From 98405edf61a02b4a8697a05ec2320c9337d844c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Fri, 28 Nov 2014 20:26:50 +0100 Subject: [PATCH 0001/4996] Add a Jekyll doctor warning for URLs that only differ by case Those URLs are problematic on case-insensitive file systems because one of the URLs is overwritten by the other. Fixes #3035 --- lib/jekyll/commands/doctor.rb | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 0fab8b3a7a5..5d3dfc610b2 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -31,7 +31,8 @@ def process(options) def healthy?(site) [ !deprecated_relative_permalinks(site), - !conflicting_urls(site) + !conflicting_urls(site), + !urls_only_differ_by_case(site) ].all? end @@ -63,6 +64,22 @@ def conflicting_urls(site) conflicting_urls end + def urls_only_differ_by_case(site) + urls_only_differ_by_case = false + urls = {} + urls = collect_urls_case_insensitive(urls, site.pages, site.dest) + urls = collect_urls_case_insensitive(urls, site.posts, site.dest) + urls.each do |case_insensitive_url, real_urls| + if real_urls.uniq.size > 1 + urls_only_differ_by_case = true + Jekyll.logger.warn "Warning:", "The following URLs only differ" + + " by case. On a case-insensitive file system one of the URLs" + + " will be overwritten by the other: #{real_urls.join(", ")}" + end + end + urls_only_differ_by_case + end + private def collect_urls(urls, things, destination) @@ -77,6 +94,17 @@ def collect_urls(urls, things, destination) urls end + def collect_urls_case_insensitive(urls, things, destination) + things.each do |thing| + dest = thing.destination(destination) + if urls[dest.downcase] + urls[dest.downcase] << dest + else + urls[dest.downcase] = [dest] + end + end + urls + end end end From a0da18e4f85c9b844bd29da5bfc7c1b24aedcdd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Sun, 30 Nov 2014 14:30:22 +0100 Subject: [PATCH 0002/4996] Incorporate code review feedback --- lib/jekyll/commands/doctor.rb | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 5d3dfc610b2..8da68956e40 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -95,13 +95,10 @@ def collect_urls(urls, things, destination) end def collect_urls_case_insensitive(urls, things, destination) - things.each do |thing| - dest = thing.destination(destination) - if urls[dest.downcase] - urls[dest.downcase] << dest - else - urls[dest.downcase] = [dest] - end + things.inject(urls) do |memo, thing| + dest = thing.destination(destination) + (memo[dest.downcase] ||= []) << dest + memo end urls end From 6055f112fb248e90f5bc8378f7c06942645296ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Sun, 30 Nov 2014 14:52:16 +0100 Subject: [PATCH 0003/4996] Incorporate code review feedback --- lib/jekyll/commands/doctor.rb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 8da68956e40..d238f0d18b2 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -66,9 +66,7 @@ def conflicting_urls(site) def urls_only_differ_by_case(site) urls_only_differ_by_case = false - urls = {} - urls = collect_urls_case_insensitive(urls, site.pages, site.dest) - urls = collect_urls_case_insensitive(urls, site.posts, site.dest) + urls = case_insensitive_urls(site.pages + site.posts, site.dest) urls.each do |case_insensitive_url, real_urls| if real_urls.uniq.size > 1 urls_only_differ_by_case = true @@ -94,13 +92,12 @@ def collect_urls(urls, things, destination) urls end - def collect_urls_case_insensitive(urls, things, destination) - things.inject(urls) do |memo, thing| + def case_insensitive_urls(things, destination) + things.inject(Hash.new) do |memo, thing| dest = thing.destination(destination) (memo[dest.downcase] ||= []) << dest memo end - urls end end From 34ff0bbb36916dff4bd719981c2f15d903f862a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Mon, 15 Dec 2014 21:26:47 +0100 Subject: [PATCH 0004/4996] Added tests for new jekyll doctor warning --- .../_urls_differ_by_case_invalid/page1.html | 6 ++++ .../_urls_differ_by_case_invalid/page2.html | 6 ++++ .../_urls_differ_by_case_valid/page1.html | 6 ++++ test/test_doctor_command.rb | 36 +++++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 test/source/_urls_differ_by_case_invalid/page1.html create mode 100644 test/source/_urls_differ_by_case_invalid/page2.html create mode 100644 test/source/_urls_differ_by_case_valid/page1.html create mode 100644 test/test_doctor_command.rb diff --git a/test/source/_urls_differ_by_case_invalid/page1.html b/test/source/_urls_differ_by_case_invalid/page1.html new file mode 100644 index 00000000000..a6a79f932db --- /dev/null +++ b/test/source/_urls_differ_by_case_invalid/page1.html @@ -0,0 +1,6 @@ +--- +title: About +permalink: /about/ +--- + +About the site diff --git a/test/source/_urls_differ_by_case_invalid/page2.html b/test/source/_urls_differ_by_case_invalid/page2.html new file mode 100644 index 00000000000..21f679f3f97 --- /dev/null +++ b/test/source/_urls_differ_by_case_invalid/page2.html @@ -0,0 +1,6 @@ +--- +title: About +permalink: /About/ +--- + +About the site diff --git a/test/source/_urls_differ_by_case_valid/page1.html b/test/source/_urls_differ_by_case_valid/page1.html new file mode 100644 index 00000000000..a6a79f932db --- /dev/null +++ b/test/source/_urls_differ_by_case_valid/page1.html @@ -0,0 +1,6 @@ +--- +title: About +permalink: /about/ +--- + +About the site diff --git a/test/test_doctor_command.rb b/test/test_doctor_command.rb new file mode 100644 index 00000000000..43fa602c7b0 --- /dev/null +++ b/test/test_doctor_command.rb @@ -0,0 +1,36 @@ +require 'helper' +require 'jekyll/commands/doctor' + +class TestDoctorCommand < Test::Unit::TestCase + context 'urls only differ by case' do + setup do + clear_dest + end + + should 'return success on a valid site/page' do + @site = Site.new(Jekyll.configuration({ + "source" => File.join(source_dir, '/_urls_differ_by_case_valid'), + "destination" => dest_dir + })) + @site.process + output = capture_stderr do + ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) + assert_equal false, ret + end + assert_equal "", output + end + + should 'return warning for pages only differing by case' do + @site = Site.new(Jekyll.configuration({ + "source" => File.join(source_dir, '/_urls_differ_by_case_invalid'), + "destination" => dest_dir + })) + @site.process + output = capture_stderr do + ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) + assert_equal true, ret + end + assert_equal "\e[33m Warning: The following URLs only differ by case. On a case-insensitive file system one of the URLs will be overwritten by the other: #{dest_dir}/about/index.html, #{dest_dir}/About/index.html\e[0m\n", output + end + end +end From 34438ed325423a75248cd6bd2927b69b39bfa217 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 9 Jun 2015 19:10:55 -0500 Subject: [PATCH 0005/4996] Refactor: lib/jekyll/convertor/markdown.rb - tests: no additions/breaks. Reason: #3770 --- lib/jekyll/converters/markdown.rb | 101 ++++++++++++++++++------------ 1 file changed, 62 insertions(+), 39 deletions(-) diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 30c7ef36682..7633ccf7d80 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -1,54 +1,63 @@ module Jekyll module Converters class Markdown < Converter - safe true - highlighter_prefix "\n" highlighter_suffix "\n" + safe true def setup return if @setup - @parser = - case @config['markdown'].downcase - when 'redcarpet' then RedcarpetParser.new(@config) - when 'kramdown' then KramdownParser.new(@config) - when 'rdiscount' then RDiscountParser.new(@config) - else - # So they can't try some tricky bullshit or go down the ancestor chain, I hope. - if allowed_custom_class?(@config['markdown']) - self.class.const_get(@config['markdown']).new(@config) - else - Jekyll.logger.error "Invalid Markdown Processor:", "#{@config['markdown']}" - Jekyll.logger.error "", "Valid options are [ #{valid_processors.join(" | ")} ]" - raise Errors::FatalException, "Invalid Markdown Processor: #{@config['markdown']}" - end - end - @setup = true + if (!@parser = get_processor) + Jekyll.logger.error "Invalid Markdown processor given:", @config["markdown"] + Jekyll.logger.info "", "Custom processors are not loaded in safe mode" if @config["safe"] + Jekyll.logger.error "", "Available processors are: #{valid_processors.join(", ")}" + raise Errors::FatalException, "Bailing out; invalid Markdown processor." + end + + @setup = \ + true + end + + def get_processor + case @config["markdown"].downcase + when "redcarpet" then return RedcarpetParser.new(@config) + when "kramdown" then return KramdownParser.new(@config) + when "rdiscount" then return RDiscountParser.new(@config) + else + get_custom_processor + end end + # Public: Provides you with a list of processors, the ones we + # support internally and the ones that you have provided to us (if you + # are not in safe mode.) + def valid_processors - %w[ - rdiscount - kramdown - redcarpet - ] + third_party_processors + %W(rdiscount kramdown redcarpet) + \ + third_party_processors end + # Public: A list of processors that you provide via plugins. + # This is really only available if you are not in safe mode, if you are + # in safe mode (re: Github) then there will be none. + def third_party_processors - self.class.constants - %w[ - KramdownParser - RDiscountParser - RedcarpetParser - PRIORITIES - ].map(&:to_sym) + self.class.constants - \ + %w[KramdownParser RDiscountParser RedcarpetParser PRIORITIES].map( + &:to_sym + ) end def extname_list - @extname_list ||= @config['markdown_ext'].split(',').map { |e| ".#{e.downcase}" } + @extname_list ||= @config['markdown_ext'].split(',').map do |e| + ".#{e.downcase}" + end end def matches(ext) - extname_list.include? ext.downcase + extname_list.include?( + ext.downcase + ) end def output_ext(ext) @@ -56,21 +65,35 @@ def output_ext(ext) end def convert(content) - setup - @parser.convert(content) + setup + @parser.convert( + content + ) end private + def get_custom_processor + md = @config["markdown"] + if custom_class_allowed?(md) + self.class.const_get(md).new( + @config + ) + end + end - # Private: Determine whether a class name is an allowed custom markdown - # class name + # Private: Determine whether a class name is an allowed custom + # markdown class name. # # parser_name - the name of the parser class # - # Returns true if the parser name contains only alphanumeric characters - # and is defined within Jekyll::Converters::Markdown - def allowed_custom_class?(parser_name) - parser_name !~ /[^A-Za-z0-9]/ && self.class.constants.include?(parser_name.to_sym) + # Returns true if the parser name contains only alphanumeric + # characters and is defined within Jekyll::Converters::Markdown + + private + def custom_class_allowed?(parser_name) + parser_name !~ /[^A-Za-z0-9]/ && self.class.constants.include?( + parser_name.to_sym + ) end end end From a58f23aeaf38bc180b2fdf46f7a6b98064d1302c Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 10 Jun 2015 15:05:17 -0500 Subject: [PATCH 0006/4996] Add support for underscores. --- lib/jekyll/converters/markdown.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 7633ccf7d80..e3c89934856 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -91,7 +91,7 @@ def get_custom_processor private def custom_class_allowed?(parser_name) - parser_name !~ /[^A-Za-z0-9]/ && self.class.constants.include?( + parser_name !~ /[^A-Za-z0-9_]/ && self.class.constants.include?( parser_name.to_sym ) end From e0b8539670b9cbc24175d9816241567e9eea74ae Mon Sep 17 00:00:00 2001 From: Shinnosuke Kondo Date: Mon, 13 Jul 2015 17:47:42 -0500 Subject: [PATCH 0007/4996] Added a new case for test_clearner where a directory is not in keep_files, but its path contains a string in keep_files. --- test/test_cleaner.rb | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/test_cleaner.rb b/test/test_cleaner.rb index 819dbf5cd21..c96394d7a68 100644 --- a/test/test_cleaner.rb +++ b/test/test_cleaner.rb @@ -37,6 +37,40 @@ class TestCleaner < JekyllUnitTest end end + context "not-nested directory in keep_files and similary named directory not in keep_files" do + setup do + clear_dest + + FileUtils.mkdir_p(dest_dir('.git/child_dir')) + FileUtils.mkdir_p(dest_dir('username.github.io')) + FileUtils.touch(File.join(dest_dir('.git'), 'index.html')) + FileUtils.touch(File.join(dest_dir('username.github.io'), 'index.html')) + + @site = fixture_site + @site.keep_files = ['.git'] + + @cleaner = Cleaner.new(@site) + @cleaner.cleanup! + end + + teardown do + FileUtils.rm_rf(dest_dir('.git')) + FileUtils.rm_rf(dest_dir('.username.github.io')) + end + + should "keep the file in the directory in keep_files" do + assert File.exist?(File.join(dest_dir('.git'), 'index.html')) + end + + should "delete the file in the directory not in keep_files" do + assert !File.exist?(File.join(dest_dir('username.github.io'), 'index.html')) + end + + should "delete the directory not in keep_files" do + assert !File.exist?(dest_dir('username.github.io')) + end + end + context "directory containing no files and non-empty directories" do setup do clear_dest From 3b60237cb152aa19526902d30bd02feb39a71f24 Mon Sep 17 00:00:00 2001 From: Shinnosuke Kondo Date: Mon, 13 Jul 2015 18:34:40 -0500 Subject: [PATCH 0008/4996] Fix keep_files to be used as paths relative to the destination. They were used as keywords to match files containing them in the paths. --- lib/jekyll/cleaner.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index 70bd2f790ea..2a00a737bfb 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -94,11 +94,12 @@ def keep_dirs # Private: Creates a regular expression from the config's keep_files array # # Examples - # ['.git','.svn'] creates the following regex: /\/(\.git|\/.svn)/ + # ['.git','.svn'] with site.dest "/myblog/_site" creates + # the following regex: /\/myblog\/_site\/(\.git|\/.svn)/ # # Returns the regular expression def keep_file_regex - Regexp.union(site.keep_files) + /#{Regexp.quote(site.dest)}\/(#{Regexp.union(site.keep_files).source})/ end end end From 1eb626b1dfdcb90cbc6f48c0b67b665ed71fccbe Mon Sep 17 00:00:00 2001 From: Shinnosuke Kondo Date: Mon, 13 Jul 2015 19:08:11 -0500 Subject: [PATCH 0009/4996] Fix keep_files not to match a file with repeated path. --- lib/jekyll/cleaner.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index 2a00a737bfb..509cebb1fb5 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -95,11 +95,11 @@ def keep_dirs # # Examples # ['.git','.svn'] with site.dest "/myblog/_site" creates - # the following regex: /\/myblog\/_site\/(\.git|\/.svn)/ + # the following regex: /\A\/myblog\/_site\/(\.git|\/.svn)/ # # Returns the regular expression def keep_file_regex - /#{Regexp.quote(site.dest)}\/(#{Regexp.union(site.keep_files).source})/ + /\A#{Regexp.quote(site.dest)}\/(#{Regexp.union(site.keep_files).source})/ end end end From 36a41cd22424f5cca95e11403e91114f01f67542 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Mon, 19 Oct 2015 12:06:46 -0400 Subject: [PATCH 0010/4996] Typos and line wrapping --- site/_docs/configuration.md | 4 ++-- site/_docs/contributing.md | 2 +- site/_docs/deployment-methods.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index ffbef8a40c3..fb7cd2f36fe 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -653,8 +653,8 @@ class Jekyll::Converters::Markdown::MyCustomProcessor end {% endhighlight %} -Once you've created your class and have it properly setup either as a plugin in -the `_plugins` folder or as a gem, specify it in your `_config.yml`: +Once you've created your class and have it properly set up either as a plugin +in the `_plugins` folder or as a gem, specify it in your `_config.yml`: {% highlight yaml %} markdown: MyCustomProcessor diff --git a/site/_docs/contributing.md b/site/_docs/contributing.md index ae768e5b553..4728e96ec9d 100644 --- a/site/_docs/contributing.md +++ b/site/_docs/contributing.md @@ -43,7 +43,7 @@ Test Dependencies ----------------- To run the test suite and build the gem you'll need to install Jekyll's -dependencies. Simply run this command to get all setup: +dependencies. Simply run this command to get all set up: $ script/bootstrap diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index c1040b2b780..1fb0c64c89d 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -112,7 +112,7 @@ That's why rrsync wrapper shall be installed. If it is not already installed by - 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) +#### Step 2: Set up 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: From cf71c563ab2ce4fe974e2e0c07361c2721a9b334 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Sat, 24 Oct 2015 17:34:29 +0200 Subject: [PATCH 0011/4996] Handle empty config files SafeYAML.load_file returns `false` when processing empty files so we convert this into an empty hash for further processing. fixes #4030 --- lib/jekyll/configuration.rb | 20 +++++++++++++++++--- test/test_configuration.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index f57b3ae4853..52b65a33b0a 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -118,7 +118,7 @@ def safe_load_file(filename) Jekyll::External.require_with_graceful_fail('toml') unless defined?(TOML) TOML.load_file(filename) when /\.ya?ml/i - SafeYAML.load_file(filename) + SafeYAML.load_file(filename) || {} else raise ArgumentError, "No parser for '#{filename}' is available. Use a .toml or .y(a)ml file instead." end @@ -153,7 +153,7 @@ def config_files(override) # Returns this configuration, overridden by the values in the file def read_config_file(file) next_config = safe_load_file(file) - raise ArgumentError.new("Configuration file: (INVALID) #{file}".yellow) unless next_config.is_a?(Hash) + check_config_is_hash!(next_config, file) Jekyll.logger.info "Configuration file:", file next_config rescue SystemCallError @@ -236,7 +236,8 @@ def backwards_compatibilize end %w[include exclude].each do |option| - if config.fetch(option, []).is_a?(String) + config[option] ||= [] + if config[option].is_a?(String) Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" + " must now be specified as an array, but you specified" + " a string. For now, we've treated the string you provided" + @@ -300,6 +301,7 @@ def renamed_key(old, new, config, allowed_values = nil) end private + def style_to_permalink(permalink_style) case permalink_style.to_sym when :pretty @@ -314,5 +316,17 @@ def style_to_permalink(permalink_style) permalink_style.to_s end end + + # Private: Checks if a given config is a hash + # + # extracted_config - the value to check + # file - the file from which the config was extracted + # + # Raises an ArgumentError if given config is not a hash + def check_config_is_hash!(extracted_config, file) + unless extracted_config.is_a?(Hash) + raise ArgumentError.new("Configuration file: (INVALID) #{file}".yellow) + end + end end end diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 553dfda3d00..608dfef0c07 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -59,6 +59,34 @@ class TestConfiguration < JekyllUnitTest assert_equal %w[config/site.yml config/deploy.toml configuration.yml], @config.config_files(@multiple_files) end end + + context "#read_config_file" do + setup do + @config = Configuration[{"source" => source_dir('empty.yml')}] + end + + should "not raise an error on empty files" do + allow(SafeYAML).to receive(:load_file).with('empty.yml').and_return(false) + Jekyll.logger.log_level = :warn + @config.read_config_file('empty.yml') + Jekyll.logger.log_level = :info + end + end + + context "#read_config_files" do + setup do + @config = Configuration[{"source" => source_dir}] + end + + should "continue to read config files if one is empty" do + allow(SafeYAML).to receive(:load_file).with('empty.yml').and_return(false) + allow(SafeYAML).to receive(:load_file).with('not_empty.yml').and_return({'foo' => 'bar', 'include' => '', 'exclude' => ''}) + Jekyll.logger.log_level = :warn + read_config = @config.read_config_files(['empty.yml', 'not_empty.yml']) + Jekyll.logger.log_level = :info + assert_equal 'bar', read_config['foo'] + end + end context "#backwards_compatibilize" do setup do @config = Configuration[{ From 056abdf8997c4739336d14b813ebfd075f1c604e Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Tue, 10 Nov 2015 22:17:20 -0500 Subject: [PATCH 0012/4996] Improve readability of rrsync instructions, update deploy scripts --- site/_docs/deployment-methods.md | 65 +++++++++++++++++++------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index 1fb0c64c89d..9bbc63fa0f6 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -102,64 +102,77 @@ Once you’ve generated the `_site` directory, you can easily scp it using a `ta Once you’ve 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). You’d obviously need to change the values to reflect your site’s details. -#### Step 1: Install rrsync to your home folder (server-side) +Certificate-based authorization is another way to simplify the publishing +process. It makes sense to restrict rsync access only to the directory which it is supposed to sync. This can be done using rrsync. -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. +#### Step 1: Install rrsync to your home folder (server-side) -That's why rrsync wrapper shall be installed. If it is not already installed by your hoster you can do it yourself: +If it is not already installed by your host, 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```) +- [Download rrsync](http://ftp.samba.org/pub/unpacked/rsync/support/rrsync) +- Place it in the `bin` subdirectory of your home folder (`~/bin`) +- Make it executable (`chmod +x`) -#### Step 2: Set up certificate-based ssh access (server side) +#### Step 2: Set up 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: +This [process](https://wiki.gentoo.org/wiki/SSH#Passwordless_Authentication) is +described in several places online. What is different from the typical approach +is to put the restriction to certificate-based authorization in +```~/.ssh/authorized_keys```. Then, aunch `rrsync` and supply +it with the folder it shall have read-write access to: -``` +{% highlight bash %} command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa -``` +{% endhighlight %} `````` is the path to your site. E.g., ```~/public_html/you.org/blog-html/```. -#### Step 3: Rsync! (client-side) +#### Step 3: Rsync (client-side) -Add the script ```deploy``` to the web site source folder: +Add the `deploy` script to the site source folder: {% highlight bash %} #!/bin/sh -rsync -avr --rsh='ssh -p2222' --delete-after --delete-excluded @: +rsync -crvz --rsh=ssh -p2222' --delete-after --delete-excluded @: {% 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) -- `````` is the name of the local folder with generated web content. By default it is ```_site/``` for Jekyll -- `````` — ssh user name for your hosting account -- `````` — your hosting server +- ````--rsh=ssh -p2222```` — The port for SSH access. It is required if +your host uses a different port than the default (e.g, HostGator) +- `` — The name of the local output folder (defaults to `_site`) +- `` — The username for your hosting account +- `` — Your hosting server -Example command line is: +Using this setup, you might run the following command: {% highlight bash %} -rsync -avr --rsh='ssh -p2222' --delete-after --delete-excluded _site/ hostuser@vrepin.org: +rsync -crvz --rsh='ssh -p2222' --delete-after --delete-excluded _site/ hostuser@example.org: {% endhighlight %} -Don't forget column ':' after server name! +Don't forget the column `:` after server name! + +#### Step 4 (Optional): Exclude the transfer script from being copied to the output folder. -#### Optional step 4: exclude transfer.sh from being copied to the output folder by Jekyll +This step is recommended if you use these instructions to deploy your site. If +you put the `deploy` script in the root folder of your project, Jekyll will +copy it to the output folder. This behavior can be changed in `_config.yml`. -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: +Just add the following line: {% highlight yaml %} -# Do not copy these file to the output directory +# Do not copy these files to the output directory exclude: ["deploy"] {% endhighlight %} -#### We are done! +Alternatively, you can use an `rsync-exclude.txt` file to control which files will be transferred to your server. + +#### 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. +Now it's possible to publish your website simply by running the `deploy` +script. If your SSH certificate is [passphrase-protected](https://martin.kleppmann.com/2013/05/24/improving-security-of-ssh-private-keys.html), you will be asked to enter it when the +script executes. ## Rack-Jekyll From 4a91bb669c1339a786aeb8cb88452009f31c43a7 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Wed, 11 Nov 2015 20:33:44 -0500 Subject: [PATCH 0013/4996] Fix a typo, use single backticks for inline code examples --- site/_docs/deployment-methods.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index 9bbc63fa0f6..51a3a5b221c 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -118,14 +118,14 @@ If it is not already installed by your host, you can do it yourself: This [process](https://wiki.gentoo.org/wiki/SSH#Passwordless_Authentication) is described in several places online. What is different from the typical approach is to put the restriction to certificate-based authorization in -```~/.ssh/authorized_keys```. Then, aunch `rrsync` and supply +`~/.ssh/authorized_keys`. Then, launch `rrsync` and supply it with the folder it shall have read-write access to: {% highlight bash %} command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa {% endhighlight %} -`````` is the path to your site. E.g., ```~/public_html/you.org/blog-html/```. +`` is the path to your site. E.g., `~/public_html/you.org/blog-html/`. #### Step 3: Rsync (client-side) @@ -139,7 +139,7 @@ rsync -crvz --rsh=ssh -p2222' --delete-after --delete-excluded Command line parameters are: -- ````--rsh=ssh -p2222```` — The port for SSH access. It is required if +- `--rsh=ssh -p2222` — The port for SSH access. It is required if your host uses a different port than the default (e.g, HostGator) - `` — The name of the local output folder (defaults to `_site`) - `` — The username for your hosting account From bd2c337e5bd1a3532f42776f55f80f4e273cfeac Mon Sep 17 00:00:00 2001 From: Ducksan Cho Date: Wed, 18 Nov 2015 02:16:03 +1300 Subject: [PATCH 0014/4996] Avoid using Dir.glob with absolute path the absolute path including '[', '{', '?', or '*' could change the outcome --- lib/jekyll/cleaner.rb | 11 ++++++++--- lib/jekyll/collection.rb | 7 +++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index d23da78fc4f..a8bbf24e280 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -36,13 +36,18 @@ def metadata_file # # Returns a Set with the file paths def existing_files + return Set.new unless Dir.exist?(site.in_dest_dir) + files = Set.new regex = keep_file_regex dirs = keep_dirs - Dir.glob(site.in_dest_dir("**", "*"), File::FNM_DOTMATCH) do |file| - next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file) - files << file + Dir.chdir(site.in_dest_dir) do + Dir.glob("**/*", File::FNM_DOTMATCH).each do |f| + file = File.join(site.in_dest_dir, f) + next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file) + files << file + end end files diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 4363aee195b..4d4b9bd0869 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -74,8 +74,11 @@ def read def entries return Array.new unless exists? @entries ||= - Dir.glob(collection_dir("**", "*.*")).map do |entry| - entry["#{collection_dir}/"] = ''; entry + Dir.chdir(collection_dir) do + Dir.glob("**/*.*").map do |f| + entry = collection_dir(f) + entry["#{collection_dir}/"] = ''; entry + end end end From a168edae45cf6878dfe7408cc396252b8899c17a Mon Sep 17 00:00:00 2001 From: Ducksan Cho Date: Thu, 19 Nov 2015 00:46:46 +1300 Subject: [PATCH 0015/4996] Add Utils.safe_glob method which works the same way as Dir.glob but seperating the input into two parts ('dir' + '/' + 'pattern') to make sure the first part('dir') does not act as a pattern. --- lib/jekyll/utils.rb | 29 +++++++++++++++++++++++++++ test/safe_glob_test[/find_me.txt | 0 test/test_utils.rb | 34 ++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 test/safe_glob_test[/find_me.txt diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index c30a986a389..ab516767664 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -207,5 +207,34 @@ def add_permalink_suffix(template, permalink_style) template end + + # Work the same way as Dir.glob but seperating the input into two parts + # ('dir' + '/' + 'pattern') to make sure the first part('dir') does not act + # as a pattern. + # + # For example, Dir.glob("path[/*") always returns an empty array, + # because the method fails to find the closing pattern to '[' which is ']' + # + # Examples: + # safe_glob("path[", "*") + # # => ["path[/file1", "path[/file2"] + # + # safe_glob("path", "*", File::FNM_DOTMATCH) + # # => ["path/.", "path/..", "path/file1"] + # + # dir - the dir where glob will be executed under + # (the dir will be included to each result) + # pattern - the pattern which will be applied under the dir + # flags - the flags which will be applied to the pattern + # + # Returns matched pathes + def safe_glob(dir, pattern, flags = 0) + return [] unless Dir.exist?(dir) + return [dir] if pattern.nil? || pattern.empty? + Dir.chdir(dir) do + Dir.glob(pattern, flags).map { |f| File.join(dir, f) } + end + end + end end diff --git a/test/safe_glob_test[/find_me.txt b/test/safe_glob_test[/find_me.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/test_utils.rb b/test/test_utils.rb index 9d4a5a4df3a..02ebb09ad45 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -180,4 +180,38 @@ class TestUtils < JekyllUnitTest assert_equal "/:basename", Utils.add_permalink_suffix("/:basename", "/:title") end end + + context "The \`Utils.safe_glob\` method" do + should "not apply pattern to the dir" do + dir = "test/safe_glob_test[" + assert_equal [], Dir.glob(dir + "/*") + assert_equal ["test/safe_glob_test[/find_me.txt"], Utils.safe_glob(dir, "*") + end + + should "return the same data to #glob" do + dir = "test" + assert_equal Dir.glob(dir + "/*"), Utils.safe_glob(dir, "*") + assert_equal Dir.glob(dir + "/**/*"), Utils.safe_glob(dir, "**/*") + end + + should "return the same data to #glob if dir is not found" do + dir = "dir_not_exist" + assert_equal [], Utils.safe_glob(dir, "*") + assert_equal Dir.glob(dir + "/*"), Utils.safe_glob(dir, "*") + end + + should "return the same data to #glob if pattern is blank" do + dir = "test" + assert_equal [dir], Utils.safe_glob(dir, "") + assert_equal Dir.glob(dir), Utils.safe_glob(dir, "") + assert_equal Dir.glob(dir), Utils.safe_glob(dir, nil) + end + + should "return the same data to #glob if flag is given" do + dir = "test" + assert_equal Dir.glob(dir + "/*", File::FNM_DOTMATCH), + Utils.safe_glob(dir, "*", File::FNM_DOTMATCH) + end + end + end From 20735e12f9ea1ffd49294bb8e5bf3ec724853dc6 Mon Sep 17 00:00:00 2001 From: Ducksan Cho Date: Thu, 19 Nov 2015 01:02:48 +1300 Subject: [PATCH 0016/4996] Use safe_glob to unsafe glob --- lib/jekyll/cleaner.rb | 11 +++-------- lib/jekyll/collection.rb | 7 ++----- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index a8bbf24e280..9146e7de497 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -36,18 +36,13 @@ def metadata_file # # Returns a Set with the file paths def existing_files - return Set.new unless Dir.exist?(site.in_dest_dir) - files = Set.new regex = keep_file_regex dirs = keep_dirs - Dir.chdir(site.in_dest_dir) do - Dir.glob("**/*", File::FNM_DOTMATCH).each do |f| - file = File.join(site.in_dest_dir, f) - next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file) - files << file - end + Utils.safe_glob(site.in_dest_dir, "**/*", File::FNM_DOTMATCH).each do |file| + next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file) + files << file end files diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 4d4b9bd0869..e472571806f 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -74,11 +74,8 @@ def read def entries return Array.new unless exists? @entries ||= - Dir.chdir(collection_dir) do - Dir.glob("**/*.*").map do |f| - entry = collection_dir(f) - entry["#{collection_dir}/"] = ''; entry - end + Utils.safe_glob(collection_dir, "**/*.*").map do |entry| + entry["#{collection_dir}/"] = ''; entry end end From 90865d5fc173f5ed4af8bff0a975f720326b06d6 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 18 Nov 2015 15:58:26 -0600 Subject: [PATCH 0017/4996] Fix #4082: Allow users to use .htm and .xhtml (XHTML5.) --- lib/jekyll/page.rb | 15 ++++++++++++--- test/test_page.rb | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index ca5bb268131..a62a99402bd 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -16,6 +16,15 @@ class Page url ] + # A set of extensions that are considered HTML or HTML-like so we + # should not alter them, this includes .xhtml through XHTM5. + + HTML_EXTENSIONS = %W( + .html + .xhtml + .htm + ) + # Initialize a new Page. # # site - The Site object. @@ -135,8 +144,8 @@ def relative_path # Returns the destination file path String. def destination(dest) path = site.in_dest_dir(dest, URL.unescape_path(url)) - path = File.join(path, "index.html") if url.end_with?("/") - path << output_ext unless path.end_with?(output_ext) + path = File.join(path, "index") if url.end_with?("/") + path << output_ext unless path.end_with?(output_ext) path end @@ -147,7 +156,7 @@ def inspect # Returns the Boolean of whether this Page is HTML or not. def html? - output_ext == '.html' + HTML_EXTENSIONS.include?(output_ext) end # Returns the Boolean of whether this Page is an index file or not. diff --git a/test/test_page.rb b/test/test_page.rb index 1e4d3da62eb..625812aa6d3 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -261,6 +261,26 @@ def do_render(page) assert File.exist?(File.join(dest_dir, 'contacts', 'index.html')) end + should "support .htm extension and respects that" do + page = setup_page('contacts.htm') + page.site.permalink_style = :pretty + do_render(page) + page.write(dest_dir) + + assert File.directory?(dest_dir) + assert File.exist?(File.join(dest_dir, 'contacts', 'index.htm')) + end + + should "support .xhtml extension and respects that" do + page = setup_page('contacts.xhtml') + page.site.permalink_style = :pretty + do_render(page) + page.write(dest_dir) + + assert File.directory?(dest_dir) + assert File.exist?(File.join(dest_dir, 'contacts', 'index.xhtml')) + end + should "write properly with extension different from html" do page = setup_page("sitemap.xml") page.site.permalink_style = :pretty From e9f8b4df749eb793db744e7ba379de9f5bd89377 Mon Sep 17 00:00:00 2001 From: ducksan cho Date: Thu, 19 Nov 2015 17:15:51 +1300 Subject: [PATCH 0018/4996] Add Windows support to Utils.safe_glob --- lib/jekyll/cleaner.rb | 2 +- lib/jekyll/collection.rb | 2 +- lib/jekyll/utils.rb | 14 +++++++++----- test/test_utils.rb | 5 +++++ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index 9146e7de497..ca8a0ca99f6 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -40,7 +40,7 @@ def existing_files regex = keep_file_regex dirs = keep_dirs - Utils.safe_glob(site.in_dest_dir, "**/*", File::FNM_DOTMATCH).each do |file| + Utils.safe_glob(site.in_dest_dir, ["**", "*"], File::FNM_DOTMATCH).each do |file| next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file) files << file end diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index e472571806f..009063520f0 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -74,7 +74,7 @@ def read def entries return Array.new unless exists? @entries ||= - Utils.safe_glob(collection_dir, "**/*.*").map do |entry| + Utils.safe_glob(collection_dir, ["**", "*.*"]).map do |entry| entry["#{collection_dir}/"] = ''; entry end end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index ab516767664..54f400f8b02 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -222,15 +222,19 @@ def add_permalink_suffix(template, permalink_style) # safe_glob("path", "*", File::FNM_DOTMATCH) # # => ["path/.", "path/..", "path/file1"] # - # dir - the dir where glob will be executed under + # safe_glob("path", ["**", "*"]) + # # => ["path[/file1", "path[/folder/file2"] + # + # dir - the dir where glob will be executed under # (the dir will be included to each result) - # pattern - the pattern which will be applied under the dir - # flags - the flags which will be applied to the pattern + # patterns - the patterns (or the pattern) which will be applied under the dir + # flags - the flags which will be applied to the pattern # # Returns matched pathes - def safe_glob(dir, pattern, flags = 0) + def safe_glob(dir, patterns, flags = 0) return [] unless Dir.exist?(dir) - return [dir] if pattern.nil? || pattern.empty? + pattern = File.join(Array patterns) + return [dir] if pattern.empty? Dir.chdir(dir) do Dir.glob(pattern, flags).map { |f| File.join(dir, f) } end diff --git a/test/test_utils.rb b/test/test_utils.rb index 02ebb09ad45..133aba0a82d 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -212,6 +212,11 @@ class TestUtils < JekyllUnitTest assert_equal Dir.glob(dir + "/*", File::FNM_DOTMATCH), Utils.safe_glob(dir, "*", File::FNM_DOTMATCH) end + + should "support pattern as an array to support windows" do + dir = "test" + assert_equal Dir.glob(dir + "/**/*"), Utils.safe_glob(dir, ["**", "*"]) + end end end From 16aea22c8d392c38afcda86f479d61a38718746c Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 23 Nov 2015 22:38:45 +0800 Subject: [PATCH 0019/4996] pass build options into clean command --- lib/jekyll/commands/clean.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/commands/clean.rb b/lib/jekyll/commands/clean.rb index bf05dbe0bf9..94f9bf97844 100644 --- a/lib/jekyll/commands/clean.rb +++ b/lib/jekyll/commands/clean.rb @@ -10,8 +10,8 @@ def init_with_program(prog) add_build_options(c) - c.action do |args, _| - Jekyll::Commands::Clean.process({}) + c.action do |args, options| + Jekyll::Commands::Clean.process(options) end end end From 2011addabcfa38d872a0940b4720232c725cad3c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 23 Nov 2015 08:25:06 -0800 Subject: [PATCH 0020/4996] Update history to reflect merge of #4177 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index cbc710e6a02..3d4a5fa67a4 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,10 @@ * Cache parsed include file to save liquid parsing time. (#4120) * Slightly speed up url sanitization and handle multiples of ///. (#4168) +### Bug Fixes + + * Pass build options into `clean` command (#4177) + ### Development Fixes * `jekyll-docs` should be easily release-able (#4152) From bf66d1fc23eafa4b0d605ad5eb671c877cf969e8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 23 Nov 2015 08:29:18 -0800 Subject: [PATCH 0021/4996] Upgrading 2-3: note that default syntax highlighter changed. Fixes #4176 --- site/_docs/upgrading/2-to-3.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index 25d38b00aad..8bbadd99622 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -61,4 +61,14 @@ merged and some unexpected behaviour. In Jekyll 3, all layout data is accessible in Liquid. For example, if your layout has `class: my-layout` in its YAML front matter, then the layout can access that via `{% raw %}{{ layout.class }}{% endraw %}`. +### Syntax highlighter changed + +For the first time, the default syntax highlighter has changed for the +`highlight` tag and for backtick code blocks. Instead of [Pygments.rb][], +it's now [Rouge][]. If you were using the `highlight` tag with certain +options, such as `hl_lines`, they may not be available when using Rouge. To +go back to using Pygments, set `highlighter: pygments` in your +`_config.yml` file and run `gem install pygments.rb` or add +`gem 'pygments.rb'` to your project's `Gemfile`. + _Did we miss something? Please click "Improve this page" above and add a section. Thanks!_ From 3417a33e7a1a903a170565f910388f6ba3831ea1 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 23 Nov 2015 08:37:52 -0800 Subject: [PATCH 0022/4996] Update templates docs to reflect Rouge default. Fixes #3323 --- site/_docs/templates.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 7a4ed049294..58e06c94661 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -317,16 +317,16 @@ such as using variables. ### Code snippet highlighting -Jekyll has built in support for syntax highlighting of [over 100 -languages](http://pygments.org/languages/) thanks to -[Pygments](http://pygments.org/). To use Pygments, you must have Python installed -on your system and set `highlighter` to `pygments` in your site's configuration -file. +Jekyll has built in support for syntax highlighting of over 60 languages +thanks to [Rouge](http://rouge.jneen.net). Rouge is the default highlighter +in Jekyll 3 and above. To use it in Jekyll 2, set `highlighter` to `rouge` +and ensure the `rouge` gem is installed properly. -Alternatively, you can use [Rouge](https://github.com/jayferd/rouge) to highlight -your code snippets. It doesn't support as many languages as Pygments, however it -should suit most use cases. Also, since [Rouge](https://github.com/jayferd/rouge) -is written in pure Ruby, you don't need Python on your system! +Alternatively, you can use [Pygments](http://pygments.org) to highlight +your code snippets. To use Pygments, you must have Python installed on your +system, have the `pygments.rb` gem installed and set `highlighter` to +`pygments` in your site's configuration file. Pygments supports [over 100 +languages](http://pygments.org/languages/) To render a code block with syntax highlighting, surround your code as follows: @@ -342,9 +342,9 @@ end The argument to the `highlight` tag (`ruby` in the example above) is the language identifier. To find the appropriate identifier to use for the language -you want to highlight, look for the “short name” on the [Pygments' Lexers -page](http://pygments.org/docs/lexers/) or the [Rouge -wiki](https://github.com/jayferd/rouge/wiki/List-of-supported-languages-and-lexers). +you want to highlight, look for the “short name” on the [Rouge +wiki](https://github.com/jayferd/rouge/wiki/List-of-supported-languages-and-lexers) +or the [Pygments' Lexers page](http://pygments.org/docs/lexers/). #### Line numbers @@ -422,4 +422,5 @@ You may also optionally specify the filename in the gist to display: {% endraw %} {% endhighlight %} -To use the `gist` tag, you'll need to add the [jekyll-gist](https://github.com/jekyll/jekyll-gist) gem to your project. +To use the `gist` tag, you'll need to add the +[jekyll-gist](https://github.com/jekyll/jekyll-gist) gem to your project. From a7730914df272d003de6d3b63669e8e8417e0c61 Mon Sep 17 00:00:00 2001 From: Tim Cuthbertson Date: Sun, 22 Nov 2015 16:00:50 +1100 Subject: [PATCH 0023/4996] rename `@options` in HighlightBlock (clash with Liquid::Block). fixes #4173 --- lib/jekyll/tags/highlight.rb | 10 +++++----- test/test_tags.rb | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 454c09a2f80..3e64bc8bc52 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -14,7 +14,7 @@ def initialize(tag_name, markup, tokens) super if markup.strip =~ SYNTAX @lang = $1.downcase - @options = {} + @highlight_options = {} if defined?($2) && $2 != '' # Split along 3 possible forms -- key="", key=value, or key $2.scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt| @@ -24,10 +24,10 @@ def initialize(tag_name, markup, tokens) value.gsub!(/"/, "") value = value.split end - @options[key.to_sym] = value || true + @highlight_options[key.to_sym] = value || true end end - @options[:linenos] = "inline" if @options.key?(:linenos) and @options[:linenos] == true + @highlight_options[:linenos] = "inline" if @highlight_options.key?(:linenos) and @highlight_options[:linenos] == true else raise SyntaxError.new <<-eos Syntax Error in tag 'highlight' while parsing the following markup: @@ -80,7 +80,7 @@ def render_pygments(code, is_safe) highlighted_code = Pygments.highlight( code, :lexer => @lang, - :options => sanitized_opts(@options, is_safe) + :options => sanitized_opts(@highlight_options, is_safe) ) if highlighted_code.nil? @@ -99,7 +99,7 @@ def render_pygments(code, is_safe) def render_rouge(code) Jekyll::External.require_with_graceful_fail('rouge') - formatter = Rouge::Formatters::HTML.new(line_numbers: @options[:linenos], wrap: false) + formatter = Rouge::Formatters::HTML.new(line_numbers: @highlight_options[:linenos], wrap: false) lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText formatter.format(lexer.lex(code)) end diff --git a/test/test_tags.rb b/test/test_tags.rb index 2276b207278..f263e9d8867 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -65,37 +65,37 @@ def highlight_block_with_opts(options_string) context "highlight tag in unsafe mode" do should "set the no options with just a language name" do tag = highlight_block_with_opts('ruby ') - assert_equal({}, tag.instance_variable_get(:@options)) + assert_equal({}, tag.instance_variable_get(:@highlight_options)) end should "set the linenos option as 'inline' if no linenos value" do tag = highlight_block_with_opts('ruby linenos ') - assert_equal({ :linenos => 'inline' }, tag.instance_variable_get(:@options)) + assert_equal({ :linenos => 'inline' }, tag.instance_variable_get(:@highlight_options)) end should "set the linenos option to 'table' if the linenos key is given the table value" do tag = highlight_block_with_opts('ruby linenos=table ') - assert_equal({ :linenos => 'table' }, tag.instance_variable_get(:@options)) + assert_equal({ :linenos => 'table' }, tag.instance_variable_get(:@highlight_options)) end should "recognize nowrap option with linenos set" do tag = highlight_block_with_opts('ruby linenos=table nowrap ') - assert_equal({ :linenos => 'table', :nowrap => true }, tag.instance_variable_get(:@options)) + assert_equal({ :linenos => 'table', :nowrap => true }, tag.instance_variable_get(:@highlight_options)) end should "recognize the cssclass option" do tag = highlight_block_with_opts('ruby linenos=table cssclass=hl ') - assert_equal({ :cssclass => 'hl', :linenos => 'table' }, tag.instance_variable_get(:@options)) + assert_equal({ :cssclass => 'hl', :linenos => 'table' }, tag.instance_variable_get(:@highlight_options)) end should "recognize the hl_linenos option and its value" do tag = highlight_block_with_opts('ruby linenos=table cssclass=hl hl_linenos=3 ') - assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => '3' }, tag.instance_variable_get(:@options)) + assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => '3' }, tag.instance_variable_get(:@highlight_options)) end should "recognize multiple values of hl_linenos" do tag = highlight_block_with_opts('ruby linenos=table cssclass=hl hl_linenos="3 5 6" ') - assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => ['3', '5', '6'] }, tag.instance_variable_get(:@options)) + assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => ['3', '5', '6'] }, tag.instance_variable_get(:@highlight_options)) end should "treat language name as case insensitive" do From 95203d99ba4d667060c6ada3414d28c385dcf5a3 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 24 Nov 2015 04:20:44 -0600 Subject: [PATCH 0024/4996] Update History.markdown --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3d4a5fa67a4..82caf865dcd 100644 --- a/History.markdown +++ b/History.markdown @@ -30,6 +30,7 @@ * Align hooks implementation with documentation (#4104) * Fix the deprecation warning in the doctor command (#4114) * Fix case in `:title` and add `:slug` which is downcased (#4100) + * Rename @options so that it does not impact Liquid. (#4173) ### Development Fixes From 256212649a44f4d10eabaf45f58efe7e66718e7a Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 24 Nov 2015 04:26:05 -0600 Subject: [PATCH 0025/4996] Update mime-types. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 9b64809eca1..68b1a63684f 100644 --- a/Gemfile +++ b/Gemfile @@ -43,7 +43,7 @@ gem 'jekyll-paginate', '~> 1.0' gem 'jekyll-coffeescript', '~> 1.0' gem 'jekyll-feed' gem 'jekyll-gist', '~> 1.0' -gem 'mime-types', '~> 2.6' +gem 'mime-types', '~> 3.0' gem 'kramdown', '~> 1.9' platform :ruby, :mswin, :mingw do From 6739072fb2e3cdd19add25c5027f64514808dcd5 Mon Sep 17 00:00:00 2001 From: Vincent Wochnik Date: Tue, 24 Nov 2015 22:39:07 +0100 Subject: [PATCH 0026/4996] Update plugins.md Add `jekyll-deploy` plugin. --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 37ca947d9c5..a6154556825 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -876,6 +876,7 @@ LESS.js files during generation. - [jekyll-minifier](https://github.com/digitalsparky/jekyll-minifier): Minifies HTML, XML, CSS, and Javascript both inline and as separate files utilising yui-compressor and htmlcompressor. - [Jekyll views router](https://bitbucket.org/nyufac/jekyll-views-router): Simple router between generator plugins and templates. - [Jekyll Language Plugin](https://github.com/vwochnik/jekyll-language-plugin): Jekyll 3.0-compatible multi-language plugin for posts, pages and includes. +- [Jekyll Deploy](https://github.com/vwochnik/jekyll-deploy): Adds a `deploy` sub-command to Jekyll. #### Editors From 35070d6806cad526724985f7dbccba7f727175da Mon Sep 17 00:00:00 2001 From: Sam Volin Date: Tue, 24 Nov 2015 16:02:10 -0700 Subject: [PATCH 0027/4996] added debug message to collection --- lib/jekyll/collection.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 4363aee195b..70d47e90d90 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -58,7 +58,11 @@ def read if Utils.has_yaml_header? full_path doc = Jekyll::Document.new(full_path, { site: site, collection: self }) doc.read - docs << doc if site.publisher.publish?(doc) || !write? + if site.publisher.publish?(doc) || !write? + docs << doc + else + Jekyll.logger.debug "Skipped From Publishing:", doc.relative_path + end else relative_dir = Jekyll.sanitized_path(relative_directory, File.dirname(file_path)).chomp("/.") files << StaticFile.new(site, site.source, relative_dir, File.basename(full_path), self) From 1c42a8225ecd0e5dcbce35e69d38bcc5f1d84a06 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 24 Nov 2015 15:04:19 -0800 Subject: [PATCH 0028/4996] Update history to reflect merge of #4179 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 82caf865dcd..30f129035ef 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ * Add three plugins to directory (#4163) * Add upgrading docs from 2.x to 3.x (#4157) * Add protect_email to the plugins index. (#4169) + * Add `jekyll-deploy` to list of third-party plugins (#4179) ## 3.0.1 / 2015-11-17 From 934273ad92f6161a243327ca1d850428cacbf412 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 24 Nov 2015 15:18:28 -0800 Subject: [PATCH 0029/4996] Update history to reflect merge of #4180 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 30f129035ef..ff2eb51377e 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Cache parsed include file to save liquid parsing time. (#4120) * Slightly speed up url sanitization and handle multiples of ///. (#4168) + * Print debug message when a document is skipped from reading (#4180) ### Bug Fixes From d7bac8cc40978c0a6d8978aa80dc31cbd6e53cbf Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 24 Nov 2015 16:19:58 -0800 Subject: [PATCH 0030/4996] Update history to reflect merge of #4160 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ff2eb51377e..560b65c66a6 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,7 @@ ### Bug Fixes * Pass build options into `clean` command (#4177) + * Allow users to use .htm and .xhtml (XHTML5.) (#4160) ### Development Fixes From 8a0941808329efac9cdc9b031c76aa5b25606de4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 24 Nov 2015 16:27:16 -0800 Subject: [PATCH 0031/4996] Allow use of Cucumber 2.1 or greater --- Gemfile | 2 +- features/support/overview.rb | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 68b1a63684f..4f3da61ca7a 100644 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,7 @@ end group :test do gem 'redgreen', '~> 1.2' gem 'shoulda', '~> 3.5' - gem 'cucumber', '~> 2.0', '< 2.1' + gem 'cucumber', '~> 2.1' gem 'simplecov', '~> 0.9' gem 'jekyll_test_plugin' gem 'jekyll_test_plugin_malicious' diff --git a/features/support/overview.rb b/features/support/overview.rb index 8d414be7f54..9550969b39c 100644 --- a/features/support/overview.rb +++ b/features/support/overview.rb @@ -2,7 +2,6 @@ require 'colorator' require 'cucumber/formatter/console' require 'cucumber/formatter/io' -require 'gherkin/formatter/escaping' module Features module Support @@ -17,12 +16,11 @@ class Overview include FileUtils include Cucumber::Formatter::Console include Cucumber::Formatter::Io - include Gherkin::Formatter::Escaping attr_writer :indent attr_reader :runtime def initialize(runtime, path_or_io, options) - @runtime, @io, @options = runtime, ensure_io(path_or_io, "pretty"), options + @runtime, @io, @options = runtime, ensure_io(path_or_io), options @exceptions = [] @indent = 0 @prefixes = options[:prefixes] || {} From 1bde4ce84a373e86770d26388f02512c991bc2c4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 24 Nov 2015 17:11:47 -0800 Subject: [PATCH 0032/4996] include_tag.feature: double escape --- features/include_tag.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/include_tag.feature b/features/include_tag.feature index 427c1bb4f0c..cab01187df0 100644 --- a/features/include_tag.feature +++ b/features/include_tag.feature @@ -15,7 +15,7 @@ Feature: Include tags | Ignore params if unused | 2013-03-21 | html | {% include ignore.html date="today" %} | | List multiple parameters | 2013-03-21 | html | {% include params.html date="today" start="tomorrow" %} | | Dont keep parameters | 2013-03-21 | html | {% include ignore.html param="test" %}\n{% include header.html %} | - | Allow params with spaces and quotes | 2013-04-07 | html | {% include params.html cool="param with spaces" super="\"quoted\"" single='has "quotes"' escaped='\'single\' quotes' %} | + | Allow params with spaces and quotes | 2013-04-07 | html | {% include params.html cool="param with spaces" super="\\"quoted\\"" single='has "quotes"' escaped='\\'single\\' quotes' %} | | Parameter syntax | 2013-04-12 | html | {% include params.html param1_or_2="value" %} | | Pass a variable | 2013-06-22 | html | {% assign var = 'some text' %}{% include params.html local=var title=page.title %} | When I run jekyll build From 7a284b802b68557dd585fee3a64e4d59bf500fd4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 24 Nov 2015 17:33:33 -0800 Subject: [PATCH 0033/4996] Update history to reflect merge of #4181 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 560b65c66a6..9977b65207e 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ ### Development Fixes * `jekyll-docs` should be easily release-able (#4152) + * Allow use of Cucumber 2.1 or greater (#4181) ### Site Enhancements From 43cfad250e7f81e2ebf050494161a3bf7cc733c2 Mon Sep 17 00:00:00 2001 From: Chi Trung Nguyen Date: Wed, 18 Nov 2015 12:42:42 +0100 Subject: [PATCH 0034/4996] Update Plugin Docs according to #4126 --- site/_docs/plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 7cd7c3f8087..a617f574dc3 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -32,10 +32,10 @@ Jekyll generates your site. values of the gem names of the plugins you'd like to use. An example: - gems: [jekyll-test-plugin, jekyll-jsonify, jekyll-assets] + gems: [jekyll-coffeescript, jekyll-watch, jekyll-assets] # This will require each of these gems automatically. - Then install your plugins using `gem install jekyll-test-plugin jekyll-jsonify jekyll-assets` + Then install your plugins using `gem install jekyll-coffeescript jekyll-watch jekyll-assets` 3. Add the relevant plugins to a Bundler group in your `Gemfile`. An example: From effe23a00896a2b91edaf873a5611ee165a0a3f0 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 24 Nov 2015 20:50:09 -0600 Subject: [PATCH 0035/4996] Update history.markdown to reflect the merger of #4154 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9977b65207e..c25fc45ef11 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * Add upgrading docs from 2.x to 3.x (#4157) * Add protect_email to the plugins index. (#4169) * Add `jekyll-deploy` to list of third-party plugins (#4179) + * Clarify plugin docs (#4154) ## 3.0.1 / 2015-11-17 From 657a8d7239533553571559aad954b40764e55b79 Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 25 Nov 2015 16:37:08 +0800 Subject: [PATCH 0036/4996] Allow users to input multiple variables in include tag --- features/include_tag.feature | 8 ++++++++ lib/jekyll/tags/include.rb | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/features/include_tag.feature b/features/include_tag.feature index cab01187df0..83ae379f8a0 100644 --- a/features/include_tag.feature +++ b/features/include_tag.feature @@ -89,3 +89,11 @@ Feature: Include tags Then I have an "_includes/one.html" file that contains "include content changed" When I run jekyll build Then I should see "include content changed" in "_site/index.html" + + Scenario: Include a file with multiple variables + Given I have an _includes directory + And I have an "_includes/header-en.html" file that contains "include" + And I have an "index.html" page that contains "{% assign name = 'header' %}{% assign locale = 'en' %}{% include {{name}}-{{locale}}.html %}" + When I run jekyll build + Then the _site directory should exist + And I should see "include" in "_site/index.html" diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 0e944407b59..2e39738e0aa 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -16,7 +16,7 @@ class IncludeTag < Liquid::Tag attr_reader :includes_dir VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/ - VARIABLE_SYNTAX = /(?[^{]*\{\{\s*(?[\w\-\.]+)\s*(\|.*)?\}\}[^\s}]*)(?.*)/ + VARIABLE_SYNTAX = /(?[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+)(?.*)/ def initialize(tag_name, markup, tokens) super From e60e5f35327944bd2198cc19b54d27a1dffc9479 Mon Sep 17 00:00:00 2001 From: Ducksan Cho Date: Wed, 25 Nov 2015 23:18:33 +1300 Subject: [PATCH 0037/4996] Allow quoted date in front matter defaults --- lib/jekyll/frontmatter_defaults.rb | 9 ++++++++- test/test_front_matter_defaults.rb | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index d6cb173f9c8..d6fba04f639 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -30,6 +30,13 @@ def update_deprecated_types(set) set end + def parse_quoted_date(set) + return set unless set.key?('values') && set['values'].key?('date') + return set if set['values']['date'].is_a?(Time) + set['values']['date'] = Utils.parse_date(set['values']['date'], "Front matter defaults does not have a valid date.") + set + end + # Finds a default value for a given setting, filtered by path and type # # path - the path (relative to the source) of the page, post or :draft the default is used in @@ -159,7 +166,7 @@ def valid_sets sets.map do |set| if valid?(set) - update_deprecated_types(set) + parse_quoted_date(update_deprecated_types(set)) else Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:" Jekyll.logger.warn "#{set}" diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index 99efedead2a..8eeed7f3ae0 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -175,4 +175,29 @@ class TestFrontMatterDefaults < JekyllUnitTest end end + context "A site with front matter defaults with quoted date" do + setup do + @site = Site.new(Jekyll.configuration({ + "source" => source_dir, + "destination" => dest_dir, + "defaults" => [{ + "values" => { + "date" => "2015-01-01 00:00:01" + } + }] + })) + end + + should "not raise error" do + @site.process + end + + should "parse date" do + @site.process + date = Time.parse("2015-01-01 00:00:01") + assert @site.pages.find { |page| page.data["date"] == date } + assert @site.posts.find { |page| page.data["date"] == date } + end + end + end From c159f19c7d92ca0f1b32f76f679e80dfc308173f Mon Sep 17 00:00:00 2001 From: Ducksan Cho Date: Thu, 26 Nov 2015 00:06:09 +1300 Subject: [PATCH 0038/4996] Rename destructive method with bang --- lib/jekyll/frontmatter_defaults.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index d6fba04f639..a37dcbe7df9 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -30,7 +30,7 @@ def update_deprecated_types(set) set end - def parse_quoted_date(set) + def ensure_time!(set) return set unless set.key?('values') && set['values'].key?('date') return set if set['values']['date'].is_a?(Time) set['values']['date'] = Utils.parse_date(set['values']['date'], "Front matter defaults does not have a valid date.") @@ -166,7 +166,7 @@ def valid_sets sets.map do |set| if valid?(set) - parse_quoted_date(update_deprecated_types(set)) + ensure_time!(update_deprecated_types(set)) else Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:" Jekyll.logger.warn "#{set}" From 918bfd5fe5f9f411869f3bfbbf81a478316f04b2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 Nov 2015 10:28:07 -0800 Subject: [PATCH 0039/4996] Update history to reflect merge of #4183 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c25fc45ef11..208ba7559bc 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,7 @@ * Cache parsed include file to save liquid parsing time. (#4120) * Slightly speed up url sanitization and handle multiples of ///. (#4168) * Print debug message when a document is skipped from reading (#4180) + * Include tag should accept multiple variables in the include name (#4183) ### Bug Fixes From 147a29302f01a431580e0b29c21788a07e93646d Mon Sep 17 00:00:00 2001 From: Nielsen Ramon Date: Thu, 26 Nov 2015 22:54:00 +0100 Subject: [PATCH 0040/4996] Add Kickster to deployment methods in documentation --- site/_docs/deployment-methods.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index c1040b2b780..03b13cf7953 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -190,3 +190,11 @@ for that](https://github.com/openshift-cartridges/openshift-jekyll-cartridge).
ProTip™: Use GitHub Pages for zero-hassle Jekyll hosting

GitHub Pages are powered by Jekyll behind the scenes, so if you’re looking for a zero-hassle, zero-cost solution, GitHub Pages are a great way to host your Jekyll-powered website for free.

+ +## Kickster + +Use [Kickster](http://kickster.nielsenramon.com/) for easy (automated) deploys to Github Pages when using unsupported plugins on Github Pages. + +Kickster provides a basic Jekyll project setup packed with web best practises and useful optimization tools increasing your overall project quality. Kickster ships with automated and worry-free deployment scripts for GitHub Pages. + +Setting up Kickster is very easy, just install the gem and you are good to go. More documentation can here found [here](https://github.com/nielsenramon/kickster#kickster). If you do not want to use the gem or start a new project you can just copy paste the deployment scripts for [Travis CI](https://github.com/nielsenramon/kickster/tree/master/snippets/travis) or [Circle CI](https://github.com/nielsenramon/kickster#automated-deployment-with-circle-ci). From face3985dc0e16f0d82d7e86123bf64a98af75ee Mon Sep 17 00:00:00 2001 From: Sasha Friedenberg Date: Sun, 15 Nov 2015 15:45:29 -0500 Subject: [PATCH 0041/4996] add "-o" option to serve command which opens server URL --- lib/jekyll/commands/serve.rb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 111d6709f7f..c26cd48da18 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -19,6 +19,7 @@ def init_with_program(prog) c.option 'host', '-H', '--host [HOST]', 'Host to bind to' c.option 'baseurl', '-b', '--baseurl [URL]', 'Base URL' c.option 'skip_initial_build', '--skip-initial-build', 'Skips the initial site build which occurs before the server is started.' + c.option 'open_url', '-o', '--open-url', 'Opens the local URL in your default browser' c.action do |args, options| options["serving"] = true @@ -45,7 +46,24 @@ def process(options) file_handler_options ) - Jekyll.logger.info "Server address:", server_address(s, options) + server_address_str = server_address(s, options) + Jekyll.logger.info "Server address:", server_address_str + + begin + command_name = "" + + if Utils::Platforms.windows? + command_name = "start" + elsif Utils::Platforms.osx? + command_name = "open" + elsif Utils::Platforms.linux? + command_name = "xdg-open" + end + + system("#{command_name} #{server_address_str}") + rescue + Jekyll.logger.info "Could not open URL, exception was thrown" + end if options['open_url'] if options['detach'] # detach the server pid = Process.fork { s.start } From 3e8f00a0690df8d7ac8aae4689dbd831dc227f24 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 28 Nov 2015 23:22:10 -0800 Subject: [PATCH 0042/4996] Update history to reflect merge of #4144 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 208ba7559bc..cd86d80ff70 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,7 @@ * Slightly speed up url sanitization and handle multiples of ///. (#4168) * Print debug message when a document is skipped from reading (#4180) * Include tag should accept multiple variables in the include name (#4183) + * Add `-o` option to serve command which opens server URL (#4144) ### Bug Fixes From 2a4aa0fdb1dfb234c9222c62b82a684358f15407 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 28 Nov 2015 23:25:34 -0800 Subject: [PATCH 0043/4996] Update history to reflect merge of #4190 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cd86d80ff70..e4b06a7de13 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Add protect_email to the plugins index. (#4169) * Add `jekyll-deploy` to list of third-party plugins (#4179) * Clarify plugin docs (#4154) + * Add Kickster to deployment methods in documentation (#4190) ## 3.0.1 / 2015-11-17 From c8edb1582071d24019bd0d9b3f8dc6b8875f3d4b Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 29 Nov 2015 21:22:27 -0600 Subject: [PATCH 0044/4996] Prevent shell injection when opening a URL. --- lib/jekyll/commands/serve.rb | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index c26cd48da18..389ae5a2cb1 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -46,24 +46,16 @@ def process(options) file_handler_options ) + server_address_str = server_address(s, options) Jekyll.logger.info "Server address:", server_address_str - begin - command_name = "" - - if Utils::Platforms.windows? - command_name = "start" - elsif Utils::Platforms.osx? - command_name = "open" - elsif Utils::Platforms.linux? - command_name = "xdg-open" - end - - system("#{command_name} #{server_address_str}") - rescue - Jekyll.logger.info "Could not open URL, exception was thrown" - end if options['open_url'] + if options["open_url"] + command = Utils::Platforms.windows?? "start" : Utils::Platforms.osx?? \ + "open" : "xdg-open" + + system command, server_address_str + end if options['detach'] # detach the server pid = Process.fork { s.start } From d100a685636b491d0df05e3ff3a8d53516edc7ad Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 29 Nov 2015 21:42:31 -0600 Subject: [PATCH 0045/4996] Update History.markdown --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e4b06a7de13..a5adb225fc6 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ * Pass build options into `clean` command (#4177) * Allow users to use .htm and .xhtml (XHTML5.) (#4160) + * Prevent Shell Injection. (#4200) ### Development Fixes From 47081736ef035e4fea5f216fc55968aab5b899af Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 30 Nov 2015 13:16:20 +0800 Subject: [PATCH 0046/4996] Update CSS to avoid it overlaps parent div --- site/_docs/deployment-methods.md | 4 ++-- site/_sass/_style.scss | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index 03b13cf7953..9dae4a1a2ae 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -116,9 +116,9 @@ That's why rrsync wrapper shall be installed. If it is not already installed by [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: -``` +{% highlight bash %} command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa -``` +{% endhighlight %} `````` is the path to your site. E.g., ```~/public_html/you.org/blog-html/```. diff --git a/site/_sass/_style.scss b/site/_sass/_style.scss index 5980d248b7c..f06ea77f36d 100644 --- a/site/_sass/_style.scss +++ b/site/_sass/_style.scss @@ -643,10 +643,14 @@ p > pre, p > code, p > nobr > code, li > code, +li> pre, h5 > code, .note > code { background-color: #2b2b2b; color: #fff; + max-width: 100%; + overflow-x: auto; + vertical-align: middle; @include border-radius(5px); @include box-shadow(inset 0 1px 10px rgba(0,0,0,.3), 0 1px 0 rgba(255,255,255,.1), From ac9fa413a5675ee73171e532c575145f7a59872b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 30 Nov 2015 14:34:01 -0800 Subject: [PATCH 0047/4996] Convertible should make layout data accessible via 'layout' Not via 'page'. Erroneous! Fixes #4117. --- lib/jekyll/convertible.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 121513955ba..016ff245d5b 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -210,7 +210,13 @@ def render_all_layouts(layouts, payload, info) while layout Jekyll.logger.debug "Rendering Layout:", path - payload = Utils.deep_merge_hashes(payload, {"content" => output, "page" => layout.data}) + payload = Utils.deep_merge_hashes( + payload, + { + "content" => output, + "layout" => layout.data + } + ) self.output = render_liquid(layout.content, payload, From 928f51ad249331d10c9be27c2d57b1c3b4705ebf Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 30 Nov 2015 19:56:08 -0800 Subject: [PATCH 0048/4996] Update history to reflect merge of #4205 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a5adb225fc6..e0f8c769b7f 100644 --- a/History.markdown +++ b/History.markdown @@ -13,6 +13,7 @@ * Pass build options into `clean` command (#4177) * Allow users to use .htm and .xhtml (XHTML5.) (#4160) * Prevent Shell Injection. (#4200) + * Convertible should make layout data accessible via `layout` instead of `page` (#4205) ### Development Fixes From c7eacbdfcd3c6be246091f08500aff0d9a2351cc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 30 Nov 2015 19:58:16 -0800 Subject: [PATCH 0049/4996] Update history to reflect merge of #4150 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e0f8c769b7f..1bef2ce6d5c 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ * Allow users to use .htm and .xhtml (XHTML5.) (#4160) * Prevent Shell Injection. (#4200) * Convertible should make layout data accessible via `layout` instead of `page` (#4205) + * Avoid using `Dir.glob` with absolute path to allow special characters in the path (#4150) ### Development Fixes From e5e5369cde15c027a59009849032354b727fe898 Mon Sep 17 00:00:00 2001 From: David Burela Date: Wed, 2 Dec 2015 15:23:11 +0800 Subject: [PATCH 0050/4996] Update windows.md Added a very quick guide on getting Jekyll up and running on Windows in the fastest way possible with just a few command prompt commands. --- site/_docs/windows.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/_docs/windows.md b/site/_docs/windows.md index a3e6b5f0677..5a1a0a56ffa 100644 --- a/site/_docs/windows.md +++ b/site/_docs/windows.md @@ -15,6 +15,8 @@ Julian Thilo has written up instructions to get The instructions were written for Ruby 2.0.0, but should work for later versions [prior to 2.2][hitimes-issue]. +Alternatively David Burela has written instructions on [how to install Jekyll via Chocolately with 3 command prompt entries](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/) + ## Encoding If you use UTF-8 encoding, make sure that no `BOM` header From 15fdc828210cda93ee16f10c8addb5164ec87d4e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 2 Dec 2015 10:51:04 -0800 Subject: [PATCH 0051/4996] Update history to reflect merge of #4210 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1bef2ce6d5c..242810a835c 100644 --- a/History.markdown +++ b/History.markdown @@ -29,6 +29,7 @@ * Add `jekyll-deploy` to list of third-party plugins (#4179) * Clarify plugin docs (#4154) * Add Kickster to deployment methods in documentation (#4190) + * Add DavidBurela's tutorial for Windows to Windows docs page (#4210) ## 3.0.1 / 2015-11-17 From a5be27b2226a3615a5a64fe6d9ef687ece0512a2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 2 Dec 2015 11:51:37 -0800 Subject: [PATCH 0052/4996] Update history to reflect merge of #4121 [ci skip] --- History.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 242810a835c..86d5582115c 100644 --- a/History.markdown +++ b/History.markdown @@ -25,11 +25,12 @@ * Add three plugins to directory (#4163) * Add upgrading docs from 2.x to 3.x (#4157) - * Add protect_email to the plugins index. (#4169) + * Add `protect_email` to the plugins index. (#4169) * Add `jekyll-deploy` to list of third-party plugins (#4179) * Clarify plugin docs (#4154) * Add Kickster to deployment methods in documentation (#4190) * Add DavidBurela's tutorial for Windows to Windows docs page (#4210) + * Change GitHub code block to highlight tag to avoid it overlaps parent div (#4121) ## 3.0.1 / 2015-11-17 From 3432fd2c2dcc1a367732e16404f5cd1fee895c43 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 3 Nov 2015 19:48:29 -0600 Subject: [PATCH 0053/4996] Modernize Kramdown for Markdown converter. --- Gemfile | 3 +- lib/jekyll/configuration.rb | 12 +- .../converters/markdown/kramdown_parser.rb | 87 ++++++++++--- lib/jekyll/utils.rb | 4 + test/helper.rb | 14 ++- test/test_kramdown.rb | 119 ++++++++++++------ 6 files changed, 169 insertions(+), 70 deletions(-) diff --git a/Gemfile b/Gemfile index 9b64809eca1..19548e81c35 100644 --- a/Gemfile +++ b/Gemfile @@ -18,8 +18,9 @@ group :test do gem 'jekyll_test_plugin_malicious' gem 'minitest-reporters' gem 'minitest-profile' - gem 'minitest' gem 'rspec-mocks' + gem 'minitest' + gem "nokogiri" if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") gem 'test-unit' diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index f57b3ae4853..a3e80c7ffc5 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -68,17 +68,7 @@ class Configuration < Hash 'footnote_nr' => 1, 'entity_output' => 'as_char', 'toc_levels' => '1..6', - 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo', - 'enable_coderay' => false, - - 'coderay' => { - 'coderay_wrap' => 'div', - 'coderay_line_numbers' => 'inline', - 'coderay_line_number_start' => 1, - 'coderay_tab_width' => 4, - 'coderay_bold_every' => 10, - 'coderay_css' => 'style' - } + 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo' } }] diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index 40dfa87eaea..d1fa7865cf7 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -1,33 +1,86 @@ +# Frozen-string-literal: true +# Encoding: utf-8 + module Jekyll module Converters class Markdown class KramdownParser + CODERAY_DEFAULTS = { + "css" => "style", + "bold_every" => 10, + "line_numbers" => "inline", + "line_number_start" => 1, + "tab_width" => 4, + "wrap" => "div" + } + def initialize(config) - require 'kramdown' - @config = config - # If kramdown supported highlighter enabled, use that - highlighter = @config['highlighter'] - if highlighter == 'rouge' || highlighter == 'coderay' - @config['kramdown']['syntax_highlighter'] ||= highlighter - end - rescue LoadError - STDERR.puts 'You are missing a library required for Markdown. Please run:' - STDERR.puts ' $ [sudo] gem install kramdown' - raise Errors::FatalException.new("Missing dependency: kramdown") + Jekyll::External.require_with_graceful_fail "kramdown" + @main_fallback_highlighter = config["highlighter"] || "rogue" + @config = config["kramdown"] || {} + setup + end + + # Setup and normalize the configuration: + # * Create Kramdown if it doesn't exist. + # * Set syntax_highlighter, detecting enable_coderay and merging highlighter if none. + # * Merge kramdown[coderay] into syntax_highlighter_opts stripping coderay_. + # * Make sure `syntax_highlighter_opts` exists. + + def setup + @config["syntax_highlighter"] ||= highlighter + @config["syntax_highlighter_opts"] ||= {} + @config["coderay"] ||= {} # XXX: Legacy. + modernize_coderay_config end def convert(content) - # Check for use of coderay - if @config['kramdown']['enable_coderay'] - %w[wrap line_numbers line_numbers_start tab_width bold_every css default_lang].each do |opt| - key = "coderay_#{opt}" - @config['kramdown'][key] = @config['kramdown']['coderay'][key] unless @config['kramdown'].key?(key) + Kramdown::Document.new(content, @config).to_html + end + + # config[kramdown][syntax_higlighter] > config[kramdown][enable_coderay] > config[highlighter] + # Where `enable_coderay` is now deprecated because Kramdown + # supports Rouge now too. + + private + def highlighter + @highlighter ||= begin + if highlighter = @config["syntax_highlighter"] then highlighter + elsif @config.key?("enable_coderay") && @config["enable_coderay"] + Jekyll.logger.warn "DEPRECATION: You are using 'enable_coderay', use syntax_highlighter: coderay." + "coderay" + else + @main_fallback_highlighter end end + end - Kramdown::Document.new(content, Utils.symbolize_hash_keys(@config['kramdown'])).to_html + private + def strip_coderay_prefix(hash) + hash.each_with_object({}) do |(key, val), hsh| + cleaned_key = key.gsub(/\Acoderay_/, "") + Jekyll.logger.warn "You are using '#{key}'. Normalizing to #{cleaned_key}." if key != cleaned_key + hsh[cleaned_key] = val + end end + # If our highlighter is CodeRay we go in to merge the CodeRay defaults + # with your "coderay" key if it's there, deprecating it in the + # process of you using it. + + private + def modernize_coderay_config + if highlighter == "coderay" + Jekyll.logger.warn "DEPRECATION: kramdown.coderay is deprecated use syntax_highlighter_opts." + @config["syntax_highlighter_opts"] = begin + strip_coderay_prefix( + @config["syntax_highlighter_opts"] \ + .merge(CODERAY_DEFAULTS) \ + .merge(@config["coderay"]) + ) + end + end + end end end end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 7d2490a6864..0b67911b803 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -8,6 +8,10 @@ module Utils extend self SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze + def strip_heredoc(str) + str.gsub(/^[ \t]{#{(str.scan(/^[ \t]*(?=\S)/).min || "").size}}/, "") + end + # Non-destructive version of deep_merge_hashes! See that method. # # Returns the merged hashes. diff --git a/test/helper.rb b/test/helper.rb index dc0217676d1..281f68715f6 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -11,13 +11,13 @@ def jruby? end end +require "nokogiri" require 'rubygems' require 'ostruct' require 'minitest/autorun' require 'minitest/reporters' require 'minitest/profile' require 'rspec/mocks' - require 'jekyll' Jekyll.logger = Logger.new(StringIO.new) @@ -51,15 +51,15 @@ def mocks_expect(*args) end def before_setup - ::RSpec::Mocks.setup + RSpec::Mocks.setup super end def after_teardown super - ::RSpec::Mocks.verify + RSpec::Mocks.verify ensure - ::RSpec::Mocks.teardown + RSpec::Mocks.teardown end def fixture_site(overrides = {}) @@ -120,4 +120,10 @@ def capture_output end alias_method :capture_stdout, :capture_output alias_method :capture_stderr, :capture_output + + def nokogiri_fragment(str) + Nokogiri::HTML.fragment( + str + ) + end end diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index b7f44925cc1..21ba5764ab1 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -8,65 +8,110 @@ class TestKramdown < JekyllUnitTest @config = { 'markdown' => 'kramdown', 'kramdown' => { - 'auto_ids' => false, - 'footnote_nr' => 1, + 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo', 'entity_output' => 'as_char', - 'toc_levels' => '1..6', - 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo', - - 'enable_coderay' => true, - 'coderay_bold_every'=> 12, - 'coderay' => { - 'coderay_css' => :style, - 'coderay_bold_every' => 8 + 'toc_levels' => '1..6', + 'auto_ids' => false, + 'footnote_nr' => 1, + + 'syntax_highlighter_opts' => { + 'bold_every' => 8, 'css' => :class } } } + @config = Jekyll.configuration(@config) - @markdown = Converters::Markdown.new(@config) + @markdown = Converters::Markdown.new( + @config + ) end - # http://kramdown.gettalong.org/converter/html.html#options - should "pass kramdown options" do + should "run Kramdown" do assert_equal "

Some Header

", @markdown.convert('# Some Header #').strip end - should "convert quotes to smart quotes" do - assert_match /

(“|“)Pit(’|’)hy(”|”)<\/p>/, @markdown.convert(%{"Pit'hy"}).strip + context "when asked to convert smart quotes" do + should "convert" do + assert_match %r!

(“|“)Pit(’|’)hy(”|”)<\/p>!, @markdown.convert(%{"Pit'hy"}).strip + end - override = { 'kramdown' => { 'smart_quotes' => 'lsaquo,rsaquo,laquo,raquo' } } - markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) - assert_match /

(«|«)Pit(›|›)hy(»|»)<\/p>/, markdown.convert(%{"Pit'hy"}).strip + should "support custom types" do + override = { + 'kramdown' => { + 'smart_quotes' => 'lsaquo,rsaquo,laquo,raquo' + } + } + + markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) + assert_match %r!

(«|«)Pit(›|›)hy(»|»)<\/p>!, \ + markdown.convert(%{"Pit'hy"}).strip + end end should "render fenced code blocks with syntax highlighting" do - assert_equal "

puts \"Hello world\"\n
\n
", @markdown.convert( - <<-EOS -~~~ruby -puts "Hello world" -~~~ - EOS - ).strip + result = nokogiri_fragment(@markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) + ~~~ruby + puts "Hello World" + ~~~ + MARKDOWN + + selector = "div.highlighter-rouge>pre.highlight>code" + refute result.css(selector).empty? end - context "moving up nested coderay options" do - setup do - @markdown.convert('some markup') - @converter_config = @markdown.instance_variable_get(:@config)['kramdown'] - end + context "when a custom highlighter is chosen" do + should "use the chosen highlighter if it's available" do + override = { "markdown" => "kramdown", "kramdown" => { "syntax_highlighter" => :coderay }} + markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) + result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) + ~~~ruby + puts "Hello World" + ~~~ + MARKDOWN - should "work correctly" do - assert_equal :style, @converter_config['coderay_css'] + selector = "div.highlighter-coderay>div.CodeRay>div.code>pre" + refute result.css(selector).empty? end - should "also work for defaults" do - default = Jekyll::Configuration::DEFAULTS['kramdown']['coderay']['coderay_tab_width'] - assert_equal default, @converter_config['coderay_tab_width'] + should "support legacy enable_coderay... for now" do + override = { + "markdown" => "kramdown", + "kramdown" => { + "syntax_highlighter" => nil, + "enable_coderay" => true + } + } + + markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) + result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) + ~~~ruby + puts "Hello World" + ~~~ + MARKDOWN + + selector = "div.highlighter-coderay>div.CodeRay>div.code>pre" + refute result.css(selector).empty? end + end - should "not overwrite" do - assert_equal 12, @converter_config['coderay_bold_every'] + should "move coderay to syntax_highlighter_opts" do + original = Kramdown::Document.method(:new) + markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, { + "markdown" => "kramdown", + "kramdown" => { + "syntax_highlighter" => "coderay", + "coderay" => { + "hello" => "world" + } + } + })) + + expect(Kramdown::Document).to receive(:new) do |arg1, hash| + assert_equal hash["syntax_highlighter_opts"]["hello"], "world" + original.call(arg1, hash) end + + markdown.convert("hello world") end end end From e331a372608393c32c2abab2d06b0e73ba02cb5b Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 4 Dec 2015 11:11:30 -0600 Subject: [PATCH 0054/4996] Fix #4202: Have Kramdown behave like Github. --- lib/jekyll/configuration.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index a3e80c7ffc5..c2e74eb2e40 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -65,10 +65,12 @@ class Configuration < Hash 'kramdown' => { 'auto_ids' => true, - 'footnote_nr' => 1, - 'entity_output' => 'as_char', 'toc_levels' => '1..6', - 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo' + 'entity_output' => 'as_char', + 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo', + 'input' => "GFM", + 'hard_wrap' => false, + 'footnote_nr' => 1 } }] From fe13c3b3664b475764f51afd468dd6ea24b0598c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 09:21:11 -0800 Subject: [PATCH 0055/4996] KramdownConverter: clean up some source with some unified methods --- Gemfile | 2 +- .../converters/markdown/kramdown_parser.rb | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Gemfile b/Gemfile index 19548e81c35..b1c118dde14 100644 --- a/Gemfile +++ b/Gemfile @@ -20,7 +20,7 @@ group :test do gem 'minitest-profile' gem 'rspec-mocks' gem 'minitest' - gem "nokogiri" + gem 'nokogiri' if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") gem 'test-unit' diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index d1fa7865cf7..05b94337e55 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -6,12 +6,12 @@ module Converters class Markdown class KramdownParser CODERAY_DEFAULTS = { - "css" => "style", - "bold_every" => 10, - "line_numbers" => "inline", + "css" => "style", + "bold_every" => 10, + "line_numbers" => "inline", "line_number_start" => 1, - "tab_width" => 4, - "wrap" => "div" + "tab_width" => 4, + "wrap" => "div" } def initialize(config) @@ -47,7 +47,7 @@ def highlighter @highlighter ||= begin if highlighter = @config["syntax_highlighter"] then highlighter elsif @config.key?("enable_coderay") && @config["enable_coderay"] - Jekyll.logger.warn "DEPRECATION: You are using 'enable_coderay', use syntax_highlighter: coderay." + Jekyll::Deprecator.deprecation_message "You are using 'enable_coderay', use syntax_highlighter: coderay in your configuration file." "coderay" else @main_fallback_highlighter @@ -59,7 +59,7 @@ def highlighter def strip_coderay_prefix(hash) hash.each_with_object({}) do |(key, val), hsh| cleaned_key = key.gsub(/\Acoderay_/, "") - Jekyll.logger.warn "You are using '#{key}'. Normalizing to #{cleaned_key}." if key != cleaned_key + Jekyll::Deprecator.deprecation_message "You are using '#{key}'. Normalizing to #{cleaned_key}." if key != cleaned_key hsh[cleaned_key] = val end end @@ -71,7 +71,7 @@ def strip_coderay_prefix(hash) private def modernize_coderay_config if highlighter == "coderay" - Jekyll.logger.warn "DEPRECATION: kramdown.coderay is deprecated use syntax_highlighter_opts." + Jekyll::Deprecator.deprecation_message "You are using 'kramdown.coderay' in your configuration, please use 'syntax_highlighter_opts' instead." @config["syntax_highlighter_opts"] = begin strip_coderay_prefix( @config["syntax_highlighter_opts"] \ From b78d5085f148e2794dba12546245ee5c2007ccb7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 09:21:43 -0800 Subject: [PATCH 0056/4996] Update history to reflect merge of #4109 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 86d5582115c..1346ab282f1 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * `jekyll-docs` should be easily release-able (#4152) * Allow use of Cucumber 2.1 or greater (#4181) + * Modernize Kramdown for Markdown converter. (#4109) ### Site Enhancements From 96bc62c666b598c3dc7df7e2ec8a9b22625ed0af Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 09:33:33 -0800 Subject: [PATCH 0057/4996] Add 'sample' Liquid filter Equivalent to Array#sample functionality --- lib/jekyll/filters.rb | 5 +++++ site/_docs/templates.md | 11 +++++++++++ test/test_filters.rb | 7 +++++++ 3 files changed, 23 insertions(+) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 7e2d30f3492..f3193f21462 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -281,6 +281,11 @@ def unshift(array, input) new_ary end + def sample(input) + return input unless input.respond_to?(:sample) + input.sample(1) + end + # Convert an object into its String representation for debugging # # input - The Object to be converted diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 58e06c94661..20a3a3f24bd 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -246,6 +246,17 @@ common tasks easier.

+ + +

Sample

+

Pick a random value from an array.

+ + +

+ {% raw %}{{ site.pages | sample }}{% endraw %} +

+ + diff --git a/test/test_filters.rb b/test/test_filters.rb index cf4db89b70d..59b882f12f6 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -388,5 +388,12 @@ def to_liquid end end + context "sample filter" do + should "return a random item from the array" do + input = %w(hey there bernie) + assert_includes input, @filter.sample(input) + end + end + end end From 86195655d798e4afcb888fa37787453e0d56ae23 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 09:40:57 -0800 Subject: [PATCH 0058/4996] filters: allow sample(n) instead of just sample(1) --- lib/jekyll/filters.rb | 4 ++-- site/_docs/templates.md | 5 ++++- test/test_filters.rb | 7 +++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index f3193f21462..70e93b90ea6 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -281,9 +281,9 @@ def unshift(array, input) new_ary end - def sample(input) + def sample(input, num = 1) return input unless input.respond_to?(:sample) - input.sample(1) + input.sample(num) end # Convert an object into its String representation for debugging diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 20a3a3f24bd..fd42b6b1625 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -249,12 +249,15 @@ common tasks easier.

Sample

-

Pick a random value from an array.

+

Pick a random value from an array. Optional: pick multiple values.

{% raw %}{{ site.pages | sample }}{% endraw %}

+

+ {% raw %}{{ site.pages | sample:2 }}{% endraw %} +

diff --git a/test/test_filters.rb b/test/test_filters.rb index 59b882f12f6..5fd9facb8b5 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -393,6 +393,13 @@ def to_liquid input = %w(hey there bernie) assert_includes input, @filter.sample(input) end + + should "allow sampling of multiple values (n > 1)" do + input = %w(hey there bernie) + @filter.sample(input, 2).each do |val| + assert_includes val, input + end + end end end From b6de905ee44d39eb25dd8eba06426d4fac74229b Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 4 Dec 2015 06:46:44 -0600 Subject: [PATCH 0059/4996] Fix: #4219: Add CodeClimate Platform. --- .codeclimate.yml | 46 +++++++++++++++++++++++++++ .gitignore | 1 + .rubocop.yml | 27 ++++++++++++++++ Rakefile | 37 ++++++++++++++++++++++ lib/jekyll/utils.rb | 1 + lib/jekyll/utils/ansi.rb | 59 +++++++++++++++++++++++++++++++++++ lib/jekyll/utils/platforms.rb | 3 +- test/test_ansi.rb | 23 ++++++++++++++ 8 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 .codeclimate.yml create mode 100644 .rubocop.yml create mode 100644 lib/jekyll/utils/ansi.rb create mode 100644 test/test_ansi.rb diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 00000000000..29ed62d0cda --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,46 @@ +engines: + rubocop: + enabled: true + checks: + Rubocop/Style/SpaceInsideBrackets: { enabled: false } + Rubocop/Style/BracesAroundHashParameters: { enabled: false} + Rubocop/Style/EmptyLinesAroundAccessModifier: { enabled: false } + Rubocop/Style/EmptyLinesAroundModuleBody: { enabled: false } + Rubocop/Lint/FormatParameterMismatch: { enabled: false } + Rubocop/Lint/UselessAccessModifier: { enabled: false } + Rubocop/Lint/AssignmentInCondition: { enabled: false } + Rubocop/Style/SpaceAroundOperators: { enabled: false } + Rubocop/Style/AlignParameters: { enabled: false } + Rubocop/Style/SignalException: { enabled: false } + Rubocop/Style/Documentation: { enabled: false } + Rubocop/Style/DoubleNegation: { enabled: false } + Rubocop/Style/UnneededCapitalW: { enabled: false } + Rubocop/Style/IfUnlessModifier: { enabled: false } + Rubocop/Style/RescueModifier: { enabled: false } + Rubocop/Style/RegexpLiteral: { enabled: false } + Rubocop/Style/GuardClause: { enabled: false } + Rubocop/Style/FileName: { enabled: false } + fixme: + enabled: false +exclude_paths: +- .rubocop.yml +- .codeclimate.yml +- .travis.yml +- .gitignore +- .rspec + +- Gemfile.lock +- CHANGELOG.md +- readme.md +- README.md +- Readme.md +- ReadMe.md +- COPYING +- LICENSE + +- test/**/* +- script/**/* +- spec/**/* +ratings: + paths: + - lib/**/* diff --git a/.gitignore b/.gitignore index d75a4982cd2..6441a147fd9 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ tmp/* .jekyll-metadata /vendor /test/source/file_name.txt +.analysis diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 00000000000..66b8552d634 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,27 @@ +Style/IndentHash: { EnforcedStyle: align_braces } +Style/StringLiteralsInInterpolation: { EnforcedStyle: double_quotes } +Style/StringLiterals: { EnforcedStyle: none } +Metrics/MethodLength: { Max: 24 } +Metrics/ClassLength: { Max: 240 } +Metrics/ModuleLength: { Max: 240 } +Metrics/LineLength: { Max: 112 } + +Style/HashSyntax: + UseHashRocketsWithSymbolValues: false + SupportedStyles: [ruby19 ruby19_no_mixed_keys, hash_rockets] + EnforcedStyle: ruby19 + +Style/MultilineOperationIndentation: + EnforcedStyle: indented + SupportedStyles: + - indented + +Style/PercentLiteralDelimiters: + PreferredDelimiters: + '%q': '{}' + '%Q': '{}' + '%r': '!!' + '%s': '()' + '%w': '()' + '%W': '()' + '%x': '()' diff --git a/Rakefile b/Rakefile index e189f0b947a..3596270ba20 100644 --- a/Rakefile +++ b/Rakefile @@ -329,3 +329,40 @@ namespace :docs do sh "mv #{docs_name}-#{version}.gem pkg" end end + +task :analysis do + require "jekyll/utils/ansi" + require "open3" + + cmd = [ + "docker", "run", "--rm", "--env=CODE_PATH=#{Dir.pwd}", \ + "--volume='#{Dir.pwd}:/code'", "--volume=/var/run/docker.sock:/var/run/docker.sock", \ + "--volume=/tmp/cc:/tmp/cc", "-i", "codeclimate/codeclimate", "analyze" + ] + + ansi = Jekyll::Utils::Ansi + file = File.open(".analysis", "w+") + Open3.popen3(cmd.shelljoin) do |_, out, err, _| + while data = out.gets + file.write data + if data =~ /\A==/ + $stdout.print ansi.yellow(data) + + elsif data !~ %r!\A[0-9\-]+! + $stdout.puts data + + else + h, d = data.split(":", 2) + $stdout.print ansi.cyan(h) + $stdout.print ":", d + end + end + + while data = err.gets + file.write data + $stderr.print ansi.red(data) + end + end + + file.close +end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 7d2490a6864..339c860a20f 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -1,6 +1,7 @@ module Jekyll module Utils extend self autoload :Platforms, 'jekyll/utils/platforms' + autoload :Ansi, "jekyll/utils/ansi" # Constants for use in #slugify SLUGIFY_MODES = %w{raw default pretty} diff --git a/lib/jekyll/utils/ansi.rb b/lib/jekyll/utils/ansi.rb new file mode 100644 index 00000000000..05f38429b3f --- /dev/null +++ b/lib/jekyll/utils/ansi.rb @@ -0,0 +1,59 @@ +# Frozen-string-literal: true +# Copyright: 2015 Jekyll - MIT License +# Encoding: utf-8 + +module Jekyll + module Utils + module Ansi + extend self + + ESCAPE = format("%c", 27) + MATCH = /#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m/ix.freeze + COLORS = { + :red => 31, + :green => 32, + :black => 30, + :magenta => 35, + :yellow => 33, + :white => 37, + :blue => 34, + :cyan => 36 + } + + # Strip ANSI from the current string. It also strips cursor stuff, + # well some of it, and it also strips some other stuff that a lot of + # the other ANSI strippers don't. + + def strip(str) + str.gsub MATCH, "" + end + + # + + def has?(str) + !!(str =~ MATCH) + end + + # Reset the color back to the default color so that you do not leak any + # colors when you move onto the next line. This is probably normally + # used as part of a wrapper so that we don't leak colors. + + def reset(str = "") + @ansi_reset ||= format("%c[0m", 27) + "#{@ansi_reset}#{str}" + end + + # SEE: `self::COLORS` for a list of methods. They are mostly + # standard base colors supported by pretty much any xterm-color, we do + # not need more than the base colors so we do not include them. + # Actually... if I'm honest we don't even need most of the + # base colors. + + COLORS.each do |color, num| + define_method color do |str| + "#{format("%c", 27)}[#{num}m#{str}#{reset}" + end + end + end + end +end diff --git a/lib/jekyll/utils/platforms.rb b/lib/jekyll/utils/platforms.rb index 83858a074a6..abc1598cb42 100644 --- a/lib/jekyll/utils/platforms.rb +++ b/lib/jekyll/utils/platforms.rb @@ -1,6 +1,7 @@ module Jekyll module Utils - module Platforms extend self + module Platforms + extend self # Provides jruby? and mri? which respectively detect these two types of # tested Engines we support, in the future we might probably support the diff --git a/test/test_ansi.rb b/test/test_ansi.rb new file mode 100644 index 00000000000..b209e23775c --- /dev/null +++ b/test/test_ansi.rb @@ -0,0 +1,23 @@ +require "helper" + +class TestAnsi < JekyllUnitTest + context nil do + setup do + @subject = Jekyll::Utils::Ansi + end + + Jekyll::Utils::Ansi::COLORS.each do |color, val| + should "respond_to? #{color}" do + assert @subject.respond_to?(color) + end + end + + should "be able to strip colors" do + assert_equal @subject.strip(@subject.yellow(@subject.red("hello"))), "hello" + end + + should "be able to detect colors" do + assert @subject.has?(@subject.yellow("hello")) + end + end +end From 0aa3c96d1150afe8a69332e5749a799cef89af2f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 09:59:00 -0800 Subject: [PATCH 0060/4996] travis: do NOT wait for branch builds for PR's. it just wastes time. --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 8026187c503..82e32e86566 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,9 @@ env: matrix: - TEST_SUITE=test - TEST_SUITE=cucumber +branches: + only: + - master before_script: bundle update script: script/cibuild notifications: From d10dc012908751f24836e65754177e4bbaaca65e Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 4 Dec 2015 12:09:06 -0600 Subject: [PATCH 0061/4996] Update History.markdown --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1346ab282f1..583784ae1e2 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * Print debug message when a document is skipped from reading (#4180) * Include tag should accept multiple variables in the include name (#4183) * Add `-o` option to serve command which opens server URL (#4144) + * Add CodeClimate platform for better code quality. (#4220) ### Bug Fixes From 2e91d094e5852ccb760010ede2e1062e6aff74a1 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 10:25:13 -0800 Subject: [PATCH 0062/4996] filters#sample: n == 1, return item; n > 1, return array --- lib/jekyll/filters.rb | 7 ++++++- test/test_filters.rb | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 70e93b90ea6..6efc2e9404a 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -283,7 +283,12 @@ def unshift(array, input) def sample(input, num = 1) return input unless input.respond_to?(:sample) - input.sample(num) + sampling = input.sample(num) + if num == 1 + sampling.first + else + sampling + end end # Convert an object into its String representation for debugging diff --git a/test/test_filters.rb b/test/test_filters.rb index 5fd9facb8b5..dc51252e68e 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -397,7 +397,7 @@ def to_liquid should "allow sampling of multiple values (n > 1)" do input = %w(hey there bernie) @filter.sample(input, 2).each do |val| - assert_includes val, input + assert_includes input, val end end end From a43d2907c788bb2e932a06a3b81906b958429335 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 10:48:25 -0800 Subject: [PATCH 0063/4996] travis: fast finish. don't wait for allowed failures to finish. JRUBY... --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 8026187c503..6c86836f800 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ rvm: - ruby-head - jruby-9.0.3.0 matrix: + fast_finish: true allow_failures: - rvm: ruby-head - rvm: jruby-9.0.3.0 From 8efbdc01ff27397d614eb2702d0916375a634f90 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 16 Jun 2015 20:15:18 -0500 Subject: [PATCH 0064/4996] Fix #3791/#3478 * Add support for SSL through command line switches. * Add suppport for file/index.html > file.html > directory. * Add support for custom-headers through configuration. * Modernize and split up the serve. * Add a few basic tests. --- lib/jekyll/commands/serve.rb | 261 +++++++++++++++------------ lib/jekyll/commands/serve/servlet.rb | 56 ++++++ site/_docs/configuration.md | 36 ++++ test/test_commands_serve.rb | 115 ++++++++++++ 4 files changed, 355 insertions(+), 113 deletions(-) create mode 100644 lib/jekyll/commands/serve/servlet.rb create mode 100644 test/test_commands_serve.rb diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 389ae5a2cb1..aa8fc6a882e 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -1,161 +1,196 @@ -# -*- encoding: utf-8 -*- module Jekyll module Commands class Serve < Command - class << self + COMMAND_OPTIONS = { + "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], + "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], + "open_url" => ["-o", "--open-url", "Launch your browser with your site."], + "detach" => ["-B", "--detach", "Run the server in the background (detach)"], + "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], + "port" => ["-P", "--port [PORT]", "Port to listen on"], + "baseurl" => ["-b", "--baseurl [URL]", "Base URL"], + "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", + "Skips the initial site build which occurs before the server is started."] + } + + # def init_with_program(prog) - prog.command(:serve) do |c| - c.syntax 'serve [options]' - c.description 'Serve your site locally' - c.alias :server - c.alias :s - - add_build_options(c) - - c.option 'detach', '-B', '--detach', 'Run the server in the background (detach)' - c.option 'port', '-P', '--port [PORT]', 'Port to listen on' - c.option 'host', '-H', '--host [HOST]', 'Host to bind to' - c.option 'baseurl', '-b', '--baseurl [URL]', 'Base URL' - c.option 'skip_initial_build', '--skip-initial-build', 'Skips the initial site build which occurs before the server is started.' - c.option 'open_url', '-o', '--open-url', 'Opens the local URL in your default browser' - - c.action do |args, options| - options["serving"] = true - options["watch"] = true unless options.key?("watch") - Jekyll::Commands::Build.process(options) - Jekyll::Commands::Serve.process(options) + prog.command(:serve) do |cmd| + cmd.description "Serve your site locally" + cmd.syntax "serve [options]" + cmd.alias :server + cmd.alias :s + + add_build_options(cmd) + COMMAND_OPTIONS.each do |key, val| + cmd.option key, *val + end + + cmd.action do |_, opts| + opts["serving"] = true + opts["watch" ] = true unless opts.key?("watch") + Build.process(opts) + Serve.process(opts) end end end - # Boot up a WEBrick server which points to the compiled site's root. - def process(options) - options = configuration_from_options(options) - destination = options['destination'] - setup(destination) - - s = WEBrick::HTTPServer.new(webrick_options(options)) - s.unmount("") - - s.mount( - options['baseurl'], - custom_file_handler, - destination, - file_handler_options - ) - + # - server_address_str = server_address(s, options) - Jekyll.logger.info "Server address:", server_address_str - - if options["open_url"] - command = Utils::Platforms.windows?? "start" : Utils::Platforms.osx?? \ - "open" : "xdg-open" - - system command, server_address_str - end + def process(opts) + opts = configuration_from_options(opts) + destination = opts["destination"] + setup(destination) - if options['detach'] # detach the server - pid = Process.fork { s.start } - Process.detach(pid) - Jekyll.logger.info "Server detached with pid '#{pid}'.", "Run `pkill -f jekyll' or `kill -9 #{pid}' to stop the server." - else # create a new server thread, then join it with current terminal - t = Thread.new { s.start } - trap("INT") { s.shutdown } - t.join - end + server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } + server.mount(opts["baseurl"], Servlet, destination, file_handler_opts) + Jekyll.logger.info "Server address:", server_address(server, opts) + launch_browser server, opts if opts["open_url"] + boot_or_detach server, opts end + # Do a base pre-setup of WEBRick so that everything is in place + # when we get ready to party, checking for an setting up an error page + # and making sure our destination exists. + + private def setup(destination) - require 'webrick' + require_relative "serve/servlet" FileUtils.mkdir_p(destination) - - # monkey patch WEBrick using custom 404 page (/404.html) - if File.exist?(File.join(destination, '404.html')) + if File.exist?(File.join(destination, "404.html")) WEBrick::HTTPResponse.class_eval do def create_error_page - @header['content-type'] = "text/html; charset=UTF-8" - @body = IO.read(File.join(@config[:DocumentRoot], '404.html')) + @header["Content-Type"] = "text/html; charset=UTF-8" + @body = IO.read(File.join(@config[:DocumentRoot], "404.html")) end end end end - def webrick_options(config) + # + + private + def webrick_opts(opts) opts = { - :BindAddress => config['host'], - :DirectoryIndex => %w(index.html index.htm index.cgi index.rhtml index.xml), - :DocumentRoot => config['destination'], + :JekyllOptions => opts, :DoNotReverseLookup => true, :MimeTypes => mime_types, - :Port => config['port'], - :StartCallback => start_callback(config['detach']) + :DocumentRoot => opts["destination"], + :StartCallback => start_callback(opts["detach"]), + :BindAddress => opts["host"], + :Port => opts["port"], + :DirectoryIndex => %W( + index.htm + index.html + index.rhtml + index.cgi + index.xml + ) } - if config['verbose'] - opts.merge!({ - :Logger => WEBrick::Log.new($stdout, WEBrick::Log::DEBUG) - }) + enable_ssl(opts) + enable_logging(opts) + opts + end + + # Recreate NondisclosureName under utf-8 circumstance + + private + def file_handler_opts + WEBrick::Config::FileHandler.merge({ + :FancyIndexing => true, + :NondisclosureName => [ + '.ht*','~*' + ] + }) + end + + # + + private + def server_address(server, opts) + address = server.config[:BindAddress] + baseurl = "#{opts["baseurl"]}/" if opts["baseurl"] + port = server.config[:Port] + + "http://#{address}:#{port}#{baseurl}" + end + + # + + private + def launch_browser(server, opts) + command = Utils::Platforms.windows?? "start" : Utils::Platforms.osx?? "open" : "xdg-open" + system command, server_address(server, opts) + end + + # Keep in our area with a thread or detach the server as requested + # by the user. This method determines what we do based on what you + # ask us to do. + + private + def boot_or_detach(server, opts) + if opts["detach"] + pid = Process.fork do + server.start + end + + Process.detach(pid) + Jekyll.logger.info "Server detached with pid '#{pid}'.", \ + "Run `pkill -f jekyll' or `kill -9 #{pid}' to stop the server." else - opts.merge!({ - :AccessLog => [], - :Logger => WEBrick::Log.new([], WEBrick::Log::WARN) - }) + t = Thread.new { server.start } + trap("INT") { server.shutdown } + t.join end + end - opts + # Make the stack verbose if the user requests it. + + private + def enable_logging(opts) + opts[:AccessLog] = [] + level = WEBrick::Log.const_get(opts[:JekyllOptions]["verbose"] ? :DEBUG : :WARN) + opts[:Logger] = WEBrick::Log.new($stdout, level) end - # Custom WEBrick FileHandler servlet for serving "/file.html" at "/file" - # when no exact match is found. This mirrors the behavior of GitHub - # Pages and many static web server configs. - def custom_file_handler - Class.new WEBrick::HTTPServlet::FileHandler do - def search_file(req, res, basename) - if file = super - file - else - super(req, res, "#{basename}.html") - end - end + # Add SSL to the stack if the user triggers --enable-ssl and they + # provide both types of certificates commonly needed. Raise if they + # forget to add one of the certificates. + + private + def enable_ssl(opts) + return if !opts[:JekyllOptions]["ssl_cert"] && !opts[:JekyllOptions]["ssl_key"] + if !opts[:JekyllOptions]["ssl_cert"] || !opts[:JekyllOptions]["ssl_key"] + raise RuntimeError, "--ssl-cert or --ssl-key missing." end + + require "openssl"; require "webrick/https" + source_key = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], opts[:JekyllOptions]["ssl_key" ]) + source_certificate = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], opts[:JekyllOptions]["ssl_cert"]) + opts[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.read(source_certificate)) + opts[:SSLPrivateKey ] = OpenSSL::PKey::RSA.new(File.read(source_key)) + opts[:EnableSSL] = true end + private def start_callback(detached) unless detached - Proc.new { Jekyll.logger.info "Server running...", "press ctrl-c to stop." } + proc do + Jekyll.logger.info("Server running...", "press ctrl-c to stop.") + end end end + private def mime_types - mime_types_file = File.expand_path('../mime.types', File.dirname(__FILE__)) - WEBrick::HTTPUtils::load_mime_types(mime_types_file) + file = File.expand_path('../mime.types', File.dirname(__FILE__)) + WEBrick::HTTPUtils.load_mime_types(file) end - - def server_address(server, options) - baseurl = "#{options['baseurl']}/" if options['baseurl'] - [ - "http://", - server.config[:BindAddress], - ":", - server.config[:Port], - baseurl || "" - ].map(&:to_s).join("") - end - - # recreate NondisclosureName under utf-8 circumstance - def file_handler_options - WEBrick::Config::FileHandler.merge({ - :FancyIndexing => true, - :NondisclosureName => ['.ht*','~*'] - }) - end - end - end end end diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb new file mode 100644 index 00000000000..4b11ad0da19 --- /dev/null +++ b/lib/jekyll/commands/serve/servlet.rb @@ -0,0 +1,56 @@ +require "webrick" + +module Jekyll + module Commands + class Serve + class Servlet < WEBrick::HTTPServlet::FileHandler + HEADER_DEFAULTS = {} + + def initialize(server, root, callbacks) + extract_headers(server.config[:JekyllOptions]) + super + end + + # + + def do_GET(req, res) + res.header.merge!(@headers) if @headers.any? + return super + end + + # --------------------------------------------------------------------- + # file > file/index.html > file.html > directory -> Having a directory + # with the same name as a file will result in the file being served the + # way that Nginx behaves (probably not exactly...) For browsing. + # --------------------------------------------------------------------- + + def search_file(req, res, basename) + return file if (file = super) || (file = super req, res, "#{basename}.html") + + file = "#{req.path.gsub(/\/\Z/, "")}.html" + if file && File.file?(File.join(@config[:DocumentRoot], file)) + return ".html" + end + nil + end + + def extract_headers(opts) + @headers = add_defaults(opts.fetch("webrick", {}).fetch("headers", {})) + end + + def add_defaults(opts) + control_development_cache(opts) + HEADER_DEFAULTS.each_with_object(opts) do |(k, v), h| + h[k] = v if !h[k] + end + end + + def control_development_cache(opts) + if !opts.has_key?("Cache-Control") && Jekyll.env == "development" + opts["Cache-Control"] = "private, max-age=0, proxy-revalidate, no-store, no-cache, must-revalidate" + end + end + end + end + end +end diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 2bb65e822f3..f6a71ed2bb1 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -352,6 +352,24 @@ before your site is served.

--skip-initial-build

+ + +

X.509 (SSL) Private Key

+

SSL Private Key.

+ + +

--ssl-key

+ + + + +

X.509 (SSL) Certificate

+

SSL Public certificate.

+ + +

--ssl-cert

+ + @@ -364,6 +382,24 @@ before your site is served.

+## Custom WEBRick Headers + +You can provide custom headers for your site by adding them to `_config.yml` + +{% highlight yaml %} +# File: _config.yml +webrick: + headers: + My-Header: My-Value + My-Other-Header: My-Other-Value +{% endhighlight %} + +### Defaults + +We only provide on default and that's a Content-Type header that disables +caching in development so that you don't have to fight with Chrome's aggressive +caching when you are in development mode. + ## Specifying a Jekyll environment at build time In the build (or serve) arguments, you can specify a Jekyll environment and value. The build will then apply this value in any conditional statements in your content. diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb new file mode 100644 index 00000000000..87472c3df06 --- /dev/null +++ b/test/test_commands_serve.rb @@ -0,0 +1,115 @@ +require "webrick" +require "mercenary" +require "helper" + +class TestCommandsServe < JekyllUnitTest + def custom_opts(what) + @cmd.send( + :webrick_opts, what + ) + end + + context "with a program" do + setup do + @merc, @cmd = nil, Jekyll::Commands::Serve + Mercenary.program(:jekyll) do |p| + @merc = @cmd.init_with_program( + p + ) + end + end + + should "label itself" do + assert_equal( + @merc.name, :serve + ) + end + + should "have aliases" do + assert_includes @merc.aliases, :s + assert_includes @merc.aliases, :server + end + + should "have a description" do + refute_nil( + @merc.description + ) + end + + should "have an action" do + refute_empty( + @merc.actions + ) + end + + should "not have an empty options set" do + refute_empty( + @merc.options + ) + end + + context "with custom options" do + should "create a default set of mimetypes" do + refute_nil custom_opts({})[ + :MimeTypes + ] + end + + should "use user destinations" do + assert_equal "foo", custom_opts({ "destination" => "foo" })[ + :DocumentRoot + ] + end + + should "use user port" do + # WHAT?!?!1 Over 9000? That's impossible. + assert_equal 9001, custom_opts( { "port" => 9001 })[ + :Port + ] + end + + context "verbose" do + should "debug when verbose" do + assert_equal custom_opts({ "verbose" => true })[:Logger].level, 5 + end + + should "warn when not verbose" do + assert_equal custom_opts({})[:Logger].level, 3 + end + end + + context "enabling ssl" do + should "raise if enabling without key or cert" do + assert_raises RuntimeError do + custom_opts({ + "ssl_key" => "foo" + }) + end + + assert_raises RuntimeError do + custom_opts({ + "ssl_key" => "foo" + }) + end + end + + should "allow SSL with a key and cert" do + expect(OpenSSL::PKey::RSA).to receive(:new).and_return("c2") + expect(OpenSSL::X509::Certificate).to receive(:new).and_return("c1") + allow(File).to receive(:read).and_return("foo") + + result = custom_opts({ + "ssl_cert" => "foo", + "source" => "bar", + "enable_ssl" => true, + "ssl_key" => "bar" + }) + + assert result[:EnableSSL] + assert_equal result[:SSLPrivateKey ], "c2" + assert_equal result[:SSLCertificate], "c1" + end + end + end + end +end From dd971a35814527df3cda0835508b14be0862c1bd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 13:16:40 -0800 Subject: [PATCH 0065/4996] Update history to reflect merge of #4224 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 583784ae1e2..2d4e3fa3290 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * Include tag should accept multiple variables in the include name (#4183) * Add `-o` option to serve command which opens server URL (#4144) * Add CodeClimate platform for better code quality. (#4220) + * General improvements for WEBrick via jekyll serve such as SSL & custom headers (#4224) ### Bug Fixes From 47d2a2459d0dbe07301f8d8fb5bbf142bf5eb2d2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 13:48:09 -0800 Subject: [PATCH 0066/4996] filters: refactor #sample to leave off the arg --- lib/jekyll/filters.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 6efc2e9404a..2b1bf1afbd8 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -283,11 +283,11 @@ def unshift(array, input) def sample(input, num = 1) return input unless input.respond_to?(:sample) - sampling = input.sample(num) - if num == 1 - sampling.first + n = num.to_i rescue 1 + if n == 1 + input.sample else - sampling + input.sample(n) end end From 79ceb4d394f77a42069c5d7cba6a7f4f10ef4716 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Dec 2015 14:12:59 -0800 Subject: [PATCH 0067/4996] Update history to reflect merge of #4223 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2d4e3fa3290..c87e220b2c1 100644 --- a/History.markdown +++ b/History.markdown @@ -2,6 +2,7 @@ ### Minor Enhancements + * Add 'sample' Liquid filter Equivalent to Array#sample functionality (#4223) * Cache parsed include file to save liquid parsing time. (#4120) * Slightly speed up url sanitization and handle multiples of ///. (#4168) * Print debug message when a document is skipped from reading (#4180) From 99042fa8702189bbdd664946f962d0141e64206c Mon Sep 17 00:00:00 2001 From: Ducksan Cho Date: Sat, 5 Dec 2015 16:21:50 +1300 Subject: [PATCH 0068/4996] Improve error message --- lib/jekyll/frontmatter_defaults.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index a37dcbe7df9..673d9a99f69 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -33,7 +33,7 @@ def update_deprecated_types(set) def ensure_time!(set) return set unless set.key?('values') && set['values'].key?('date') return set if set['values']['date'].is_a?(Time) - set['values']['date'] = Utils.parse_date(set['values']['date'], "Front matter defaults does not have a valid date.") + set['values']['date'] = Utils.parse_date(set['values']['date'], "An invalid date format was found in a front-matter default set: #{set}") set end From b63712e40312f85846da3ca34b52d3f1ac5db580 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 5 Dec 2015 04:48:51 -0600 Subject: [PATCH 0069/4996] Fix an edge where file is sometimes not returned properly. --- lib/jekyll/commands/serve/servlet.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 4b11ad0da19..cc6d958fbc6 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -18,24 +18,26 @@ def do_GET(req, res) return super end - # --------------------------------------------------------------------- # file > file/index.html > file.html > directory -> Having a directory - # with the same name as a file will result in the file being served the - # way that Nginx behaves (probably not exactly...) For browsing. - # --------------------------------------------------------------------- + # with the same name as a file will result in the file being served the way + # that Nginx behaves (probably not exactly...) For browsing. def search_file(req, res, basename) - return file if (file = super) || (file = super req, res, "#{basename}.html") + file = super || super(req, res, "#{basename}.html") + return file if file file = "#{req.path.gsub(/\/\Z/, "")}.html" if file && File.file?(File.join(@config[:DocumentRoot], file)) return ".html" end - nil + + nil end def extract_headers(opts) - @headers = add_defaults(opts.fetch("webrick", {}).fetch("headers", {})) + @headers = add_defaults(opts.fetch("webrick", {}).fetch("headers", { + # Nothing. + })) end def add_defaults(opts) From fdf12efde40c6f1696d58c7fa3c18e740d48afd9 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 5 Dec 2015 04:54:34 -0600 Subject: [PATCH 0070/4996] [CI:SKIP] Update history.markdown to reflect the merger of #4228 --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index c87e220b2c1..f5ad6291792 100644 --- a/History.markdown +++ b/History.markdown @@ -9,7 +9,7 @@ * Include tag should accept multiple variables in the include name (#4183) * Add `-o` option to serve command which opens server URL (#4144) * Add CodeClimate platform for better code quality. (#4220) - * General improvements for WEBrick via jekyll serve such as SSL & custom headers (#4224) + * General improvements for WEBrick via jekyll serve such as SSL & custom headers (#4224, #4228) ### Bug Fixes From 643ae6891271f9cfc481f9b42ecea890b2f9dcef Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 6 Dec 2015 20:33:53 -0600 Subject: [PATCH 0071/4996] Add a default charset to content-type on webrick. Add a default charset to content-type on webrick, using Jekyll's default encoding (or user set encoding) and cleanup servlet removing unecessary logic that really served no purpose at the end of the day, we don't need to strictly match Nginx, only be "like it." This also cleans up the way we set headers and merges that logic into a cleaner to understand interface that is slightly speedier. --- lib/jekyll/commands/serve/servlet.rb | 63 +++++++++++++++------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index cc6d958fbc6..fa376f6118d 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -4,52 +4,55 @@ module Jekyll module Commands class Serve class Servlet < WEBrick::HTTPServlet::FileHandler - HEADER_DEFAULTS = {} + DEFAULTS = { + "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ + "no-store, no-cache, must-revalidate" + } def initialize(server, root, callbacks) - extract_headers(server.config[:JekyllOptions]) + # So we can access them easily. + @jekyll_opts = server.config[:JekyllOptions] + set_defaults super end + # Add the ability to tap file.html the same way that Nginx does on our + # Docker images (or on Github pages.) The difference is that we might end + # up with a different preference on which comes first. + + def search_file(req, res, basename) + # /file.* > /file/index.html > /file.html + super || super(req, res, "#{basename}.html") + end + # def do_GET(req, res) - res.header.merge!(@headers) if @headers.any? - return super + rtn = super + validate_and_ensure_charset(req, res) + res.header.merge!(@headers) + rtn end - # file > file/index.html > file.html > directory -> Having a directory - # with the same name as a file will result in the file being served the way - # that Nginx behaves (probably not exactly...) For browsing. + # - def search_file(req, res, basename) - file = super || super(req, res, "#{basename}.html") + private + def validate_and_ensure_charset(req, res) + key = res.header.keys.grep(/content-type/i).first + typ = res.header[key] - return file if file - file = "#{req.path.gsub(/\/\Z/, "")}.html" - if file && File.file?(File.join(@config[:DocumentRoot], file)) - return ".html" + unless typ =~ /;\s*charset=/ + res.header[key] = "#{typ}; charset=#{@jekyll_opts["encoding"]}" end - - nil - end - - def extract_headers(opts) - @headers = add_defaults(opts.fetch("webrick", {}).fetch("headers", { - # Nothing. - })) end - def add_defaults(opts) - control_development_cache(opts) - HEADER_DEFAULTS.each_with_object(opts) do |(k, v), h| - h[k] = v if !h[k] - end - end + # - def control_development_cache(opts) - if !opts.has_key?("Cache-Control") && Jekyll.env == "development" - opts["Cache-Control"] = "private, max-age=0, proxy-revalidate, no-store, no-cache, must-revalidate" + private + def set_defaults + hash_ = @jekyll_opts.fetch("webrick", {}).fetch("headers", {}) + DEFAULTS.each_with_object(@headers = hash_) do |(key, val), hash| + hash[key] = val if !hash.key?(key) end end end From 915d8adb1b1cc71ef47e78b56d3b6daf8ba7dfbe Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Mon, 7 Dec 2015 11:37:37 -0600 Subject: [PATCH 0072/4996] [CI:SKIP] Update Gemnasium URL. --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index b1dfae4a494..d8c621d1910 100644 --- a/README.markdown +++ b/README.markdown @@ -3,7 +3,7 @@ [![Gem Version](https://img.shields.io/gem/v/jekyll.svg)](https://rubygems.org/gems/jekyll) [![Build Status](https://img.shields.io/travis/jekyll/jekyll/master.svg)](https://travis-ci.org/jekyll/jekyll) [![Code Climate](https://img.shields.io/codeclimate/github/jekyll/jekyll.svg)](https://codeclimate.com/github/jekyll/jekyll) -[![Dependency Status](https://img.shields.io/gemnasium/jekyll/jekyll.svg)](https://gemnasium.com/jekyll/jekyll) +[![Dependency Status](https://gemnasium.com/jekyll/jekyll.svg)](https://gemnasium.com/jekyll/jekyll) [![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)](https://hakiri.io/github/jekyll/jekyll/master) By Tom Preston-Werner, Nick Quaranto, Parker Moore, and many [awesome contributors](https://github.com/jekyll/jekyll/graphs/contributors)! From f4fa2e735e1499d1212e2ce42c8e3e475573ac2a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 7 Dec 2015 09:58:46 -0800 Subject: [PATCH 0073/4996] Update history to reflect merge of #4231 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f5ad6291792..ef9e8f03f10 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,7 @@ * Add `-o` option to serve command which opens server URL (#4144) * Add CodeClimate platform for better code quality. (#4220) * General improvements for WEBrick via jekyll serve such as SSL & custom headers (#4224, #4228) + * Add a default charset to content-type on webrick. (#4231) ### Bug Fixes From 0e89e80426cd854bafeea8b89dec76979f8847ca Mon Sep 17 00:00:00 2001 From: James Wen Date: Mon, 7 Dec 2015 09:56:17 -0500 Subject: [PATCH 0074/4996] Switch PluginManager to use require_with_graceful_fail * Add debug statement specifying current plugin to External#require_with_graceful_fail --- lib/jekyll/external.rb | 1 + lib/jekyll/plugin_manager.rb | 14 ++++---------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index e41bce27d17..04dbb6f2f01 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -39,6 +39,7 @@ def require_if_present(names) def require_with_graceful_fail(names) Array(names).each do |name| begin + Jekyll.logger.debug("Requiring #{name}") require name rescue LoadError => e Jekyll.logger.error "Dependency Error:", <<-MSG diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index bc541617255..11db89d1772 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -24,12 +24,7 @@ def conscientious_require # # Returns nothing. def require_gems - site.gems.each do |gem| - if plugin_allowed?(gem) - Jekyll.logger.debug("PluginManager:", "Requiring #{gem}") - require gem - end - end + Jekyll::External.require_with_graceful_fail(site.gems.select { |gem| plugin_allowed?(gem) }) end def self.require_from_bundler @@ -70,10 +65,9 @@ def whitelist # Returns nothing. def require_plugin_files unless site.safe - plugins_path.each do |plugins| - Dir[File.join(plugins, "**", "*.rb")].sort.each do |f| - require f - end + plugins_path.each do |plugin_search_path| + plugin_files = Utils.safe_glob(plugin_search_path, File.join("**", "*.rb")) + Jekyll::External.require_with_graceful_fail(plugin_files) end end end From eadbf2a711a75b5f794f9c0748033391de114a40 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 7 Dec 2015 22:11:43 -0800 Subject: [PATCH 0075/4996] Update history to reflect merge of #4233 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ef9e8f03f10..a598bdf851e 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Add CodeClimate platform for better code quality. (#4220) * General improvements for WEBrick via jekyll serve such as SSL & custom headers (#4224, #4228) * Add a default charset to content-type on webrick. (#4231) + * Switch `PluginManager` to use `require_with_graceful_fail` for better UX (#4233) ### Bug Fixes From c9ead955a41d7e890d958ff9c900ae2162967a0b Mon Sep 17 00:00:00 2001 From: Ben Orenstein Date: Wed, 9 Dec 2015 13:44:45 -0500 Subject: [PATCH 0076/4996] Link to less generic FormKeep page This link used to point to a generic landing page. Now it links to a guide written specifically for Jekyll users. --- site/_docs/resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/resources.md b/site/_docs/resources.md index 8ede6a68da0..aad76dc8696 100644 --- a/site/_docs/resources.md +++ b/site/_docs/resources.md @@ -12,7 +12,7 @@ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, ext Code example reuse, and keeping documentation up to date. -- [Use FormKeep for Jekyll form backend and webhooks](https://formkeep.com/) +- [Use FormKeep as a backend for forms (contact forms, hiring forms, etc.)](https://formkeep.com/guides/how-to-make-a-contact-form-in-jekyll) - [Use Simple Form to integrate a simple contact form](http://getsimpleform.com/) - [JekyllBootstrap.com](http://jekyllbootstrap.com) From 6a4c8a0b1c1052c261dad54839ce2e90c665bfaf Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 9 Dec 2015 11:14:01 -0800 Subject: [PATCH 0077/4996] Update history to reflect merge of #4243 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a598bdf851e..3f9622d7949 100644 --- a/History.markdown +++ b/History.markdown @@ -37,6 +37,7 @@ * Add Kickster to deployment methods in documentation (#4190) * Add DavidBurela's tutorial for Windows to Windows docs page (#4210) * Change GitHub code block to highlight tag to avoid it overlaps parent div (#4121) + * Update FormKeep link to be something more specific to Jekyll (#4243) ## 3.0.1 / 2015-11-17 From e8b1a8aa44dc1fe41d0cd24e05a472ef77f0125c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 9 Dec 2015 11:46:47 -0800 Subject: [PATCH 0078/4996] script/cibuild: fail if subprocesses fail --- script/cibuild | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/cibuild b/script/cibuild index afafd7d0990..d30fd36b7df 100755 --- a/script/cibuild +++ b/script/cibuild @@ -2,6 +2,8 @@ script/branding +set -e + if [[ -z "$TEST_SUITE" ]] then script/test ci From f97a48d970bddc716e3e4e03e72dfc91ba08dcb6 Mon Sep 17 00:00:00 2001 From: Ben Orenstein Date: Wed, 9 Dec 2015 16:28:25 -0500 Subject: [PATCH 0079/4996] Add utm params to link in docs https://github.com/jekyll/jekyll/pull/4243 updated this link to a jekyll-specific page. This commit adds utm params to the link so we can tell that users came to us from the Jekyll documentation. Among other things, this will help us provide better support to Jekyll users who sign up, since we'll know what site generator they're using. --- site/_docs/resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/resources.md b/site/_docs/resources.md index aad76dc8696..b414c90de0b 100644 --- a/site/_docs/resources.md +++ b/site/_docs/resources.md @@ -12,7 +12,7 @@ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, ext Code example reuse, and keeping documentation up to date. -- [Use FormKeep as a backend for forms (contact forms, hiring forms, etc.)](https://formkeep.com/guides/how-to-make-a-contact-form-in-jekyll) +- [Use FormKeep as a backend for forms (contact forms, hiring forms, etc.)](https://formkeep.com/guides/how-to-make-a-contact-form-in-jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=contact-form-jekyll) - [Use Simple Form to integrate a simple contact form](http://getsimpleform.com/) - [JekyllBootstrap.com](http://jekyllbootstrap.com) From 961c807c721e92a4f3e28cfcf656be213604f223 Mon Sep 17 00:00:00 2001 From: Conor O'Callaghan Date: Thu, 10 Dec 2015 17:24:17 +0000 Subject: [PATCH 0080/4996] Removed example Roger Chapman site Page not found for this demo site --- site/_docs/sites.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/site/_docs/sites.md b/site/_docs/sites.md index 42d0492148e..7eb6559f600 100644 --- a/site/_docs/sites.md +++ b/site/_docs/sites.md @@ -12,8 +12,6 @@ learning purposes. ([source](https://github.com/mojombo/mojombo.github.io)) - [Nick Quaranto](http://quaran.to/) ([source](https://github.com/qrush/qrush.github.com)) -- [Roger Chapman](http://rogchap.com/) - ([source](https://github.com/rogchap/rogchap.github.com)) - [GitHub Official Teaching Materials](http://training.github.com) ([source](https://github.com/github/training.github.com/tree/7049d7532a6856411e34046aedfce43a4afaf424)) - [Rasmus Andersson](http://rsms.me/) From fceddca1b25d4a40c0ab4418b1986adc0c0c2bb3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Dec 2015 11:11:13 -0800 Subject: [PATCH 0081/4996] Update history to reflect merge of #4249 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3f9622d7949..2a9ee75b986 100644 --- a/History.markdown +++ b/History.markdown @@ -38,6 +38,7 @@ * Add DavidBurela's tutorial for Windows to Windows docs page (#4210) * Change GitHub code block to highlight tag to avoid it overlaps parent div (#4121) * Update FormKeep link to be something more specific to Jekyll (#4243) + * Remove example Roger Chapman site, as the domain doesn't exist (#4249) ## 3.0.1 / 2015-11-17 From b79c17292141b81a688688517bca79fd7b112fb9 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 10 Dec 2015 15:02:24 -0600 Subject: [PATCH 0082/4996] E-Mail on test failure since I'm not often in IRC. --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bf5d2d4c076..58980f41c2f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,7 +33,9 @@ notifications: template: - "%{repository}#%{build_number} (%{branch}) %{message} %{build_url}" email: + recipients: + - jordon@envygeeks.io on_success: never - on_failure: never + on_failure: always slack: secure: dNdKk6nahNURIUbO3ULhA09/vTEQjK0fNbgjVjeYPEvROHgQBP1cIP3AJy8aWs8rl5Yyow4YGEilNRzKPz18AsFptVXofpwyqcBxaCfmHP809NX5PHBaadydveLm+TNVao2XeLXSWu+HUNAYO1AanCUbJSEyJTju347xCBGzESU= From ed41ff7774ba6882fc58a53487bd2c8a16dbd84b Mon Sep 17 00:00:00 2001 From: Mike Neumegen Date: Thu, 10 Dec 2015 13:40:53 -0800 Subject: [PATCH 0083/4996] Updated configuration docs Added configuration options for draft_posts to configuration docs. --- site/_docs/configuration.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index f6a71ed2bb1..ccff8f49c63 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -198,6 +198,7 @@ class="flag">flags (specified on the command-line) that control them.

Process and render draft posts.

+

show_drafts: BOOL

--drafts

From 29e721a804f2e0899e3ab4479d7a01949b937803 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Dec 2015 15:59:05 -0800 Subject: [PATCH 0084/4996] Update history to reflect merge of #4251 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2a9ee75b986..309b9a6c88b 100644 --- a/History.markdown +++ b/History.markdown @@ -39,6 +39,7 @@ * Change GitHub code block to highlight tag to avoid it overlaps parent div (#4121) * Update FormKeep link to be something more specific to Jekyll (#4243) * Remove example Roger Chapman site, as the domain doesn't exist (#4249) + * Added configuration options for `draft_posts` to configuration docs (#4251) ## 3.0.1 / 2015-11-17 From dfa3f8b33a6b74f9e240a4e81edb9aa23b8db32a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 11 Dec 2015 14:03:05 -0800 Subject: [PATCH 0085/4996] Update history to reflect merge of #4184 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 309b9a6c88b..1928439455b 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ * General improvements for WEBrick via jekyll serve such as SSL & custom headers (#4224, #4228) * Add a default charset to content-type on webrick. (#4231) * Switch `PluginManager` to use `require_with_graceful_fail` for better UX (#4233) + * Allow quoted date in front matter defaults (#4184) ### Bug Fixes From b94800361b4e3c507569e632a0ab017a834af273 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 11 Dec 2015 14:07:34 -0800 Subject: [PATCH 0086/4996] Collection: change missing_method message to be a bit clearer. Fixes #4234. Fixes #4199. --- lib/jekyll/collection.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 6cf3e99ba29..c4a1f456e2d 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -32,7 +32,7 @@ def respond_to?(method, include_private = false) # Override of method_missing to check in @data for the key. def method_missing(method, *args, &blck) if docs.respond_to?(method.to_sym) - Jekyll.logger.warn "Deprecation:", "Collection##{method} should be called on the #docs array directly." + Jekyll.logger.warn "Deprecation:", "#{label}.#{method} should be changed to #{label}.docs.#{method}." Jekyll.logger.warn "", "Called by #{caller.first}." docs.public_send(method.to_sym, *args, &blck) else From 9e5b1c9f6a338fae534e26c4c563d72e0792cc23 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 11 Dec 2015 14:11:40 -0800 Subject: [PATCH 0087/4996] Update history to reflect merge of #4052 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1928439455b..b6d01032993 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,7 @@ * Prevent Shell Injection. (#4200) * Convertible should make layout data accessible via `layout` instead of `page` (#4205) * Avoid using `Dir.glob` with absolute path to allow special characters in the path (#4150) + * Handle empty config files (#4052) ### Development Fixes From e61e93b48685bc4eb64868a5a523aed1d7151d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliv=C3=A9r=20Falvai?= Date: Sat, 12 Dec 2015 15:08:12 +0100 Subject: [PATCH 0088/4996] Added missing links to Pygments.rb and Rouge --- site/_docs/upgrading/2-to-3.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index 8bbadd99622..cdc69fd044b 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -64,8 +64,8 @@ then the layout can access that via `{% raw %}{{ layout.class }}{% endraw %}`. ### Syntax highlighter changed For the first time, the default syntax highlighter has changed for the -`highlight` tag and for backtick code blocks. Instead of [Pygments.rb][], -it's now [Rouge][]. If you were using the `highlight` tag with certain +`highlight` tag and for backtick code blocks. Instead of [Pygments.rb](https://github.com/tmm1/pygments.rb), +it's now [Rouge](http://rouge.jneen.net/). If you were using the `highlight` tag with certain options, such as `hl_lines`, they may not be available when using Rouge. To go back to using Pygments, set `highlighter: pygments` in your `_config.yml` file and run `gem install pygments.rb` or add From 05924bae5e22030b5b53eb505400f186026e5ce9 Mon Sep 17 00:00:00 2001 From: Dan K Date: Sun, 13 Dec 2015 16:52:35 +0300 Subject: [PATCH 0089/4996] Fix checklist in _assets.md --- site/_docs/assets.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/_docs/assets.md b/site/_docs/assets.md index 202ade0e58b..61d74a3264b 100644 --- a/site/_docs/assets.md +++ b/site/_docs/assets.md @@ -83,7 +83,8 @@ here, too. ## Coffeescript -To enable Coffeescript in Jekyll 3.0 and up you must +To enable Coffeescript in Jekyll 3.0 and up you must + * Install the `jekyll-coffeescript` gem * Ensure that your `_config.yml` is up-to-date and includes the following From 02b8e326edf727c1101630208facaf50e60ef69b Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 13 Dec 2015 08:09:44 -0600 Subject: [PATCH 0090/4996] [CI:SKIP] Update history.markdown to reflect the merger of #4259. --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b6d01032993..1f78cecb9c3 100644 --- a/History.markdown +++ b/History.markdown @@ -42,6 +42,7 @@ * Update FormKeep link to be something more specific to Jekyll (#4243) * Remove example Roger Chapman site, as the domain doesn't exist (#4249) * Added configuration options for `draft_posts` to configuration docs (#4251) + * Fix checklist in _assets.md (#4259) ## 3.0.1 / 2015-11-17 From 2c5a5e76ec40fd526d8cd56953cac50fe79f2014 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 13 Dec 2015 12:21:32 -0800 Subject: [PATCH 0091/4996] script/stackprof: allow CLI to set stackprof mode [ci skip] --- script/stackprof | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/script/stackprof b/script/stackprof index 3399616f272..1c8331429ae 100755 --- a/script/stackprof +++ b/script/stackprof @@ -2,15 +2,21 @@ set -e +case "$1" in + cpu|object) STACKPROF_MODE="$1"; shift ;; + *) STACKPROF_MODE="cpu" ;; +esac + export BENCHMARK=true command -v stackprof > /dev/null || script/bootstrap TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})" -PROF_OUTPUT_FILE=tmp/stackprof-$(date +%Y%m%d%H%M).dump +PROF_OUTPUT_FILE=tmp/stackprof-${STACKPROF_MODE}-$(date +%Y%m%d%H%M).dump +echo Stackprof Mode: $STACKPROF_MODE test -f "$PROF_OUTPUT_FILE" || { bundle exec ruby -r./lib/jekyll -rstackprof \ - -e "StackProf.run(mode: :cpu, interval: 100, out: '${PROF_OUTPUT_FILE}') { ${TEST_SCRIPT} }" + -e "StackProf.run(mode: :${STACKPROF_MODE}, interval: 100, out: '${PROF_OUTPUT_FILE}') { ${TEST_SCRIPT} }" } bundle exec stackprof $PROF_OUTPUT_FILE $@ From fb8bf7bab6ab76cdc669a6ac218cedc432cc7fed Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 13 Dec 2015 12:26:58 -0800 Subject: [PATCH 0092/4996] Update history to reflect merge of #3171 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1f78cecb9c3..92780830bc0 100644 --- a/History.markdown +++ b/History.markdown @@ -13,6 +13,7 @@ * Add a default charset to content-type on webrick. (#4231) * Switch `PluginManager` to use `require_with_graceful_fail` for better UX (#4233) * Allow quoted date in front matter defaults (#4184) + * Add a Jekyll doctor warning for URLs that only differ by case (#3171) ### Bug Fixes From 115926fd54041e85a4a1c49e6ebe06d61703bf7f Mon Sep 17 00:00:00 2001 From: Nick Quaranto Date: Mon, 14 Dec 2015 21:58:36 -0500 Subject: [PATCH 0093/4996] Change TestDoctorCommand to JekyllUnitTest since Test constant doesn't necessarily exist --- test/test_doctor_command.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_doctor_command.rb b/test/test_doctor_command.rb index 43fa602c7b0..eb33ec85fb7 100644 --- a/test/test_doctor_command.rb +++ b/test/test_doctor_command.rb @@ -1,7 +1,7 @@ require 'helper' require 'jekyll/commands/doctor' -class TestDoctorCommand < Test::Unit::TestCase +class TestDoctorCommand < JekyllUnitTest context 'urls only differ by case' do setup do clear_dest From 595ad56a7e36e68ef719d86409a96da8961cf63e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 14 Dec 2015 20:26:08 -0800 Subject: [PATCH 0094/4996] Update history to reflect merge of #4263 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 92780830bc0..dc030d1f22c 100644 --- a/History.markdown +++ b/History.markdown @@ -29,6 +29,7 @@ * `jekyll-docs` should be easily release-able (#4152) * Allow use of Cucumber 2.1 or greater (#4181) * Modernize Kramdown for Markdown converter. (#4109) + * Change TestDoctorCommand to JekyllUnitTest... (#4263) ### Site Enhancements From 645a2cc664ca39c672c5139a294515cec10be0d8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 14 Dec 2015 20:59:52 -0800 Subject: [PATCH 0095/4996] test/test_doctor_command.rb: fix test for Doctor.urls_only_differ_by_case --- test/test_doctor_command.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_doctor_command.rb b/test/test_doctor_command.rb index eb33ec85fb7..dee50ac210f 100644 --- a/test/test_doctor_command.rb +++ b/test/test_doctor_command.rb @@ -13,7 +13,7 @@ class TestDoctorCommand < JekyllUnitTest "destination" => dest_dir })) @site.process - output = capture_stderr do + output = capture_stderr do ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) assert_equal false, ret end @@ -26,11 +26,11 @@ class TestDoctorCommand < JekyllUnitTest "destination" => dest_dir })) @site.process - output = capture_stderr do + output = capture_stderr do ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) assert_equal true, ret end - assert_equal "\e[33m Warning: The following URLs only differ by case. On a case-insensitive file system one of the URLs will be overwritten by the other: #{dest_dir}/about/index.html, #{dest_dir}/About/index.html\e[0m\n", output + assert_includes output, "Warning: The following URLs only differ by case. On a case-insensitive file system one of the URLs will be overwritten by the other: #{dest_dir}/about/index.html, #{dest_dir}/About/index.html" end end end From 05285798be8c43b985f64ebd62854a176b36a0d5 Mon Sep 17 00:00:00 2001 From: Decider UI Date: Wed, 16 Dec 2015 16:54:27 -0800 Subject: [PATCH 0096/4996] site: remove preceding space before coffeescript installation steps list items Closes #4267 --- site/_docs/assets.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/assets.md b/site/_docs/assets.md index 61d74a3264b..66023147b87 100644 --- a/site/_docs/assets.md +++ b/site/_docs/assets.md @@ -85,8 +85,8 @@ here, too. To enable Coffeescript in Jekyll 3.0 and up you must - * Install the `jekyll-coffeescript` gem - * Ensure that your `_config.yml` is up-to-date and includes the following +* Install the `jekyll-coffeescript` gem +* Ensure that your `_config.yml` is up-to-date and includes the following {% highlight yaml %} gems: From 4c050bba652d7e68451ca8bcc902547ce05017f6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 18 Dec 2015 10:19:11 -0800 Subject: [PATCH 0097/4996] docs: posts example code is invalid UTF-8, use three dots instead of ellipsis Fixes #4271 --- site/_docs/posts.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/posts.md b/site/_docs/posts.md index ee02d06b0a0..f16bd2021cc 100644 --- a/site/_docs/posts.md +++ b/site/_docs/posts.md @@ -91,14 +91,14 @@ variable in a post. Including an image asset in a post: {% highlight text %} -… which is shown in the screenshot below: +... which is shown in the screenshot below: ![My helpful screenshot]({% raw %}{{ site.url }}{% endraw %}/assets/screenshot.jpg) {% endhighlight %} Linking to a PDF for readers to download: {% highlight text %} -… you can [get the PDF]({% raw %}{{ site.url }}{% endraw %}/assets/mydoc.pdf) directly. +... you can [get the PDF]({% raw %}{{ site.url }}{% endraw %}/assets/mydoc.pdf) directly. {% endhighlight %}
From 37517c9a39cece71a24225c666a0231d9089e97b Mon Sep 17 00:00:00 2001 From: midnightSuyama Date: Sun, 20 Dec 2015 03:02:24 +0900 Subject: [PATCH 0098/4996] Add jekyll-paginate-category to plugins.md --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 3fa1e4c3e5b..1ca2948a61f 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -736,6 +736,7 @@ LESS.js files during generation. - [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. - [Jekyll-Umlauts by Arne Gockeln](https://github.com/webchef/jekyll-umlauts): This generator replaces all german umlauts (äöüß) case sensitive with html. - [Jekyll Flickr Plugin](https://github.com/lawmurray/indii-jekyll-flickr) by [Lawrence Murray](http://www.indii.org): Generates posts for photos uploaded to a Flickr photostream. +- [Jekyll::Paginate::Category](https://github.com/midnightSuyama/jekyll-paginate-category): Pagination Generator for Jekyll Category. #### Converters From cc633543675758a02bb770843fc057707d66d0b3 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Mon, 21 Dec 2015 11:56:13 +0700 Subject: [PATCH 0099/4996] Adding markdown examples to Pages Fix for #3824 --- site/_docs/pages.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/site/_docs/pages.md b/site/_docs/pages.md index fa76a9fb1b1..3bb4af117a6 100644 --- a/site/_docs/pages.md +++ b/site/_docs/pages.md @@ -27,12 +27,14 @@ homepage of your Jekyll-generated site. ## Where additional pages live -Where you put HTML files for pages depends on how you want the pages to work. +Where you put HTML or [Markdown](http://daringfireball.net/projects/markdown/) +files for pages depends on how you want the pages to work. There are two main ways of creating pages: -- Place named HTML files for each page in your site's root folder. +- Place named HTML or [Markdown](http://daringfireball.net/projects/markdown/) +files for each page in your site's root folder. - Create a folder in the site's root for each page, and place an index.html -file in each page folder. +or index.md file in each page folder. Both methods work fine (and can be used in conjunction with each other), with the only real difference being the resulting URLs. @@ -53,6 +55,7 @@ and associated URLs might look like: |-- _site/ |-- about.html # => http://example.com/about.html |-- index.html # => http://example.com/ +|-- other.md # => http://example.com/other.html └── contact.html # => http://example.com/contact.html {% endhighlight %} @@ -77,6 +80,8 @@ might look like: | └── index.html # => http://example.com/about/ ├── contact/ | └── index.html # => http://example.com/contact/ +|── other/ +| └── index.md # => http://example.com/other.html └── index.html # => http://example.com/ {% endhighlight %} From fe5984ee153d3f1252b0ce5aec75d05a4d04abd0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 15 Dec 2015 00:01:35 -0800 Subject: [PATCH 0100/4996] History: move reference for #4173 to latest HEAD, not 3.0.1 --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index dc030d1f22c..9dd16cb0912 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * Convertible should make layout data accessible via `layout` instead of `page` (#4205) * Avoid using `Dir.glob` with absolute path to allow special characters in the path (#4150) * Handle empty config files (#4052) + * Rename `@options` so that it does not impact Liquid. (#4173) ### Development Fixes @@ -57,7 +58,6 @@ * Align hooks implementation with documentation (#4104) * Fix the deprecation warning in the doctor command (#4114) * Fix case in `:title` and add `:slug` which is downcased (#4100) - * Rename @options so that it does not impact Liquid. (#4173) ### Development Fixes From f92d6639e65a66a159c260e8b4068197b5e09e42 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 15 Dec 2015 00:01:56 -0800 Subject: [PATCH 0101/4996] Rakefile: alias :generate to :build --- Rakefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Rakefile b/Rakefile index 3596270ba20..02e105d5b7a 100644 --- a/Rakefile +++ b/Rakefile @@ -169,6 +169,7 @@ namespace :site do "destination" => File.expand_path("site/_site") }) end + task :build => :generate desc "Update normalize.css library to the latest version and minify" task :update_normalize_css do From 82c3ee365f5a8b948ce2ea853d75a954fa709939 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 21 Dec 2015 22:45:26 -0500 Subject: [PATCH 0102/4996] Initial work on using Liquid::Drops instead of Hashes. The properties of Liquid::Drops are only evaluated when they're asked for and therefore save computation time. This prevents a lot of GC time cleaning up objects that are not needed, because they're not created unless requested. Additionally, this saves time for actual computation of those values because they can be computed only if needed. It's funny how much it helps when you only do what is needed. Far less overhead. --- lib/jekyll.rb | 1 + lib/jekyll/collection.rb | 9 +--- lib/jekyll/convertible.rb | 15 +++---- lib/jekyll/document.rb | 42 +------------------ lib/jekyll/drops/collection_drop.rb | 22 ++++++++++ lib/jekyll/drops/document_drop.rb | 50 +++++++++++++++++++++++ lib/jekyll/drops/immutable_drop.rb | 29 +++++++++++++ lib/jekyll/drops/jekyll_drop.rb | 21 ++++++++++ lib/jekyll/drops/mutable_drop.rb | 28 +++++++++++++ lib/jekyll/drops/site_drop.rb | 38 +++++++++++++++++ lib/jekyll/drops/unified_payload_drop.rb | 24 +++++++++++ lib/jekyll/drops/url_drop.rb | 52 ++++++++++++++++++++++++ lib/jekyll/page.rb | 8 ++-- lib/jekyll/renderer.rb | 31 ++++++-------- lib/jekyll/site.rb | 20 +-------- lib/jekyll/url.rb | 14 +++++++ 16 files changed, 303 insertions(+), 101 deletions(-) create mode 100644 lib/jekyll/drops/collection_drop.rb create mode 100644 lib/jekyll/drops/document_drop.rb create mode 100644 lib/jekyll/drops/immutable_drop.rb create mode 100644 lib/jekyll/drops/jekyll_drop.rb create mode 100644 lib/jekyll/drops/mutable_drop.rb create mode 100644 lib/jekyll/drops/site_drop.rb create mode 100644 lib/jekyll/drops/unified_payload_drop.rb create mode 100644 lib/jekyll/drops/url_drop.rb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 3e8e639def0..a90a5a0bfe6 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -172,6 +172,7 @@ def sanitized_path(base_directory, questionable_path) require_all 'jekyll/commands' require_all 'jekyll/converters' require_all 'jekyll/converters/markdown' +require_all 'jekyll/drops' require_all 'jekyll/generators' require_all 'jekyll/tags' diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index c4a1f456e2d..f74ccf6f791 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -170,14 +170,7 @@ def sanitize_label(label) # # Returns a representation of this collection for use in Liquid. def to_liquid - metadata.merge({ - "label" => label, - "docs" => docs, - "files" => files, - "directory" => directory, - "output" => write?, - "relative_directory" => relative_directory - }) + Drops::CollectionDrop.new self end # Whether the collection's documents ought to be written as individual diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 016ff245d5b..db34307ab61 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -210,13 +210,8 @@ def render_all_layouts(layouts, payload, info) while layout Jekyll.logger.debug "Rendering Layout:", path - payload = Utils.deep_merge_hashes( - payload, - { - "content" => output, - "layout" => layout.data - } - ) + payload.content = output + payload.layout = layout.data self.output = render_liquid(layout.content, payload, @@ -250,11 +245,11 @@ def do_layout(payload, layouts) Jekyll.logger.debug "Pre-Render Hooks:", self.relative_path Jekyll::Hooks.trigger hook_owner, :pre_render, self, payload - info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload['page'] } } + info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload.page } } # render and transform content (this becomes the final content of the object) - payload["highlighter_prefix"] = converters.first.highlighter_prefix - payload["highlighter_suffix"] = converters.first.highlighter_suffix + payload.highlighter_prefix = converters.first.highlighter_prefix + payload.highlighter_suffix = converters.first.highlighter_suffix if render_with_liquid? Jekyll.logger.debug "Rendering Liquid:", self.relative_path diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 528fed6845f..622f1180ddd 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -38,12 +38,10 @@ def initialize(path, relations) end def output=(output) - @to_liquid = nil @output = output end def content=(content) - @to_liquid = nil @content = content end @@ -181,27 +179,7 @@ def url_template # # Returns the Hash of key-value pairs for replacement in the URL. def url_placeholders - { - collection: collection.label, - path: cleaned_relative_path, - output_ext: output_ext, - name: Utils.slugify(basename_without_ext), - title: Utils.slugify(data['slug'], mode: "pretty", cased: true) || Utils - .slugify(basename_without_ext, mode: "pretty", cased: true), - slug: Utils.slugify(data['slug']) || Utils.slugify(basename_without_ext), - year: date.strftime("%Y"), - month: date.strftime("%m"), - day: date.strftime("%d"), - hour: date.strftime("%H"), - minute: date.strftime("%M"), - second: date.strftime("%S"), - i_day: date.strftime("%-d"), - i_month: date.strftime("%-m"), - categories: (data['categories'] || []).map { |c| c.to_s.downcase }.uniq.join('/'), - short_month: date.strftime("%b"), - short_year: date.strftime("%y"), - y_day: date.strftime("%j"), - } + @url_placeholders ||= Drops::UrlDrop.new(self) end # The permalink for this Document. @@ -278,8 +256,6 @@ def published? # # Returns nothing. def read(opts = {}) - @to_liquid = nil - Jekyll.logger.debug "Reading:", relative_path if yaml_file? @@ -353,21 +329,7 @@ def populate_tags # # Returns a Hash representing this Document's data. def to_liquid - @to_liquid ||= if data.is_a?(Hash) - Utils.deep_merge_hashes Utils.deep_merge_hashes({ - "output" => output, - "content" => content, - "relative_path" => relative_path, - "path" => relative_path, - "url" => url, - "collection" => collection.label, - "next" => next_doc, - "previous" => previous_doc, - "id" => id, - }, data), { 'excerpt' => data['excerpt'].to_s } - else - data - end + @to_liquid ||= Drops::DocumentDrop.new(self) end # The inspect string for this document. diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb new file mode 100644 index 00000000000..30c9f8657b9 --- /dev/null +++ b/lib/jekyll/drops/collection_drop.rb @@ -0,0 +1,22 @@ +# encoding: UTF-8 +require "jekyll/drops/immutable_drop" + +module Jekyll + module Drops + class CollectionDrop < ImmutableDrop + extend Forwardable + + def_delegators :@obj, :label, :docs, :files, :directory, :relative_directory + + def output + @obj.write? + end + + private + def data + @obj.metadata + end + + end + end +end diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb new file mode 100644 index 00000000000..4d7207d5f13 --- /dev/null +++ b/lib/jekyll/drops/document_drop.rb @@ -0,0 +1,50 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class DocumentDrop < ImmutableDrop + + def output + @obj.output + end + + def content + @obj.content + end + + def relative_path + @obj.relative_path + end + alias_method :path, :relative_path + + def url + @obj.url + end + + def collection + @obj.collection.label + end + + def next + @obj.next_doc + end + + def previous + @obj.previous_doc + end + + def id + @obj.id + end + + def excerpt + data['excerpt'].to_s + end + + def data + @obj.data + end + + end + end +end diff --git a/lib/jekyll/drops/immutable_drop.rb b/lib/jekyll/drops/immutable_drop.rb new file mode 100644 index 00000000000..51257cff7cb --- /dev/null +++ b/lib/jekyll/drops/immutable_drop.rb @@ -0,0 +1,29 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class ImmutableDrop < Liquid::Drop + + def initialize(obj) + @obj = obj + end + + def [](key) + if respond_to? key + public_send key + else + data[key] + end + end + + def []=(key, val) + if respond_to? key + raise ArgumentError.new("Key #{key} cannot be set in the drop.") + else + data[key] = val + end + end + + end + end +end diff --git a/lib/jekyll/drops/jekyll_drop.rb b/lib/jekyll/drops/jekyll_drop.rb new file mode 100644 index 00000000000..c4009da01bb --- /dev/null +++ b/lib/jekyll/drops/jekyll_drop.rb @@ -0,0 +1,21 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class JekyllDrop < Liquid::Drop + class << self + def global + @global ||= JekyllDrop.new + end + end + + def version + Jekyll::VERSION + end + + def environment + Jekyll.env + end + end + end +end diff --git a/lib/jekyll/drops/mutable_drop.rb b/lib/jekyll/drops/mutable_drop.rb new file mode 100644 index 00000000000..1551728e24f --- /dev/null +++ b/lib/jekyll/drops/mutable_drop.rb @@ -0,0 +1,28 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class MutableDrop < Liquid::Drop + + def initialize(obj) + @obj = obj + @mutations = {} + end + + def [](key) + if @mutations.key? key + @mutations[key] + elsif respond_to? key + public_send key + else + data[key] + end + end + + def []=(key, val) + @mutations[key] = val + end + + end + end +end diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb new file mode 100644 index 00000000000..77d6a4162e8 --- /dev/null +++ b/lib/jekyll/drops/site_drop.rb @@ -0,0 +1,38 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class SiteDrop < ImmutableDrop + extend Forwardable + + def_delegator :@obj, :site_data, :data + def_delegators :@obj, :time, :pages, :static_files, :documents + + def posts + @site_posts ||= @obj.posts.docs.sort { |a, b| b <=> a } + end + + def html_pages + @site_html_pages ||= @obj.pages.select { |page| page.html? || page.url.end_with?("/") } + end + + def categories + @site_categories ||= @obj.post_attr_hash('categories') + end + + def tags + @site_tags ||= @obj.post_attr_hash('tags') + end + + def collections + @site_collections ||= @obj.collections.values.map(&:to_liquid) + end + + private + def data + @obj.config + end + + end + end +end diff --git a/lib/jekyll/drops/unified_payload_drop.rb b/lib/jekyll/drops/unified_payload_drop.rb new file mode 100644 index 00000000000..65733b20bd2 --- /dev/null +++ b/lib/jekyll/drops/unified_payload_drop.rb @@ -0,0 +1,24 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class UnifiedPayloadDrop < Liquid::Drop + + attr_accessor :page, :layout, :content, :paginator + attr_accessor :highlighter_prefix, :highlighter_suffix + + def initialize(site) + @site = site + end + + def jekyll + JekyllDrop.global + end + + def site + @site_drop ||= SiteDrop.new(@site) + end + + end + end +end diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb new file mode 100644 index 00000000000..047acacf6a2 --- /dev/null +++ b/lib/jekyll/drops/url_drop.rb @@ -0,0 +1,52 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class UrlDrop < ImmutableDrop + def collection + @obj.collection.label + end + + def path + @obj.cleaned_relative_path + end + + def output_ext + @obj.output_ext + end + + def name + Utils.slugify(@obj.basename_without_ext) + end + + def title + Utils.slugify(@obj.data['slug'], mode: "pretty", cased: true) || + Utils.slugify(@obj.basename_without_ext, mode: "pretty", cased: true) + end + + def slug + Utils.slugify(@obj.data['slug']) || Utils.slugify(@obj.basename_without_ext) + end + + def categories + category_set = Set.new + Array(@obj.data['categories']).each do |category| + category_set << category.to_s.downcase + end + category_set.to_a.join('/') + end + + def year; @obj.date.strftime("%Y"); end + def month; @obj.date.strftime("%m"); end + def day; @obj.date.strftime("%d"); end + def hour; @obj.date.strftime("%H"); end + def minute; @obj.date.strftime("%M"); end + def second; @obj.date.strftime("%S"); end + def i_day; @obj.date.strftime("%-d"); end + def i_month; @obj.date.strftime("%-m"); end + def short_month; @obj.date.strftime("%b"); end + def short_year; @obj.date.strftime("%y"); end + def y_day; @obj.date.strftime("%j"); end + end + end +end diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index a62a99402bd..0644e1b650e 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -117,12 +117,10 @@ def process(name) # # Returns nothing. def render(layouts, site_payload) - payload = Utils.deep_merge_hashes({ - "page" => to_liquid, - 'paginator' => pager.to_liquid - }, site_payload) + site_payload.page = to_liquid + site_payload.paginator = pager.to_liquid - do_layout(payload, layouts) + do_layout(site_payload, layouts) end # The path to the source file diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 529ff84bd68..09763cca529 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -3,12 +3,12 @@ module Jekyll class Renderer - attr_reader :document, :site, :site_payload + attr_reader :document, :site, :payload def initialize(site, document, site_payload = nil) - @site = site - @document = document - @site_payload = site_payload + @site = site + @document = document + @payload = site_payload || site.site_payload end # Determine which converters to use based on this document's @@ -33,12 +33,10 @@ def output_ext def run Jekyll.logger.debug "Rendering:", document.relative_path - payload = Utils.deep_merge_hashes({ - "page" => document.to_liquid - }, site_payload || site.site_payload) + payload.page = document.to_liquid if document.collection.label == 'posts' && document.is_a?(Document) - payload['site']['related_posts'] = document.related_posts + payload.site['related_posts'] = document.related_posts end Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path @@ -46,12 +44,12 @@ def run info = { filters: [Jekyll::Filters], - registers: { :site => site, :page => payload['page'] } + registers: { :site => site, :page => payload.page } } # render and transform content (this becomes the final content of the object) - payload["highlighter_prefix"] = converters.first.highlighter_prefix - payload["highlighter_suffix"] = converters.first.highlighter_suffix + payload.highlighter_prefix = converters.first.highlighter_prefix + payload.highlighter_suffix = converters.first.highlighter_suffix output = document.content @@ -135,14 +133,9 @@ def place_in_layouts(content, payload, info) used = Set.new([layout]) while layout - payload = Utils.deep_merge_hashes( - payload, - { - "content" => output, - "page" => document.to_liquid, - "layout" => layout.data - } - ) + payload.content = output + payload.page = document.to_liquid + payload.layout = layout.data output = render_liquid( layout.content, diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 5e9402f4dbb..4dc3ac847e6 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -259,25 +259,7 @@ def site_data # "tags" - The Hash of tag values and Posts. # See Site#post_attr_hash for type info. def site_payload - { - "jekyll" => { - "version" => Jekyll::VERSION, - "environment" => Jekyll.env - }, - "site" => Utils.deep_merge_hashes(config, - Utils.deep_merge_hashes(Hash[collections.map{|label, coll| [label, coll.docs]}], { - "time" => time, - "posts" => posts.docs.sort { |a, b| b <=> a }, - "pages" => pages, - "static_files" => static_files, - "html_pages" => pages.select { |page| page.html? || page.url.end_with?("/") }, - "categories" => post_attr_hash('categories'), - "tags" => post_attr_hash('tags'), - "collections" => collections.values.map(&:to_liquid), - "documents" => documents, - "data" => site_data - })) - } + Drops::UnifiedPayloadDrop.new self end # Get the implementation class for the given Converter. diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 6e8042b01d9..b338c23a7b2 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -59,6 +59,14 @@ def generated_url # # Returns the unsanitized String URL def generate_url(template) + if @placeholders.is_a? Drops::UrlDrop + generate_url_from_drop(template) + else + generate_url_from_hash(template) + end + end + + def generate_url_from_hash(template) @placeholders.inject(template) do |result, token| break result if result.index(':').nil? if token.last.nil? @@ -70,6 +78,12 @@ def generate_url(template) end end + def generate_url_from_drop(template) + template.gsub(/(:[a-z_]+)/) do |match| + @placeholders.public_send(match.sub(':', '')) + end.gsub(/\/\//, '/') + end + # Returns a sanitized String URL, stripping "../../" and multiples of "/", # as well as the beginning "/" so we can enforce and ensure it. From b9721024be69150312dfe7bdbced1553009090d5 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Tue, 22 Dec 2015 11:33:25 +0700 Subject: [PATCH 0103/4996] URL fix up --- site/_docs/pages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/pages.md b/site/_docs/pages.md index 3bb4af117a6..2299c83c8dd 100644 --- a/site/_docs/pages.md +++ b/site/_docs/pages.md @@ -81,7 +81,7 @@ might look like: ├── contact/ | └── index.html # => http://example.com/contact/ |── other/ -| └── index.md # => http://example.com/other.html +| └── index.md # => http://example.com/other/ └── index.html # => http://example.com/ {% endhighlight %} From ebe3c106047f5843f354c8b88a640a146bd1df2d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 21 Dec 2015 23:33:33 -0500 Subject: [PATCH 0104/4996] Drops: fix accessing of site collections via site.COL_NAME --- lib/jekyll/drops/collection_drop.rb | 2 +- lib/jekyll/drops/document_drop.rb | 5 +++-- lib/jekyll/drops/immutable_drop.rb | 4 ++-- lib/jekyll/drops/mutable_drop.rb | 2 +- lib/jekyll/drops/site_drop.rb | 10 +++++++++- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb index 30c9f8657b9..2c447cb45aa 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -13,7 +13,7 @@ def output end private - def data + def fallback_data @obj.metadata end diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index 4d7207d5f13..9319424b644 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -38,10 +38,11 @@ def id end def excerpt - data['excerpt'].to_s + fallback_data['excerpt'].to_s end - def data + private + def fallback_data @obj.data end diff --git a/lib/jekyll/drops/immutable_drop.rb b/lib/jekyll/drops/immutable_drop.rb index 51257cff7cb..d7948bebffa 100644 --- a/lib/jekyll/drops/immutable_drop.rb +++ b/lib/jekyll/drops/immutable_drop.rb @@ -12,7 +12,7 @@ def [](key) if respond_to? key public_send key else - data[key] + fallback_data[key] end end @@ -20,7 +20,7 @@ def []=(key, val) if respond_to? key raise ArgumentError.new("Key #{key} cannot be set in the drop.") else - data[key] = val + fallback_data[key] = val end end diff --git a/lib/jekyll/drops/mutable_drop.rb b/lib/jekyll/drops/mutable_drop.rb index 1551728e24f..9dd4048dfd9 100644 --- a/lib/jekyll/drops/mutable_drop.rb +++ b/lib/jekyll/drops/mutable_drop.rb @@ -15,7 +15,7 @@ def [](key) elsif respond_to? key public_send key else - data[key] + fallback_data[key] end end diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index 77d6a4162e8..82c552307a7 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -8,6 +8,14 @@ class SiteDrop < ImmutableDrop def_delegator :@obj, :site_data, :data def_delegators :@obj, :time, :pages, :static_files, :documents + def [](key) + if !respond_to?(key) && @obj.collections.key?(key) + @obj.collections[key].docs + else + super(key) + end + end + def posts @site_posts ||= @obj.posts.docs.sort { |a, b| b <=> a } end @@ -29,7 +37,7 @@ def collections end private - def data + def fallback_data @obj.config end From 03488b1cde735eaac9a75a64cc155324f4167e64 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 21 Dec 2015 23:36:31 -0500 Subject: [PATCH 0105/4996] DocumentDrop: use def_delegators instead of duplicating methods --- lib/jekyll/drops/document_drop.rb | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index 9319424b644..c4170d86dad 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -3,18 +3,10 @@ module Jekyll module Drops class DocumentDrop < ImmutableDrop + extend Forwardable - def output - @obj.output - end - - def content - @obj.content - end + def_delegators :@obj, :id, :output, :content, :to_s, :relative_path, :url - def relative_path - @obj.relative_path - end alias_method :path, :relative_path def url @@ -33,10 +25,6 @@ def previous @obj.previous_doc end - def id - @obj.id - end - def excerpt fallback_data['excerpt'].to_s end From 4935e85f7cd1f09cefbe9988fd0e52eeb49d6f9a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 21 Dec 2015 23:41:36 -0500 Subject: [PATCH 0106/4996] CollectionDrop: to_s should work like Array#to_s --- lib/jekyll/drops/collection_drop.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb index 2c447cb45aa..8dc8c6b8233 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -6,7 +6,12 @@ module Drops class CollectionDrop < ImmutableDrop extend Forwardable - def_delegators :@obj, :label, :docs, :files, :directory, :relative_directory + def_delegators :@obj, :label, :docs, :files, :directory, + :relative_directory + + def to_s + @obj.docs.map(&:to_s).join(' ') + end def output @obj.write? From bbbe6479e58c0f436a314f8b23cca196ddf74b67 Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Tue, 22 Dec 2015 09:14:51 -0800 Subject: [PATCH 0107/4996] Update history to reflect merge of #4275 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9dd16cb0912..22f4f05d819 100644 --- a/History.markdown +++ b/History.markdown @@ -46,6 +46,7 @@ * Remove example Roger Chapman site, as the domain doesn't exist (#4249) * Added configuration options for `draft_posts` to configuration docs (#4251) * Fix checklist in _assets.md (#4259) + * Add Markdown examples to Pages docs (#4275) ## 3.0.1 / 2015-11-17 From 532bb9e9cb4851405ed595ed315724779b93b286 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 22 Dec 2015 21:33:42 -0500 Subject: [PATCH 0108/4996] Further consolidation in the Drops. --- lib/jekyll/drops/collection_drop.rb | 2 +- lib/jekyll/drops/document_drop.rb | 8 +------- lib/jekyll/drops/site_drop.rb | 13 +++---------- lib/jekyll/drops/unified_payload_drop.rb | 7 ++++++- 4 files changed, 11 insertions(+), 19 deletions(-) diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb index 8dc8c6b8233..b8a1bdd7539 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -10,7 +10,7 @@ class CollectionDrop < ImmutableDrop :relative_directory def to_s - @obj.docs.map(&:to_s).join(' ') + docs.to_s end def output diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index c4170d86dad..0da6986b644 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -9,10 +9,6 @@ class DocumentDrop < ImmutableDrop alias_method :path, :relative_path - def url - @obj.url - end - def collection @obj.collection.label end @@ -30,9 +26,7 @@ def excerpt end private - def fallback_data - @obj.data - end + def_delegator :@obj, :data, :fallback_data end end diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index 82c552307a7..4c632a0d8a9 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -6,10 +6,11 @@ class SiteDrop < ImmutableDrop extend Forwardable def_delegator :@obj, :site_data, :data - def_delegators :@obj, :time, :pages, :static_files, :documents + def_delegators :@obj, :time, :pages, :static_files, :documents, + :tags, :categories def [](key) - if !respond_to?(key) && @obj.collections.key?(key) + if @obj.collections.key?(key) && key != "posts" @obj.collections[key].docs else super(key) @@ -24,14 +25,6 @@ def html_pages @site_html_pages ||= @obj.pages.select { |page| page.html? || page.url.end_with?("/") } end - def categories - @site_categories ||= @obj.post_attr_hash('categories') - end - - def tags - @site_tags ||= @obj.post_attr_hash('tags') - end - def collections @site_collections ||= @obj.collections.values.map(&:to_liquid) end diff --git a/lib/jekyll/drops/unified_payload_drop.rb b/lib/jekyll/drops/unified_payload_drop.rb index 65733b20bd2..6db48f6665b 100644 --- a/lib/jekyll/drops/unified_payload_drop.rb +++ b/lib/jekyll/drops/unified_payload_drop.rb @@ -2,7 +2,7 @@ module Jekyll module Drops - class UnifiedPayloadDrop < Liquid::Drop + class UnifiedPayloadDrop < ImmutableDrop attr_accessor :page, :layout, :content, :paginator attr_accessor :highlighter_prefix, :highlighter_suffix @@ -19,6 +19,11 @@ def site @site_drop ||= SiteDrop.new(@site) end + private + def fallback_data + @fallback_data ||= {} + end + end end end From 233589e15076c41ac4b95ad6e0595f2f6a4a7ac2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 22 Dec 2015 21:34:24 -0500 Subject: [PATCH 0109/4996] document: throw ArgumentError if compared to non-doc --- lib/jekyll/document.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 622f1180ddd..0a416eff1b6 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -353,7 +353,7 @@ def to_s # Returns -1, 0, +1 or nil depending on whether this doc's path is less than, # equal or greater than the other doc's path. See String#<=> for more details. def <=>(other) - return nil if !other.respond_to?(:data) + return ArgumentError.new("document cannot be compared against #{other}") unless other.respond_to?(:data) cmp = data['date'] <=> other.data['date'] cmp = path <=> other.path if cmp == 0 cmp From 659f0869e078249c2dfa1a6b088f8f934b9956f5 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 22 Dec 2015 21:35:28 -0500 Subject: [PATCH 0110/4996] features/collections: drops don't output like a hash -- update accordingly --- features/collections.feature | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/features/collections.feature b/features/collections.feature index d97918bd27d..1fcc7ccea57 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -13,7 +13,7 @@ Feature: Collections And the "_site/methods/configuration.html" file should not exist Scenario: Rendered collection - Given I have an "index.html" page that contains "Collections: {{ site.collections }}" + Given I have an "index.html" page that contains "Collections: output => {{ site.collections[0].output }} label => {{ site.collections[0].label }}" And I have an "collection_metadata.html" page that contains "Methods metadata: {{ site.collections[0].foo }} {{ site.collections[0] }}" And I have fixture collections And I have a "_config.yml" file with content: @@ -25,8 +25,8 @@ Feature: Collections """ When I run jekyll build Then the _site directory should exist - And I should see "Collections: {\"output\"=>true" in "_site/index.html" - And I should see "\"label\"=>\"methods\"," in "_site/index.html" + And I should see "Collections: output => true" in "_site/index.html" + And I should see "label => methods" in "_site/index.html" And I should see "Methods metadata: bar" in "_site/collection_metadata.html" And I should see "

Whatever: foo.bar

" in "_site/methods/configuration.html" @@ -45,7 +45,7 @@ Feature: Collections And I should see "

Whatever: foo.bar

" in "_site/methods/configuration/index.html" Scenario: Rendered document in a layout - Given I have an "index.html" page that contains "Collections: {{ site.collections }}" + Given I have an "index.html" page that contains "Collections: output => {{ site.collections[0].output }} label => {{ site.collections[0].label }} foo => {{ site.collections[0].foo }}" And I have a default layout that contains "
Tom Preston-Werner
{{content}}" And I have fixture collections And I have a "_config.yml" file with content: @@ -57,8 +57,9 @@ Feature: Collections """ When I run jekyll build Then the _site directory should exist - And I should see "Collections: {\"output\"=>true" in "_site/index.html" - And I should see "\"label\"=>\"methods\"," in "_site/index.html" + And I should see "Collections: output => true" in "_site/index.html" + And I should see "label => methods" in "_site/index.html" + And I should see "foo => bar" in "_site/index.html" And I should see "

Run your generators! default

" in "_site/methods/site/generate.html" And I should see "
Tom Preston-Werner
" in "_site/methods/site/generate.html" From 30ceda52ef6f00a1edefcd8c9ce1bf1e81c1028c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 22 Dec 2015 21:36:15 -0500 Subject: [PATCH 0111/4996] features/hooks: global payload _is_ global -- not new for each page --- features/hooks.feature | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/features/hooks.feature b/features/hooks.feature index 489f256b897..b561c00c77e 100644 --- a/features/hooks.feature +++ b/features/hooks.feature @@ -89,11 +89,11 @@ Feature: Hooks And I have a "_plugins/ext.rb" file with content: """ Jekyll::Hooks.register :pages, :pre_render do |page, payload| - payload['myparam'] = 'special' if page.name == 'page1.html' + payload.page['myparam'] = 'special' if page.name == 'page1.html' end """ - And I have a "page1.html" page that contains "{{ myparam }}" - And I have a "page2.html" page that contains "{{ myparam }}" + And I have a "page1.html" page that contains "{{ page.myparam }}" + And I have a "page2.html" page that contains "{{ page.myparam }}" When I run jekyll build Then I should see "special" in "_site/page1.html" And I should not see "special" in "_site/page2.html" From 9bb59e9999ef7ecd6ce64022fc6394906c9f43e5 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 22 Dec 2015 21:36:29 -0500 Subject: [PATCH 0112/4996] features/post_data: do NOT allow page.path to be overridden --- features/post_data.feature | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/features/post_data.feature b/features/post_data.feature index 6ebfb27d2e6..0b43c8c9209 100644 --- a/features/post_data.feature +++ b/features/post_data.feature @@ -233,14 +233,14 @@ Feature: Post data | dir | dir/ | | dir/nested | dir/nested/ | - Scenario: Override page.path variable + Scenario: Cannot override page.path variable Given I have a _posts directory And I have the following post: | title | date | path | content | - | override | 2013-04-12 | override-path.html | Custom path: {{ page.path }} | + | override | 2013-04-12 | override-path.html | Non-custom path: {{ page.path }} | When I run jekyll build Then the _site directory should exist - And I should see "Custom path: override-path.html" in "_site/2013/04/12/override.html" + And I should see "Non-custom path: _posts/2013-04-12-override.markdown in "_site/2013/04/12/override.html" Scenario: Disable a post from being published Given I have a _posts directory From cd2688ab6665367b3e65ce7d1e878bb00599f4b9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 22 Dec 2015 22:37:48 -0500 Subject: [PATCH 0113/4996] test_excerpt & _page: use Drop instead of Hash to mock payload --- test/test_excerpt.rb | 3 +-- test/test_page.rb | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index 322ba3c6eb3..61ffded302b 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -10,8 +10,7 @@ def setup_post(file) def do_render(document) @site.layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")} - payload = {"site" => {"posts" => []}} - document.output = Jekyll::Renderer.new(@site, document, payload).run + document.output = Jekyll::Renderer.new(@site, document, @site.site_payload).run end context "With extraction disabled" do diff --git a/test/test_page.rb b/test/test_page.rb index 625812aa6d3..16b9e06031c 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -9,7 +9,7 @@ def setup_page(*args) def do_render(page) layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")} - page.render(layouts, {"site" => {"posts" => []}}) + page.render(layouts, @site.site_payload) end context "A Page" do From 6a72d4a98690d5b13eca50c42bcbb9c8c3daca35 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 22 Dec 2015 22:44:56 -0500 Subject: [PATCH 0114/4996] features/post_data: Fix undefined feature step. --- features/post_data.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/post_data.feature b/features/post_data.feature index 0b43c8c9209..2792a829f93 100644 --- a/features/post_data.feature +++ b/features/post_data.feature @@ -240,7 +240,7 @@ Feature: Post data | override | 2013-04-12 | override-path.html | Non-custom path: {{ page.path }} | When I run jekyll build Then the _site directory should exist - And I should see "Non-custom path: _posts/2013-04-12-override.markdown in "_site/2013/04/12/override.html" + And I should see "Non-custom path: _posts/2013-04-12-override.markdown" in "_site/2013/04/12/override.html" Scenario: Disable a post from being published Given I have a _posts directory From bff1726a5a24551164d958eca93983b96a975203 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 24 Dec 2015 15:06:32 -0500 Subject: [PATCH 0115/4996] immutable_drop: use custom error for bad set --- lib/jekyll.rb | 1 + lib/jekyll/drops/immutable_drop.rb | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index a90a5a0bfe6..de6b6c69fc7 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -32,6 +32,7 @@ def require_all(path) SafeYAML::OPTIONS[:suppress_warnings] = true module Jekyll + StandardError = Class.new(::StandardError) # internal requires autoload :Cleaner, 'jekyll/cleaner' diff --git a/lib/jekyll/drops/immutable_drop.rb b/lib/jekyll/drops/immutable_drop.rb index d7948bebffa..630cbfe1551 100644 --- a/lib/jekyll/drops/immutable_drop.rb +++ b/lib/jekyll/drops/immutable_drop.rb @@ -3,6 +3,7 @@ module Jekyll module Drops class ImmutableDrop < Liquid::Drop + IllegalDropModification = Class.new(Jekyll::StandardError) def initialize(obj) @obj = obj @@ -18,7 +19,7 @@ def [](key) def []=(key, val) if respond_to? key - raise ArgumentError.new("Key #{key} cannot be set in the drop.") + raise IllegalDropModification.new("Key #{key} cannot be set in the drop.") else fallback_data[key] = val end From d070a77716f65fc9cbdef1aed91943959e9616e0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 24 Dec 2015 15:07:20 -0500 Subject: [PATCH 0116/4996] url: fix issue with bad URL escaping when using Drop --- lib/jekyll/url.rb | 8 ++++++-- lib/jekyll/utils.rb | 13 +++++++------ test/test_url.rb | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index b338c23a7b2..a001f44daf1 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -79,8 +79,12 @@ def generate_url_from_hash(template) end def generate_url_from_drop(template) - template.gsub(/(:[a-z_]+)/) do |match| - @placeholders.public_send(match.sub(':', '')) + template.gsub(/:([a-z_]+)/) do |match| + if replacement = @placeholders.public_send(match.sub(':', '')) + self.class.escape_path replacement + else + ''.freeze + end end.gsub(/\/\//, '/') end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 94da8bd5eea..a2c6139d5da 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -174,13 +174,14 @@ def slugify(string, mode: nil, cased: false) SLUGIFY_PRETTY_REGEXP end - slug = string. - # Strip according to the mode - gsub(re, '-'). - # Remove leading/trailing hyphen - gsub(/^\-|\-$/i, '') + # Strip according to the mode + slug = string.gsub(re, '-') - cased ? slug : slug.downcase + # Remove leading/trailing hyphen + slug.gsub!(/^\-|\-$/i, '') + + slug.downcase! unless cased + slug end # Add an appropriate suffix to template so that it matches the specified diff --git a/test/test_url.rb b/test/test_url.rb index e4529be7c81..578e8962bc7 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -54,5 +54,23 @@ class TestURL < JekyllUnitTest ).to_s end + should "handle UrlDrop as a placeholder in addition to a hash" do + site = fixture_site({ + "collections" => { + "methods" => { + "output" => true + } + }, + }) + site.read + doc = site.collections["methods"].docs.find do |doc| + doc.relative_path == "_methods/escape-+ #%20[].md" + end + assert_equal '/methods/escape-+-20/escape-20.html', URL.new( + :template => '/methods/:title/:name:output_ext', + :placeholders => doc.url_placeholders + ).to_s + end + end end From fcce0d5482e6cd541e3e6857cad00a6969a9dd4e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 24 Dec 2015 15:07:31 -0500 Subject: [PATCH 0117/4996] document: fix issue with bad comparison --- lib/jekyll/document.rb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 0a416eff1b6..a1bf6badad8 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -12,11 +12,13 @@ class Document # Create a new Document. # - # site - the Jekyll::Site instance to which this Document belongs # path - the path to the file + # relations - a hash with keys :site and :collection, the values of which + # are the Jekyll::Site and Jekyll::Collection to which this + # Document belong. # # Returns nothing. - def initialize(path, relations) + def initialize(path, relations = {}) @site = relations[:site] @path = path @extname = File.extname(path) @@ -354,9 +356,11 @@ def to_s # equal or greater than the other doc's path. See String#<=> for more details. def <=>(other) return ArgumentError.new("document cannot be compared against #{other}") unless other.respond_to?(:data) - cmp = data['date'] <=> other.data['date'] - cmp = path <=> other.path if cmp == 0 - cmp + if data['date'] && other.data['date'] && (cmp = data['date'] <=> other.data['date']) != 0 + cmp + else + path <=> other.path + end end # Determine whether this document should be written. From b2b634e767c7a8775b41e8f8a28353577d84e340 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 24 Dec 2015 15:07:48 -0500 Subject: [PATCH 0118/4996] drops: use def_delegator more liberally where acceptable --- lib/jekyll/drops/collection_drop.rb | 9 ++------- lib/jekyll/drops/document_drop.rb | 13 +++---------- lib/jekyll/drops/site_drop.rb | 4 +--- lib/jekyll/drops/url_drop.rb | 13 +++++-------- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb index b8a1bdd7539..ccb3045a2cb 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -6,6 +6,7 @@ module Drops class CollectionDrop < ImmutableDrop extend Forwardable + def_delegator :@obj, :write?, :output def_delegators :@obj, :label, :docs, :files, :directory, :relative_directory @@ -13,14 +14,8 @@ def to_s docs.to_s end - def output - @obj.write? - end - private - def fallback_data - @obj.metadata - end + def_delegator :@obj, :metadata, :fallback_data end end diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index 0da6986b644..81c9bcd25f9 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -5,22 +5,15 @@ module Drops class DocumentDrop < ImmutableDrop extend Forwardable + def_delegator :@obj, :next_doc, :next + def_delegator :@obj, :previous_doc, :previous + def_delegator :@obj, :relative_path, :path def_delegators :@obj, :id, :output, :content, :to_s, :relative_path, :url - alias_method :path, :relative_path - def collection @obj.collection.label end - def next - @obj.next_doc - end - - def previous - @obj.previous_doc - end - def excerpt fallback_data['excerpt'].to_s end diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index 4c632a0d8a9..61ac8098a88 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -30,9 +30,7 @@ def collections end private - def fallback_data - @obj.config - end + def_delegator :@obj, :config, :fallback_data end end diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb index 047acacf6a2..163591dd18a 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -3,16 +3,13 @@ module Jekyll module Drops class UrlDrop < ImmutableDrop - def collection - @obj.collection.label - end + extend Forwardable - def path - @obj.cleaned_relative_path - end + def_delegator :@obj, :cleaned_relative_path, :path + def_delegator :@obj, :output_ext, :output_ext - def output_ext - @obj.output_ext + def collection + @obj.collection.label end def name From 3effae59d8a8ab0b78e3dba19f4d13aa9eea03d6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 24 Dec 2015 15:09:26 -0500 Subject: [PATCH 0119/4996] Update history to reflect merge of #4273 [ci skip] --- History.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 22f4f05d819..6ee375f47f8 100644 --- a/History.markdown +++ b/History.markdown @@ -45,8 +45,9 @@ * Update FormKeep link to be something more specific to Jekyll (#4243) * Remove example Roger Chapman site, as the domain doesn't exist (#4249) * Added configuration options for `draft_posts` to configuration docs (#4251) - * Fix checklist in _assets.md (#4259) + * Fix checklist in `_assets.md` (#4259) * Add Markdown examples to Pages docs (#4275) + * Add jekyll-paginate-category to list of third-party plugins (#4273) ## 3.0.1 / 2015-11-17 From b34e8e0bc04c4c8dbe5ffa786ca891d58b59de19 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 25 Dec 2015 21:32:46 -0500 Subject: [PATCH 0120/4996] Update history to reflect merge of #4277 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6ee375f47f8..c415701d041 100644 --- a/History.markdown +++ b/History.markdown @@ -2,6 +2,7 @@ ### Minor Enhancements + * Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` (#4277) * Add 'sample' Liquid filter Equivalent to Array#sample functionality (#4223) * Cache parsed include file to save liquid parsing time. (#4120) * Slightly speed up url sanitization and handle multiples of ///. (#4168) From debdb15171d006610888d20894eb94b5f28c6b3d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 25 Dec 2015 22:45:51 -0500 Subject: [PATCH 0121/4996] Move 'forwardable' require to earlier in the program start up. --- lib/jekyll.rb | 1 + lib/jekyll/excerpt.rb | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index de6b6c69fc7..686aad3b14c 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -16,6 +16,7 @@ def require_all(path) require 'rubygems' # stdlib +require 'forwardable' require 'fileutils' require 'time' require 'English' diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index 36fcd11b4c5..f5884d682d8 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -1,5 +1,3 @@ -require 'forwardable' - module Jekyll class Excerpt extend Forwardable From c63b51b6612a0bb867a69dff2aa38d66a08eb2a4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 25 Dec 2015 22:54:12 -0500 Subject: [PATCH 0122/4996] document: revert comparison of Documents to old style & add nil check @envygeeks, this should address your comment: https://github.com/jekyll/jekyll/commit/fcce0d5482e6cd541e3e6857cad00a6969a9dd4e#commitcomment-15162261 --- lib/jekyll/document.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index a1bf6badad8..8c1b77cf73d 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -356,11 +356,9 @@ def to_s # equal or greater than the other doc's path. See String#<=> for more details. def <=>(other) return ArgumentError.new("document cannot be compared against #{other}") unless other.respond_to?(:data) - if data['date'] && other.data['date'] && (cmp = data['date'] <=> other.data['date']) != 0 - cmp - else - path <=> other.path - end + cmp = data['date'] <=> other.data['date'] + cmp = path <=> other.path if cmp.nil? || cmp == 0 + cmp end # Determine whether this document should be written. From b05b174b875193021ebd31a49bfdc71da5949118 Mon Sep 17 00:00:00 2001 From: leethomas Date: Fri, 25 Dec 2015 22:50:23 -0800 Subject: [PATCH 0123/4996] moved namespaced rake tasks to separate .rake files under lib/tasks --- Rakefile | 241 +---------------------------------------- lib/tasks/docs.rake | 60 ++++++++++ lib/tasks/release.rake | 25 +++++ lib/tasks/site.rake | 151 ++++++++++++++++++++++++++ 4 files changed, 238 insertions(+), 239 deletions(-) create mode 100644 lib/tasks/docs.rake create mode 100644 lib/tasks/release.rake create mode 100644 lib/tasks/site.rake diff --git a/Rakefile b/Rakefile index 02e105d5b7a..00c93db5646 100644 --- a/Rakefile +++ b/Rakefile @@ -7,6 +7,8 @@ require 'yaml' $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib])) require 'jekyll/version' +Dir.glob('lib/tasks/**.rake').each { |f| import f } + ############################################################################# # # Helper functions @@ -128,242 +130,3 @@ desc "Open an irb session preloaded with this library" task :console do sh "irb -rubygems -r ./lib/#{name}.rb" end - -############################################################################# -# -# Site tasks - http://jekyllrb.com -# -############################################################################# - -namespace :site do - desc "Generate and view the site locally" - task :preview => [:history, :version_file] do - require "launchy" - require "jekyll" - - # Yep, it's a hack! Wait a few seconds for the Jekyll site to generate and - # then open it in a browser. Someday we can do better than this, I hope. - Thread.new do - sleep 4 - puts "Opening in browser..." - Launchy.open("http://localhost:4000") - end - - # Generate the site in server mode. - puts "Running Jekyll..." - options = { - "source" => File.expand_path("site"), - "destination" => File.expand_path("site/_site"), - "watch" => true, - "serving" => true - } - Jekyll::Commands::Build.process(options) - Jekyll::Commands::Serve.process(options) - end - - desc "Generate the site" - task :generate => [:history, :version_file] do - require "jekyll" - Jekyll::Commands::Build.process({ - "source" => File.expand_path("site"), - "destination" => File.expand_path("site/_site") - }) - end - task :build => :generate - - desc "Update normalize.css library to the latest version and minify" - task :update_normalize_css do - Dir.chdir("site/_sass") do - sh 'curl "http://necolas.github.io/normalize.css/latest/normalize.css" -o "normalize.scss"' - sh 'sass "normalize.scss":"_normalize.scss" --style compressed' - rm ['normalize.scss', Dir.glob('*.map')].flatten - end - end - - desc "Commit the local site to the gh-pages branch and publish to GitHub Pages" - task :publish => [:history, :version_file] do - # Ensure the gh-pages dir exists so we can generate into it. - puts "Checking for gh-pages dir..." - unless File.exist?("./gh-pages") - puts "Creating gh-pages dir..." - sh "git clone git@github.com:jekyll/jekyll gh-pages" - end - - # Ensure latest gh-pages branch history. - Dir.chdir('gh-pages') do - sh "git checkout gh-pages" - sh "git pull origin gh-pages" - end - - # Proceed to purge all files in case we removed a file in this release. - puts "Cleaning gh-pages directory..." - purge_exclude = %w[ - gh-pages/. - gh-pages/.. - gh-pages/.git - gh-pages/.gitignore - ] - FileList["gh-pages/{*,.*}"].exclude(*purge_exclude).each do |path| - sh "rm -rf #{path}" - end - - # Copy site to gh-pages dir. - puts "Building site into gh-pages branch..." - ENV['JEKYLL_ENV'] = 'production' - require "jekyll" - Jekyll::Commands::Build.process({ - "source" => File.expand_path("site"), - "destination" => File.expand_path("gh-pages"), - "sass" => { "style" => "compressed" } - }) - - File.open('gh-pages/.nojekyll', 'wb') { |f| f.puts(":dog: food.") } - - # Commit and push. - puts "Committing and pushing to GitHub Pages..." - sha = `git rev-parse HEAD`.strip - Dir.chdir('gh-pages') do - sh "git add ." - sh "git commit --allow-empty -m 'Updating to #{sha}.'" - sh "git push origin gh-pages" - end - puts 'Done.' - end - - desc "Create a nicely formatted history page for the jekyll site based on the repo history." - task :history do - if File.exist?("History.markdown") - history_file = File.read("History.markdown") - front_matter = { - "layout" => "docs", - "title" => "History", - "permalink" => "/docs/history/" - } - Dir.chdir('site/_docs/') do - File.open("history.md", "w") do |file| - file.write("#{front_matter.to_yaml}---\n\n") - file.write(converted_history(history_file)) - end - end - else - abort "You seem to have misplaced your History.markdown file. I can haz?" - end - end - - desc "Write the site latest_version.txt file" - task :version_file do - File.open('site/latest_version.txt', 'wb') { |f| f.puts(version) } unless version =~ /(beta|rc|alpha)/i - end - - namespace :releases do - desc "Create new release post" - task :new, :version do |t, args| - raise "Specify a version: rake site:releases:new['1.2.3']" unless args.version - today = Time.new.strftime('%Y-%m-%d') - release = args.version.to_s - filename = "site/_posts/#{today}-jekyll-#{release.split('.').join('-')}-released.markdown" - - File.open(filename, "wb") do |post| - post.puts("---") - post.puts("layout: news_item") - post.puts("title: 'Jekyll #{release} Released'") - post.puts("date: #{Time.new.strftime('%Y-%m-%d %H:%M:%S %z')}") - post.puts("author: ") - post.puts("version: #{release}") - post.puts("categories: [release]") - post.puts("---") - post.puts - post.puts - end - - puts "Created #{filename}" - end - end -end - -############################################################################# -# -# Packaging tasks -# -############################################################################# - -desc "Release #{name} v#{version}" -task :release => :build do - unless `git branch` =~ /^\* master$/ - puts "You must be on the master branch to release!" - exit! - end - sh "git commit --allow-empty -m 'Release :gem: #{version}'" - sh "git tag v#{version}" - sh "git push origin master" - sh "git push origin v#{version}" - sh "gem push pkg/#{name}-#{version}.gem" -end - -desc "Build #{name} v#{version} into pkg/" -task :build do - mkdir_p "pkg" - sh "gem build #{gemspec_file}" - sh "mv #{gem_file} pkg" -end - -############################################################################# -# -# Packaging tasks for jekyll-docs -# -############################################################################# - -namespace :docs do - desc "Release #{docs_name} v#{version}" - task :release => :build do - unless `git branch` =~ /^\* master$/ - puts "You must be on the master branch to release!" - exit! - end - sh "gem push pkg/#{docs_name}-#{version}.gem" - end - - desc "Build #{docs_name} v#{version} into pkg/" - task :build do - mkdir_p "pkg" - sh "gem build #{docs_name}.gemspec" - sh "mv #{docs_name}-#{version}.gem pkg" - end -end - -task :analysis do - require "jekyll/utils/ansi" - require "open3" - - cmd = [ - "docker", "run", "--rm", "--env=CODE_PATH=#{Dir.pwd}", \ - "--volume='#{Dir.pwd}:/code'", "--volume=/var/run/docker.sock:/var/run/docker.sock", \ - "--volume=/tmp/cc:/tmp/cc", "-i", "codeclimate/codeclimate", "analyze" - ] - - ansi = Jekyll::Utils::Ansi - file = File.open(".analysis", "w+") - Open3.popen3(cmd.shelljoin) do |_, out, err, _| - while data = out.gets - file.write data - if data =~ /\A==/ - $stdout.print ansi.yellow(data) - - elsif data !~ %r!\A[0-9\-]+! - $stdout.puts data - - else - h, d = data.split(":", 2) - $stdout.print ansi.cyan(h) - $stdout.print ":", d - end - end - - while data = err.gets - file.write data - $stderr.print ansi.red(data) - end - end - - file.close -end diff --git a/lib/tasks/docs.rake b/lib/tasks/docs.rake new file mode 100644 index 00000000000..c04520e571d --- /dev/null +++ b/lib/tasks/docs.rake @@ -0,0 +1,60 @@ +############################################################################# +# +# Packaging tasks for jekyll-docs +# +############################################################################# + +namespace :docs do + desc "Release #{docs_name} v#{version}" + task :release => :build do + unless `git branch` =~ /^\* master$/ + puts "You must be on the master branch to release!" + exit! + end + sh "gem push pkg/#{docs_name}-#{version}.gem" + end + + desc "Build #{docs_name} v#{version} into pkg/" + task :build do + mkdir_p "pkg" + sh "gem build #{docs_name}.gemspec" + sh "mv #{docs_name}-#{version}.gem pkg" + end +end + +task :analysis do + require "jekyll/utils/ansi" + require "open3" + + cmd = [ + "docker", "run", "--rm", "--env=CODE_PATH=#{Dir.pwd}", \ + "--volume='#{Dir.pwd}:/code'", "--volume=/var/run/docker.sock:/var/run/docker.sock", \ + "--volume=/tmp/cc:/tmp/cc", "-i", "codeclimate/codeclimate", "analyze" + ] + + ansi = Jekyll::Utils::Ansi + file = File.open(".analysis", "w+") + Open3.popen3(cmd.shelljoin) do |_, out, err, _| + while data = out.gets + file.write data + if data =~ /\A==/ + $stdout.print ansi.yellow(data) + + elsif data !~ %r!\A[0-9\-]+! + $stdout.puts data + + else + h, d = data.split(":", 2) + $stdout.print ansi.cyan(h) + $stdout.print ":", d + end + end + + while data = err.gets + file.write data + $stderr.print ansi.red(data) + end + end + + file.close +end diff --git a/lib/tasks/release.rake b/lib/tasks/release.rake new file mode 100644 index 00000000000..a78690d8726 --- /dev/null +++ b/lib/tasks/release.rake @@ -0,0 +1,25 @@ +############################################################################# +# +# Packaging tasks +# +############################################################################# + +desc "Release #{name} v#{version}" +task :release => :build do + unless `git branch` =~ /^\* master$/ + puts "You must be on the master branch to release!" + exit! + end + sh "git commit --allow-empty -m 'Release :gem: #{version}'" + sh "git tag v#{version}" + sh "git push origin master" + sh "git push origin v#{version}" + sh "gem push pkg/#{name}-#{version}.gem" +end + +desc "Build #{name} v#{version} into pkg/" +task :build do + mkdir_p "pkg" + sh "gem build #{gemspec_file}" + sh "mv #{gem_file} pkg" +end diff --git a/lib/tasks/site.rake b/lib/tasks/site.rake new file mode 100644 index 00000000000..eb5b263b8d1 --- /dev/null +++ b/lib/tasks/site.rake @@ -0,0 +1,151 @@ +############################################################################# +# +# Site tasks - http://jekyllrb.com +# +############################################################################# + +namespace :site do + desc "Generate and view the site locally" + task :preview => [:history, :version_file] do + require "launchy" + require "jekyll" + + # Yep, it's a hack! Wait a few seconds for the Jekyll site to generate and + # then open it in a browser. Someday we can do better than this, I hope. + Thread.new do + sleep 4 + puts "Opening in browser..." + Launchy.open("http://localhost:4000") + end + + # Generate the site in server mode. + puts "Running Jekyll..." + options = { + "source" => File.expand_path("site"), + "destination" => File.expand_path("site/_site"), + "watch" => true, + "serving" => true + } + Jekyll::Commands::Build.process(options) + Jekyll::Commands::Serve.process(options) + end + + desc "Generate the site" + task :generate => [:history, :version_file] do + require "jekyll" + Jekyll::Commands::Build.process({ + "source" => File.expand_path("site"), + "destination" => File.expand_path("site/_site") + }) + end + task :build => :generate + + desc "Update normalize.css library to the latest version and minify" + task :update_normalize_css do + Dir.chdir("site/_sass") do + sh 'curl "http://necolas.github.io/normalize.css/latest/normalize.css" -o "normalize.scss"' + sh 'sass "normalize.scss":"_normalize.scss" --style compressed' + rm ['normalize.scss', Dir.glob('*.map')].flatten + end + end + + desc "Commit the local site to the gh-pages branch and publish to GitHub Pages" + task :publish => [:history, :version_file] do + # Ensure the gh-pages dir exists so we can generate into it. + puts "Checking for gh-pages dir..." + unless File.exist?("./gh-pages") + puts "Creating gh-pages dir..." + sh "git clone git@github.com:jekyll/jekyll gh-pages" + end + + # Ensure latest gh-pages branch history. + Dir.chdir('gh-pages') do + sh "git checkout gh-pages" + sh "git pull origin gh-pages" + end + + # Proceed to purge all files in case we removed a file in this release. + puts "Cleaning gh-pages directory..." + purge_exclude = %w[ + gh-pages/. + gh-pages/.. + gh-pages/.git + gh-pages/.gitignore + ] + FileList["gh-pages/{*,.*}"].exclude(*purge_exclude).each do |path| + sh "rm -rf #{path}" + end + + # Copy site to gh-pages dir. + puts "Building site into gh-pages branch..." + ENV['JEKYLL_ENV'] = 'production' + require "jekyll" + Jekyll::Commands::Build.process({ + "source" => File.expand_path("site"), + "destination" => File.expand_path("gh-pages"), + "sass" => { "style" => "compressed" } + }) + + File.open('gh-pages/.nojekyll', 'wb') { |f| f.puts(":dog: food.") } + + # Commit and push. + puts "Committing and pushing to GitHub Pages..." + sha = `git rev-parse HEAD`.strip + Dir.chdir('gh-pages') do + sh "git add ." + sh "git commit --allow-empty -m 'Updating to #{sha}.'" + sh "git push origin gh-pages" + end + puts 'Done.' + end + + desc "Create a nicely formatted history page for the jekyll site based on the repo history." + task :history do + if File.exist?("History.markdown") + history_file = File.read("History.markdown") + front_matter = { + "layout" => "docs", + "title" => "History", + "permalink" => "/docs/history/" + } + Dir.chdir('site/_docs/') do + File.open("history.md", "w") do |file| + file.write("#{front_matter.to_yaml}---\n\n") + file.write(converted_history(history_file)) + end + end + else + abort "You seem to have misplaced your History.markdown file. I can haz?" + end + end + + desc "Write the site latest_version.txt file" + task :version_file do + File.open('site/latest_version.txt', 'wb') { |f| f.puts(version) } unless version =~ /(beta|rc|alpha)/i + end + + namespace :releases do + desc "Create new release post" + task :new, :version do |t, args| + raise "Specify a version: rake site:releases:new['1.2.3']" unless args.version + today = Time.new.strftime('%Y-%m-%d') + release = args.version.to_s + filename = "site/_posts/#{today}-jekyll-#{release.split('.').join('-')}-released.markdown" + + File.open(filename, "wb") do |post| + post.puts("---") + post.puts("layout: news_item") + post.puts("title: 'Jekyll #{release} Released'") + post.puts("date: #{Time.new.strftime('%Y-%m-%d %H:%M:%S %z')}") + post.puts("author: ") + post.puts("version: #{release}") + post.puts("categories: [release]") + post.puts("---") + post.puts + post.puts + end + + puts "Created #{filename}" + end + end +end From 1afbe9967d561fdcd5784382cac87f67d432a351 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 12:23:21 -0500 Subject: [PATCH 0124/4996] document: return nil if bad arg in #<=> Addresses @envygeek's comment: https://github.com/jekyll/jekyll/commit/233589e15076c41ac4b95ad6e0595f2f6a4a7ac2#commitcomment-15164178 --- lib/jekyll/document.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 8c1b77cf73d..14a0a92e224 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -355,7 +355,7 @@ def to_s # Returns -1, 0, +1 or nil depending on whether this doc's path is less than, # equal or greater than the other doc's path. See String#<=> for more details. def <=>(other) - return ArgumentError.new("document cannot be compared against #{other}") unless other.respond_to?(:data) + return nil unless other.respond_to?(:data) cmp = data['date'] <=> other.data['date'] cmp = path <=> other.path if cmp.nil? || cmp == 0 cmp From b70ea3ca5cf0769753d358c8f358a242f3b15cbe Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 12:27:07 -0500 Subject: [PATCH 0125/4996] immutable_drop/errors: consolidate errors & fix syntax for raising Addresses @envygeeks's comments: https://github.com/jekyll/jekyll/commit/bff1726a5a24551164d958eca93983b96a975203 --- lib/jekyll.rb | 2 -- lib/jekyll/drops/immutable_drop.rb | 4 +--- lib/jekyll/errors.rb | 7 +++---- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 686aad3b14c..e3fca10b1f6 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -33,8 +33,6 @@ def require_all(path) SafeYAML::OPTIONS[:suppress_warnings] = true module Jekyll - StandardError = Class.new(::StandardError) - # internal requires autoload :Cleaner, 'jekyll/cleaner' autoload :Collection, 'jekyll/collection' diff --git a/lib/jekyll/drops/immutable_drop.rb b/lib/jekyll/drops/immutable_drop.rb index 630cbfe1551..5440aa00ba2 100644 --- a/lib/jekyll/drops/immutable_drop.rb +++ b/lib/jekyll/drops/immutable_drop.rb @@ -3,8 +3,6 @@ module Jekyll module Drops class ImmutableDrop < Liquid::Drop - IllegalDropModification = Class.new(Jekyll::StandardError) - def initialize(obj) @obj = obj end @@ -19,7 +17,7 @@ def [](key) def []=(key, val) if respond_to? key - raise IllegalDropModification.new("Key #{key} cannot be set in the drop.") + raise DropMutationException, "Key #{key} cannot be set in the drop." else fallback_data[key] = val end diff --git a/lib/jekyll/errors.rb b/lib/jekyll/errors.rb index dc5238a05ee..2b0dbc0c39a 100644 --- a/lib/jekyll/errors.rb +++ b/lib/jekyll/errors.rb @@ -1,9 +1,8 @@ module Jekyll module Errors - class FatalException < RuntimeError - end + FatalException = Class.new(::RuntimeError) - class MissingDependencyException < FatalException - end + MissingDependencyException = Class.new(FatalException) + DropMutationException = Class.new(FatalException) end end From 1f298e0d9d3482492a43d0b37262342631c95894 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 12:32:21 -0500 Subject: [PATCH 0126/4996] url: move setter outside of if statement Addresses @envygeeks's comment: https://github.com/jekyll/jekyll/commit/d070a77716f65fc9cbdef1aed91943959e9616e0#commitcomment-15164169 --- lib/jekyll/url.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index a001f44daf1..3f00cfd337b 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -80,10 +80,11 @@ def generate_url_from_hash(template) def generate_url_from_drop(template) template.gsub(/:([a-z_]+)/) do |match| - if replacement = @placeholders.public_send(match.sub(':', '')) - self.class.escape_path replacement - else + replacement = @placeholders.public_send(match.sub(':', '')) + if replacement.nil? ''.freeze + else + self.class.escape_path(replacement) end end.gsub(/\/\//, '/') end From 75be388487002c390356356332fac9f14fad5792 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 12:48:18 -0500 Subject: [PATCH 0127/4996] Update history to reflect merge of #4282 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c415701d041..7b373689cb2 100644 --- a/History.markdown +++ b/History.markdown @@ -32,6 +32,7 @@ * Allow use of Cucumber 2.1 or greater (#4181) * Modernize Kramdown for Markdown converter. (#4109) * Change TestDoctorCommand to JekyllUnitTest... (#4263) + * Create namespaced rake tasks in separate `.rake` files under `lib/tasks` (#4282) ### Site Enhancements From 57613b31dd1247785418c9e627861f860b4c39bc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 12:53:30 -0500 Subject: [PATCH 0128/4996] Slightly restructure rake helper files Ref #4282 --- Rakefile | 2 +- lib/tasks/docs.rake => rake/analysis.rake | 22 ++-------------------- rake/docs.rake | 23 +++++++++++++++++++++++ {lib/tasks => rake}/release.rake | 0 {lib/tasks => rake}/site.rake | 0 5 files changed, 26 insertions(+), 21 deletions(-) rename lib/tasks/docs.rake => rake/analysis.rake (67%) create mode 100644 rake/docs.rake rename {lib/tasks => rake}/release.rake (100%) rename {lib/tasks => rake}/site.rake (100%) diff --git a/Rakefile b/Rakefile index 00c93db5646..e3f99c41295 100644 --- a/Rakefile +++ b/Rakefile @@ -7,7 +7,7 @@ require 'yaml' $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib])) require 'jekyll/version' -Dir.glob('lib/tasks/**.rake').each { |f| import f } +Dir.glob('rake/**.rake').each { |f| import f } ############################################################################# # diff --git a/lib/tasks/docs.rake b/rake/analysis.rake similarity index 67% rename from lib/tasks/docs.rake rename to rake/analysis.rake index c04520e571d..4fcc6af5563 100644 --- a/lib/tasks/docs.rake +++ b/rake/analysis.rake @@ -1,27 +1,9 @@ ############################################################################# # -# Packaging tasks for jekyll-docs +# Analyze the quality of the Jekyll source code (requires Docker) # ############################################################################# -namespace :docs do - desc "Release #{docs_name} v#{version}" - task :release => :build do - unless `git branch` =~ /^\* master$/ - puts "You must be on the master branch to release!" - exit! - end - sh "gem push pkg/#{docs_name}-#{version}.gem" - end - - desc "Build #{docs_name} v#{version} into pkg/" - task :build do - mkdir_p "pkg" - sh "gem build #{docs_name}.gemspec" - sh "mv #{docs_name}-#{version}.gem pkg" - end -end - task :analysis do require "jekyll/utils/ansi" require "open3" @@ -57,4 +39,4 @@ task :analysis do end file.close -end +end \ No newline at end of file diff --git a/rake/docs.rake b/rake/docs.rake new file mode 100644 index 00000000000..aec162b59e9 --- /dev/null +++ b/rake/docs.rake @@ -0,0 +1,23 @@ +############################################################################# +# +# Packaging tasks for jekyll-docs +# +############################################################################# + +namespace :docs do + desc "Release #{docs_name} v#{version}" + task :release => :build do + unless `git branch` =~ /^\* master$/ + puts "You must be on the master branch to release!" + exit! + end + sh "gem push pkg/#{docs_name}-#{version}.gem" + end + + desc "Build #{docs_name} v#{version} into pkg/" + task :build do + mkdir_p "pkg" + sh "gem build #{docs_name}.gemspec" + sh "mv #{docs_name}-#{version}.gem pkg" + end +end diff --git a/lib/tasks/release.rake b/rake/release.rake similarity index 100% rename from lib/tasks/release.rake rename to rake/release.rake diff --git a/lib/tasks/site.rake b/rake/site.rake similarity index 100% rename from lib/tasks/site.rake rename to rake/site.rake From 95b05cd0c52f46d002f5877827fa2ea5997a5e24 Mon Sep 17 00:00:00 2001 From: Joseph Wynn Date: Sat, 26 Dec 2015 18:38:32 +0000 Subject: [PATCH 0129/4996] Add jekyll-responsive_image to plugins list [jekyll-responsive_image](https://github.com/wildlyinaccurate/jekyll-responsive-image) has been gaining popularity recently. I thought it would be worth adding it to the documentation. --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 1ca2948a61f..57f7d51583d 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -817,6 +817,7 @@ LESS.js files during generation. - [Jekyll-swfobject](https://github.com/sectore/jekyll-swfobject): Liquid plugin for embedding Adobe Flash files (.swf) using [SWFObject](http://code.google.com/p/swfobject/). - [Jekyll Picture Tag](https://github.com/robwierzbowski/jekyll-picture-tag): Easy responsive images for Jekyll. Based on the proposed [``](https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element) element, polyfilled with Scott Jehl’s [Picturefill](https://github.com/scottjehl/picturefill). - [Jekyll Image Tag](https://github.com/robwierzbowski/jekyll-image-tag): Better images for Jekyll. Save image presets, generate resized images, and add classes, alt text, and other attributes. +- [Jekyll Responsive Image](https://github.com/wildlyinaccurate/jekyll-responsive-image): Responsive images for Jekyll. Automatically resizes images, supports all responsive methods (``, `srcset`, Imager.js, etc), super-flexible configuration. - [Ditaa Tag](https://github.com/matze/jekyll-ditaa) by [matze](https://github.com/matze): Renders ASCII diagram art into PNG images and inserts a figure tag. - [Jekyll Suggested Tweet](https://github.com/davidensinger/jekyll-suggested-tweet) by [David Ensinger](https://github.com/davidensinger/): A Liquid tag for Jekyll that allows for the embedding of suggested tweets via Twitter’s Web Intents API. - [Jekyll Date Chart](https://github.com/GSI/jekyll_date_chart) by [GSI](https://github.com/GSI): Block that renders date line charts based on textile-formatted tables. From 3fa8af2a18b1f79dbb9c6af24894bdf5b7122d76 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 13:26:22 -0500 Subject: [PATCH 0130/4996] drops: create one base Drop class which can be set as mutable or not --- lib/jekyll/drops/collection_drop.rb | 6 +- lib/jekyll/drops/document_drop.rb | 4 +- lib/jekyll/drops/drop.rb | 74 ++++++++++++++++++++++++ lib/jekyll/drops/immutable_drop.rb | 28 --------- lib/jekyll/drops/mutable_drop.rb | 28 --------- lib/jekyll/drops/site_drop.rb | 4 +- lib/jekyll/drops/unified_payload_drop.rb | 3 +- lib/jekyll/drops/url_drop.rb | 4 +- 8 files changed, 89 insertions(+), 62 deletions(-) create mode 100644 lib/jekyll/drops/drop.rb delete mode 100644 lib/jekyll/drops/immutable_drop.rb delete mode 100644 lib/jekyll/drops/mutable_drop.rb diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb index ccb3045a2cb..009635a427e 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -1,11 +1,13 @@ # encoding: UTF-8 -require "jekyll/drops/immutable_drop" +require "jekyll/drops/drop" module Jekyll module Drops - class CollectionDrop < ImmutableDrop + class CollectionDrop < Drop extend Forwardable + mutable false + def_delegator :@obj, :write?, :output def_delegators :@obj, :label, :docs, :files, :directory, :relative_directory diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index 81c9bcd25f9..f6e03fec546 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -2,9 +2,11 @@ module Jekyll module Drops - class DocumentDrop < ImmutableDrop + class DocumentDrop < Drop extend Forwardable + mutable false + def_delegator :@obj, :next_doc, :next def_delegator :@obj, :previous_doc, :previous def_delegator :@obj, :relative_path, :path diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb new file mode 100644 index 00000000000..09bdb2d2479 --- /dev/null +++ b/lib/jekyll/drops/drop.rb @@ -0,0 +1,74 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class Drop < Liquid::Drop + # Get or set whether the drop class is mutable. + # Mutability determines whether or not pre-defined fields may be + # overwritten. + # + # is_mutable - Boolean set mutability of the class (default: nil) + # + # Returns the mutability of the class + def self.mutable(is_mutable = nil) + if is_mutable + @is_mutable = is_mutable + end + @is_mutable || false + end + + # Create a new Drop + # + # obj - the Jekyll Site, Collection, or Document required by the + # drop. + # + # Returns nothing + def initialize(obj) + @obj = obj + @mutations = {} # only if mutable: true + end + + # Access a method in the Drop or a field in the underlying hash data. + # If mutable, checks the mutations first. Then checks the methods, + # and finally check the underlying hash (e.g. document front matter) + # if all the previous places didn't match. + # + # key - the string key whose value to fetch + # + # Returns the value for the given key, or nil if none exists + def [](key) + if self.class.mutable && @mutations.key?(key) + @mutations[key] + elsif respond_to? key + public_send key + else + fallback_data[key] + end + end + + # Set a field in the Drop. If mutable, sets in the mutations and + # returns. If not mutable, checks first if it's trying to override a + # Drop method and raises a DropMutationException if so. If not + # mutable and the key is not a method on the Drop, then it sets the + # key to the value in the underlying hash (e.g. document front + # matter) + # + # key - the String key whose value to set + # val - the Object to set the key's value to + # + # Returns the value the key was set to unless the Drop is not mutable + # and the key matches a method in which case it raises a + # DropMutationException. + def []=(key, val) + if self.class.mutable + @mutations[key] = val + elsif respond_to? key + raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." + else + fallback_data[key] = val + end + end + + end + end +end diff --git a/lib/jekyll/drops/immutable_drop.rb b/lib/jekyll/drops/immutable_drop.rb deleted file mode 100644 index 5440aa00ba2..00000000000 --- a/lib/jekyll/drops/immutable_drop.rb +++ /dev/null @@ -1,28 +0,0 @@ -# encoding: UTF-8 - -module Jekyll - module Drops - class ImmutableDrop < Liquid::Drop - def initialize(obj) - @obj = obj - end - - def [](key) - if respond_to? key - public_send key - else - fallback_data[key] - end - end - - def []=(key, val) - if respond_to? key - raise DropMutationException, "Key #{key} cannot be set in the drop." - else - fallback_data[key] = val - end - end - - end - end -end diff --git a/lib/jekyll/drops/mutable_drop.rb b/lib/jekyll/drops/mutable_drop.rb deleted file mode 100644 index 9dd4048dfd9..00000000000 --- a/lib/jekyll/drops/mutable_drop.rb +++ /dev/null @@ -1,28 +0,0 @@ -# encoding: UTF-8 - -module Jekyll - module Drops - class MutableDrop < Liquid::Drop - - def initialize(obj) - @obj = obj - @mutations = {} - end - - def [](key) - if @mutations.key? key - @mutations[key] - elsif respond_to? key - public_send key - else - fallback_data[key] - end - end - - def []=(key, val) - @mutations[key] = val - end - - end - end -end diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index 61ac8098a88..ec4f0910189 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -2,9 +2,11 @@ module Jekyll module Drops - class SiteDrop < ImmutableDrop + class SiteDrop < Drop extend Forwardable + mutable false + def_delegator :@obj, :site_data, :data def_delegators :@obj, :time, :pages, :static_files, :documents, :tags, :categories diff --git a/lib/jekyll/drops/unified_payload_drop.rb b/lib/jekyll/drops/unified_payload_drop.rb index 6db48f6665b..3c593ba6a47 100644 --- a/lib/jekyll/drops/unified_payload_drop.rb +++ b/lib/jekyll/drops/unified_payload_drop.rb @@ -2,7 +2,8 @@ module Jekyll module Drops - class UnifiedPayloadDrop < ImmutableDrop + class UnifiedPayloadDrop < Drop + mutable false attr_accessor :page, :layout, :content, :paginator attr_accessor :highlighter_prefix, :highlighter_suffix diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb index 163591dd18a..a2bf6262c55 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -2,9 +2,11 @@ module Jekyll module Drops - class UrlDrop < ImmutableDrop + class UrlDrop < Drop extend Forwardable + mutable false + def_delegator :@obj, :cleaned_relative_path, :path def_delegator :@obj, :output_ext, :output_ext From 839fd45b9dbf9d301865768b41ff13bf51132341 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 13:47:31 -0500 Subject: [PATCH 0131/4996] Update history to reflect merge of #4286 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7b373689cb2..0e8182803cb 100644 --- a/History.markdown +++ b/History.markdown @@ -50,6 +50,7 @@ * Fix checklist in `_assets.md` (#4259) * Add Markdown examples to Pages docs (#4275) * Add jekyll-paginate-category to list of third-party plugins (#4273) + * Add `jekyll-responsive_image` to list of third-party plugins (#4286) ## 3.0.1 / 2015-11-17 From ceca1bcf1416ec01c5d0089702e6bf2cfa38b90c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 13:49:32 -0500 Subject: [PATCH 0132/4996] site: set the timezone in the config for consistent generation times --- site/_config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/_config.yml b/site/_config.yml index d1cd5367b53..e09c4857045 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -9,6 +9,8 @@ google_analytics_id: UA-50755011-1 repository: https://github.com/jekyll/jekyll help_url: https://github.com/jekyll/jekyll-help +timezone: America/Los_Angeles + collections: docs: output: true From cc5937815e3a3954160e50a1e81fa514409cfa40 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 13:53:08 -0500 Subject: [PATCH 0133/4996] Update history to reflect merge of #4285 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0e8182803cb..f603cbd3aaf 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ * Switch `PluginManager` to use `require_with_graceful_fail` for better UX (#4233) * Allow quoted date in front matter defaults (#4184) * Add a Jekyll doctor warning for URLs that only differ by case (#3171) + * drops: create one base Drop class which can be set as mutable or not (#4285) ### Bug Fixes From d138558c1de5dded742050ed2d587b4f8d256189 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 25 Dec 2015 21:57:21 -0500 Subject: [PATCH 0134/4996] drops: provide #to_h to allow for hash introspection Follow-up to #4277 --- lib/jekyll/drops/drop.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 09bdb2d2479..b14581a40af 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -3,6 +3,8 @@ module Jekyll module Drops class Drop < Liquid::Drop + NON_CONTENT_METHODS = [:[], :[]=, :inspect, :to_h, :fallback_data].freeze + # Get or set whether the drop class is mutable. # Mutability determines whether or not pre-defined fields may be # overwritten. @@ -69,6 +71,37 @@ def []=(key, val) end end + # Generates a list of keys with user content as their values. + # This gathers up the Drop methods and keys of the mutations and + # underlying data hashes and performs a set union to ensure a list + # of unique keys for the Drop. + # + # Returns an Array of unique keys for content for the Drop. + def keys + ((self.class.instance_methods(false) - NON_CONTENT_METHODS).map(&:to_s) | + @mutations.keys | + fallback_data.keys).flatten + end + + # Generate a Hash representation of the Drop by resolving each key's + # value. It includes Drop methods, mutations, and the underlying object's + # data. See the documentation for Drop#keys for more. + # + # Returns a Hash with all the keys and values resolved. + def to_h + keys.each_with_object({}) do |(key, val), result| + result[key] = self[key] + end + end + + # Inspect the drop's keys and values through a JSON representation + # of its keys and values. + # + # Returns a pretty generation of the hash representation of the Drop. + def inspect + JSON.pretty_generate to_h + end + end end end From a47ce7b6552fe051cf8b82513103e67f4da808e5 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sat, 26 Dec 2015 12:48:20 -0800 Subject: [PATCH 0135/4996] Wrap Arguments in () when used in a setter --- test/test_generated_site.rb | 6 +++--- test/test_layout_reader.rb | 2 +- test/test_static_file.rb | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 88e0fe9eea3..32999aba9b1 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -6,7 +6,7 @@ class TestGeneratedSite < JekyllUnitTest clear_dest config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir}) - @site = fixture_site config + @site = fixture_site(config) @site.process @index = File.read(dest_dir('index.html')) end @@ -59,7 +59,7 @@ class TestGeneratedSite < JekyllUnitTest setup do clear_dest config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => 5}) - @site = fixture_site config + @site = fixture_site(config) @site.process @index = File.read(dest_dir('index.html')) end @@ -73,7 +73,7 @@ class TestGeneratedSite < JekyllUnitTest clear_dest config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => -1}) - @site = fixture_site config + @site = fixture_site(config) end end diff --git a/test/test_layout_reader.rb b/test/test_layout_reader.rb index 88f35220765..11acdb3140e 100644 --- a/test/test_layout_reader.rb +++ b/test/test_layout_reader.rb @@ -4,7 +4,7 @@ class TestLayoutReader < JekyllUnitTest context "reading layouts" do setup do config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir}) - @site = fixture_site config + @site = fixture_site(config) end should "read layouts" do diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 3af7a1f0e45..85512ab449b 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -19,12 +19,12 @@ def setup_static_file(base, dir, name) end def setup_static_file_with_collection(base, dir, name, label, metadata) - site = fixture_site 'collections' => {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 + site = fixture_site('defaults' => defaults) StaticFile.new(site, base, dir, name) end @@ -130,4 +130,3 @@ def setup_static_file_with_defaults(base, dir, name, defaults) end end end - From 59a5fc64f997c5bd08e8a2c0c4dcb2b1f7da4e3c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 26 Dec 2015 22:09:34 -0500 Subject: [PATCH 0136/4996] Update history to reflect merge of #4281 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f603cbd3aaf..52d7053835a 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Allow quoted date in front matter defaults (#4184) * Add a Jekyll doctor warning for URLs that only differ by case (#3171) * drops: create one base Drop class which can be set as mutable or not (#4285) + * drops: provide `#to_h` to allow for hash introspection (#4281) ### Bug Fixes From 69a6323599ea1c902097d958892611fc9b672a51 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sat, 26 Dec 2015 12:37:08 -0800 Subject: [PATCH 0137/4996] Utils.deep_merge_hashes failing test --- test/test_utils.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/test_utils.rb b/test/test_utils.rb index f25a5f694aa..42d4f3ed8b0 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -1,6 +1,21 @@ require 'helper' class TestUtils < JekyllUnitTest + context "The \`Utils.deep_merge_hashes\` method" do + setup do + clear_dest + config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir}) + + @site = fixture_site(config) + @site.process + end + + should "merge a page into the site" do + data = {"page" => {}} + assert Utils.deep_merge_hashes(data, @site.site_payload) + end + end + context "hash" do context "pluralized_array" do From 5bf596b2390ec716cad3da81eece9f2c08dc6f96 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 27 Dec 2015 08:06:37 -0500 Subject: [PATCH 0138/4996] utils/drops: update Drop to support Utils.deep_merge_hashes Fixes #4287 --- lib/jekyll/drops/drop.rb | 23 ++++++++++++++++++++++- lib/jekyll/drops/unified_payload_drop.rb | 8 ++------ lib/jekyll/utils.rb | 5 +++-- test/test_utils.rb | 20 +++++++++++++++----- 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index b14581a40af..98eb864acfa 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -71,6 +71,18 @@ def []=(key, val) end end + # Generates a list of strings which correspond to content getter + # methods. + # + # Returns an Array of strings which represent method-specific keys. + def content_methods + @content_methods ||= ( + self.class.instance_methods(false) - NON_CONTENT_METHODS + ).map(&:to_s).reject do |method| + method.end_with?("=") + end + end + # Generates a list of keys with user content as their values. # This gathers up the Drop methods and keys of the mutations and # underlying data hashes and performs a set union to ensure a list @@ -78,7 +90,7 @@ def []=(key, val) # # Returns an Array of unique keys for content for the Drop. def keys - ((self.class.instance_methods(false) - NON_CONTENT_METHODS).map(&:to_s) | + (content_methods | @mutations.keys | fallback_data.keys).flatten end @@ -102,6 +114,15 @@ def inspect JSON.pretty_generate to_h end + # Collects all the keys and passes each to the block in turn. + # + # block - a block which accepts one argument, the key + # + # Returns nothing. + def each_key(&block) + keys.each(&block) + end + end end end diff --git a/lib/jekyll/drops/unified_payload_drop.rb b/lib/jekyll/drops/unified_payload_drop.rb index 3c593ba6a47..26b9104b6d9 100644 --- a/lib/jekyll/drops/unified_payload_drop.rb +++ b/lib/jekyll/drops/unified_payload_drop.rb @@ -3,21 +3,17 @@ module Jekyll module Drops class UnifiedPayloadDrop < Drop - mutable false + mutable true attr_accessor :page, :layout, :content, :paginator attr_accessor :highlighter_prefix, :highlighter_suffix - def initialize(site) - @site = site - end - def jekyll JekyllDrop.global end def site - @site_drop ||= SiteDrop.new(@site) + @site_drop ||= SiteDrop.new(@obj) end private diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index a2c6139d5da..c0c56579d2e 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -31,7 +31,8 @@ def deep_merge_hashes(master_hash, other_hash) # Thanks to whoever made it. def deep_merge_hashes!(target, overwrite) overwrite.each_key do |key| - if overwrite[key].is_a? Hash and target[key].is_a? Hash + if (overwrite[key].is_a?(Hash) or overwrite[key].is_a?(Drops::Drop)) and + (target[key].is_a?(Hash) or target[key].is_a?(Drops::Drop)) target[key] = Utils.deep_merge_hashes(target[key], overwrite[key]) next end @@ -39,7 +40,7 @@ def deep_merge_hashes!(target, overwrite) target[key] = overwrite[key] end - if target.default_proc.nil? + if target.respond_to?(:default_proc) && overwrite.respond_to?(:default_proc) && target.default_proc.nil? target.default_proc = overwrite.default_proc end diff --git a/test/test_utils.rb b/test/test_utils.rb index 42d4f3ed8b0..bf7e8957aed 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -4,15 +4,25 @@ class TestUtils < JekyllUnitTest context "The \`Utils.deep_merge_hashes\` method" do setup do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir}) - - @site = fixture_site(config) + @site = fixture_site @site.process end - should "merge a page into the site" do + should "merge a drop into a hash" do + data = {"page" => {}} + merged = Utils.deep_merge_hashes(data, @site.site_payload) + assert merged.is_a? Hash + assert merged["site"].is_a? Drops::SiteDrop + assert_equal data["page"], {} + end + + should "merge a hash into a drop" do data = {"page" => {}} - assert Utils.deep_merge_hashes(data, @site.site_payload) + assert_nil @site.site_payload["page"] + merged = Utils.deep_merge_hashes(@site.site_payload, data) + assert merged.is_a? Drops::UnifiedPayloadDrop + assert merged["site"].is_a? Drops::SiteDrop + assert_equal data["page"], {} end end From 8e887dcd8b13bbce8d7feb0e3c81cd4d2c6be246 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 27 Dec 2015 08:23:50 -0500 Subject: [PATCH 0139/4996] markdown: minor style fixes ref: #3771 --- lib/jekyll/converters/markdown.rb | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index e3c89934856..711c0a31ebf 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -14,8 +14,7 @@ def setup raise Errors::FatalException, "Bailing out; invalid Markdown processor." end - @setup = \ - true + @setup = true end def get_processor @@ -33,8 +32,7 @@ def get_processor # are not in safe mode.) def valid_processors - %W(rdiscount kramdown redcarpet) + \ - third_party_processors + %W(rdiscount kramdown redcarpet) + third_party_processors end # Public: A list of processors that you provide via plugins. @@ -55,9 +53,7 @@ def extname_list end def matches(ext) - extname_list.include?( - ext.downcase - ) + extname_list.include?(ext.downcase) end def output_ext(ext) @@ -65,19 +61,15 @@ def output_ext(ext) end def convert(content) - setup - @parser.convert( - content - ) + setup + @parser.convert(content) end private def get_custom_processor - md = @config["markdown"] - if custom_class_allowed?(md) - self.class.const_get(md).new( - @config - ) + converter_name = @config["markdown"] + if custom_class_allowed?(converter_name) + self.class.const_get(converter_name).new(@config) end end From e302873203cefc40019d17eb09bec837e09b15c7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 27 Dec 2015 08:25:29 -0500 Subject: [PATCH 0140/4996] Update history to reflect merge of #3771 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 52d7053835a..33bc08309c0 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Modernize Kramdown for Markdown converter. (#4109) * Change TestDoctorCommand to JekyllUnitTest... (#4263) * Create namespaced rake tasks in separate `.rake` files under `lib/tasks` (#4282) + * markdown: refactor for greater readability & efficiency (#3771) ### Site Enhancements From cb342c375dee00cb3b90872de55c3530173cbb53 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 27 Dec 2015 08:27:37 -0500 Subject: [PATCH 0141/4996] Update history to reflect merge of #4289 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 33bc08309c0..9a2b4acad90 100644 --- a/History.markdown +++ b/History.markdown @@ -27,6 +27,7 @@ * Avoid using `Dir.glob` with absolute path to allow special characters in the path (#4150) * Handle empty config files (#4052) * Rename `@options` so that it does not impact Liquid. (#4173) + * utils/drops: update Drop to support `Utils.deep_merge_hashes` (#4289) ### Development Fixes From 5034216637c79a412b3366cbcc10f81db1724b60 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 27 Dec 2015 08:32:08 -0500 Subject: [PATCH 0142/4996] Release :gem: 3.1.0.pre.beta1 --- lib/jekyll/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 7907aaa5590..2d2bf2c6a06 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.0.1' + VERSION = '3.1.0.pre.beta1' end From f2f88dbd9f1f4035d7fc51e2dbb6e75d07cd64e7 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 27 Dec 2015 12:48:21 -0600 Subject: [PATCH 0143/4996] Move require "jekyll/drops/drop" to "jekyll.rb" Linux does not read files in alphanumeric order, this can lead to Jekyll drops not working on Linux because the assumption here is that the collection drop will be required first. --- lib/jekyll.rb | 1 + lib/jekyll/drops/collection_drop.rb | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index e3fca10b1f6..3d33e52c572 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -169,6 +169,7 @@ def sanitized_path(base_directory, questionable_path) end end +require "jekyll/drops/drop" require_all 'jekyll/commands' require_all 'jekyll/converters' require_all 'jekyll/converters/markdown' diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb index 009635a427e..26913230471 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -1,5 +1,4 @@ # encoding: UTF-8 -require "jekyll/drops/drop" module Jekyll module Drops From e048e428d19d32fad645051cde93073c06727488 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 27 Dec 2015 12:56:42 -0600 Subject: [PATCH 0144/4996] Update History.markdown --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9a2b4acad90..4b2cb3fa1c6 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,7 @@ * Handle empty config files (#4052) * Rename `@options` so that it does not impact Liquid. (#4173) * utils/drops: update Drop to support `Utils.deep_merge_hashes` (#4289) + * Make sure jekyll/drops/drop is loaded first. (#4292) ### Development Fixes From e98f543513465971bf8aba71e1c51807a052016e Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Sun, 27 Dec 2015 19:44:08 -0800 Subject: [PATCH 0145/4996] Add some documentation for incremental regeneration --- site/_docs/configuration.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 0e4f57590e1..6bf17766c61 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -712,3 +712,35 @@ in the `_plugins` folder or as a gem, specify it in your `_config.yml`: {% highlight yaml %} markdown: MyCustomProcessor {% endhighlight %} + +## Incremental Regeneration +
+
Incremental regeneration is still an experimental feature
+

+ While incremental regeneration will work for the most common cases, it will + not work correctly in every scenario. Please be extremely cautious when + using the feature, and report any problems not listed below by + opening an issue on GitHub. +

+
+ +Incremental regeneration helps shorten build times by only generating documents +and pages that were updated since the previous build. It does this by keeping +track of both file modification times and inter-document dependencies in the +`.jekyll-metadata` file. + +Under the current implementation, incremental regeneration will only generate a +document or page if either it, or one of its dependencies, is modified. Currently, +the only types of dependencies tracked are includes (using the +{% raw %}`{% include %}`{% endraw %} tag) and layouts. This means that plain +references to other documents (for example, the common case of iterating over +`site.posts` in a post listings page) will not be detected as a dependency. + +To remedy some of these shortfalls, putting `regenerate: true` in the front-matter +of a document will force Jekyll to regenerate it regardless of whether it has been +modified. Note that this will generate the specified document only; references +to other documents' contents will not work since they won't be re-rendered. + +Incremental regeneration can be enabled via the `--incremental` flag (`-I` for +short) from the command-line or by setting `incremental: true` in your +configuration file. From 0309c940dfbe2f60560656bc3b8a80d974135e21 Mon Sep 17 00:00:00 2001 From: Kakoma Date: Mon, 28 Dec 2015 18:48:52 +0300 Subject: [PATCH 0146/4996] Use permalink Front Matter variable for clean URLs Add pro Tip to use permalink front matter variable to get clean URLs --- site/_docs/pages.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/site/_docs/pages.md b/site/_docs/pages.md index 2299c83c8dd..a2080868e03 100644 --- a/site/_docs/pages.md +++ b/site/_docs/pages.md @@ -87,3 +87,15 @@ might look like: This approach may not suit everyone, but for people who like clean URLs it’s simple and it works. In the end the decision is yours! + +
+
ProTip™: Use permalink Front Matter Variable
+

+ Clean URLs can also be achieved using the permalink Front Matter variable. In the example above, using the first method, you can get URL http://example.com/other for the file other.md by adding this to the top of the file. +

+    ---
+    permalink: /other/
+    ---
+    
+

+
From bf4bfcf4f08d342a7f2971e8a85e94cb6eed100b Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 29 Dec 2015 18:02:59 -0800 Subject: [PATCH 0147/4996] Add link to jekyll-commonmark --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 57f7d51583d..2aff0b959d0 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -761,6 +761,7 @@ LESS.js files during generation. - [Bigfootnotes Plugin](https://github.com/TheFox/jekyll-bigfootnotes): Enables big footnotes for Kramdown. - [AsciiDoc Plugin](https://github.com/asciidoctor/jekyll-asciidoc): AsciiDoc convertor for Jekyll using [Asciidoctor](http://asciidoctor.org/). - [Lazy Tweet Embedding](https://github.com/takuti/jekyll-lazy-tweet-embedding): Automatically convert tweet urls into twitter cards. +- [jekyll-commonmark](https://github.com/pathawks/jekyll-commonmark): Markdown converter that uses [libcmark](https://github.com/jgm/CommonMark), the reference parser for CommonMark. #### Filters From a1c97c66fbdc87cc4148c7ac50d6790622100051 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 30 Dec 2015 09:26:18 -0800 Subject: [PATCH 0148/4996] Update history to reflect merge of #4299 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4b2cb3fa1c6..c590832fb67 100644 --- a/History.markdown +++ b/History.markdown @@ -56,6 +56,7 @@ * Add Markdown examples to Pages docs (#4275) * Add jekyll-paginate-category to list of third-party plugins (#4273) * Add `jekyll-responsive_image` to list of third-party plugins (#4286) + * Add `jekyll-commonmark` to list of third-party plugins (#4299) ## 3.0.1 / 2015-11-17 From 519c0f1b3849eac0c3e094ffb13dff6330ce63e2 Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Wed, 30 Dec 2015 10:43:01 -0800 Subject: [PATCH 0149/4996] Update history to reflect merge of #4293 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c590832fb67..b45e565b28d 100644 --- a/History.markdown +++ b/History.markdown @@ -57,6 +57,7 @@ * Add jekyll-paginate-category to list of third-party plugins (#4273) * Add `jekyll-responsive_image` to list of third-party plugins (#4286) * Add `jekyll-commonmark` to list of third-party plugins (#4299) + * Add documentation for incremental regeneration (#4293) ## 3.0.1 / 2015-11-17 From 13f520f2b40079c3293d199a2672c62ad60aec38 Mon Sep 17 00:00:00 2001 From: Alistair Calder Date: Wed, 30 Dec 2015 16:07:15 -0800 Subject: [PATCH 0150/4996] Added content on relative permalinks Could not find documentation on issues with relative permalinks. Added what fixed it for me. --- site/_docs/upgrading/2-to-3.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index cdc69fd044b..c01be517960 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -71,4 +71,15 @@ go back to using Pygments, set `highlighter: pygments` in your `_config.yml` file and run `gem install pygments.rb` or add `gem 'pygments.rb'` to your project's `Gemfile`. +### Relative Permalinks deprecated + +In Jekyll 3 and above, relative permalinks have been deprecated. If you created your site using Jekyll 2 and below, you may receive the following error when trying to **serve** or **build**: + + Since v3.0, permalinks for pages in subfolders must be relative to the site source directory, not the parent directory. Check http://jekyllrb.com/docs/upgrading/ for more info. + +This can be fixed by removing the following line from your _config.yml file: + + relative_permalinks: true + + _Did we miss something? Please click "Improve this page" above and add a section. Thanks!_ From 2a280b7f626bf4e415062291a3b86e2f68ba927e Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 2 Jan 2016 23:58:59 -0600 Subject: [PATCH 0151/4996] Reduce our surface, extend self is useful for some modules. We should handle extend self and module_function on a case-by-case basis because there are times when extend self is useful, especially when you wish a module to be included but also available on itself. `module_function` does not allow this. --- .codeclimate.yml | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index 29ed62d0cda..ae7e3d26db8 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -2,24 +2,25 @@ engines: rubocop: enabled: true checks: - Rubocop/Style/SpaceInsideBrackets: { enabled: false } - Rubocop/Style/BracesAroundHashParameters: { enabled: false} + Rubocop/Style/SpaceInsideBrackets: { enabled: false } + Rubocop/Style/BracesAroundHashParameters: { enabled: false} Rubocop/Style/EmptyLinesAroundAccessModifier: { enabled: false } - Rubocop/Style/EmptyLinesAroundModuleBody: { enabled: false } - Rubocop/Lint/FormatParameterMismatch: { enabled: false } - Rubocop/Lint/UselessAccessModifier: { enabled: false } - Rubocop/Lint/AssignmentInCondition: { enabled: false } - Rubocop/Style/SpaceAroundOperators: { enabled: false } - Rubocop/Style/AlignParameters: { enabled: false } - Rubocop/Style/SignalException: { enabled: false } - Rubocop/Style/Documentation: { enabled: false } - Rubocop/Style/DoubleNegation: { enabled: false } - Rubocop/Style/UnneededCapitalW: { enabled: false } - Rubocop/Style/IfUnlessModifier: { enabled: false } - Rubocop/Style/RescueModifier: { enabled: false } - Rubocop/Style/RegexpLiteral: { enabled: false } - Rubocop/Style/GuardClause: { enabled: false } - Rubocop/Style/FileName: { enabled: false } + Rubocop/Style/EmptyLinesAroundModuleBody: { enabled: false } + Rubocop/Lint/FormatParameterMismatch: { enabled: false } + Rubocop/Lint/UselessAccessModifier: { enabled: false } + Rubocop/Lint/AssignmentInCondition: { enabled: false } + Rubocop/Style/SpaceAroundOperators: { enabled: false } + Rubocop/Style/AlignParameters: { enabled: false } + Rubocop/Style/SignalException: { enabled: false } + Rubocop/Style/Documentation: { enabled: false } + Rubocop/Style/DoubleNegation: { enabled: false } + Rubocop/Style/UnneededCapitalW: { enabled: false } + Rubocop/Style/IfUnlessModifier: { enabled: false } + Rubocop/Style/RescueModifier: { enabled: false } + Rubocop/Style/RegexpLiteral: { enabled: false } + Rubocop/Style/GuardClause: { enabled: false } + Rubocop/Style/FileName: { enabled: false } + Rubocop/Style/ModuleFunction: { enabled: false } fixme: enabled: false exclude_paths: From a2623be3da72313d47ac1e203d54c7230e8d72c7 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 3 Jan 2016 00:15:31 -0600 Subject: [PATCH 0152/4996] Be consistent with your hashes and arrays. ``` val = %W(hello world world) ``` ``` var = %W( hello world ) ``` ``` var = %W(hello world) ``` --- .rubocop.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.rubocop.yml b/.rubocop.yml index 66b8552d634..478837c345d 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,5 +1,7 @@ Style/IndentHash: { EnforcedStyle: align_braces } Style/StringLiteralsInInterpolation: { EnforcedStyle: double_quotes } +Style/IndentArray: { EnforcedStyle: consistent } +Style/IndentHash: { EnforcedStyle: consistent } Style/StringLiterals: { EnforcedStyle: none } Metrics/MethodLength: { Max: 24 } Metrics/ClassLength: { Max: 240 } From b7d5a26d53300616937c92aa42fba7c7527db01d Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 3 Jan 2016 02:19:42 -0600 Subject: [PATCH 0153/4996] Move around CodeClimate so people can do `bundle exec rubocop`. /cc @pathawks -- This is why you were not getting the custom settings we had made and some things were showing up as broken when they weren't. Sorry. --- .codeclimate.yml | 30 ++++------------------- .rubocop.yml | 64 +++++++++++++++++++++++++++++++++++++----------- Gemfile | 1 + 3 files changed, 56 insertions(+), 39 deletions(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index ae7e3d26db8..27b8728d48d 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,28 +1,6 @@ engines: - rubocop: - enabled: true - checks: - Rubocop/Style/SpaceInsideBrackets: { enabled: false } - Rubocop/Style/BracesAroundHashParameters: { enabled: false} - Rubocop/Style/EmptyLinesAroundAccessModifier: { enabled: false } - Rubocop/Style/EmptyLinesAroundModuleBody: { enabled: false } - Rubocop/Lint/FormatParameterMismatch: { enabled: false } - Rubocop/Lint/UselessAccessModifier: { enabled: false } - Rubocop/Lint/AssignmentInCondition: { enabled: false } - Rubocop/Style/SpaceAroundOperators: { enabled: false } - Rubocop/Style/AlignParameters: { enabled: false } - Rubocop/Style/SignalException: { enabled: false } - Rubocop/Style/Documentation: { enabled: false } - Rubocop/Style/DoubleNegation: { enabled: false } - Rubocop/Style/UnneededCapitalW: { enabled: false } - Rubocop/Style/IfUnlessModifier: { enabled: false } - Rubocop/Style/RescueModifier: { enabled: false } - Rubocop/Style/RegexpLiteral: { enabled: false } - Rubocop/Style/GuardClause: { enabled: false } - Rubocop/Style/FileName: { enabled: false } - Rubocop/Style/ModuleFunction: { enabled: false } - fixme: - enabled: false + rubocop: { enabled: true } + fixme: { enabled: false } exclude_paths: - .rubocop.yml - .codeclimate.yml @@ -40,8 +18,10 @@ exclude_paths: - LICENSE - test/**/* +- vendor/**/* +- features/**/* - script/**/* - spec/**/* ratings: paths: - - lib/**/* + - lib/**/*.rb diff --git a/.rubocop.yml b/.rubocop.yml index 478837c345d..1bd98b26b62 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,22 +1,18 @@ -Style/IndentHash: { EnforcedStyle: align_braces } -Style/StringLiteralsInInterpolation: { EnforcedStyle: double_quotes } -Style/IndentArray: { EnforcedStyle: consistent } -Style/IndentHash: { EnforcedStyle: consistent } -Style/StringLiterals: { EnforcedStyle: none } Metrics/MethodLength: { Max: 24 } Metrics/ClassLength: { Max: 240 } Metrics/ModuleLength: { Max: 240 } Metrics/LineLength: { Max: 112 } -Style/HashSyntax: - UseHashRocketsWithSymbolValues: false - SupportedStyles: [ruby19 ruby19_no_mixed_keys, hash_rockets] - EnforcedStyle: ruby19 - -Style/MultilineOperationIndentation: - EnforcedStyle: indented - SupportedStyles: - - indented +Style/IndentHash: { EnforcedStyle: consistent } +Style/HashSyntax: { EnforcedStyle: hash_rockets } +Style/SignalException: { EnforcedStyle: only_raise } +Style/SpaceAroundOperators: { AllowForAlignment: true } +Style/AlignParameters: { EnforcedStyle: with_fixed_indentation } +Style/StringLiteralsInInterpolation: { EnforcedStyle: double_quotes } +Style/MultilineOperationIndentation: { EnforcedStyle: indented } +# Style/StringLiterals: { EnforcedStyle: double_quotes } +Style/RegexpLiteral: { EnforcedStyle: percent_r } +Style/IndentArray: { EnforcedStyle: consistent } Style/PercentLiteralDelimiters: PreferredDelimiters: @@ -27,3 +23,43 @@ Style/PercentLiteralDelimiters: '%w': '()' '%W': '()' '%x': '()' + +Style/StringLiterals: { Enabled: false } +Style/Documentation: { Enabled: false } +Style/DoubleNegation: { Enabled: false } +Style/UnneededCapitalW: { Enabled: false } +Style/EmptyLinesAroundModuleBody: { Enabled: false } +Style/EmptyLinesAroundAccessModifier: { Enabled: false } +Style/BracesAroundHashParameters: { Enabled: false } +Style/SpaceInsideBrackets: { Enabled: false } +Style/IfUnlessModifier: { Enabled: false } +Style/ModuleFunction: { Enabled: false } +Style/RescueModifier: { Enabled: false } +Style/GuardClause: { Enabled: false } +Style/FileName: { Enabled: false } + +AllCops: + Include: + - lib/**/*.rb + + Exclude: + - .rubocop.yml + - .codeclimate.yml + - .travis.yml + - .gitignore + - .rspec + + - Gemfile.lock + - CHANGELOG.md + - readme.md + - README.md + - Readme.md + - ReadMe.md + - COPYING + - LICENSE + + - test/**/* + - vendor/**/* + - features/**/* + - script/**/* + - spec/**/* diff --git a/Gemfile b/Gemfile index cdafdc9b5fa..750c461b132 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,7 @@ group :development do gem 'rdoc', '~> 4.2' gem 'launchy', '~> 2.3' gem 'toml', '~> 0.1.0' + gem "rubocop" gem 'pry' end From 8e00301fcacf19f8f06e569c851e3fe0850ae8da Mon Sep 17 00:00:00 2001 From: Atul Bhosale Date: Fri, 1 Jan 2016 11:24:00 +0530 Subject: [PATCH 0154/4996] Update copyright notices to 2016 [ci skip] --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 527166b60b2..94dbfc391f0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2008-2015 Tom Preston-Werner +Copyright (c) 2008-2016 Tom Preston-Werner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 22a0be3f7b743ec42844edfb8d6359e28287774d Mon Sep 17 00:00:00 2001 From: William Entriken Date: Sun, 3 Jan 2016 16:10:38 -0500 Subject: [PATCH 0155/4996] Escape html from site.title and page.title --- lib/site_template/_includes/head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/site_template/_includes/head.html b/lib/site_template/_includes/head.html index 41340ae57b4..1598d6fe77a 100644 --- a/lib/site_template/_includes/head.html +++ b/lib/site_template/_includes/head.html @@ -3,7 +3,7 @@ - {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} From ffdbeb89dd06d361396afff5f2254004d332f1fc Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 3 Jan 2016 15:57:47 -0600 Subject: [PATCH 0156/4996] Further refine our Rubocop to the current styles. --- .rubocop.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 1bd98b26b62..345bec1df0f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -6,13 +6,15 @@ Metrics/LineLength: { Max: 112 } Style/IndentHash: { EnforcedStyle: consistent } Style/HashSyntax: { EnforcedStyle: hash_rockets } Style/SignalException: { EnforcedStyle: only_raise } -Style/SpaceAroundOperators: { AllowForAlignment: true } Style/AlignParameters: { EnforcedStyle: with_fixed_indentation } Style/StringLiteralsInInterpolation: { EnforcedStyle: double_quotes } +Style/RegexpLiteral: { EnforcedStyle: slashes, AllowInnerSlashes: true } +Style/MultilineMethodCallIndentation: { EnforcedStyle: indented } Style/MultilineOperationIndentation: { EnforcedStyle: indented } -# Style/StringLiterals: { EnforcedStyle: double_quotes } -Style/RegexpLiteral: { EnforcedStyle: percent_r } +Style/FirstParameterIndentation: { EnforcedStyle: consistent } +Style/StringLiterals: { EnforcedStyle: double_quotes } Style/IndentArray: { EnforcedStyle: consistent } +Style/ExtraSpacing: { AllowForAlignment: true } Style/PercentLiteralDelimiters: PreferredDelimiters: @@ -24,6 +26,7 @@ Style/PercentLiteralDelimiters: '%W': '()' '%x': '()' +Style/AlignArray: { Enabled: false } Style/StringLiterals: { Enabled: false } Style/Documentation: { Enabled: false } Style/DoubleNegation: { Enabled: false } @@ -37,8 +40,12 @@ Style/ModuleFunction: { Enabled: false } Style/RescueModifier: { Enabled: false } Style/GuardClause: { Enabled: false } Style/FileName: { Enabled: false } +Lint/UselessAccessModifier: { Enabled: false } +Style/SpaceAroundOperators: { Enabled: false } +Style/RedundantReturn: { Enabled: false } AllCops: + TargetRubyVersion: 2.0 Include: - lib/**/*.rb From 31dd0ebed5faa79d68307222403de85db9177f16 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 14:39:01 -0800 Subject: [PATCH 0157/4996] Rubocop: Style/EmptyLiteral - Use array literal [] instead of Array.new - Use hash literal {} instead of Hash.new --- lib/jekyll.rb | 2 +- lib/jekyll/collection.rb | 6 +++--- lib/jekyll/commands/doctor.rb | 2 +- lib/jekyll/document.rb | 2 +- lib/jekyll/readers/page_reader.rb | 2 +- lib/jekyll/readers/static_file_reader.rb | 2 +- lib/jekyll/static_file.rb | 4 ++-- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 3d33e52c572..24448c26940 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -95,7 +95,7 @@ def env # list of option names and their defaults. # # Returns the final configuration Hash. - def configuration(override = Hash.new) + def configuration(override = {}) config = Configuration[Configuration::DEFAULTS] override = Configuration[override].stringify_keys unless override.delete('skip_config_files') diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index f74ccf6f791..a68fbfec84d 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -76,7 +76,7 @@ def read # Returns an Array of file paths to the documents in this collection # relative to the collection's directory def entries - return Array.new unless exists? + return [] unless exists? @entries ||= Utils.safe_glob(collection_dir, ["**", "*.*"]).map do |entry| entry["#{collection_dir}/"] = ''; entry @@ -88,7 +88,7 @@ def entries # # Returns a list of filtered entry paths. def filtered_entries - return Array.new unless exists? + return [] unless exists? @filtered_entries ||= Dir.chdir(directory) do entry_filter.filter(entries).reject do |f| @@ -195,7 +195,7 @@ def url_template # Returns the metadata for this collection def extract_metadata if site.config['collections'].is_a?(Hash) - site.config['collections'][label] || Hash.new + site.config['collections'][label] || {} else {} end diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 02e1967d0d4..8ce2c4732ee 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -105,7 +105,7 @@ def collect_urls(urls, things, destination) end def case_insensitive_urls(things, destination) - things.inject(Hash.new) do |memo, thing| + things.inject({}) do |memo, thing| dest = thing.destination(destination) (memo[dest.downcase] ||= []) << dest memo diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 14a0a92e224..c906e149842 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -52,7 +52,7 @@ def content=(content) # Returns a Hash containing the data. An empty hash is returned if # no data was read. def data - @data ||= Hash.new + @data ||= {} end # Merge some data in with this document's data. diff --git a/lib/jekyll/readers/page_reader.rb b/lib/jekyll/readers/page_reader.rb index 099ebf133ed..12e7074814f 100644 --- a/lib/jekyll/readers/page_reader.rb +++ b/lib/jekyll/readers/page_reader.rb @@ -4,7 +4,7 @@ class PageReader def initialize(site, dir) @site = site @dir = dir - @unfiltered_content = Array.new + @unfiltered_content = [] end # Read all the files in // for Yaml header and create a new Page diff --git a/lib/jekyll/readers/static_file_reader.rb b/lib/jekyll/readers/static_file_reader.rb index 279bea46d5e..b95981a8f39 100644 --- a/lib/jekyll/readers/static_file_reader.rb +++ b/lib/jekyll/readers/static_file_reader.rb @@ -4,7 +4,7 @@ class StaticFileReader def initialize(site, dir) @site = site @dir = dir - @unfiltered_content = Array.new + @unfiltered_content = [] end # Read all the files in // for Yaml header and create a new Page diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 48fa34c5990..6f24f7d2b38 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -1,7 +1,7 @@ module Jekyll class StaticFile # The cache of last modification times [path] -> mtime. - @@mtimes = Hash.new + @@mtimes = {} attr_reader :relative_path, :extname @@ -90,7 +90,7 @@ def write(dest) # # Returns nothing. def self.reset_cache - @@mtimes = Hash.new + @@mtimes = {} nil end From 44d2995277276e3e34ae2931a90c29b291c0ca8b Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 14:40:45 -0800 Subject: [PATCH 0158/4996] Rubocop: Style/Semicolon - Do not use semicolons to terminate expressions --- lib/jekyll/collection.rb | 3 ++- lib/jekyll/commands/serve.rb | 3 ++- lib/jekyll/tags/include.rb | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index a68fbfec84d..9b9f6593ab4 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -79,7 +79,8 @@ def entries return [] unless exists? @entries ||= Utils.safe_glob(collection_dir, ["**", "*.*"]).map do |entry| - entry["#{collection_dir}/"] = ''; entry + entry["#{collection_dir}/"] = '' + entry end end diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index aa8fc6a882e..4dad7600002 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -168,7 +168,8 @@ def enable_ssl(opts) raise RuntimeError, "--ssl-cert or --ssl-key missing." end - require "openssl"; require "webrick/https" + require "openssl" + require "webrick/https" source_key = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], opts[:JekyllOptions]["ssl_key" ]) source_certificate = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], opts[:JekyllOptions]["ssl_cert"]) opts[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.read(source_certificate)) diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 2e39738e0aa..6082a4cca6a 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -25,7 +25,7 @@ def initialize(tag_name, markup, tokens) @file = matched['variable'].strip @params = matched['params'].strip else - @file, @params = markup.strip.split(' ', 2); + @file, @params = markup.strip.split(' ', 2) end validate_params if @params @tag_name = tag_name From 0eae36aec2b6ce7043277ff463e780b4e85fbf78 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 14:41:49 -0800 Subject: [PATCH 0159/4996] Rubocop: Style/LineEndConcatenation - Use \ instead of + or << to concatenate those strings --- lib/jekyll/commands/doctor.rb | 10 ++++----- lib/jekyll/configuration.rb | 38 +++++++++++++++++------------------ lib/jekyll/filters.rb | 2 +- lib/jekyll/hooks.rb | 2 +- lib/jekyll/plugin_manager.rb | 4 ++-- lib/jekyll/site.rb | 8 ++++---- lib/jekyll/tags/highlight.rb | 2 +- lib/jekyll/tags/post_url.rb | 6 +++--- 8 files changed, 36 insertions(+), 36 deletions(-) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 8ce2c4732ee..a29cbf7e6fc 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -39,8 +39,8 @@ def healthy?(site) def deprecated_relative_permalinks(site) if site.config['relative_permalinks'] - Jekyll::Deprecator.deprecation_message "Your site still uses relative" + - " permalinks, which was removed in" + + Jekyll::Deprecator.deprecation_message "Your site still uses relative" \ + " permalinks, which was removed in" \ " Jekyll v3.0.0." return true end @@ -54,7 +54,7 @@ def conflicting_urls(site) urls.each do |url, paths| if paths.size > 1 conflicting_urls = true - Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" + + Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" \ " for the following pages: #{paths.join(", ")}" end end @@ -83,8 +83,8 @@ def urls_only_differ_by_case(site) urls.each do |case_insensitive_url, real_urls| if real_urls.uniq.size > 1 urls_only_differ_by_case = true - Jekyll.logger.warn "Warning:", "The following URLs only differ" + - " by case. On a case-insensitive file system one of the URLs" + + Jekyll.logger.warn "Warning:", "The following URLs only differ" \ + " by case. On a case-insensitive file system one of the URLs" \ " will be overwritten by the other: #{real_urls.join(", ")}" end end diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index e01f798cb67..21929f3fe65 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -173,7 +173,7 @@ def read_config_files(files) configuration = Utils.deep_merge_hashes(configuration, new_config) end rescue ArgumentError => err - Jekyll.logger.warn "WARNING:", "Error reading configuration. " + + Jekyll.logger.warn "WARNING:", "Error reading configuration. " \ "Using defaults (and options)." $stderr.puts "#{err}" end @@ -198,16 +198,16 @@ def backwards_compatibilize config = clone # Provide backwards-compatibility if config.key?('auto') || config.key?('watch') - Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" + - " be set from your configuration file(s). Use the"+ + Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" \ + " be set from your configuration file(s). Use the"\ " --[no-]watch/-w command-line option instead." config.delete('auto') config.delete('watch') end if config.key? 'server' - Jekyll::Deprecator.deprecation_message "The 'server' configuration option" + - " is no longer accepted. Use the 'jekyll serve'" + + Jekyll::Deprecator.deprecation_message "The 'server' configuration option" \ + " is no longer accepted. Use the 'jekyll serve'" \ " subcommand to serve your site with WEBrick." config.delete('server') end @@ -218,9 +218,9 @@ def backwards_compatibilize renamed_key 'data_source', 'data_dir', config if config.key? 'pygments' - Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" + - " has been renamed to 'highlighter'. Please update your" + - " config file accordingly. The allowed values are 'rouge', " + + Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" \ + " has been renamed to 'highlighter'. Please update your" \ + " config file accordingly. The allowed values are 'rouge', " \ "'pygments' or null." config['highlighter'] = 'pygments' if config['pygments'] @@ -230,9 +230,9 @@ def backwards_compatibilize %w[include exclude].each do |option| config[option] ||= [] if config[option].is_a?(String) - Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" + - " must now be specified as an array, but you specified" + - " a string. For now, we've treated the string you provided" + + Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" \ + " must now be specified as an array, but you specified" \ + " a string. For now, we've treated the string you provided" \ " as a list of comma-separated values." config[option] = csv_to_array(config[option]) end @@ -240,16 +240,16 @@ def backwards_compatibilize end if (config['kramdown'] || {}).key?('use_coderay') - Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" + + Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" \ " to 'enable_coderay' in your configuration file." config['kramdown']['use_coderay'] = config['kramdown'].delete('enable_coderay') end if config.fetch('markdown', 'kramdown').to_s.downcase.eql?("maruku") - Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " + - "Markdown processor, which has been removed as of 3.0.0. " + - "We recommend you switch to Kramdown. To do this, replace " + - "`markdown: maruku` with `markdown: kramdown` in your " + + Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " \ + "Markdown processor, which has been removed as of 3.0.0. " \ + "We recommend you switch to Kramdown. To do this, replace " \ + "`markdown: maruku` with `markdown: kramdown` in your " \ "`_config.yml` file." end @@ -260,7 +260,7 @@ def fix_common_issues config = clone if config.key?('paginate') && (!config['paginate'].is_a?(Integer) || config['paginate'] < 1) - Jekyll.logger.warn "Config Warning:", "The `paginate` key must be a" + + Jekyll.logger.warn "Config Warning:", "The `paginate` key must be a" \ " positive integer or nil. It's currently set to '#{config['paginate'].inspect}'." config['paginate'] = nil end @@ -285,8 +285,8 @@ def add_default_collections def renamed_key(old, new, config, allowed_values = nil) if config.key?(old) - Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" + - "option has been renamed to '#{new}'. Please update your config " + + Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" \ + "option has been renamed to '#{new}'. Please update your config " \ "file accordingly." config[new] = config.delete(old) end diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 2b1bf1afbd8..2ba0fac323d 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -234,7 +234,7 @@ def sort(input, property = nil, nils = "first") when nils == "last" order = + 1 else - raise ArgumentError.new("Invalid nils order: " + + raise ArgumentError.new("Invalid nils order: " \ "'#{nils}' is not a valid nils order. It must be 'first' or 'last'.") end diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index a9a5e73529c..74c01bbbbcc 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -67,7 +67,7 @@ def self.register_one(owner, event, priority, &block) } unless @registry[owner][event] - raise NotAvailable, "Invalid hook. #{owner} supports only the " << + raise NotAvailable, "Invalid hook. #{owner} supports only the " \ "following hooks #{@registry[owner].keys.inspect}" end diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index 11db89d1772..da7bf121509 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -86,8 +86,8 @@ def plugins_path def deprecation_checks pagination_included = (site.config['gems'] || []).include?('jekyll-paginate') || defined?(Jekyll::Paginate) if site.config['paginate'] && !pagination_included - Jekyll::Deprecator.deprecation_message "You appear to have pagination " + - "turned on, but you haven't included the `jekyll-paginate` gem. " + + Jekyll::Deprecator.deprecation_message "You appear to have pagination " \ + "turned on, but you haven't included the `jekyll-paginate` gem. " \ "Ensure you have `gems: [jekyll-paginate]` in your configuration file." end end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 4dc3ac847e6..2575eba224c 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -292,10 +292,10 @@ def instantiate_subclasses(klass) # Returns def relative_permalinks_are_deprecated if config['relative_permalinks'] - Jekyll.logger.abort_with "Since v3.0, permalinks for pages" + - " in subfolders must be relative to the" + - " site source directory, not the parent" + - " directory. Check http://jekyllrb.com/docs/upgrading/"+ + Jekyll.logger.abort_with "Since v3.0, permalinks for pages" \ + " in subfolders must be relative to the" \ + " site source directory, not the parent" \ + " directory. Check http://jekyllrb.com/docs/upgrading/"\ " for more info." end end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 3e64bc8bc52..616dfdbf9db 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -88,7 +88,7 @@ def render_pygments(code, is_safe) puts Jekyll.logger.error code puts - Jekyll.logger.error "While attempting to convert the above code, Pygments.rb" + + Jekyll.logger.error "While attempting to convert the above code, Pygments.rb" \ " returned an unacceptable value." Jekyll.logger.error "This is usually a timeout problem solved by running `jekyll build` again." raise ArgumentError.new("Pygments.rb returned an unacceptable value when attempting to highlight some code.") diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index 5b0d6479f76..2da26ec0d28 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -70,9 +70,9 @@ def render(context) site.posts.docs.each do |p| if @post.deprecated_equality p - Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{@post.name} }}' did not match " + - "a post using the new matching method of checking name " + - "(path-date-slug) equality. Please make sure that you " + + Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{@post.name} }}' did not match " \ + "a post using the new matching method of checking name " \ + "(path-date-slug) equality. Please make sure that you " \ "change this tag to match the post's name exactly." return p.url end From 8223ebd86109c9b13339c93b660ef7e1215fd0fa Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:24:18 -0800 Subject: [PATCH 0160/4996] Use select and find instead of conditional loop --- lib/jekyll/commands/doctor.rb | 22 +++++++++------------- lib/jekyll/tags/post_url.rb | 22 ++++++++++------------ 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index a29cbf7e6fc..953c2623a13 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -51,12 +51,10 @@ def conflicting_urls(site) urls = {} urls = collect_urls(urls, site.pages, site.dest) urls = collect_urls(urls, site.posts.docs, site.dest) - urls.each do |url, paths| - if paths.size > 1 - conflicting_urls = true - Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" \ - " for the following pages: #{paths.join(", ")}" - end + urls.select { |_, p| p.size > 1 }.each do |url, paths| + conflicting_urls = true + Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" \ + " for the following pages: #{paths.join(", ")}" end conflicting_urls end @@ -80,13 +78,11 @@ def fsnotify_buggy?(site) def urls_only_differ_by_case(site) urls_only_differ_by_case = false urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest) - urls.each do |case_insensitive_url, real_urls| - if real_urls.uniq.size > 1 - urls_only_differ_by_case = true - Jekyll.logger.warn "Warning:", "The following URLs only differ" \ - " by case. On a case-insensitive file system one of the URLs" \ - " will be overwritten by the other: #{real_urls.join(", ")}" - end + urls.select { |_, p| p.size > 1 }.each do |_, real_urls| + urls_only_differ_by_case = true + Jekyll.logger.warn "Warning:", "The following URLs only differ" \ + " by case. On a case-insensitive file system one of the URLs" \ + " will be overwritten by the other: #{real_urls.join(", ")}" end urls_only_differ_by_case end diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index 2da26ec0d28..723eafd7a6f 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -59,23 +59,21 @@ def initialize(tag_name, post, tokens) def render(context) site = context.registers[:site] - site.posts.docs.each do |p| - if @post == p - return p.url - end + post = site.posts.docs.find { |p| @post == p } + if post + return post.url end # New matching method did not match, fall back to old method # with deprecation warning if this matches - site.posts.docs.each do |p| - if @post.deprecated_equality p - Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{@post.name} }}' did not match " \ - "a post using the new matching method of checking name " \ - "(path-date-slug) equality. Please make sure that you " \ - "change this tag to match the post's name exactly." - return p.url - end + post = site.posts.docs.find { |p| @post.deprecated_equality p } + if post + Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{@post.name} }}' did not match " \ + "a post using the new matching method of checking name " \ + "(path-date-slug) equality. Please make sure that you " \ + "change this tag to match the post's name exactly." + return post.url end raise ArgumentError.new <<-eos From 6550867051f54f879ea71305f3751c637e04f0b9 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:29:49 -0800 Subject: [PATCH 0161/4996] Rubocop: Style/SpecialGlobalVars - Prefer $LOAD_PATH over $: --- bin/jekyll | 2 +- lib/jekyll.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/jekyll b/bin/jekyll index 67705b515d7..26754040d55 100755 --- a/bin/jekyll +++ b/bin/jekyll @@ -1,7 +1,7 @@ #!/usr/bin/env ruby STDOUT.sync = true -$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) +$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) require 'jekyll' require 'mercenary' diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 24448c26940..ad8a3395f47 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -1,4 +1,4 @@ -$:.unshift File.dirname(__FILE__) # For use/testing when no gem is installed +$LOAD_PATH.unshift File.dirname(__FILE__) # For use/testing when no gem is installed # Require all of the Ruby files in the given directory. # From fb0457bf3d863cc2eacdb14960265affba88cced Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:30:26 -0800 Subject: [PATCH 0162/4996] Rubocop: Style/AndOr - Use && instead of and - Use || instead of or --- lib/jekyll/regenerator.rb | 2 +- lib/jekyll/static_file.rb | 2 +- lib/jekyll/stevenson.rb | 2 +- lib/jekyll/tags/highlight.rb | 2 +- lib/jekyll/tags/include.rb | 2 +- lib/jekyll/utils.rb | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 2d84ee34951..c7d47c59a9d 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -76,7 +76,7 @@ def clear_cache # # returns a boolean def source_modified_or_dest_missing?(source_path, dest_path) - modified?(source_path) || (dest_path and !File.exist?(dest_path)) + modified?(source_path) || (dest_path && !File.exist?(dest_path)) end # Checks if a path's (or one of its dependencies) diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 6f24f7d2b38..efa836d1f3b 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -75,7 +75,7 @@ def write? def write(dest) dest_path = destination(dest) - return false if File.exist?(dest_path) and !modified? + return false if File.exist?(dest_path) && !modified? @@mtimes[path] = mtime FileUtils.mkdir_p(File.dirname(dest_path)) diff --git a/lib/jekyll/stevenson.rb b/lib/jekyll/stevenson.rb index 9a9f412ec96..ea26c8b56c7 100644 --- a/lib/jekyll/stevenson.rb +++ b/lib/jekyll/stevenson.rb @@ -14,7 +14,7 @@ def add(severity, message = nil, progname = nil, &block) severity ||= UNKNOWN @logdev = set_logdevice(severity) - if @logdev.nil? or severity < @level + if @logdev.nil? || severity < @level return true end progname ||= @progname diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 616dfdbf9db..13c4e8e89ab 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -27,7 +27,7 @@ def initialize(tag_name, markup, tokens) @highlight_options[key.to_sym] = value || true end end - @highlight_options[:linenos] = "inline" if @highlight_options.key?(:linenos) and @highlight_options[:linenos] == true + @highlight_options[:linenos] = "inline" if @highlight_options.key?(:linenos) && @highlight_options[:linenos] == true else raise SyntaxError.new <<-eos Syntax Error in tag 'highlight' while parsing the following markup: diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 6082a4cca6a..e3bee1158fd 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -115,7 +115,7 @@ def render(context) validate_path(path, dir, site.safe) # Add include to dependency tree - if context.registers[:page] and context.registers[:page].has_key? "path" + if context.registers[:page] && context.registers[:page].has_key?("path") site.regenerator.add_dependency( site.in_source_dir(context.registers[:page]["path"]), path diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index c0c56579d2e..d18b41c7c57 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -31,8 +31,8 @@ def deep_merge_hashes(master_hash, other_hash) # Thanks to whoever made it. def deep_merge_hashes!(target, overwrite) overwrite.each_key do |key| - if (overwrite[key].is_a?(Hash) or overwrite[key].is_a?(Drops::Drop)) and - (target[key].is_a?(Hash) or target[key].is_a?(Drops::Drop)) + if (overwrite[key].is_a?(Hash) || overwrite[key].is_a?(Drops::Drop)) && + (target[key].is_a?(Hash) || target[key].is_a?(Drops::Drop)) target[key] = Utils.deep_merge_hashes(target[key], overwrite[key]) next end From 98a19cdf2b24fbf9d18ea38ee183929eabc032d0 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:32:11 -0800 Subject: [PATCH 0163/4996] Rubocop: Style/PercentLiteralDelimiters - %w-literals should be delimited by ( and ) Rubocop: Style/WordArray - Use %w or %W for array of words --- bin/jekyll | 2 +- lib/jekyll/configuration.rb | 4 ++-- lib/jekyll/converters/markdown.rb | 2 +- lib/jekyll/converters/markdown/redcarpet_parser.rb | 4 ++-- lib/jekyll/convertible.rb | 2 +- lib/jekyll/deprecator.rb | 2 +- lib/jekyll/document.rb | 4 ++-- lib/jekyll/external.rb | 4 ++-- lib/jekyll/liquid_renderer/table.rb | 2 +- lib/jekyll/page.rb | 4 ++-- lib/jekyll/readers/collection_reader.rb | 2 +- lib/jekyll/site.rb | 4 ++-- lib/jekyll/utils.rb | 2 +- 13 files changed, 19 insertions(+), 19 deletions(-) diff --git a/bin/jekyll b/bin/jekyll index 26754040d55..297e1175038 100755 --- a/bin/jekyll +++ b/bin/jekyll @@ -1,7 +1,7 @@ #!/usr/bin/env ruby STDOUT.sync = true -$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) +$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w( .. lib )) require 'jekyll' require 'mercenary' diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 21929f3fe65..a2e5e381a40 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -128,7 +128,7 @@ def config_files(override) # Get configuration from /_config.yml or / config_files = override.delete('config') if config_files.to_s.empty? - default = %w[yml yaml].find(Proc.new { 'yml' }) do |ext| + default = %w(yml yaml).find(Proc.new { 'yml' }) do |ext| File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}")) end config_files = Jekyll.sanitized_path(source(override), "_config.#{default}") @@ -227,7 +227,7 @@ def backwards_compatibilize config.delete('pygments') end - %w[include exclude].each do |option| + %w(include exclude).each do |option| config[option] ||= [] if config[option].is_a?(String) Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" \ diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 711c0a31ebf..8e297dca8a9 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -41,7 +41,7 @@ def valid_processors def third_party_processors self.class.constants - \ - %w[KramdownParser RDiscountParser RedcarpetParser PRIORITIES].map( + %w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map( &:to_sym ) end diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index 6788d96e0e8..7f5adcee069 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -71,10 +71,10 @@ def class_with_proper_highlighter(highlighter) end when "rouge" Class.new(Redcarpet::Render::HTML) do - Jekyll::External.require_with_graceful_fail(%w[ + Jekyll::External.require_with_graceful_fail(%w( rouge rouge/plugins/redcarpet - ]) + )) unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0") abort "Please install Rouge 1.3.0 or greater and try running Jekyll again." diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index db34307ab61..b510d306555 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -160,7 +160,7 @@ def asset_file? # # Returns true if extname == .sass or .scss, false otherwise. def sass_file? - %w[.sass .scss].include?(ext) + %w(.sass .scss).include?(ext) end # Determine whether the document is a CoffeeScript file. diff --git a/lib/jekyll/deprecator.rb b/lib/jekyll/deprecator.rb index 8fda510bb3a..d4ea3c882c2 100644 --- a/lib/jekyll/deprecator.rb +++ b/lib/jekyll/deprecator.rb @@ -21,7 +21,7 @@ def process(args) end def no_subcommand(args) - if args.size > 0 && args.first =~ /^--/ && !%w[--help --version].include?(args.first) + if args.size > 0 && args.first =~ /^--/ && !%w(--help --version).include?(args.first) deprecation_message "Jekyll now uses subcommands instead of just switches. Run `jekyll --help` to find out more." abort end diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index c906e149842..f3eda04f123 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -127,7 +127,7 @@ def cleaned_relative_path # # Returns true if the extname is either .yml or .yaml, false otherwise. def yaml_file? - %w[.yaml .yml].include?(extname) + %w(.yaml .yml).include?(extname) end # Determine whether the document is an asset file. @@ -143,7 +143,7 @@ def asset_file? # # Returns true if extname == .sass or .scss, false otherwise. def sass_file? - %w[.sass .scss].include?(extname) + %w(.sass .scss).include?(extname) end # Determine whether the document is a CoffeeScript file. diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index 04dbb6f2f01..8124805163a 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -7,10 +7,10 @@ class << self # Usually contain subcommands. # def blessed_gems - %w{ + %w( jekyll-docs jekyll-import - } + ) end # diff --git a/lib/jekyll/liquid_renderer/table.rb b/lib/jekyll/liquid_renderer/table.rb index 32b09cb3f04..15a802b0382 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -72,7 +72,7 @@ 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' ]] + table = [%w(Filename Count Bytes Time)] sorted.each do |filename, file_stats| row = [] diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 0644e1b650e..fb46f32463c 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -8,13 +8,13 @@ class Page attr_accessor :data, :content, :output # Attributes for Liquid templates - ATTRIBUTES_FOR_LIQUID = %w[ + ATTRIBUTES_FOR_LIQUID = %w( content dir name path url - ] + ) # A set of extensions that are considered HTML or HTML-like so we # should not alter them, this includes .xhtml through XHTM5. diff --git a/lib/jekyll/readers/collection_reader.rb b/lib/jekyll/readers/collection_reader.rb index 6a54321d45d..8d522551255 100644 --- a/lib/jekyll/readers/collection_reader.rb +++ b/lib/jekyll/readers/collection_reader.rb @@ -1,6 +1,6 @@ module Jekyll class CollectionReader - SPECIAL_COLLECTIONS = %w{posts data}.freeze + SPECIAL_COLLECTIONS = %w(posts data).freeze attr_reader :site, :content def initialize(site) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 2575eba224c..2859355cfc4 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -19,8 +19,8 @@ class Site def initialize(config) @config = config.clone - %w[safe lsi highlighter baseurl exclude include future unpublished - show_drafts limit_posts keep_files gems].each do |opt| + %w(safe lsi highlighter baseurl exclude include future unpublished + show_drafts limit_posts keep_files gems).each do |opt| self.send("#{opt}=", config[opt]) end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index d18b41c7c57..d5c68ae4a48 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -4,7 +4,7 @@ module Utils extend self autoload :Ansi, "jekyll/utils/ansi" # Constants for use in #slugify - SLUGIFY_MODES = %w{raw default pretty} + SLUGIFY_MODES = %w(raw default pretty) SLUGIFY_RAW_REGEXP = Regexp.new('\\s+').freeze SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze From ff5f7b71202663e5c693cec41f2108fbbb73ff2d Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:41:04 -0800 Subject: [PATCH 0164/4996] Rubocop: Style/DeprecatedHashMethods - Hash#has_key? is deprecated in favor of Hash#key? Add method `key?` to Drop --- lib/jekyll/drops/drop.rb | 13 +++++++++++++ lib/jekyll/frontmatter_defaults.rb | 4 ++-- lib/jekyll/regenerator.rb | 2 +- lib/jekyll/tags/include.rb | 4 ++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 98eb864acfa..23237a08193 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -83,6 +83,19 @@ def content_methods end end + # Check if key exists in Drop + # + # key - the string key whose value to fetch + # + # Returns true if the given key is present + def key?(key) + if self.class.mutable && @mutations.key?(key) + true + else + respond_to?(key) || fallback_data.key?(key) + end + end + # Generates a list of keys with user content as their values. # This gathers up the Drop methods and keys of the mutations and # underlying data hashes and performs a set union to ensure a list diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index 673d9a99f69..edf70969165 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -90,7 +90,7 @@ def applies?(scope, path, type) end def applies_path?(scope, path) - return true if !scope.has_key?('path') || scope['path'].empty? + return true if !scope.key?('path') || scope['path'].empty? scope_path = Pathname.new(scope['path']) Pathname.new(sanitize_path(path)).ascend do |path| @@ -150,7 +150,7 @@ def has_precedence?(old_scope, new_scope) # Returns an array of hashes def matching_sets(path, type) valid_sets.select do |set| - !set.has_key?('scope') || applies?(set['scope'], path, type) + !set.key?('scope') || applies?(set['scope'], path, type) end end diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index c7d47c59a9d..52ff5178f86 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -90,7 +90,7 @@ def modified?(path) return true if path.nil? # Check for path in cache - if cache.has_key? path + if cache.key? path return cache[path] end diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index e3bee1158fd..4152e7efe10 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -115,7 +115,7 @@ def render(context) validate_path(path, dir, site.safe) # Add include to dependency tree - if context.registers[:page] && context.registers[:page].has_key?("path") + if context.registers[:page] && context.registers[:page].key?("path") site.regenerator.add_dependency( site.in_source_dir(context.registers[:page]["path"]), path @@ -138,7 +138,7 @@ def load_cached_partial(path, context) context.registers[:cached_partials] ||= {} cached_partial = context.registers[:cached_partials] - if cached_partial.has_key?(path) + if cached_partial.key?(path) cached_partial[path] else cached_partial[path] = context.registers[:site].liquid_renderer.file(path).parse(read_file(path, context)) From d157a04c6d4f3c0d23ec5cf396003b321e245ca3 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:47:31 -0800 Subject: [PATCH 0165/4996] Rubocop: Performance/StringReplacement - Use delete! instead of gsub! - Use tr instead of gsub --- lib/jekyll/tags/highlight.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 13c4e8e89ab..575fb57e7bd 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -21,7 +21,7 @@ def initialize(tag_name, markup, tokens) key, value = opt.split('=') # If a quoted list, convert to array if value && value.include?("\"") - value.gsub!(/"/, "") + value.delete!('"') value = value.split end @highlight_options[key.to_sym] = value || true @@ -110,7 +110,7 @@ def render_codehighlighter(code) def add_code_tag(code) code_attributes = [ - "class=\"language-#{@lang.to_s.gsub('+', '-')}\"", + "class=\"language-#{@lang.to_s.tr('+', '-')}\"", "data-lang=\"#{@lang.to_s}\"" ].join(" ") "
#{code.chomp}
" From 2530a8cdfc4e0112e7642349b4a718ec95493b09 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:49:22 -0800 Subject: [PATCH 0166/4996] Rubocop: Style/HashSyntax - Use hash rockets syntax --- lib/jekyll/collection.rb | 2 +- lib/jekyll/document.rb | 6 ++-- lib/jekyll/drops/url_drop.rb | 4 +-- lib/jekyll/filters.rb | 2 +- lib/jekyll/hooks.rb | 48 +++++++++++++++---------------- lib/jekyll/readers/post_reader.rb | 4 +-- lib/jekyll/renderer.rb | 4 +-- lib/jekyll/static_file.rb | 14 ++++----- lib/jekyll/tags/highlight.rb | 2 +- 9 files changed, 43 insertions(+), 43 deletions(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 9b9f6593ab4..5d6b272848e 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -56,7 +56,7 @@ def read full_path = collection_dir(file_path) next if File.directory?(full_path) if Utils.has_yaml_header? full_path - doc = Jekyll::Document.new(full_path, { site: site, collection: self }) + doc = Jekyll::Document.new(full_path, { :site => site, :collection => self }) doc.read if site.publisher.publish?(doc) || !write? docs << doc diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index f3eda04f123..d757839f1d6 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -197,9 +197,9 @@ def permalink # Returns the computed URL for the document. def url @url = URL.new({ - template: url_template, - placeholders: url_placeholders, - permalink: permalink + :template => url_template, + :placeholders => url_placeholders, + :permalink => permalink }).to_s end diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb index a2bf6262c55..32aae194239 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -19,8 +19,8 @@ def name end def title - Utils.slugify(@obj.data['slug'], mode: "pretty", cased: true) || - Utils.slugify(@obj.basename_without_ext, mode: "pretty", cased: true) + Utils.slugify(@obj.data['slug'], :mode => "pretty", :cased => true) || + Utils.slugify(@obj.basename_without_ext, :mode => "pretty", :cased => true) end def slug diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 2ba0fac323d..ef40adb9775 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -45,7 +45,7 @@ def scssify(input) # Returns the given filename or title as a lowercase URL String. # See Utils.slugify for more detail. def slugify(input, mode=nil) - Utils.slugify(input, mode: mode) + Utils.slugify(input, :mode => mode) end # Format a date in short format e.g. "27 Jan 2011". diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index 74c01bbbbcc..a9bf79f5f67 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -4,37 +4,37 @@ module Hooks # compatibility layer for octopress-hooks users PRIORITY_MAP = { - low: 10, - normal: 20, - high: 30, + :low => 10, + :normal => 20, + :high => 30, }.freeze # initial empty hooks @registry = { :site => { - after_reset: [], - post_read: [], - pre_render: [], - post_render: [], - post_write: [], + :after_reset => [], + :post_read => [], + :pre_render => [], + :post_render => [], + :post_write => [], }, :pages => { - post_init: [], - pre_render: [], - post_render: [], - post_write: [], + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], }, :posts => { - post_init: [], - pre_render: [], - post_render: [], - post_write: [], + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], }, :documents => { - post_init: [], - pre_render: [], - post_render: [], - post_write: [], + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], }, } @@ -60,10 +60,10 @@ def self.priority_value(priority) # register a single hook to be called later, internal API def self.register_one(owner, event, priority, &block) @registry[owner] ||={ - post_init: [], - pre_render: [], - post_render: [], - post_write: [], + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], } unless @registry[owner][event] diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index c41ef10aaaf..1bf8ca290d7 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -53,8 +53,8 @@ def read_content(dir, magic_dir, matcher) next unless entry =~ matcher path = @site.in_source_dir(File.join(dir, magic_dir, entry)) Document.new(path, { - site: @site, - collection: @site.posts + :site => @site, + :collection => @site.posts }) end.reject(&:nil?) end diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 09763cca529..f7bfed3dc83 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -43,8 +43,8 @@ def run document.trigger_hooks(:pre_render, payload) info = { - filters: [Jekyll::Filters], - registers: { :site => site, :page => payload.page } + :filters => [Jekyll::Filters], + :registers => { :site => site, :page => payload.page } } # render and transform content (this becomes the final content of the object) diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index efa836d1f3b..881e44b10c1 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -104,12 +104,12 @@ def to_liquid def placeholders { - collection: @collection.label, - path: relative_path[ + :collection => @collection.label, + :path => relative_path[ @collection.relative_directory.size..relative_path.size], - output_ext: '', - name: '', - title: '', + :output_ext => '', + :name => '', + :title => '', } end @@ -121,8 +121,8 @@ def url relative_path else ::Jekyll::URL.new({ - template: @collection.url_template, - placeholders: placeholders, + :template => @collection.url_template, + :placeholders => placeholders, }) end.to_s.gsub /\/$/, '' end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 575fb57e7bd..a487b40424e 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -99,7 +99,7 @@ def render_pygments(code, is_safe) def render_rouge(code) Jekyll::External.require_with_graceful_fail('rouge') - formatter = Rouge::Formatters::HTML.new(line_numbers: @highlight_options[:linenos], wrap: false) + formatter = Rouge::Formatters::HTML.new(:line_numbers => @highlight_options[:linenos], :wrap => false) lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText formatter.format(lexer.lex(code)) end From cda226de45cd052e89210ec70ed0364ee632bdd0 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:55:33 -0800 Subject: [PATCH 0167/4996] Rubocop: Style/EmptyLinesAroundClassBody - Extra empty line detected at class body end --- lib/jekyll.rb | 1 - lib/jekyll/command.rb | 4 ---- lib/jekyll/commands/build.rb | 4 ---- lib/jekyll/commands/clean.rb | 2 -- lib/jekyll/commands/doctor.rb | 2 -- lib/jekyll/commands/help.rb | 2 -- lib/jekyll/configuration.rb | 1 - lib/jekyll/converters/markdown/redcarpet_parser.rb | 1 - lib/jekyll/drops/collection_drop.rb | 1 - lib/jekyll/drops/document_drop.rb | 1 - lib/jekyll/drops/drop.rb | 1 - lib/jekyll/drops/site_drop.rb | 1 - lib/jekyll/drops/unified_payload_drop.rb | 1 - lib/jekyll/external.rb | 2 -- lib/jekyll/plugin_manager.rb | 1 - lib/jekyll/readers/collection_reader.rb | 1 - lib/jekyll/related_posts.rb | 1 - lib/jekyll/renderer.rb | 2 -- lib/jekyll/tags/highlight.rb | 1 - lib/jekyll/tags/include.rb | 1 - lib/jekyll/url.rb | 1 - 21 files changed, 32 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index ad8a3395f47..6c5d8f103b0 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -165,7 +165,6 @@ def sanitized_path(base_directory, questionable_path) # Conditional optimizations Jekyll::External.require_if_present('liquid-c') - end end diff --git a/lib/jekyll/command.rb b/lib/jekyll/command.rb index f3c89dfd2e3..afe72a5b44f 100644 --- a/lib/jekyll/command.rb +++ b/lib/jekyll/command.rb @@ -1,8 +1,6 @@ module Jekyll class Command - class << self - # A list of subclasses of Jekyll::Command def subclasses @subclasses ||= [] @@ -62,8 +60,6 @@ def add_build_options(c) c.option 'verbose', '-V', '--verbose', 'Print verbose output.' c.option 'incremental', '-I', '--incremental', 'Enable incremental rebuild.' end - end - end end diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb index de0cc8bcab8..b75194efe8d 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -1,9 +1,7 @@ module Jekyll module Commands class Build < Command - class << self - # Create the Mercenary command for the Jekyll CLI for this Command def init_with_program(prog) prog.command(:build) do |c| @@ -71,9 +69,7 @@ def watch(site, options) External.require_with_graceful_fail 'jekyll-watch' Jekyll::Watcher.watch(options) end - end # end of class << self - end end end diff --git a/lib/jekyll/commands/clean.rb b/lib/jekyll/commands/clean.rb index 94f9bf97844..b7f9a95396f 100644 --- a/lib/jekyll/commands/clean.rb +++ b/lib/jekyll/commands/clean.rb @@ -2,7 +2,6 @@ module Jekyll module Commands class Clean < Command class << self - def init_with_program(prog) prog.command(:clean) do |c| c.syntax 'clean [subcommand]' @@ -37,7 +36,6 @@ def process(options) Jekyll.logger.info "Nothing to do for #{metadata_file}." end end - end end end diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 953c2623a13..ba98e6539a8 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -2,7 +2,6 @@ module Jekyll module Commands class Doctor < Command class << self - def init_with_program(prog) prog.command(:doctor) do |c| c.syntax 'doctor' @@ -108,7 +107,6 @@ def case_insensitive_urls(things, destination) end end end - end end end diff --git a/lib/jekyll/commands/help.rb b/lib/jekyll/commands/help.rb index 421d87e580a..01bf3280141 100644 --- a/lib/jekyll/commands/help.rb +++ b/lib/jekyll/commands/help.rb @@ -2,7 +2,6 @@ module Jekyll module Commands class Help < Command class << self - def init_with_program(prog) prog.command(:help) do |c| c.syntax 'help [subcommand]' @@ -26,7 +25,6 @@ def invalid_command(prog, cmd) Jekyll.logger.error "Error:", "Hmm... we don't know what the '#{cmd}' command is." Jekyll.logger.info "Valid commands:", prog.commands.keys.join(", ") end - end end end diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index a2e5e381a40..f8ecd3ed31e 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -2,7 +2,6 @@ module Jekyll class Configuration < Hash - # Default options. Overridden by values in _config.yml. # Strings rather than symbols are used for compatibility with YAML. DEFAULTS = Configuration[{ diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index 7f5adcee069..8378cb5defc 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -2,7 +2,6 @@ module Jekyll module Converters class Markdown class RedcarpetParser - module CommonMethods def add_code_tags(code, lang) code = code.to_s diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb index 26913230471..5f5025b1f2d 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -17,7 +17,6 @@ def to_s private def_delegator :@obj, :metadata, :fallback_data - end end end diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index f6e03fec546..69933752b3d 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -22,7 +22,6 @@ def excerpt private def_delegator :@obj, :data, :fallback_data - end end end diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 23237a08193..2ad107e8e35 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -135,7 +135,6 @@ def inspect def each_key(&block) keys.each(&block) end - end end end diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index ec4f0910189..4d07ebe8f4a 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -33,7 +33,6 @@ def collections private def_delegator :@obj, :config, :fallback_data - end end end diff --git a/lib/jekyll/drops/unified_payload_drop.rb b/lib/jekyll/drops/unified_payload_drop.rb index 26b9104b6d9..b642bda2620 100644 --- a/lib/jekyll/drops/unified_payload_drop.rb +++ b/lib/jekyll/drops/unified_payload_drop.rb @@ -20,7 +20,6 @@ def site def fallback_data @fallback_data ||= {} end - end end end diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index 8124805163a..d213364bb68 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -1,7 +1,6 @@ module Jekyll module External class << self - # # Gems that, if installed, should be loaded. # Usually contain subcommands. @@ -54,7 +53,6 @@ def require_with_graceful_fail(names) end end end - end end end diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index da7bf121509..d4ad99515fc 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -91,6 +91,5 @@ def deprecation_checks "Ensure you have `gems: [jekyll-paginate]` in your configuration file." end end - end end diff --git a/lib/jekyll/readers/collection_reader.rb b/lib/jekyll/readers/collection_reader.rb index 8d522551255..062be42a4b4 100644 --- a/lib/jekyll/readers/collection_reader.rb +++ b/lib/jekyll/readers/collection_reader.rb @@ -16,6 +16,5 @@ def read collection.read unless SPECIAL_COLLECTIONS.include?(collection.label) end end - end end diff --git a/lib/jekyll/related_posts.rb b/lib/jekyll/related_posts.rb index fbc2837bf4e..eb57a7fc981 100644 --- a/lib/jekyll/related_posts.rb +++ b/lib/jekyll/related_posts.rb @@ -1,6 +1,5 @@ module Jekyll class RelatedPosts - class << self attr_accessor :lsi end diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index f7bfed3dc83..f9c1b88c630 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -2,7 +2,6 @@ module Jekyll class Renderer - attr_reader :document, :site, :payload def initialize(site, document, site_payload = nil) @@ -161,6 +160,5 @@ def place_in_layouts(content, payload, info) output end - end end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index a487b40424e..0a5b790bd1d 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -115,7 +115,6 @@ def add_code_tag(code) ].join(" ") "
#{code.chomp}
" end - end end end diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 4152e7efe10..c8f08a6c166 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -12,7 +12,6 @@ def initialize(msg, path) end class IncludeTag < Liquid::Tag - attr_reader :includes_dir VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/ diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 3f00cfd337b..367872c0a4c 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -11,7 +11,6 @@ # module Jekyll class URL - # options - One of :permalink or :template must be supplied. # :template - The String used as template for URL generation, # for example "/:path/:basename:output_ext", where From a70d89a86231ddff7d518248ac615521a5324c3d Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:56:44 -0800 Subject: [PATCH 0168/4996] Rubocop: Style/SpaceAfterComma - Space missing after comma --- lib/jekyll/commands/serve.rb | 2 +- lib/jekyll/configuration.rb | 4 ++-- lib/jekyll/converters/markdown/redcarpet_parser.rb | 2 +- lib/jekyll/reader.rb | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 4dad7600002..507a8c7131b 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -103,7 +103,7 @@ def file_handler_opts WEBrick::Config::FileHandler.merge({ :FancyIndexing => true, :NondisclosureName => [ - '.ht*','~*' + '.ht*', '~*' ] }) end diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index f8ecd3ed31e..1b459eb7736 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -18,7 +18,7 @@ class Configuration < Hash 'safe' => false, 'include' => ['.htaccess'], 'exclude' => [], - 'keep_files' => ['.git','.svn'], + 'keep_files' => ['.git', '.svn'], 'encoding' => 'utf-8', 'markdown_ext' => 'markdown,mkdown,mkdn,mkd,md', @@ -77,7 +77,7 @@ class Configuration < Hash # # Return a copy of the hash where all its keys are strings def stringify_keys - reduce({}) { |hsh,(k,v)| hsh.merge(k.to_s => v) } + reduce({}) { |hsh, (k, v)| hsh.merge(k.to_s => v) } end def get_config_value_with_override(config_key, override) diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index 8378cb5defc..64e69eccbbc 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -6,7 +6,7 @@ module CommonMethods def add_code_tags(code, lang) code = code.to_s code = code.sub(/
/, "
")
-            code = code.sub(/<\/pre>/,"
") + code = code.sub(/<\/pre>/, "
") end end diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 45a204228bc..92d2528c0ed 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -38,9 +38,9 @@ def read_directories(dir = '') base = site.in_source_dir(dir) dot = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) } - dot_dirs = dot.select{ |file| File.directory?(@site.in_source_dir(base,file)) } + dot_dirs = dot.select{ |file| File.directory?(@site.in_source_dir(base, file)) } dot_files = (dot - dot_dirs) - dot_pages = dot_files.select{ |file| Utils.has_yaml_header?(@site.in_source_dir(base,file)) } + dot_pages = dot_files.select{ |file| Utils.has_yaml_header?(@site.in_source_dir(base, file)) } dot_static_files = dot_files - dot_pages retrieve_posts(dir) @@ -69,7 +69,7 @@ def retrieve_posts(dir) # Returns nothing. def retrieve_dirs(base, dir, dot_dirs) dot_dirs.map { |file| - dir_path = site.in_source_dir(dir,file) + dir_path = site.in_source_dir(dir, file) rel_path = File.join(dir, file) @site.reader.read_directories(rel_path) unless @site.dest.sub(/\/$/, '') == dir_path } From 663a2d3279ac8ac569a3b5ec6f48c71ff93481ff Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:58:02 -0800 Subject: [PATCH 0169/4996] Rubocop: Style/SpaceBeforeBlockBraces Rubocop: Style/SpaceInsideBlockBraces --- lib/jekyll/configuration.rb | 2 +- lib/jekyll/document.rb | 6 +++--- lib/jekyll/filters.rb | 2 +- lib/jekyll/liquid_renderer/table.rb | 2 +- lib/jekyll/reader.rb | 6 +++--- lib/jekyll/readers/page_reader.rb | 4 ++-- lib/jekyll/readers/static_file_reader.rb | 2 +- lib/jekyll/tags/highlight.rb | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 1b459eb7736..089c231a174 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -273,7 +273,7 @@ def add_default_collections return config if config['collections'].nil? if config['collections'].is_a?(Array) - config['collections'] = Hash[config['collections'].map{|c| [c, {}]}] + config['collections'] = Hash[config['collections'].map { |c| [c, {}] }] end config['collections']['posts'] ||= {} config['collections']['posts']['output'] = true diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index d757839f1d6..4ec701272d5 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -291,7 +291,7 @@ def post_read "ext" => ext }) merge_data!({"date" => date}) if data['date'].nil? || data['date'].to_i == site.time.to_i - data['title'] ||= slug.split('-').select {|w| w.capitalize! || w }.join(' ') + data['title'] ||= slug.split('-').select { |w| w.capitalize! || w }.join(' ') end populate_categories populate_tags @@ -386,7 +386,7 @@ def generate_excerpt? end def next_doc - pos = collection.docs.index {|post| post.equal?(self) } + pos = collection.docs.index { |post| post.equal?(self) } if pos && pos < collection.docs.length - 1 collection.docs[pos + 1] else @@ -395,7 +395,7 @@ def next_doc end def previous_doc - pos = collection.docs.index {|post| post.equal?(self) } + pos = collection.docs.index { |post| post.equal?(self) } if pos && pos > 0 collection.docs[pos - 1] else diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index ef40adb9775..be3efa62012 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -337,7 +337,7 @@ def as_liquid(item) pairs = item.map { |k, v| as_liquid([k, v]) } Hash[pairs] when Array - item.map{ |i| as_liquid(i) } + item.map { |i| as_liquid(i) } else if item.respond_to?(:to_liquid) liquidated = item.to_liquid diff --git a/lib/jekyll/liquid_renderer/table.rb b/lib/jekyll/liquid_renderer/table.rb index 15a802b0382..74ec606654a 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -69,7 +69,7 @@ def table_widths(data) end def data_for_table(n) - sorted = @stats.sort_by{ |filename, file_stats| -file_stats[:time] } + sorted = @stats.sort_by { |filename, file_stats| -file_stats[:time] } sorted = sorted.slice(0, n) table = [%w(Filename Count Bytes Time)] diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 92d2528c0ed..bc72c6579da 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -22,7 +22,7 @@ def read # Sorts posts, pages, and static files. def sort_files! - site.collections.values.each{|c| c.docs.sort!} + site.collections.values.each { |c| c.docs.sort! } site.pages.sort_by!(&:name) site.static_files.sort_by!(&:relative_path) end @@ -38,9 +38,9 @@ def read_directories(dir = '') base = site.in_source_dir(dir) dot = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) } - dot_dirs = dot.select{ |file| File.directory?(@site.in_source_dir(base, file)) } + dot_dirs = dot.select { |file| File.directory?(@site.in_source_dir(base, file)) } dot_files = (dot - dot_dirs) - dot_pages = dot_files.select{ |file| Utils.has_yaml_header?(@site.in_source_dir(base, file)) } + dot_pages = dot_files.select { |file| Utils.has_yaml_header?(@site.in_source_dir(base, file)) } dot_static_files = dot_files - dot_pages retrieve_posts(dir) diff --git a/lib/jekyll/readers/page_reader.rb b/lib/jekyll/readers/page_reader.rb index 12e7074814f..97748c01e58 100644 --- a/lib/jekyll/readers/page_reader.rb +++ b/lib/jekyll/readers/page_reader.rb @@ -14,8 +14,8 @@ def initialize(site, dir) # # Returns an array of static pages. def read(files) - files.map{ |page| @unfiltered_content << Page.new(@site, @site.source, @dir, page) } - @unfiltered_content.select{ |page| site.publisher.publish?(page) } + files.map { |page| @unfiltered_content << Page.new(@site, @site.source, @dir, page) } + @unfiltered_content.select { |page| site.publisher.publish?(page) } end end end diff --git a/lib/jekyll/readers/static_file_reader.rb b/lib/jekyll/readers/static_file_reader.rb index b95981a8f39..8def1365ab0 100644 --- a/lib/jekyll/readers/static_file_reader.rb +++ b/lib/jekyll/readers/static_file_reader.rb @@ -14,7 +14,7 @@ def initialize(site, dir) # # Returns an array of static files. def read(files) - files.map{ |file| @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file)} + files.map { |file| @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file) } @unfiltered_content end end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 0a5b790bd1d..d0d7088222f 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -68,7 +68,7 @@ def sanitized_opts(opts, is_safe) [:linenos, opts.fetch(:linenos, nil)], [:encoding, opts.fetch(:encoding, 'utf-8')], [:cssclass, opts.fetch(:cssclass, nil)] - ].reject {|f| f.last.nil? }] + ].reject { |f| f.last.nil? }] else opts end From 704ca6b8cc4eee5e263f088ca91c383c6ec7f0fa Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 15:59:12 -0800 Subject: [PATCH 0170/4996] Rubocop: Style/NegatedIf - Favor unless over if for negative conditions --- lib/jekyll/cleaner.rb | 2 +- lib/jekyll/commands/doctor.rb | 2 +- lib/jekyll/commands/serve/servlet.rb | 2 +- lib/jekyll/converters/markdown.rb | 2 +- lib/jekyll/regenerator.rb | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index ca8a0ca99f6..6c89e2bce78 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -13,7 +13,7 @@ def initialize(site) # Cleans up the site's destination directory def cleanup! FileUtils.rm_rf(obsolete_files) - FileUtils.rm_rf(metadata_file) if !@site.incremental? + FileUtils.rm_rf(metadata_file) unless @site.incremental? end private diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index ba98e6539a8..42bb0110278 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -59,7 +59,7 @@ def conflicting_urls(site) end def fsnotify_buggy?(site) - return true if !Utils::Platforms.osx? + return true unless Utils::Platforms.osx? if Dir.pwd != `pwd`.strip Jekyll.logger.error " " + <<-STR.strip.gsub(/\n\s+/, "\n ") We have detected that there might be trouble using fsevent on your diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index fa376f6118d..7930eb6131c 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -52,7 +52,7 @@ def validate_and_ensure_charset(req, res) def set_defaults hash_ = @jekyll_opts.fetch("webrick", {}).fetch("headers", {}) DEFAULTS.each_with_object(@headers = hash_) do |(key, val), hash| - hash[key] = val if !hash.key?(key) + hash[key] = val unless hash.key?(key) end end end diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 8e297dca8a9..07675427931 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -7,7 +7,7 @@ class Markdown < Converter def setup return if @setup - if (!@parser = get_processor) + unless (@parser = get_processor) Jekyll.logger.error "Invalid Markdown processor given:", @config["markdown"] Jekyll.logger.info "", "Custom processors are not loaded in safe mode" if @config["safe"] Jekyll.logger.error "", "Available processors are: #{valid_processors.join(", ")}" diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 52ff5178f86..cd672830fa4 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -119,7 +119,7 @@ def modified?(path) def add_dependency(path, dependency) return if (metadata[path].nil? || @disabled) - if !metadata[path]["deps"].include? dependency + unless metadata[path]["deps"].include? dependency metadata[path]["deps"] << dependency add(dependency) unless metadata.include?(dependency) end From af5d51289f6c425f48be89a9064200f222b0eb29 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 16:02:32 -0800 Subject: [PATCH 0171/4996] Rubocop: Style/SymbolProc - Pass &:to_sym as an argument to map instead of a block - Pass &:capitalize as an argument to select instead of a block - Pass &:to_s as an argument to map instead of a block --- lib/jekyll/converters/markdown/rdiscount_parser.rb | 2 +- lib/jekyll/document.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/converters/markdown/rdiscount_parser.rb b/lib/jekyll/converters/markdown/rdiscount_parser.rb index fb5172e7a5e..daf8874edd6 100644 --- a/lib/jekyll/converters/markdown/rdiscount_parser.rb +++ b/lib/jekyll/converters/markdown/rdiscount_parser.rb @@ -5,7 +5,7 @@ class RDiscountParser def initialize(config) Jekyll::External.require_with_graceful_fail "rdiscount" @config = config - @rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym } + @rdiscount_extensions = @config['rdiscount']['extensions'].map(&:to_sym) end def convert(content) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 4ec701272d5..9e588dedb65 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -291,7 +291,7 @@ def post_read "ext" => ext }) merge_data!({"date" => date}) if data['date'].nil? || data['date'].to_i == site.time.to_i - data['title'] ||= slug.split('-').select { |w| w.capitalize! || w }.join(' ') + data['title'] ||= slug.split('-').select(&:capitalize).join(' ') end populate_categories populate_tags @@ -317,7 +317,7 @@ def populate_categories merge_data!({ 'categories' => ( Array(data['categories']) + Utils.pluralized_array_from_hash(data, 'category', 'categories') - ).map { |c| c.to_s }.flatten.uniq + ).map(&:to_s).flatten.uniq }) end From 7ca4f7cd62d5d9d6a6375d96cbda8bc223cd4abe Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 16:18:26 -0800 Subject: [PATCH 0172/4996] Rubocop: Style/Proc - Use proc instead of Proc.new ...and use lambda instead of proc --- lib/jekyll/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 089c231a174..353e437a0c0 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -127,7 +127,7 @@ def config_files(override) # Get configuration from /_config.yml or / config_files = override.delete('config') if config_files.to_s.empty? - default = %w(yml yaml).find(Proc.new { 'yml' }) do |ext| + default = %w(yml yaml).find(-> { 'yml' }) do |ext| File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}")) end config_files = Jekyll.sanitized_path(source(override), "_config.#{default}") From 11f0aab4b1c257fa87f73d87c71af41268dc127a Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 16:24:13 -0800 Subject: [PATCH 0173/4996] Rubocop: Lint/UnusedBlockArgument - Unused block argument --- bin/jekyll | 2 +- lib/jekyll/commands/build.rb | 2 +- lib/jekyll/commands/clean.rb | 2 +- lib/jekyll/commands/doctor.rb | 2 +- lib/jekyll/document.rb | 2 +- lib/jekyll/drops/drop.rb | 2 +- lib/jekyll/liquid_renderer.rb | 2 +- lib/jekyll/liquid_renderer/table.rb | 2 +- lib/jekyll/page.rb | 2 +- lib/jekyll/site.rb | 2 +- lib/jekyll/stevenson.rb | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/bin/jekyll b/bin/jekyll index 297e1175038..173a58d3842 100755 --- a/bin/jekyll +++ b/bin/jekyll @@ -28,7 +28,7 @@ Mercenary.program(:jekyll) do |p| Jekyll::Command.subclasses.each { |c| c.init_with_program(p) } - p.action do |args, options| + p.action do |args, _| if args.empty? Jekyll.logger.error "A subcommand is required." puts p diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb index b75194efe8d..cf6d7ea0996 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -11,7 +11,7 @@ def init_with_program(prog) add_build_options(c) - c.action do |args, options| + c.action do |_, options| options["serving"] = false Jekyll::Commands::Build.process(options) end diff --git a/lib/jekyll/commands/clean.rb b/lib/jekyll/commands/clean.rb index b7f9a95396f..371b7043ab6 100644 --- a/lib/jekyll/commands/clean.rb +++ b/lib/jekyll/commands/clean.rb @@ -9,7 +9,7 @@ def init_with_program(prog) add_build_options(c) - c.action do |args, options| + c.action do |_, options| Jekyll::Commands::Clean.process(options) end end diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 42bb0110278..32600741e00 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -10,7 +10,7 @@ def init_with_program(prog) c.option '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file' - c.action do |args, options| + c.action do |_, options| Jekyll::Commands::Doctor.process(options) end end diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 9e588dedb65..5b8c904441d 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -32,7 +32,7 @@ def initialize(path, relations = {}) categories_from_path(collection.relative_directory) end - data.default_proc = proc do |hash, key| + data.default_proc = proc do |_, key| site.frontmatter_defaults.find(relative_path, collection.label, key) end diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 2ad107e8e35..c194a5baada 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -114,7 +114,7 @@ def keys # # Returns a Hash with all the keys and values resolved. def to_h - keys.each_with_object({}) do |(key, val), result| + keys.each_with_object({}) do |(key, _), result| result[key] = self[key] end end diff --git a/lib/jekyll/liquid_renderer.rb b/lib/jekyll/liquid_renderer.rb index 0edeb44b367..70f7b0d194e 100644 --- a/lib/jekyll/liquid_renderer.rb +++ b/lib/jekyll/liquid_renderer.rb @@ -15,7 +15,7 @@ def reset def file(filename) filename = @site.in_source_dir(filename).sub(/\A#{Regexp.escape(@site.source)}\//, '') - LiquidRenderer::File.new(self, filename).tap do |file| + LiquidRenderer::File.new(self, filename).tap do @stats[filename] ||= {} @stats[filename][:count] ||= 0 @stats[filename][:count] += 1 diff --git a/lib/jekyll/liquid_renderer/table.rb b/lib/jekyll/liquid_renderer/table.rb index 74ec606654a..e3e0c8af09f 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -69,7 +69,7 @@ def table_widths(data) end def data_for_table(n) - sorted = @stats.sort_by { |filename, file_stats| -file_stats[:time] } + sorted = @stats.sort_by { |_, file_stats| -file_stats[:time] } sorted = sorted.slice(0, n) table = [%w(Filename Count Bytes Time)] diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index fb46f32463c..aaf472cfe04 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -41,7 +41,7 @@ def initialize(site, base, dir, name) process(name) read_yaml(File.join(base, dir), name) - data.default_proc = proc do |hash, key| + data.default_proc = proc do |_, key| site.frontmatter_defaults.find(File.join(dir, name), type, key) end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 2859355cfc4..3ed60c121a2 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -165,7 +165,7 @@ def render Jekyll::Hooks.trigger :site, :pre_render, self, payload - collections.each do |label, collection| + collections.each do |_, collection| collection.docs.each do |document| if regenerator.regenerate?(document) document.output = Jekyll::Renderer.new(self, document, payload).run diff --git a/lib/jekyll/stevenson.rb b/lib/jekyll/stevenson.rb index ea26c8b56c7..d6dd5434fdb 100644 --- a/lib/jekyll/stevenson.rb +++ b/lib/jekyll/stevenson.rb @@ -5,7 +5,7 @@ def initialize @level = DEBUG @default_formatter = Formatter.new @logdev = $stdout - @formatter = proc do |severity, datetime, progname, msg| + @formatter = proc do |_, _, _, msg| "#{msg}" end end From e3189e38282d17b894d6984dfb35f9c86dd33a80 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 17:07:39 -0800 Subject: [PATCH 0174/4996] Rubocop: Lint/UnusedMethodArgument --- lib/jekyll/commands/build.rb | 2 +- lib/jekyll/commands/doctor.rb | 2 +- lib/jekyll/commands/serve/servlet.rb | 2 +- lib/jekyll/configuration.rb | 2 +- lib/jekyll/converters/identity.rb | 2 +- lib/jekyll/converters/markdown.rb | 2 +- lib/jekyll/converters/markdown/redcarpet_parser.rb | 2 +- lib/jekyll/reader.rb | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb index cf6d7ea0996..d505e2fb3ff 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -65,7 +65,7 @@ def build(site, options) # options - A Hash of options passed to the command # # Returns nothing. - def watch(site, options) + def watch(_site, options) External.require_with_graceful_fail 'jekyll-watch' Jekyll::Watcher.watch(options) end diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 32600741e00..c6ba4fd4452 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -58,7 +58,7 @@ def conflicting_urls(site) conflicting_urls end - def fsnotify_buggy?(site) + def fsnotify_buggy?(_site) return true unless Utils::Platforms.osx? if Dir.pwd != `pwd`.strip Jekyll.logger.error " " + <<-STR.strip.gsub(/\n\s+/, "\n ") diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 7930eb6131c..cf4952168b2 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -37,7 +37,7 @@ def do_GET(req, res) # private - def validate_and_ensure_charset(req, res) + def validate_and_ensure_charset(_req, res) key = res.header.keys.grep(/content-type/i).first typ = res.header[key] diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 353e437a0c0..0229e073e5c 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -282,7 +282,7 @@ def add_default_collections config end - def renamed_key(old, new, config, allowed_values = nil) + def renamed_key(old, new, config, _ = nil) if config.key?(old) Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" \ "option has been renamed to '#{new}'. Please update your config " \ diff --git a/lib/jekyll/converters/identity.rb b/lib/jekyll/converters/identity.rb index 69171b008ab..9574769d1a9 100644 --- a/lib/jekyll/converters/identity.rb +++ b/lib/jekyll/converters/identity.rb @@ -5,7 +5,7 @@ class Identity < Converter priority :lowest - def matches(ext) + def matches(_ext) true end diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 07675427931..e6efabf5be7 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -56,7 +56,7 @@ def matches(ext) extname_list.include?(ext.downcase) end - def output_ext(ext) + def output_ext(_ext) ".html" end diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index 64e69eccbbc..fd1b0461921 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -47,7 +47,7 @@ def block_code(code, lang) end protected - def rouge_formatter(lexer) + def rouge_formatter(_lexer) Rouge::Formatters::HTML.new(:wrap => false) end end diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index bc72c6579da..2926971b773 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -67,7 +67,7 @@ def retrieve_posts(dir) # dot_dirs - The Array of subdirectories in the dir. # # Returns nothing. - def retrieve_dirs(base, dir, dot_dirs) + def retrieve_dirs(_base, dir, dot_dirs) dot_dirs.map { |file| dir_path = site.in_source_dir(dir, file) rel_path = File.join(dir, file) From fd8fdd87d32f2be1a9bdccfd475c32e291969163 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 17:10:39 -0800 Subject: [PATCH 0175/4996] Rubocop: Style/RegexpLiteral --- lib/jekyll/static_file.rb | 2 +- lib/jekyll/url.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 881e44b10c1..72c267411ba 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -124,7 +124,7 @@ def url :template => @collection.url_template, :placeholders => placeholders, }) - end.to_s.gsub /\/$/, '' + end.to_s.gsub(/\/$/, '') end # Returns the type of the collection if present, nil otherwise. diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 367872c0a4c..950945a7714 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -92,7 +92,7 @@ def generate_url_from_drop(template) # as well as the beginning "/" so we can enforce and ensure it. def sanitize_url(str) - "/" + str.gsub(/\/{2,}/, "/").gsub(%r!\.+\/|\A/+!, "") + "/" + str.gsub(/\/{2,}/, "/").gsub(/\.+\/|\A\/+/, "") end # Escapes a path to be a valid URL path segment From 4c5d77a4b54866df0d6d862a68a5fa22b4f98cf1 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 17:14:41 -0800 Subject: [PATCH 0176/4996] Rubocop: Style/EmptyLines --- lib/jekyll/converters/markdown/redcarpet_parser.rb | 1 - lib/jekyll/page.rb | 1 - lib/jekyll/regenerator.rb | 2 -- lib/jekyll/related_posts.rb | 1 - lib/jekyll/utils.rb | 1 - 5 files changed, 6 deletions(-) diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index fd1b0461921..12b4f3fb9cb 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -52,7 +52,6 @@ def rouge_formatter(_lexer) end end - def initialize(config) External.require_with_graceful_fail("redcarpet") @config = config diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index aaf472cfe04..019cb0956c2 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -37,7 +37,6 @@ def initialize(site, base, dir, name) @dir = dir @name = name - process(name) read_yaml(File.join(base, dir), name) diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index cd672830fa4..1e751f7da63 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -62,7 +62,6 @@ def clear clear_cache end - # Clear just the cache # # Returns nothing @@ -70,7 +69,6 @@ def clear_cache @cache = {} end - # Checks if the source has been modified or the # destination is missing # diff --git a/lib/jekyll/related_posts.rb b/lib/jekyll/related_posts.rb index eb57a7fc981..51ae8d8f4af 100644 --- a/lib/jekyll/related_posts.rb +++ b/lib/jekyll/related_posts.rb @@ -23,7 +23,6 @@ def build end end - def build_index self.class.lsi ||= begin lsi = ClassifierReborn::LSI.new(:auto_rebuild => false) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index d5c68ae4a48..0760d9e3194 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -225,7 +225,6 @@ def add_permalink_suffix(template, permalink_style) template end - # Work the same way as Dir.glob but seperating the input into two parts # ('dir' + '/' + 'pattern') to make sure the first part('dir') does not act # as a pattern. From 13c980c8967bb0d6e7e65868908be32d4e05e633 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 17:16:17 -0800 Subject: [PATCH 0177/4996] Rubocop: Style/TrailingComma --- lib/jekyll/hooks.rb | 14 +++++++------- lib/jekyll/static_file.rb | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index a9bf79f5f67..869bcc1f380 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -6,7 +6,7 @@ module Hooks PRIORITY_MAP = { :low => 10, :normal => 20, - :high => 30, + :high => 30 }.freeze # initial empty hooks @@ -16,26 +16,26 @@ module Hooks :post_read => [], :pre_render => [], :post_render => [], - :post_write => [], + :post_write => [] }, :pages => { :post_init => [], :pre_render => [], :post_render => [], - :post_write => [], + :post_write => [] }, :posts => { :post_init => [], :pre_render => [], :post_render => [], - :post_write => [], + :post_write => [] }, :documents => { :post_init => [], :pre_render => [], :post_render => [], - :post_write => [], - }, + :post_write => [] + } } # map of all hooks and their priorities @@ -63,7 +63,7 @@ def self.register_one(owner, event, priority, &block) :post_init => [], :pre_render => [], :post_render => [], - :post_write => [], + :post_write => [] } unless @registry[owner][event] diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 72c267411ba..7938a0505ae 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -109,7 +109,7 @@ def placeholders @collection.relative_directory.size..relative_path.size], :output_ext => '', :name => '', - :title => '', + :title => '' } end @@ -122,7 +122,7 @@ def url else ::Jekyll::URL.new({ :template => @collection.url_template, - :placeholders => placeholders, + :placeholders => placeholders }) end.to_s.gsub(/\/$/, '') end From f221b925b4fee632ec62653f3f9848e2d7763c22 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sun, 3 Jan 2016 17:16:58 -0800 Subject: [PATCH 0178/4996] Rubocop: Lint/StringConversionInInterpolation - Redundant use of Object#to_s in interpolation --- lib/jekyll/tags/highlight.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index d0d7088222f..027865cde17 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -111,7 +111,7 @@ def render_codehighlighter(code) def add_code_tag(code) code_attributes = [ "class=\"language-#{@lang.to_s.tr('+', '-')}\"", - "data-lang=\"#{@lang.to_s}\"" + "data-lang=\"#{@lang}\"" ].join(" ") "
#{code.chomp}
" end From 2c9a349f9aafab1fff4ea15bd4cf52f4cf33d00e Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 11:06:12 -0800 Subject: [PATCH 0179/4996] Rubocop: Style/Next - Use next to skip iteration --- lib/jekyll/commands/doctor.rb | 6 ++++-- lib/jekyll/tags/post_url.rb | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index c6ba4fd4452..3a263501568 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -50,7 +50,8 @@ def conflicting_urls(site) urls = {} urls = collect_urls(urls, site.pages, site.dest) urls = collect_urls(urls, site.posts.docs, site.dest) - urls.select { |_, p| p.size > 1 }.each do |url, paths| + urls.each do |url, paths| + next unless paths.size > 1 conflicting_urls = true Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" \ " for the following pages: #{paths.join(", ")}" @@ -77,7 +78,8 @@ def fsnotify_buggy?(_site) def urls_only_differ_by_case(site) urls_only_differ_by_case = false urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest) - urls.select { |_, p| p.size > 1 }.each do |_, real_urls| + urls.each do |case_insensitive_url, real_urls| + next unless real_urls.uniq.size > 1 urls_only_differ_by_case = true Jekyll.logger.warn "Warning:", "The following URLs only differ" \ " by case. On a case-insensitive file system one of the URLs" \ diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index 723eafd7a6f..5b3df093f8c 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -59,21 +59,21 @@ def initialize(tag_name, post, tokens) def render(context) site = context.registers[:site] - post = site.posts.docs.find { |p| @post == p } - if post - return post.url + site.posts.docs.each do |p| + return p.url if @post == p end # New matching method did not match, fall back to old method # with deprecation warning if this matches - post = site.posts.docs.find { |p| @post.deprecated_equality p } - if post + + site.posts.docs.each do |p| + next unless @post.deprecated_equality p Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{@post.name} }}' did not match " \ "a post using the new matching method of checking name " \ "(path-date-slug) equality. Please make sure that you " \ "change this tag to match the post's name exactly." - return post.url + return p.url end raise ArgumentError.new <<-eos From 046928e39584e3d15a9b9a4a73a2e8e35ff51bee Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 11:14:19 -0800 Subject: [PATCH 0180/4996] upgrading docs: add note about removing relative permalinks support (2 to 3) Ref: #4303. --- site/_docs/upgrading/2-to-3.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index c01be517960..e3529f63164 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -71,15 +71,22 @@ go back to using Pygments, set `highlighter: pygments` in your `_config.yml` file and run `gem install pygments.rb` or add `gem 'pygments.rb'` to your project's `Gemfile`. -### Relative Permalinks deprecated +### Relative Permalink support removed -In Jekyll 3 and above, relative permalinks have been deprecated. If you created your site using Jekyll 2 and below, you may receive the following error when trying to **serve** or **build**: +In Jekyll 3 and above, relative permalinks have been deprecated. If you +created your site using Jekyll 2 and below, you may receive the following +error when trying to **serve** or **build**: - Since v3.0, permalinks for pages in subfolders must be relative to the site source directory, not the parent directory. Check http://jekyllrb.com/docs/upgrading/ for more info. - -This can be fixed by removing the following line from your _config.yml file: +{% highlight text %} +Since v3.0, permalinks for pages in subfolders must be relative to the site +source directory, not the parent directory. Check +http://jekyllrb.com/docs/upgrading/ for more info. +{% endhighlight %} - relative_permalinks: true +This can be fixed by removing the following line from your `_config.yml` file: +{% highlight yaml %} +relative_permalinks: true +{% endhighlight %} _Did we miss something? Please click "Improve this page" above and add a section. Thanks!_ From f6fd9014bae10df4404a3bab0b4b607146ccd743 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 11:15:37 -0800 Subject: [PATCH 0181/4996] Rubocop: Style/CaseIndentation - Indent when as deep as case --- lib/jekyll/converters/markdown.rb | 6 +++--- lib/jekyll/frontmatter_defaults.rb | 27 ++++++++++++++------------- lib/jekyll/readers/data_reader.rb | 14 +++++++------- lib/jekyll/utils.rb | 21 +++++++++++---------- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index e6efabf5be7..bb7b7ffa2b5 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -19,9 +19,9 @@ def setup def get_processor case @config["markdown"].downcase - when "redcarpet" then return RedcarpetParser.new(@config) - when "kramdown" then return KramdownParser.new(@config) - when "rdiscount" then return RDiscountParser.new(@config) + when "redcarpet" then return RedcarpetParser.new(@config) + when "kramdown" then return KramdownParser.new(@config) + when "rdiscount" then return RDiscountParser.new(@config) else get_custom_processor end diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index edf70969165..877f517ef08 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -13,19 +13,20 @@ def initialize(site) def update_deprecated_types(set) return set unless set.key?('scope') && set['scope'].key?('type') - set['scope']['type'] = case set['scope']['type'] - when 'page' - Deprecator.defaults_deprecate_type('page', 'pages') - 'pages' - when 'post' - Deprecator.defaults_deprecate_type('post', 'posts') - 'posts' - when 'draft' - Deprecator.defaults_deprecate_type('draft', 'drafts') - 'drafts' - else - set['scope']['type'] - end + set['scope']['type'] = + case set['scope']['type'] + when 'page' + Deprecator.defaults_deprecate_type('page', 'pages') + 'pages' + when 'post' + Deprecator.defaults_deprecate_type('post', 'posts') + 'posts' + when 'draft' + Deprecator.defaults_deprecate_type('draft', 'drafts') + 'drafts' + else + set['scope']['type'] + end set end diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index cbb24be3053..870fc2dc46d 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -50,13 +50,13 @@ def read_data_to(dir, data) # Returns the contents of the data file. def read_data_file(path) case File.extname(path).downcase - when '.csv' - CSV.read(path, { - :headers => true, - :encoding => site.config['encoding'] - }).map(&:to_hash) - else - SafeYAML.load_file(path) + when '.csv' + CSV.read(path, { + :headers => true, + :encoding => site.config['encoding'] + }).map(&:to_hash) + else + SafeYAML.load_file(path) end end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 0760d9e3194..1d81e0f0435 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -164,16 +164,17 @@ def slugify(string, mode: nil, cased: false) end # Replace each character sequence with a hyphen - re = case mode - when 'raw' - SLUGIFY_RAW_REGEXP - when 'default' - SLUGIFY_DEFAULT_REGEXP - when 'pretty' - # "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL - # and is allowed in both extN and NTFS. - SLUGIFY_PRETTY_REGEXP - end + re = + case mode + when 'raw' + SLUGIFY_RAW_REGEXP + when 'default' + SLUGIFY_DEFAULT_REGEXP + when 'pretty' + # "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL + # and is allowed in both extN and NTFS. + SLUGIFY_PRETTY_REGEXP + end # Strip according to the mode slug = string.gsub(re, '-') From c4047c37b2186adc89743e6ccafc3d2e4472b980 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 11:16:05 -0800 Subject: [PATCH 0182/4996] Update history to reflect merge of #4303 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b45e565b28d..cb91e071f05 100644 --- a/History.markdown +++ b/History.markdown @@ -58,6 +58,7 @@ * Add `jekyll-responsive_image` to list of third-party plugins (#4286) * Add `jekyll-commonmark` to list of third-party plugins (#4299) * Add documentation for incremental regeneration (#4293) + * Add note about removal of relative permalink support in upgrading docs (#4303) ## 3.0.1 / 2015-11-17 From af9ec6831d7652c423e29a32aff418da783757d0 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 11:23:06 -0800 Subject: [PATCH 0183/4996] Rubocop: Style/ElseAlignment - Align else with if Rubocop: Lint/EndAlignment - Align end with if --- lib/jekyll/regenerator.rb | 25 +++++++++++++------------ lib/jekyll/static_file.rb | 14 +++++++------- lib/jekyll/tags/include.rb | 12 ++++++------ 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 1e751f7da63..bb9284aa11f 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -155,20 +155,21 @@ def disabled? # # Returns the read metadata. def read_metadata - @metadata = if !disabled? && File.file?(metadata_file) - content = File.binread(metadata_file) - - begin - Marshal.load(content) - rescue TypeError - SafeYAML.load(content) - rescue ArgumentError => e - Jekyll.logger.warn("Failed to load #{metadata_file}: #{e}") + @metadata = + if !disabled? && File.file?(metadata_file) + content = File.binread(metadata_file) + + begin + Marshal.load(content) + rescue TypeError + SafeYAML.load(content) + rescue ArgumentError => e + Jekyll.logger.warn("Failed to load #{metadata_file}: #{e}") + {} + end + else {} end - else - {} - end end end end diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 7938a0505ae..0ed0fbfec4b 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -118,13 +118,13 @@ def placeholders # 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(/\/$/, '') + 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. diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index c8f08a6c166..b92e5b85449 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -42,12 +42,12 @@ def parse_params(context) markup = markup[match.end(0)..-1] value = if match[2] - match[2].gsub(/\\"/, '"') - elsif match[3] - match[3].gsub(/\\'/, "'") - elsif match[4] - context[match[4]] - end + match[2].gsub(/\\"/, '"') + elsif match[3] + match[3].gsub(/\\'/, "'") + elsif match[4] + context[match[4]] + end params[match[1]] = value end From f9926edbc44a2b5ef74b693e2da186577ed5eb02 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 11:39:14 -0800 Subject: [PATCH 0184/4996] Rubocop: Style/TrivialAccessors - Use `attr_writer` to define trivial writer methods --- lib/jekyll/document.rb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 5b8c904441d..0d23ac88d1e 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -4,7 +4,8 @@ module Jekyll class Document include Comparable - attr_reader :path, :site, :extname, :output_ext, :content, :output, :collection + attr_reader :path, :site, :extname, :output_ext, :collection + attr_accessor :content, :output YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m DATELESS_FILENAME_MATCHER = /^(.*)(\.[^.]+)$/ @@ -39,14 +40,6 @@ def initialize(path, relations = {}) trigger_hooks(:post_init) end - def output=(output) - @output = output - end - - def content=(content) - @content = content - end - # Fetch the Document's data. # # Returns a Hash containing the data. An empty hash is returned if From 78e9f3389e17231ef0c3af934a63a3a8ef8fbe93 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 11:42:17 -0800 Subject: [PATCH 0185/4996] Rubocop: Style/IndentationWidth --- lib/jekyll/collection.rb | 2 +- lib/jekyll/document.rb | 2 +- lib/jekyll/filters.rb | 2 +- lib/jekyll/tags/highlight.rb | 2 +- lib/jekyll/tags/include.rb | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 5d6b272848e..ea6a81b6fc6 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -187,7 +187,7 @@ def write? # Returns the URL template to render collection's documents at. def url_template metadata.fetch('permalink') do - Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) + Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) end end diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 0d23ac88d1e..7d7e6bb4aa6 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -60,7 +60,7 @@ def merge_data!(other) end Utils.deep_merge_hashes!(data, other) if data.key?('date') && !data['date'].is_a?(Time) - data['date'] = Utils.parse_date(data['date'].to_s, "Document '#{relative_path}' does not have a valid date in the YAML front matter.") + data['date'] = Utils.parse_date(data['date'].to_s, "Document '#{relative_path}' does not have a valid date in the YAML front matter.") end data end diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index be3efa62012..734457cb682 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -223,7 +223,7 @@ def where(input, property, value) # Returns the filtered array of objects def sort(input, property = nil, nils = "first") if input.nil? - raise ArgumentError.new("Cannot sort a null object.") + raise ArgumentError.new("Cannot sort a null object.") end if property.nil? input.sort diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 027865cde17..5881fa58ea9 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -21,7 +21,7 @@ def initialize(tag_name, markup, tokens) key, value = opt.split('=') # If a quoted list, convert to array if value && value.include?("\"") - value.delete!('"') + value.delete!('"') value = value.split end @highlight_options[key.to_sym] = value || true diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index b92e5b85449..847e66380e0 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -56,7 +56,7 @@ def parse_params(context) def validate_file_name(file) if file !~ /^[a-zA-Z0-9_\/\.-]+$/ || file =~ /\.\// || file =~ /\/\./ - raise ArgumentError.new <<-eos + raise ArgumentError.new <<-eos Invalid syntax for include tag. File contains invalid characters or sequences: #{file} From 085a778b0a9b7e87f9b1698e31fc745ac9de2118 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 11:46:25 -0800 Subject: [PATCH 0186/4996] Rubocop: Style/NestedTernaryOperator - Ternary operators must not be nested. Prefer if/else constructs instead. --- lib/jekyll/commands/serve.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 507a8c7131b..29408fe2336 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -123,7 +123,14 @@ def server_address(server, opts) private def launch_browser(server, opts) - command = Utils::Platforms.windows?? "start" : Utils::Platforms.osx?? "open" : "xdg-open" + command = + if Utils::Platforms.windows? + "start" + elsif Utils::Platforms.osx? + "open" + else + "xdg-open" + end system command, server_address(server, opts) end From ec83ef60b5731cf6fac391f9c7f889a0f35bd7df Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 11:49:54 -0800 Subject: [PATCH 0187/4996] Rubocop: Lint/UselessAssignment --- lib/jekyll/converters/markdown/redcarpet_parser.rb | 1 + lib/jekyll/document.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index 12b4f3fb9cb..79133a2abcf 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -7,6 +7,7 @@ def add_code_tags(code, lang) code = code.to_s code = code.sub(/
/, "
")
             code = code.sub(/<\/pre>/, "
") + code end end diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 7d7e6bb4aa6..42881309282 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -278,7 +278,7 @@ def read(opts = {}) def post_read if DATE_FILENAME_MATCHER =~ relative_path - m, cats, date, slug, ext = *relative_path.match(DATE_FILENAME_MATCHER) + _, _, date, slug, ext = *relative_path.match(DATE_FILENAME_MATCHER) merge_data!({ "slug" => slug, "ext" => ext From be3666fcf05b3f61208df606911000071e7d895f Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 11:51:14 -0800 Subject: [PATCH 0188/4996] Rubocop: Do not use unless with else - Rewrite these with the positive case first --- lib/jekyll.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 6c5d8f103b0..8b92a045f61 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -156,10 +156,10 @@ def sanitized_path(base_directory, questionable_path) clean_path = File.expand_path(questionable_path, "/") clean_path = clean_path.sub(/\A\w\:\//, '/') - unless clean_path.start_with?(base_directory.sub(/\A\w\:\//, '/')) - File.join(base_directory, clean_path) - else + if clean_path.start_with?(base_directory.sub(/\A\w\:\//, '/')) clean_path + else + File.join(base_directory, clean_path) end end From 086e85ca9eab3c5a6f78babd3452428afa88089b Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 12:01:23 -0800 Subject: [PATCH 0189/4996] Rubocop: Style/PerlBackrefs - Avoid the use of Perl-style backrefs --- lib/jekyll/convertible.rb | 2 +- lib/jekyll/document.rb | 2 +- lib/jekyll/tags/highlight.rb | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index b510d306555..d9298f4f621 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -47,7 +47,7 @@ def read_yaml(base, name, opts = {}) merged_file_read_opts(opts)) if content =~ /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m self.content = $POSTMATCH - self.data = SafeYAML.load($1) + self.data = SafeYAML.load(Regexp.last_match(1)) end rescue SyntaxError => e Jekyll.logger.warn "YAML Exception reading #{File.join(base, name)}: #{e.message}" diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 42881309282..8d7c92f49dd 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -263,7 +263,7 @@ def read(opts = {}) self.content = File.read(path, merged_file_read_opts(opts)) if content =~ YAML_FRONT_MATTER_REGEXP self.content = $POSTMATCH - data_file = SafeYAML.load($1) + data_file = SafeYAML.load(Regexp.last_match(1)) merge_data!(data_file) if data_file end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 5881fa58ea9..a7dbd5193bc 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -13,11 +13,11 @@ class HighlightBlock < Liquid::Block def initialize(tag_name, markup, tokens) super if markup.strip =~ SYNTAX - @lang = $1.downcase + @lang = Regexp.last_match(1).downcase @highlight_options = {} - if defined?($2) && $2 != '' + if defined?(Regexp.last_match(2)) && Regexp.last_match(2) != '' # Split along 3 possible forms -- key="", key=value, or key - $2.scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt| + Regexp.last_match(2).scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt| key, value = opt.split('=') # If a quoted list, convert to array if value && value.include?("\"") From 6711234d5fba1419e89ae442519e4bbb7c89985e Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 12:05:54 -0800 Subject: [PATCH 0190/4996] Rubocop: Style/BlockDelimiters - Avoid using {...} for multi-line blocks --- lib/jekyll/convertible.rb | 8 ++++---- lib/jekyll/filters.rb | 4 ++-- lib/jekyll/reader.rb | 4 ++-- lib/jekyll/site.rb | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index d9298f4f621..c61807f983e 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -87,9 +87,9 @@ def output_ext if converters.all? { |c| c.is_a?(Jekyll::Converters::Identity) } ext else - converters.map { |c| + converters.map do |c| c.output_ext(ext) unless c.is_a?(Jekyll::Converters::Identity) - }.compact.last + end.compact.last end end @@ -122,9 +122,9 @@ def render_liquid(content, payload, info, path) # # Returns the Hash representation of this Convertible. def to_liquid(attrs = nil) - further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map { |attribute| + further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map do |attribute| [attribute, send(attribute)] - }] + end] defaults = site.frontmatter_defaults.all(relative_path, type) Utils.deep_merge_hashes defaults, Utils.deep_merge_hashes(data, further_data) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 734457cb682..9b2cad9daf7 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -238,7 +238,7 @@ def sort(input, property = nil, nils = "first") "'#{nils}' is not a valid nils order. It must be 'first' or 'last'.") end - input.sort { |apple, orange| + input.sort do |apple, orange| apple_property = item_property(apple, property) orange_property = item_property(orange, property) @@ -249,7 +249,7 @@ def sort(input, property = nil, nils = "first") else apple_property <=> orange_property end - } + end end end diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 2926971b773..c9ded560936 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -68,11 +68,11 @@ def retrieve_posts(dir) # # Returns nothing. def retrieve_dirs(_base, dir, dot_dirs) - dot_dirs.map { |file| + dot_dirs.map do |file| dir_path = site.in_source_dir(dir, file) rel_path = File.join(dir, file) @site.reader.read_directories(rel_path) unless @site.dest.sub(/\/$/, '') == dir_path - } + end end # Retrieve all the pages from the current directory, diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 3ed60c121a2..fcd4bf778c8 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -196,9 +196,9 @@ def cleanup # # Returns nothing. def write - each_site_file { |item| + each_site_file do |item| item.write(dest) if regenerator.regenerate?(item) - } + end regenerator.write_metadata Jekyll::Hooks.trigger :site, :post_write, self end From 04e635b10cc991a742e210079be776cda133f34b Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 12:06:40 -0800 Subject: [PATCH 0191/4996] Rubocop: Style/SpaceInsideRangeLiteral - Space inside range literal --- lib/jekyll/document.rb | 2 +- lib/jekyll/page.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 8d7c92f49dd..3b41076ceff 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -113,7 +113,7 @@ def basename # Returns the cleaned relative path of the document. def cleaned_relative_path @cleaned_relative_path ||= - relative_path[0 .. -extname.length - 1].sub(collection.relative_directory, "") + relative_path[0..-extname.length - 1].sub(collection.relative_directory, "") end # Determine whether the document is a YAML file. diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 019cb0956c2..78f7e041ab5 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -106,7 +106,7 @@ def url_placeholders # Returns nothing. def process(name) self.ext = File.extname(name) - self.basename = name[0 .. -ext.length - 1] + self.basename = name[0..-ext.length - 1] end # Add any necessary layouts to this post From c1c8b6dbf733ccacfe1b260e7c23927aeb7aa34f Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 12:07:34 -0800 Subject: [PATCH 0192/4996] Rubocop: Style/SpaceInsideHashLiteralBraces --- lib/jekyll/document.rb | 2 +- lib/jekyll/filters.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 3b41076ceff..38ced6751a8 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -283,7 +283,7 @@ def post_read "slug" => slug, "ext" => ext }) - merge_data!({"date" => date}) if data['date'].nil? || data['date'].to_i == site.time.to_i + merge_data!({ "date" => date }) if data['date'].nil? || data['date'].to_i == site.time.to_i data['title'] ||= slug.split('-').select(&:capitalize).join(' ') end populate_categories diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 9b2cad9daf7..36760d65391 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -194,7 +194,7 @@ def group_by(input, property) input.group_by do |item| item_property(item, property).to_s end.inject([]) do |memo, i| - memo << {"name" => i.first, "items" => i.last} + memo << { "name" => i.first, "items" => i.last } end else input From c273d91df13227f04908198ff91df01cf7c2d284 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 12:08:02 -0800 Subject: [PATCH 0193/4996] cucumber: fix issue where an undefined step would cause an exception --- features/step_definitions/jekyll_steps.rb | 4 ++-- features/support/overview.rb | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/features/step_definitions/jekyll_steps.rb b/features/step_definitions/jekyll_steps.rb index 9164d549b28..b38397fbe55 100644 --- a/features/step_definitions/jekyll_steps.rb +++ b/features/step_definitions/jekyll_steps.rb @@ -150,14 +150,14 @@ def file_content_from_hash(input_hash) When /^I run jekyll(.*)$/ do |args| status = run_jekyll(args) if args.include?("--verbose") || ENV['DEBUG'] - puts jekyll_run_output + STDERR.puts "\n#{jekyll_run_output}\n" end end When /^I run bundle(.*)$/ do |args| status = run_bundle(args) if args.include?("--verbose") || ENV['DEBUG'] - puts jekyll_run_output + STDERR.puts "\n#{jekyll_run_output}\n" end end diff --git a/features/support/overview.rb b/features/support/overview.rb index 9550969b39c..9045eafbf5a 100644 --- a/features/support/overview.rb +++ b/features/support/overview.rb @@ -25,6 +25,7 @@ def initialize(runtime, path_or_io, options) @indent = 0 @prefixes = options[:prefixes] || {} @delayed_messages = [] + @snippets_input = [] end def before_features(features) @@ -115,6 +116,10 @@ def exception(exception, status) @io.flush end + def after_test_step(test_step, result) + collect_snippet_data(test_step, result) + end + private def print_feature_element_name(keyword, name, file_colon_line, source_indent) From cce848d3d81b1b6a992911289bf634bb9abffdea Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 12:12:17 -0800 Subject: [PATCH 0194/4996] Rubocop: Avoid single-line method definitions --- lib/jekyll/drops/url_drop.rb | 54 ++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb index 32aae194239..2815edf7557 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -35,17 +35,49 @@ def categories category_set.to_a.join('/') end - def year; @obj.date.strftime("%Y"); end - def month; @obj.date.strftime("%m"); end - def day; @obj.date.strftime("%d"); end - def hour; @obj.date.strftime("%H"); end - def minute; @obj.date.strftime("%M"); end - def second; @obj.date.strftime("%S"); end - def i_day; @obj.date.strftime("%-d"); end - def i_month; @obj.date.strftime("%-m"); end - def short_month; @obj.date.strftime("%b"); end - def short_year; @obj.date.strftime("%y"); end - def y_day; @obj.date.strftime("%j"); end + def year + @obj.date.strftime("%Y") + end + + def month + @obj.date.strftime("%m") + end + + def day + @obj.date.strftime("%d") + end + + def hour + @obj.date.strftime("%H") + end + + def minute + @obj.date.strftime("%M") + end + + def second + @obj.date.strftime("%S") + end + + def i_day + @obj.date.strftime("%-d") + end + + def i_month + @obj.date.strftime("%-m") + end + + def short_month + @obj.date.strftime("%b") + end + + def short_year + @obj.date.strftime("%y") + end + + def y_day + @obj.date.strftime("%j") + end end end end From ab3d906e04dc21bc8385829e2d356f0f4a814ac2 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 12:14:00 -0800 Subject: [PATCH 0195/4996] Rubocop: Style/ParenthesesAroundCondition - Don't use parentheses around the condition of an if --- lib/jekyll/plugin_manager.rb | 2 +- lib/jekyll/regenerator.rb | 2 +- lib/jekyll/utils.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index d4ad99515fc..502c4a731b1 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -76,7 +76,7 @@ def require_plugin_files # # Returns an Array of plugin search paths def plugins_path - if (site.config['plugins_dir'] == Jekyll::Configuration::DEFAULTS['plugins_dir']) + if site.config['plugins_dir'] == Jekyll::Configuration::DEFAULTS['plugins_dir'] [site.in_source_dir(site.config['plugins_dir'])] else Array(site.config['plugins_dir']).map { |d| File.expand_path(d) } diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index bb9284aa11f..205223509a9 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -115,7 +115,7 @@ def modified?(path) # # Returns nothing. def add_dependency(path, dependency) - return if (metadata[path].nil? || @disabled) + return if metadata[path].nil? || @disabled unless metadata[path]["deps"].include? dependency metadata[path]["deps"] << dependency diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 1d81e0f0435..6b6e8f1cd91 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -62,7 +62,7 @@ def pluralized_array_from_hash(hash, singular_key, plural_key) end def value_from_singular_key(hash, key) - hash[key] if (hash.key?(key) || (hash.default_proc && hash[key])) + hash[key] if hash.key?(key) || (hash.default_proc && hash[key]) end def value_from_plural_key(hash, key) From 060904d8096a691e73d87fd4784993f358036bdb Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 4 Jan 2016 12:16:36 -0800 Subject: [PATCH 0196/4996] Rubocop: Style/TrailingWhitespace - Trailing whitespace detected Rubocop: Style/EmptyLines - Extra blank line detected Rubocop: Style/EmptyLinesAroundBlockBody - Extra empty line detected at block body beginning --- lib/jekyll/tags/post_url.rb | 1 - lib/jekyll/utils/ansi.rb | 2 +- lib/jekyll/utils/platforms.rb | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index 5b3df093f8c..6c4c9f8eb6e 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -66,7 +66,6 @@ def render(context) # New matching method did not match, fall back to old method # with deprecation warning if this matches - site.posts.docs.each do |p| next unless @post.deprecated_equality p Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{@post.name} }}' did not match " \ diff --git a/lib/jekyll/utils/ansi.rb b/lib/jekyll/utils/ansi.rb index 05f38429b3f..933b4323018 100644 --- a/lib/jekyll/utils/ansi.rb +++ b/lib/jekyll/utils/ansi.rb @@ -33,7 +33,7 @@ def strip(str) def has?(str) !!(str =~ MATCH) end - + # Reset the color back to the default color so that you do not leak any # colors when you move onto the next line. This is probably normally # used as part of a wrapper so that we don't leak colors. diff --git a/lib/jekyll/utils/platforms.rb b/lib/jekyll/utils/platforms.rb index abc1598cb42..d431021f767 100644 --- a/lib/jekyll/utils/platforms.rb +++ b/lib/jekyll/utils/platforms.rb @@ -19,7 +19,6 @@ module Platforms { :windows? => /mswin|mingw|cygwin/, :linux? => /linux/, \ :osx? => /darwin|mac os/, :unix? => /solaris|bsd/ }.each do |k, v| - define_method k do !!( RbConfig::CONFIG["host_os"] =~ v From eaade1e49aad40a216ce9ad4900cfe7fd2681652 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 12:32:15 -0800 Subject: [PATCH 0197/4996] Update history to reflect merge of #4301 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cb91e071f05..42e152d9d48 100644 --- a/History.markdown +++ b/History.markdown @@ -38,6 +38,7 @@ * Change TestDoctorCommand to JekyllUnitTest... (#4263) * Create namespaced rake tasks in separate `.rake` files under `lib/tasks` (#4282) * markdown: refactor for greater readability & efficiency (#3771) + * Fix many Rubocop style errors (#4301) ### Site Enhancements From 87978e79f43278366d1ee002e6bc3c5046f473eb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 12:36:04 -0800 Subject: [PATCH 0198/4996] features/step_definitions: use $stderr instead of STDERR Fixes https://github.com/jekyll/jekyll/commit/c273d91df13227f04908198ff91df01cf7c2d284#commitcomment-15251676 --- features/step_definitions/jekyll_steps.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/step_definitions/jekyll_steps.rb b/features/step_definitions/jekyll_steps.rb index b38397fbe55..c9ae0567b2f 100644 --- a/features/step_definitions/jekyll_steps.rb +++ b/features/step_definitions/jekyll_steps.rb @@ -150,14 +150,14 @@ def file_content_from_hash(input_hash) When /^I run jekyll(.*)$/ do |args| status = run_jekyll(args) if args.include?("--verbose") || ENV['DEBUG'] - STDERR.puts "\n#{jekyll_run_output}\n" + $stderr.puts "\n#{jekyll_run_output}\n" end end When /^I run bundle(.*)$/ do |args| status = run_bundle(args) if args.include?("--verbose") || ENV['DEBUG'] - STDERR.puts "\n#{jekyll_run_output}\n" + $stderr.puts "\n#{jekyll_run_output}\n" end end From 735194ccaf7f7b9079f31ea09aa4fb8ad856b3c3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 12:00:18 -0800 Subject: [PATCH 0199/4996] Convertible/Page/Renderer: use payload hash accessor & setter syntax --- lib/jekyll/convertible.rb | 12 ++++++------ lib/jekyll/page.rb | 4 ++-- lib/jekyll/renderer.rb | 18 +++++++++--------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index c61807f983e..746f4bd1529 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -210,8 +210,8 @@ def render_all_layouts(layouts, payload, info) while layout Jekyll.logger.debug "Rendering Layout:", path - payload.content = output - payload.layout = layout.data + payload["content"] = output + payload["layout"] = Utils.deep_merge_hashes(payload["layout"] || {}, layout.data) self.output = render_liquid(layout.content, payload, @@ -236,7 +236,7 @@ def render_all_layouts(layouts, payload, info) # Add any necessary layouts to this convertible document. # - # payload - The site payload Hash. + # payload - The site payload Drop or Hash. # layouts - A Hash of {"name" => "layout"}. # # Returns nothing. @@ -245,11 +245,11 @@ def do_layout(payload, layouts) Jekyll.logger.debug "Pre-Render Hooks:", self.relative_path Jekyll::Hooks.trigger hook_owner, :pre_render, self, payload - info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload.page } } + info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload["page"] } } # render and transform content (this becomes the final content of the object) - payload.highlighter_prefix = converters.first.highlighter_prefix - payload.highlighter_suffix = converters.first.highlighter_suffix + payload["highlighter_prefix"] = converters.first.highlighter_prefix + payload["highlighter_suffix"] = converters.first.highlighter_suffix if render_with_liquid? Jekyll.logger.debug "Rendering Liquid:", self.relative_path diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 78f7e041ab5..1d29e354979 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -116,8 +116,8 @@ def process(name) # # Returns nothing. def render(layouts, site_payload) - site_payload.page = to_liquid - site_payload.paginator = pager.to_liquid + site_payload["page"] = to_liquid + site_payload["paginator"] = pager.to_liquid do_layout(site_payload, layouts) end diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index f9c1b88c630..c17ba4b2785 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -32,23 +32,23 @@ def output_ext def run Jekyll.logger.debug "Rendering:", document.relative_path - payload.page = document.to_liquid + payload["page"] = document.to_liquid if document.collection.label == 'posts' && document.is_a?(Document) - payload.site['related_posts'] = document.related_posts + payload['site']['related_posts'] = document.related_posts end Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path document.trigger_hooks(:pre_render, payload) info = { - :filters => [Jekyll::Filters], - :registers => { :site => site, :page => payload.page } + :filters => [Jekyll::Filters], + :registers => { :site => site, :page => payload['page'] } } # render and transform content (this becomes the final content of the object) - payload.highlighter_prefix = converters.first.highlighter_prefix - payload.highlighter_suffix = converters.first.highlighter_suffix + payload['highlighter_prefix'] = converters.first.highlighter_prefix + payload['highlighter_suffix'] = converters.first.highlighter_suffix output = document.content @@ -132,9 +132,9 @@ def place_in_layouts(content, payload, info) used = Set.new([layout]) while layout - payload.content = output - payload.page = document.to_liquid - payload.layout = layout.data + payload['content'] = output + payload['page'] = document.to_liquid + payload['layout'] = Utils.deep_merge_hashes(payload['layout'] || {}, layout.data) output = render_liquid( layout.content, From 2756503e7b32f9fa819e2652fa4932a6cc700401 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 12:18:02 -0800 Subject: [PATCH 0200/4996] features/hooks: use hash syntax to access page --- features/hooks.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/hooks.feature b/features/hooks.feature index b561c00c77e..5252d562160 100644 --- a/features/hooks.feature +++ b/features/hooks.feature @@ -89,7 +89,7 @@ Feature: Hooks And I have a "_plugins/ext.rb" file with content: """ Jekyll::Hooks.register :pages, :pre_render do |page, payload| - payload.page['myparam'] = 'special' if page.name == 'page1.html' + payload['page']['myparam'] = 'special' if page.name == 'page1.html' end """ And I have a "page1.html" page that contains "{{ page.myparam }}" From 06c45df8c3181fa2967dcc7952939e90b11af23a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 12:09:19 -0800 Subject: [PATCH 0201/4996] Drop: hash syntax should use setter method for a property if it's defined --- lib/jekyll/drops/drop.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index c194a5baada..af249996d2e 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -62,7 +62,9 @@ def [](key) # and the key matches a method in which case it raises a # DropMutationException. def []=(key, val) - if self.class.mutable + if respond_to?("#{key}=") + public_send("#{key}=", val) + elsif self.class.mutable @mutations[key] = val elsif respond_to? key raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." From 62d7f5ecade234b07fe51fda22ed4ffd1e391bcc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 12:10:05 -0800 Subject: [PATCH 0202/4996] Add feature test for layout data Fixes issue defined here: https://github.com/jekyll/jekyll/issues/4246#issuecomment-168367510 --- features/layout_data.feature | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 features/layout_data.feature diff --git a/features/layout_data.feature b/features/layout_data.feature new file mode 100644 index 00000000000..a06502c89b2 --- /dev/null +++ b/features/layout_data.feature @@ -0,0 +1,18 @@ +Feature: Layout data + As a hacker who likes to avoid repetition + I want to be able to embed data into my layouts + In order to make the layouts slightly dynamic + + Scenario: Use custom layout data + Given I have a _layouts directory + And I have a "_layouts/custom.html" file with content: + """ + --- + foo: my custom data + --- + {{ content }} foo: {{ layout.foo }} + """ + And I have an "index.html" page with layout "custom" that contains "page content" + When I run jekyll build + Then the "_site/index.html" file should exist + And I should see "page content\n foo: my custom data" in "_site/index.html" From 95a3c54ddb374a757cec468caed3d413dd2ea9e9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 12:41:40 -0800 Subject: [PATCH 0203/4996] drop: only check mutable if the key is a method --- lib/jekyll/drops/drop.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index af249996d2e..b4a07fc7c1b 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -64,10 +64,12 @@ def [](key) def []=(key, val) if respond_to?("#{key}=") public_send("#{key}=", val) - elsif self.class.mutable - @mutations[key] = val elsif respond_to? key - raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." + if self.class.mutable + @mutations[key] = val + else + raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." + end else fallback_data[key] = val end From e10c483ec3734fbf2eeff1a1edb71f6f23c5f205 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Mon, 4 Jan 2016 14:44:13 -0600 Subject: [PATCH 0204/4996] Adjust Rubocop to fit in a bit better. --- .rubocop.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index 345bec1df0f..aa9f765f279 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -2,17 +2,22 @@ Metrics/MethodLength: { Max: 24 } Metrics/ClassLength: { Max: 240 } Metrics/ModuleLength: { Max: 240 } Metrics/LineLength: { Max: 112 } +Metrics/CyclomaticComplexity: { Max: 8 } +Metrics/PerceivedComplexity: { Max: 8 } +Metrics/ParameterLists: { Max: 4 } +Metrics/MethodLength: { Max: 24 } +Metrics/AbcSize: { Max: 20 } Style/IndentHash: { EnforcedStyle: consistent } Style/HashSyntax: { EnforcedStyle: hash_rockets } Style/SignalException: { EnforcedStyle: only_raise } Style/AlignParameters: { EnforcedStyle: with_fixed_indentation } Style/StringLiteralsInInterpolation: { EnforcedStyle: double_quotes } -Style/RegexpLiteral: { EnforcedStyle: slashes, AllowInnerSlashes: true } Style/MultilineMethodCallIndentation: { EnforcedStyle: indented } Style/MultilineOperationIndentation: { EnforcedStyle: indented } Style/FirstParameterIndentation: { EnforcedStyle: consistent } Style/StringLiterals: { EnforcedStyle: double_quotes } +Style/RegexpLiteral: { EnforcedStyle: slashes } Style/IndentArray: { EnforcedStyle: consistent } Style/ExtraSpacing: { AllowForAlignment: true } @@ -43,6 +48,7 @@ Style/FileName: { Enabled: false } Lint/UselessAccessModifier: { Enabled: false } Style/SpaceAroundOperators: { Enabled: false } Style/RedundantReturn: { Enabled: false } +Style/SingleLineMethods: { Enabled: false } AllCops: TargetRubyVersion: 2.0 From a62e085ea051617c0669aa22b732882d8eec8720 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 13:04:38 -0800 Subject: [PATCH 0205/4996] Update history to reflect merge of #4311 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 42e152d9d48..993ed5e9386 100644 --- a/History.markdown +++ b/History.markdown @@ -29,6 +29,7 @@ * Rename `@options` so that it does not impact Liquid. (#4173) * utils/drops: update Drop to support `Utils.deep_merge_hashes` (#4289) * Make sure jekyll/drops/drop is loaded first. (#4292) + * Convertible/Page/Renderer: use payload hash accessor & setter syntax for backwards-compatibility (#4311) ### Development Fixes From ee2db21202db086936c478504068c3cda98a9c1f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 13:05:19 -0800 Subject: [PATCH 0206/4996] Update history to reflect merge of #4312 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 993ed5e9386..b317e8d3c65 100644 --- a/History.markdown +++ b/History.markdown @@ -30,6 +30,7 @@ * utils/drops: update Drop to support `Utils.deep_merge_hashes` (#4289) * Make sure jekyll/drops/drop is loaded first. (#4292) * Convertible/Page/Renderer: use payload hash accessor & setter syntax for backwards-compatibility (#4311) + * Drop: fix hash setter precendence (#4312) ### Development Fixes From ed815b0d2c302f91e4985137afd674cf102cec37 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 13:07:33 -0800 Subject: [PATCH 0207/4996] Update history to reflect merge of #4296 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b317e8d3c65..9e5185268d0 100644 --- a/History.markdown +++ b/History.markdown @@ -62,6 +62,7 @@ * Add `jekyll-commonmark` to list of third-party plugins (#4299) * Add documentation for incremental regeneration (#4293) * Add note about removal of relative permalink support in upgrading docs (#4303) + * Add Pro Tip to use front matter variable to create clean URLs (#4296) ## 3.0.1 / 2015-11-17 From 1ea667474b8c82bcaccda08dc4e58b46649b3ae4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 13:24:14 -0800 Subject: [PATCH 0208/4996] Clean up the permalink front matter protip Ref #4296. --- site/_docs/pages.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/site/_docs/pages.md b/site/_docs/pages.md index a2080868e03..59b827e2013 100644 --- a/site/_docs/pages.md +++ b/site/_docs/pages.md @@ -91,11 +91,10 @@ simple and it works. In the end the decision is yours!
ProTip™: Use permalink Front Matter Variable

- Clean URLs can also be achieved using the permalink Front Matter variable. In the example above, using the first method, you can get URL http://example.com/other for the file other.md by adding this to the top of the file. -

-    ---
-    permalink: /other/
-    ---
-    
+ Clean URLs can also be achieved using the permalink front + matter variable. In the example above, using the first method, you can + get URL http://example.com/other for the file + other.md by setting this at the top of the file: + permalink: /other

From cb5bc1093e2e7c3db63a76c096ce86a4c2eef02c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 27 Dec 2015 10:56:47 -0500 Subject: [PATCH 0209/4996] utils: has_yaml_header? should accept files with extraneous spaces Occasionally, extra spaces at the end of the YAML front matter prologue are saved to a file and it goes missing without telling the user why. This should simply accept those changes without any detriment to the user, allowing anyone to add as many spaces as they like to the end of their front matter prologues. --- lib/jekyll/utils.rb | 4 +++- .../_posts/2015-12-27-extra-spaces.markdown | 3 +++ test/test_generated_site.rb | 2 +- test/test_utils.rb | 18 ++++++++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 test/source/_posts/2015-12-27-extra-spaces.markdown diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 6b6e8f1cd91..b878d4d6b0e 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -120,7 +120,9 @@ def parse_date(input, msg = "Input could not be parsed.") # # Returns true if the YAML front matter is present. def has_yaml_header?(file) - !!(File.open(file, 'rb') { |f| f.read(5) } =~ /\A---\r?\n/) + !!(File.open(file, 'rb') { |f| f.readline } =~ /\A---\s*\r?\n/) + rescue EOFError + false end # Slugify a filename or title. diff --git a/test/source/_posts/2015-12-27-extra-spaces.markdown b/test/source/_posts/2015-12-27-extra-spaces.markdown new file mode 100644 index 00000000000..595a9cd9afe --- /dev/null +++ b/test/source/_posts/2015-12-27-extra-spaces.markdown @@ -0,0 +1,3 @@ +--- +extra: spaces +--- diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 32999aba9b1..9a289dd3c8c 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -12,7 +12,7 @@ class TestGeneratedSite < JekyllUnitTest end should "ensure post count is as expected" do - assert_equal 48, @site.posts.size + assert_equal 49, @site.posts.size end should "insert site.posts into the index" do diff --git a/test/test_utils.rb b/test/test_utils.rb index bf7e8957aed..7d499f9ba15 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -259,4 +259,22 @@ class TestUtils < JekyllUnitTest end end + context "The \`Utils.has_yaml_header?\` method" do + should "accept files with yaml front matter" do + file = source_dir("_posts", "2008-10-18-foo-bar.markdown") + assert_equal "---\n", File.open(file, 'rb') { |f| f.read(4) } + assert Utils.has_yaml_header?(file) + end + should "accept files with extraneous spaces after yaml front matter" do + file = source_dir("_posts", "2015-12-27-extra-spaces.markdown") + assert_equal "--- \n", File.open(file, 'rb') { |f| f.read(6) } + assert Utils.has_yaml_header?(file) + end + should "reject pgp files and the like which resemble front matter" do + file = source_dir("pgp.key") + assert_equal "-----B", File.open(file, 'rb') { |f| f.read(6) } + refute Utils.has_yaml_header?(file) + end + end + end From 10a1b9451a270a24e3465c15aaaa115d2917db01 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 14:57:59 -0800 Subject: [PATCH 0210/4996] Update history to reflect merge of #4290 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9e5185268d0..715b8bc3279 100644 --- a/History.markdown +++ b/History.markdown @@ -31,6 +31,7 @@ * Make sure jekyll/drops/drop is loaded first. (#4292) * Convertible/Page/Renderer: use payload hash accessor & setter syntax for backwards-compatibility (#4311) * Drop: fix hash setter precendence (#4312) + * utils: `has_yaml_header?` should accept files with extraneous spaces (#4290) ### Development Fixes From 4fe9eecf053eb5d6047011372d8a195e88fb8614 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 11 Dec 2015 14:45:13 -0800 Subject: [PATCH 0211/4996] For blessed gems, shim their commands so users know how to use them. --- bin/jekyll | 14 ++++++++++---- lib/jekyll/external.rb | 3 ++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/bin/jekyll b/bin/jekyll index 173a58d3842..96e157272ea 100755 --- a/bin/jekyll +++ b/bin/jekyll @@ -6,10 +6,6 @@ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w( .. lib )) require 'jekyll' require 'mercenary' -Jekyll::External.require_if_present( - Jekyll::External.blessed_gems -) - Jekyll::PluginManager.require_from_bundler Jekyll::Deprecator.process(ARGV) @@ -26,6 +22,16 @@ Mercenary.program(:jekyll) do |p| p.option 'layouts_dir', '--layouts DIR', String, 'Layouts directory (defaults to ./_layouts)' p.option 'profile', '--profile', 'Generate a Liquid rendering profile' + Jekyll::External.require_if_present(Jekyll::External.blessed_gems) do |g| + cmd = g.split('-').last + p.command(cmd.to_sym) do |c| + c.syntax cmd + c.action do + Jekyll.logger.abort_with "You must install the '#{g}' gem to use the 'jekyll #{cmd}' command." + end + end + end + Jekyll::Command.subclasses.each { |c| c.init_with_program(p) } p.action do |args, _| diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index d213364bb68..2996d24b635 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -17,12 +17,13 @@ def blessed_gems # # names - a string gem name or array of gem names # - def require_if_present(names) + def require_if_present(names, &block) Array(names).each do |name| begin require name rescue LoadError Jekyll.logger.debug "Couldn't load #{name}. Skipping." + block.call(name) if block false end end From d37de5c8dfdcd10b4a2a48ae3498e954f4327c7e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 16:17:48 -0800 Subject: [PATCH 0212/4996] If the subcommand cannot be found, suggest the installation of a gem. --- bin/jekyll | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/jekyll b/bin/jekyll index 96e157272ea..43364b9960c 100755 --- a/bin/jekyll +++ b/bin/jekyll @@ -40,8 +40,11 @@ Mercenary.program(:jekyll) do |p| puts p abort else - unless p.has_command?(args.first) - Jekyll.logger.abort_with "Invalid command. Use --help for more information" + subcommand = args.first + unless p.has_command? subcommand + Jekyll.logger.abort_with "fatal: 'jekyll #{args.first}' could not" \ + " be found. You may need to install the jekyll-#{args.first} gem" \ + " or a related gem to be able to use this subcommand." end end end From a9b80b2f06580efa144a09da0f139759db180630 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 16:21:53 -0800 Subject: [PATCH 0213/4996] features/layout_data: add scenario for inheriting layout data from child to parent Ref: https://github.com/jekyll/jekyll/pull/4312#discussion_r48781985 --- features/layout_data.feature | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/features/layout_data.feature b/features/layout_data.feature index a06502c89b2..789986651b4 100644 --- a/features/layout_data.feature +++ b/features/layout_data.feature @@ -16,3 +16,22 @@ Feature: Layout data When I run jekyll build Then the "_site/index.html" file should exist And I should see "page content\n foo: my custom data" in "_site/index.html" + + Scenario: Inherit custom layout data + Given I have a _layouts directory + And I have a "_layouts/custom.html" file with content: + """ + --- + layout: base + foo: my custom data + --- + {{ content }} + """ + And I have a "_layouts/base.html" file with content: + """ + {{ content }} foo: {{ layout.foo }} + """ + And I have an "index.html" page with layout "custom" that contains "page content" + When I run jekyll build + Then the "_site/index.html" file should exist + And I should see "page content\n foo: my custom data" in "_site/index.html" From 657b6b328cdb270894120cd68e46e4b87af9f017 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 16:26:02 -0800 Subject: [PATCH 0214/4996] Update history to reflect merge of #4307 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 715b8bc3279..343dc08c5e4 100644 --- a/History.markdown +++ b/History.markdown @@ -32,6 +32,7 @@ * Convertible/Page/Renderer: use payload hash accessor & setter syntax for backwards-compatibility (#4311) * Drop: fix hash setter precendence (#4312) * utils: `has_yaml_header?` should accept files with extraneous spaces (#4290) + * Escape html from site.title and page.title in site template (#4307) ### Development Fixes From 935e5563e16eaa2ab15fdf0a01352516cddd7b47 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 16:31:06 -0800 Subject: [PATCH 0215/4996] Update history to reflect merge of #4254 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 343dc08c5e4..454ddc78e09 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * Add a Jekyll doctor warning for URLs that only differ by case (#3171) * drops: create one base Drop class which can be set as mutable or not (#4285) * drops: provide `#to_h` to allow for hash introspection (#4281) + * Shim subcommands with indication of gem possibly required so users know how to use them (#4254) ### Bug Fixes From b6c283a4aee531a06ba6b3c9cde5e972889c7471 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 16:10:11 -0800 Subject: [PATCH 0216/4996] wip: allow custom extensions --- lib/jekyll/configuration.rb | 6 ++--- lib/jekyll/document.rb | 12 +++++++--- lib/jekyll/page.rb | 2 +- lib/jekyll/renderer.rb | 6 ++++- lib/jekyll/utils.rb | 5 ++++- test/source/_slides/example-slide-7.md | 6 +++++ test/source/dynamic_file.php | 4 ++++ test/test_document.rb | 31 ++++++++++++++++++++++---- test/test_filters.rb | 2 +- test/test_generated_site.rb | 5 +++-- test/test_page.rb | 9 ++++++++ test/test_site.rb | 1 + test/test_utils.rb | 1 - 13 files changed, 73 insertions(+), 17 deletions(-) create mode 100644 test/source/_slides/example-slide-7.md create mode 100644 test/source/dynamic_file.php diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 0229e073e5c..0f8618a1b8b 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -298,11 +298,11 @@ def style_to_permalink(permalink_style) when :pretty "/:categories/:year/:month/:day/:title/" when :none - "/:categories/:title.html" + "/:categories/:title:output_ext" when :date - "/:categories/:year/:month/:day/:title.html" + "/:categories/:year/:month/:day/:title:output_ext" when :ordinal - "/:categories/:year/:y_day/:title.html" + "/:categories/:year/:y_day/:title:output_ext" else permalink_style.to_s end diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 38ced6751a8..c3fff329e17 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -4,7 +4,7 @@ module Jekyll class Document include Comparable - attr_reader :path, :site, :extname, :output_ext, :collection + attr_reader :path, :site, :extname, :collection attr_accessor :content, :output YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m @@ -23,7 +23,6 @@ def initialize(path, relations = {}) @site = relations[:site] @path = path @extname = File.extname(path) - @output_ext = Jekyll::Renderer.new(site, self).output_ext @collection = relations[:collection] @has_yaml_header = nil @@ -86,6 +85,13 @@ def relative_path @relative_path ||= Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s end + # The output extension of the document. + # + # Returns the output extension + def output_ext + @output_ext ||= Jekyll::Renderer.new(site, self).output_ext + end + # The base filename of the document, without the file extname. # # Returns the basename without the file extname. @@ -209,7 +215,7 @@ def destination(base_directory) dest = site.in_dest_dir(base_directory) path = site.in_dest_dir(dest, URL.unescape_path(url)) path = File.join(path, "index.html") if url.end_with?("/") - path << output_ext unless path.end_with?(output_ext) + path << output_ext unless path.end_with? output_ext path end diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 1d29e354979..a3519f57f53 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -142,7 +142,7 @@ def relative_path def destination(dest) path = site.in_dest_dir(dest, URL.unescape_path(url)) path = File.join(path, "index") if url.end_with?("/") - path << output_ext unless path.end_with?(output_ext) + path << output_ext unless path.end_with? output_ext path end diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index c17ba4b2785..e6a41aead3c 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -22,7 +22,11 @@ def converters # # Returns the output extname including the leading period. def output_ext - @output_ext ||= converters.first.output_ext(document.extname) + @output_ext ||= if document.permalink + File.extname(document.permalink) + else + converters.first.output_ext(document.extname) + end end ###################### diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index b878d4d6b0e..635b5d107d9 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -1,5 +1,8 @@ +require 'mime/types' + module Jekyll - module Utils extend self + module Utils + extend self autoload :Platforms, 'jekyll/utils/platforms' autoload :Ansi, "jekyll/utils/ansi" diff --git a/test/source/_slides/example-slide-7.md b/test/source/_slides/example-slide-7.md new file mode 100644 index 00000000000..a17c79fe8c3 --- /dev/null +++ b/test/source/_slides/example-slide-7.md @@ -0,0 +1,6 @@ +--- +am_i_convertible: yes +permalink: /slides/example-slide-7.php +--- + +Am I convertible? {{ page.am_i_convertible }} diff --git a/test/source/dynamic_file.php b/test/source/dynamic_file.php new file mode 100644 index 00000000000..823bb47fab0 --- /dev/null +++ b/test/source/dynamic_file.php @@ -0,0 +1,4 @@ +--- +--- + +I'm a Jekyll file! I should be output as dynamic_file.php, no .html to be found. diff --git a/test/test_document.rb b/test/test_document.rb index 6689e506652..7c6f7bef6b8 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -47,9 +47,7 @@ def assert_equal_value(key, one, other) context "with YAML ending in three dots" do setup do - @site = fixture_site({ - "collections" => ["methods"], - }) + @site = fixture_site({"collections" => ["methods"]}) @site.process @document = @site.collections["methods"].docs.last end @@ -195,6 +193,7 @@ def assert_equal_value(key, one, other) "permalink" => "/slides/test/:name" } }, + "permalink" => "pretty" }) @site.process @document = @site.collections["slides"].docs[0] @@ -245,7 +244,7 @@ def assert_equal_value(key, one, other) }) @site.permalink_style = :pretty @site.process - @document = @site.collections["slides"].docs[6] + @document = @site.collections["slides"].docs[7] @dest_file = dest_dir("slides/example-slide-Upper-Cased/index.html") end @@ -254,6 +253,29 @@ def assert_equal_value(key, one, other) end end + context "a document in a collection with cased file name" do + setup do + @site = fixture_site({ + "collections" => { + "slides" => { + "output" => true + } + } + }) + @site.process + @document = @site.collections["slides"].docs[6] + @dest_file = dest_dir("slides/example-slide-7.php") + end + + should "produce the permalink as the url" do + assert_equal "/slides/example-slide-7.php", @document.url + end + + should "be written to the proper directory" do + assert_equal @dest_file, @document.destination(dest_dir) + end + end + context "documents in a collection with custom title permalinks" do setup do @site = fixture_site({ @@ -273,6 +295,7 @@ def assert_equal_value(key, one, other) should "produce the right URL if they have a slug" do assert_equal "/slides/so-what-is-jekyll-exactly", @document.url end + should "produce the right destination file if they have a slug" do dest_file = dest_dir("slides/so-what-is-jekyll-exactly.html") assert_equal dest_file, @document.destination(dest_dir) diff --git a/test/test_filters.rb b/test/test_filters.rb index dc51252e68e..a2eb5bf0f7e 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -257,7 +257,7 @@ def to_liquid assert_equal 2, g["items"].size when "" assert g["items"].is_a?(Array), "The list of grouped items for '' is not an Array." - assert_equal 11, g["items"].size + assert_equal 12, g["items"].size end end end diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 9a289dd3c8c..39a8b3d9669 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -39,8 +39,9 @@ class TestGeneratedSite < JekyllUnitTest end should "process other static files and generate correct permalinks" do - assert File.exist?(dest_dir('/about/index.html')) - assert File.exist?(dest_dir('/contacts.html')) + assert File.exist?(dest_dir('/about/index.html')), "about/index.html should exist" + assert File.exist?(dest_dir('/contacts.html')), "contacts.html should exist" + assert File.exist?(dest_dir('/dynamic_file.php')), "dynamic_file.php should exist" end should "print a nice list of static files" do diff --git a/test/test_page.rb b/test/test_page.rb index 16b9e06031c..904f5bd5d78 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -55,6 +55,15 @@ def do_render(page) assert_equal ".html", @page.ext end + should "deal properly with non-html extensions" do + @page = setup_page('dynamic_page.php') + @dest_file = dest_dir("dynamic_page.php") + assert_equal ".php", @page.ext + assert_equal "dynamic_page", @page.basename + assert_equal "/dynamic_page.php", @page.url + assert_equal @dest_file, @page.destination(dest_dir) + end + should "deal properly with dots" do @page = setup_page('deal.with.dots.html') @dest_file = dest_dir("deal.with.dots.html") diff --git a/test/test_site.rb b/test/test_site.rb index a638a3498ae..970084cf165 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -174,6 +174,7 @@ def generate(site) coffeescript.coffee contacts.html deal.with.dots.html + dynamic_file.php environment.html exploit.md foo.md diff --git a/test/test_utils.rb b/test/test_utils.rb index 7d499f9ba15..49844038229 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -276,5 +276,4 @@ class TestUtils < JekyllUnitTest refute Utils.has_yaml_header?(file) end end - end From dab53a697b8f58db9bef819dc9b6f5c3a592fe56 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 18:17:51 -0800 Subject: [PATCH 0217/4996] collection: tiny optimization to #url_template --- lib/jekyll/collection.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index ea6a81b6fc6..c76071712e7 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -186,9 +186,7 @@ def write? # # Returns the URL template to render collection's documents at. def url_template - metadata.fetch('permalink') do - Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) - end + metadata['permalink'] ||= Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) end # Extract options for this collection from the site configuration. From 9579924f8a7dc6f43829065021d63096b8a5dc3e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 18:18:12 -0800 Subject: [PATCH 0218/4996] drop: tiny optimization to .mutable to create fewer objects --- lib/jekyll/drops/drop.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index b4a07fc7c1b..a8342c14b44 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -15,8 +15,13 @@ class Drop < Liquid::Drop def self.mutable(is_mutable = nil) if is_mutable @is_mutable = is_mutable + else + @is_mutable = false end - @is_mutable || false + end + + def self.mutable? + @is_mutable end # Create a new Drop @@ -39,7 +44,7 @@ def initialize(obj) # # Returns the value for the given key, or nil if none exists def [](key) - if self.class.mutable && @mutations.key?(key) + if self.class.mutable? && @mutations.key?(key) @mutations[key] elsif respond_to? key public_send key @@ -65,7 +70,7 @@ def []=(key, val) if respond_to?("#{key}=") public_send("#{key}=", val) elsif respond_to? key - if self.class.mutable + if self.class.mutable? @mutations[key] = val else raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." From dc31264160ecc8d0e7e21020098bf0010d1ba22e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 18:18:28 -0800 Subject: [PATCH 0219/4996] url: tiny optimization to #generate_url_from_drop --- lib/jekyll/url.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 950945a7714..09975e3d404 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -78,14 +78,14 @@ def generate_url_from_hash(template) end def generate_url_from_drop(template) - template.gsub(/:([a-z_]+)/) do |match| - replacement = @placeholders.public_send(match.sub(':', '')) + template.gsub(/:([a-z_]+)/.freeze) do |match| + replacement = @placeholders.public_send(match.sub(':'.freeze, ''.freeze)) if replacement.nil? ''.freeze else self.class.escape_path(replacement) end - end.gsub(/\/\//, '/') + end.gsub(/\/\//.freeze, '/'.freeze) end # Returns a sanitized String URL, stripping "../../" and multiples of "/", From 8e68de27400d51edb8fd03aa72ee0801632b8fd1 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Jan 2016 18:22:55 -0800 Subject: [PATCH 0220/4996] site: redirect /docs/ to /docs/home/ --- Gemfile | 3 ++- site/_config.yml | 1 + site/_docs/index.md | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 750c461b132..b253e8bf543 100644 --- a/Gemfile +++ b/Gemfile @@ -43,7 +43,8 @@ end gem 'jekyll-paginate', '~> 1.0' gem 'jekyll-coffeescript', '~> 1.0' -gem 'jekyll-feed' +gem 'jekyll-feed', '~> 0.1.3' +gem 'jekyll-redirect-from', '~> 0.9.1' gem 'jekyll-gist', '~> 1.0' gem 'mime-types', '~> 3.0' gem 'kramdown', '~> 1.9' diff --git a/site/_config.yml b/site/_config.yml index e09c4857045..c065f9f7015 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -21,3 +21,4 @@ url: http://jekyllrb.com gems: - jekyll-feed + - jekyll-redirect-from diff --git a/site/_docs/index.md b/site/_docs/index.md index bbb180871c3..ceae4749fb7 100644 --- a/site/_docs/index.md +++ b/site/_docs/index.md @@ -2,6 +2,7 @@ layout: docs title: Welcome permalink: /docs/home/ +redirect_from: /docs/index.html --- This site aims to be a comprehensive guide to Jekyll. We’ll cover topics such From 4cde2ad41cd31f42ac8e4c98f456be0726b16418 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 5 Jan 2016 12:30:23 -0600 Subject: [PATCH 0221/4996] Remove rake analysis, use bundle exec rubocop now. --- rake/analysis.rake | 42 ------------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 rake/analysis.rake diff --git a/rake/analysis.rake b/rake/analysis.rake deleted file mode 100644 index 4fcc6af5563..00000000000 --- a/rake/analysis.rake +++ /dev/null @@ -1,42 +0,0 @@ -############################################################################# -# -# Analyze the quality of the Jekyll source code (requires Docker) -# -############################################################################# - -task :analysis do - require "jekyll/utils/ansi" - require "open3" - - cmd = [ - "docker", "run", "--rm", "--env=CODE_PATH=#{Dir.pwd}", \ - "--volume='#{Dir.pwd}:/code'", "--volume=/var/run/docker.sock:/var/run/docker.sock", \ - "--volume=/tmp/cc:/tmp/cc", "-i", "codeclimate/codeclimate", "analyze" - ] - - ansi = Jekyll::Utils::Ansi - file = File.open(".analysis", "w+") - Open3.popen3(cmd.shelljoin) do |_, out, err, _| - while data = out.gets - file.write data - if data =~ /\A==/ - $stdout.print ansi.yellow(data) - - elsif data !~ %r!\A[0-9\-]+! - $stdout.puts data - - else - h, d = data.split(":", 2) - $stdout.print ansi.cyan(h) - $stdout.print ":", d - end - end - - while data = err.gets - file.write data - $stderr.print ansi.red(data) - end - end - - file.close -end \ No newline at end of file From a48c02a8895542efc2667eb2778d5eec5227b447 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 5 Jan 2016 12:27:27 -0600 Subject: [PATCH 0222/4996] Reorganize and cleanup the Gemfile, shorten depends on Travis. --- .travis.yml | 1 + Gemfile | 96 ++++++++++++++++++++++++++++------------------------- 2 files changed, 51 insertions(+), 46 deletions(-) diff --git a/.travis.yml b/.travis.yml index 58980f41c2f..560fbb3df86 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +bundler_args: --without doc:util:site:benchmark:development language: ruby cache: bundler sudo: false diff --git a/Gemfile b/Gemfile index b253e8bf543..c694a089886 100644 --- a/Gemfile +++ b/Gemfile @@ -1,58 +1,62 @@ -source 'https://rubygems.org' -gemspec name: 'jekyll' +source "https://rubygems.org" +gemspec :name => :jekyll -gem 'rake', '~> 10.1' +gem "rake", "~> 10.1" group :development do - gem 'rdoc', '~> 4.2' - gem 'launchy', '~> 2.3' - gem 'toml', '~> 0.1.0' - gem "rubocop" - gem 'pry' + unless ENV["CI"] + gem "pry", :require => false + gem "rubocop", { + :github => "bbatsov/rubocop", + :branch => :master, :require => false + } + end end -group :test do - gem 'redgreen', '~> 1.2' - gem 'shoulda', '~> 3.5' - gem 'cucumber', '~> 2.1' - gem 'simplecov', '~> 0.9' - gem 'jekyll_test_plugin' - gem 'jekyll_test_plugin_malicious' - gem 'minitest-reporters' - gem 'minitest-profile' - gem 'rspec-mocks' - gem 'minitest' - gem 'nokogiri' - - if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") - gem 'test-unit' - end +group( :doc) { gem "rdoc", "~> 4.2" } # `--without doc` +group(:util) { gem "launchy", "~> 2.3" } # `--without util` +group(:site) { gem "html-proofer" } # `--without site` - if ENV['PROOF'] - gem 'html-proofer', '~> 2.0' - end +# `--without benchmark` +group :benchmark do + gem "rbtrace" + gem "ruby-prof" + gem "benchmark-ips" + gem "stackprof" end -group :benchmark do - if ENV['BENCHMARK'] - gem 'ruby-prof' - gem 'rbtrace' - gem 'stackprof' - gem 'benchmark-ips' +group :test do + gem "redgreen", "~> 1.2" + gem "shoulda", "~> 3.5" + gem "cucumber", "~> 2.1" + gem "simplecov", "~> 0.9" + gem "jekyll_test_plugin" + gem "jekyll_test_plugin_malicious" + gem "minitest-reporters" + gem "minitest-profile" + gem "rspec-mocks" + gem "minitest" + gem "nokogiri" + + if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") + gem "test-unit" end end -gem 'jekyll-paginate', '~> 1.0' -gem 'jekyll-coffeescript', '~> 1.0' -gem 'jekyll-feed', '~> 0.1.3' -gem 'jekyll-redirect-from', '~> 0.9.1' -gem 'jekyll-gist', '~> 1.0' -gem 'mime-types', '~> 3.0' -gem 'kramdown', '~> 1.9' +group :optional_jekyll_dependencies do + gem "toml", "~> 0.1.0" + gem "jekyll-paginate", "~> 1.0" + gem "jekyll-coffeescript", "~> 1.0" + gem "jekyll-feed", "~> 0.1.3" + gem "jekyll-redirect-from", "~> 0.9.1" + gem "jekyll-gist", "~> 1.0" + gem "mime-types", "~> 3.0" + gem "kramdown", "~> 1.9" -platform :ruby, :mswin, :mingw do - gem 'rdiscount', '~> 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' + platform :ruby, :mswin, :mingw do + gem "rdiscount", "~> 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 end From b1a21159483401567ebffcc25909a957d8d96596 Mon Sep 17 00:00:00 2001 From: Peter Suschlik Date: Wed, 6 Jan 2016 17:19:25 +0100 Subject: [PATCH 0223/4996] Fix spelling of GitHub in docs and history * Github -> GitHub * GitHub pages -> GitHub Pages --- History.markdown | 2 +- lib/jekyll/commands/serve/servlet.rb | 2 +- lib/jekyll/converters/markdown.rb | 2 +- site/_docs/configuration.md | 2 +- site/_docs/deployment-methods.md | 2 +- site/_docs/github-pages.md | 2 +- site/_docs/history.md | 2 +- site/_docs/plugins.md | 4 ++-- site/_docs/variables.md | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/History.markdown b/History.markdown index 454ddc78e09..ec921ff2a2f 100644 --- a/History.markdown +++ b/History.markdown @@ -495,7 +495,7 @@ * Add Big Footnotes for Kramdown plugin to list of third-party plugins (#2916) * Remove warning regarding GHP use of singular types for front matter defaults (#2919) * Fix quote character typo in site documentation for templates (#2917) - * Point Liquid links to Liquid’s Github wiki (#2887) + * Point Liquid links to Liquid’s GitHub wiki (#2887) * Add HTTP Basic Auth (.htaccess) plugin to list of third-party plugins (#2931) * (Minor) Grammar & `_config.yml` filename fixes (#2911) * Added `mathml.rb` to the list of third-party plugins. (#2937) diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index cf4952168b2..bb4afe5a57b 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -17,7 +17,7 @@ def initialize(server, root, callbacks) end # Add the ability to tap file.html the same way that Nginx does on our - # Docker images (or on Github pages.) The difference is that we might end + # Docker images (or on GitHub Pages.) The difference is that we might end # up with a different preference on which comes first. def search_file(req, res, basename) diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index bb7b7ffa2b5..aed906d7493 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -37,7 +37,7 @@ def valid_processors # Public: A list of processors that you provide via plugins. # This is really only available if you are not in safe mode, if you are - # in safe mode (re: Github) then there will be none. + # in safe mode (re: GitHub) then there will be none. def third_party_processors self.class.constants - \ diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 6bf17766c61..1b1b707c5dc 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -678,7 +678,7 @@ extensions are: ### Kramdown In addition to the defaults mentioned above, you can also turn on recognition -of Github Flavored Markdown by passing an `input` option with a value of "GFM". +of GitHub Flavored Markdown by passing an `input` option with a value of "GFM". For example, in your `_config.yml`: diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index 54c51ae1589..ad4ea93c283 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -206,7 +206,7 @@ for that](https://github.com/openshift-cartridges/openshift-jekyll-cartridge). ## Kickster -Use [Kickster](http://kickster.nielsenramon.com/) for easy (automated) deploys to Github Pages when using unsupported plugins on Github Pages. +Use [Kickster](http://kickster.nielsenramon.com/) for easy (automated) deploys to GitHub Pages when using unsupported plugins on GitHub Pages. Kickster provides a basic Jekyll project setup packed with web best practises and useful optimization tools increasing your overall project quality. Kickster ships with automated and worry-free deployment scripts for GitHub Pages. diff --git a/site/_docs/github-pages.md b/site/_docs/github-pages.md index c9a4644ca5a..e19cdb2d24e 100644 --- a/site/_docs/github-pages.md +++ b/site/_docs/github-pages.md @@ -92,7 +92,7 @@ branch]({{ site.repository }}/tree/gh-pages) of the same repository.
Source Files Must be in the Root Directory

-Github Pages overrides the “Site Source” configuration value, so if you locate your files anywhere other than the root directory, your site may not build correctly. +GitHub Pages overrides the “Site Source” configuration value, so if you locate your files anywhere other than the root directory, your site may not build correctly.

diff --git a/site/_docs/history.md b/site/_docs/history.md index 6a6404015a4..a99932fb88f 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -463,7 +463,7 @@ permalink: "/docs/history/" - Add Big Footnotes for Kramdown plugin to list of third-party plugins ([#2916]({{ site.repository }}/issues/2916)) - Remove warning regarding GHP use of singular types for front matter defaults ([#2919]({{ site.repository }}/issues/2919)) - Fix quote character typo in site documentation for templates ([#2917]({{ site.repository }}/issues/2917)) -- Point Liquid links to Liquid’s Github wiki ([#2887]({{ site.repository }}/issues/2887)) +- Point Liquid links to Liquid’s GitHub wiki ([#2887]({{ site.repository }}/issues/2887)) - Add HTTP Basic Auth (.htaccess) plugin to list of third-party plugins ([#2931]({{ site.repository }}/issues/2931)) - (Minor) Grammar & `_config.yml` filename fixes ([#2911]({{ site.repository }}/issues/2911)) - Added `mathml.rb` to the list of third-party plugins. ([#2937]({{ site.repository }}/issues/2937)) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 2aff0b959d0..067fb6e7b26 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -828,7 +828,7 @@ LESS.js files during generation. - [Lychee Gallery Tag](https://gist.github.com/tobru/9171700) by [tobru](https://github.com/tobru): Include [Lychee](http://lychee.electerious.com/) albums into a post. For an introduction, see [Jekyll meets Lychee - A Liquid Tag plugin](https://tobrunet.ch/articles/jekyll-meets-lychee-a-liquid-tag-plugin/) - [Image Set/Gallery Tag](https://github.com/callmeed/jekyll-image-set) by [callmeed](https://github.com/callmeed): Renders HTML for an image gallery from a folder in your Jekyll site. Just pass it a folder name and class/tag options. - [jekyll_figure](https://github.com/lmullen/jekyll_figure): Generate figures and captions with links to the figure in a variety of formats -- [Jekyll Github Sample Tag](https://github.com/bwillis/jekyll-github-sample): A liquid tag to include a sample of a github repo file in your Jekyll site. +- [Jekyll GitHub Sample Tag](https://github.com/bwillis/jekyll-github-sample): A liquid tag to include a sample of a github repo file in your Jekyll site. - [Jekyll Project Version Tag](https://github.com/rob-murray/jekyll-version-plugin): A Liquid tag plugin that renders a version identifier for your Jekyll site sourced from the git repository containing your code. - [Piwigo Gallery](https://github.com/AlessandroLorenzi/piwigo_gallery) by [Alessandro Lorenzi](http://www.alorenzi.eu/): Jekyll plugin to generate thumbnails from a Piwigo gallery and display them with a Liquid tag - [mathml.rb](https://github.com/tmthrgd/jekyll-plugins) by Tom Thorogood: A plugin to convert TeX mathematics into MathML for display. @@ -873,7 +873,7 @@ LESS.js files during generation. - [generator-jekyllrb](https://github.com/robwierzbowski/generator-jekyllrb): A generator that wraps Jekyll in [Yeoman](http://yeoman.io/), a tool collection and workflow for builing modern web apps. - [grunt-jekyll](https://github.com/dannygarcia/grunt-jekyll): A straightforward [Grunt](http://gruntjs.com/) plugin for Jekyll. - [jekyll-postfiles](https://github.com/indirect/jekyll-postfiles): Add `_postfiles` directory and {% raw %}`{{ postfile }}`{% endraw %} tag so the files a post refers to will always be right there inside your repo. -- [A layout that compresses HTML](http://jch.penibelst.de/): Github Pages compatible, configurable way to compress HTML files on site build. +- [A layout that compresses HTML](http://jch.penibelst.de/): GitHub Pages compatible, configurable way to compress HTML files on site build. - [Jekyll CO₂](https://github.com/wdenton/jekyll-co2): Generates HTML showing the monthly change in atmospheric CO₂ at the Mauna Loa observatory in Hawaii. - [remote-include](http://www.northfieldx.co.uk/remote-include/): Includes files using remote URLs - [jekyll-minifier](https://github.com/digitalsparky/jekyll-minifier): Minifies HTML, XML, CSS, and Javascript both inline and as separate files utilising yui-compressor and htmlcompressor. diff --git a/site/_docs/variables.md b/site/_docs/variables.md index d4fb5293ddf..33b99fa54d9 100644 --- a/site/_docs/variables.md +++ b/site/_docs/variables.md @@ -106,7 +106,7 @@ following is a reference of the available data. related Posts. By default, these are the ten most recent posts. For high quality but slow to compute results, run the jekyll command with the --lsi (latent semantic - indexing) option. Also note Github pages does not support the lsi option when generating sites. + indexing) option. Also note GitHub Pages does not support the lsi option when generating sites.

From 3061f2d2041103b6fd4662c787e1c094fe1a3b91 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 6 Jan 2016 09:51:10 -0800 Subject: [PATCH 0224/4996] Update history to reflect merge of #4322 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ec921ff2a2f..dcfd3ab5dbc 100644 --- a/History.markdown +++ b/History.markdown @@ -44,6 +44,7 @@ * Create namespaced rake tasks in separate `.rake` files under `lib/tasks` (#4282) * markdown: refactor for greater readability & efficiency (#3771) * Fix many Rubocop style errors (#4301) + * Fix spelling of "GitHub" in docs and history (#4322) ### Site Enhancements From a1b39840bbf00d2acf1f5c84213d6e5692dfe0a4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 6 Jan 2016 10:13:13 -0800 Subject: [PATCH 0225/4996] Revert change to Collection#url_template which caused test breakage. Reverts dab53a697b8f58db9bef819dc9b6f5c3a592fe56 --- lib/jekyll/collection.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index c76071712e7..f0e3333d6a9 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -186,7 +186,9 @@ def write? # # Returns the URL template to render collection's documents at. def url_template - metadata['permalink'] ||= Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) + @url_template ||= metadata.fetch('permalink') do + Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) + end end # Extract options for this collection from the site configuration. From 7eefa0ffd71dfea3f65ce9db6e8c2f3354727710 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 6 Jan 2016 11:12:55 -0800 Subject: [PATCH 0226/4996] docs: remove profanity from installation page Fixes #4321 --- site/_docs/installation.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/site/_docs/installation.md b/site/_docs/installation.md index f0c091f0d30..3720d043872 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -4,10 +4,10 @@ title: Installation permalink: /docs/installation/ --- -Getting Jekyll installed and ready-to-go should only take a few minutes. If it -ever becomes a pain in the ass, please [file an -issue]({{ site.repository }}/issues/new) (or submit a pull request) -describing the issue you encountered and how we might make the process easier. +Getting Jekyll installed and ready-to-go should only take a few minutes. +If it ever becomes a pain, please [file an issue]({{ site.repository }}/issues/new) +(or submit a pull request) describing the issue you +encountered and how we might make the process easier ### Requirements From acb2263f51af818ed74734b8843ddb0a18ac4532 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 7 Jan 2016 02:36:24 -0800 Subject: [PATCH 0227/4996] Add smartify filter --- lib/jekyll/converters/smartypants.rb | 34 ++++++++++++++++++++++++++++ lib/jekyll/filters.rb | 11 +++++++++ test/test_filters.rb | 5 ++++ 3 files changed, 50 insertions(+) create mode 100644 lib/jekyll/converters/smartypants.rb diff --git a/lib/jekyll/converters/smartypants.rb b/lib/jekyll/converters/smartypants.rb new file mode 100644 index 00000000000..7af9d297e9a --- /dev/null +++ b/lib/jekyll/converters/smartypants.rb @@ -0,0 +1,34 @@ +class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown + def initialize(source, options) + super + @block_parsers = [] + @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :escaped_chars] + end +end + +module Jekyll + module Converters + class SmartyPants < Converter + safe true + priority :low + + def initialize(config) + Jekyll::External.require_with_graceful_fail "kramdown" + @config = config["kramdown"].dup || {} + @config[:input] = :SmartyPants + end + + def matches(_) + false + end + + def output_ext(_) + nil + end + + def convert(content) + Kramdown::Document.new(content, @config).to_html.chomp + end + end + end +end diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 36760d65391..986bfdee1f6 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -15,6 +15,17 @@ def markdownify(input) converter.convert(input) end + # Convert a Markdown string into HTML output. + # + # input - The Markdown String to convert. + # + # Returns the HTML formatted String. + def smartify(input) + site = @context.registers[:site] + converter = site.find_converter_instance(Jekyll::Converters::SmartyPants) + converter.convert(input) + end + # Convert a Sass string into CSS output. # # input - The Sass String to convert. diff --git a/test/test_filters.rb b/test/test_filters.rb index dc51252e68e..63e5267280d 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -31,6 +31,11 @@ def initialize(opts = {}) assert_equal "

something really simple

\n", @filter.markdownify("something **really** simple") end + should "smartify with simple string" do + assert_equal "SmartyPants is *not* Markdown", @filter.smartify("SmartyPants is *not* Markdown") + assert_equal "“This filter’s test…”", @filter.smartify(%q{"This filter's test..."}) + end + should "sassify with simple string" do assert_equal "p {\n color: #123456; }\n", @filter.sassify("$blue:#123456\np\n color: $blue") end From ab2cdac97961781e88f2f8331458d5ab36afa52e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 7 Jan 2016 18:29:11 -0800 Subject: [PATCH 0228/4996] Update history to reflect merge of #4318 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index dcfd3ab5dbc..a1ad1b896bf 100644 --- a/History.markdown +++ b/History.markdown @@ -45,6 +45,7 @@ * markdown: refactor for greater readability & efficiency (#3771) * Fix many Rubocop style errors (#4301) * Fix spelling of "GitHub" in docs and history (#4322) + * Reorganize and cleanup the Gemfile, shorten required depends. (#4318) ### Site Enhancements From 3ca451a855ab8f57913c12e1300508fbe3769ed6 Mon Sep 17 00:00:00 2001 From: "Craig P. Motlin" Date: Thu, 7 Jan 2016 23:23:43 -0500 Subject: [PATCH 0229/4996] Fix a typo in the documentation for configuration defaults. --- site/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 1b1b707c5dc..a12b2e265d3 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -397,7 +397,7 @@ webrick: ### Defaults -We only provide on default and that's a Content-Type header that disables +We only provide one default and that's a Content-Type header that disables caching in development so that you don't have to fight with Chrome's aggressive caching when you are in development mode. From 754bf14e230aa40fe0e42944a0f75faf2a61afd6 Mon Sep 17 00:00:00 2001 From: "Craig P. Motlin" Date: Fri, 8 Jan 2016 00:14:33 -0500 Subject: [PATCH 0230/4996] Fix grammar in the documentation for posts. --- site/_docs/posts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/posts.md b/site/_docs/posts.md index f16bd2021cc..47f60f3c320 100644 --- a/site/_docs/posts.md +++ b/site/_docs/posts.md @@ -84,7 +84,7 @@ One common solution is to create a folder in the root of the project directory called something like `assets` or `downloads`, into which any images, downloads or other resources are placed. Then, from within any post, they can be linked to using the site’s root as the path for the asset to include. Again, this will -depend on the way your site’s (sub)domain and path are configured, but here +depend on the way your site’s (sub)domain and path are configured, but here are some examples (in Markdown) of how you could do this using the `site.url` variable in a post. From a12ee551399eadd2b970f08629b39cb02f8381f8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 7 Jan 2016 22:26:41 -0800 Subject: [PATCH 0231/4996] Update history to reflect merge of #4330 [ci skip] --- History.markdown | 1917 +--------------------------------------------- 1 file changed, 1 insertion(+), 1916 deletions(-) diff --git a/History.markdown b/History.markdown index a1ad1b896bf..7db11b3ef9e 100644 --- a/History.markdown +++ b/History.markdown @@ -1,1916 +1 @@ -## HEAD - -### Minor Enhancements - - * Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` (#4277) - * Add 'sample' Liquid filter Equivalent to Array#sample functionality (#4223) - * Cache parsed include file to save liquid parsing time. (#4120) - * Slightly speed up url sanitization and handle multiples of ///. (#4168) - * Print debug message when a document is skipped from reading (#4180) - * Include tag should accept multiple variables in the include name (#4183) - * Add `-o` option to serve command which opens server URL (#4144) - * Add CodeClimate platform for better code quality. (#4220) - * General improvements for WEBrick via jekyll serve such as SSL & custom headers (#4224, #4228) - * Add a default charset to content-type on webrick. (#4231) - * Switch `PluginManager` to use `require_with_graceful_fail` for better UX (#4233) - * Allow quoted date in front matter defaults (#4184) - * Add a Jekyll doctor warning for URLs that only differ by case (#3171) - * drops: create one base Drop class which can be set as mutable or not (#4285) - * drops: provide `#to_h` to allow for hash introspection (#4281) - * Shim subcommands with indication of gem possibly required so users know how to use them (#4254) - -### Bug Fixes - - * Pass build options into `clean` command (#4177) - * Allow users to use .htm and .xhtml (XHTML5.) (#4160) - * Prevent Shell Injection. (#4200) - * Convertible should make layout data accessible via `layout` instead of `page` (#4205) - * Avoid using `Dir.glob` with absolute path to allow special characters in the path (#4150) - * Handle empty config files (#4052) - * Rename `@options` so that it does not impact Liquid. (#4173) - * utils/drops: update Drop to support `Utils.deep_merge_hashes` (#4289) - * Make sure jekyll/drops/drop is loaded first. (#4292) - * Convertible/Page/Renderer: use payload hash accessor & setter syntax for backwards-compatibility (#4311) - * Drop: fix hash setter precendence (#4312) - * utils: `has_yaml_header?` should accept files with extraneous spaces (#4290) - * Escape html from site.title and page.title in site template (#4307) - -### Development Fixes - - * `jekyll-docs` should be easily release-able (#4152) - * Allow use of Cucumber 2.1 or greater (#4181) - * Modernize Kramdown for Markdown converter. (#4109) - * Change TestDoctorCommand to JekyllUnitTest... (#4263) - * Create namespaced rake tasks in separate `.rake` files under `lib/tasks` (#4282) - * markdown: refactor for greater readability & efficiency (#3771) - * Fix many Rubocop style errors (#4301) - * Fix spelling of "GitHub" in docs and history (#4322) - * Reorganize and cleanup the Gemfile, shorten required depends. (#4318) - -### Site Enhancements - - * Add three plugins to directory (#4163) - * Add upgrading docs from 2.x to 3.x (#4157) - * Add `protect_email` to the plugins index. (#4169) - * Add `jekyll-deploy` to list of third-party plugins (#4179) - * Clarify plugin docs (#4154) - * Add Kickster to deployment methods in documentation (#4190) - * Add DavidBurela's tutorial for Windows to Windows docs page (#4210) - * Change GitHub code block to highlight tag to avoid it overlaps parent div (#4121) - * Update FormKeep link to be something more specific to Jekyll (#4243) - * Remove example Roger Chapman site, as the domain doesn't exist (#4249) - * Added configuration options for `draft_posts` to configuration docs (#4251) - * Fix checklist in `_assets.md` (#4259) - * Add Markdown examples to Pages docs (#4275) - * Add jekyll-paginate-category to list of third-party plugins (#4273) - * Add `jekyll-responsive_image` to list of third-party plugins (#4286) - * Add `jekyll-commonmark` to list of third-party plugins (#4299) - * Add documentation for incremental regeneration (#4293) - * Add note about removal of relative permalink support in upgrading docs (#4303) - * Add Pro Tip to use front matter variable to create clean URLs (#4296) - -## 3.0.1 / 2015-11-17 - -### Bug Fixes - - * Document: only superdirectories of the collection are categories (#4110) - * `Convertible#render_liquid` should use `render!` to cause failure on bad Liquid (#4077) - * Don't generate `.jekyll-metadata` in non-incremental build (#4079) - * Set `highlighter` config val to `kramdown.syntax_highlighter` (#4090) - * Align hooks implementation with documentation (#4104) - * Fix the deprecation warning in the doctor command (#4114) - * Fix case in `:title` and add `:slug` which is downcased (#4100) - -### Development Fixes - - * Fix test warnings when doing rake {test,spec} or script/test (#4078) - -### Site Enhancements - - * Update normalize.css to v3.0.3. (#4085) - * Update Font Awesome to v4.4.0. (#4086) - * Adds a note about installing the jekyll-gist gem to make gist tag work (#4101) - * Align hooks documentation with implementation (#4104) - * Add Jekyll Flickr Plugin to the list of third party plugins (#4111) - * Remove link to now-deleted blog post (#4125) - * Update the liquid syntax in the pagination docs (#4130) - * Add jekyll-language-plugin to plugins.md (#4134) - * Updated to reflect feedback in #4129 (#4137) - * Clarify assets.md based on feedback of #4129 (#4142) - * Re-correct the liquid syntax in the pagination docs (#4140) - -## 3.0.0 / 2015-10-26 - -### Major Enhancements - - * Liquid profiler (i.e. know how fast or slow your templates render) (#3762) - * Incremental regeneration (#3116) - * Add Hooks: a new kind of plugin (#3553) - * Upgrade to Liquid 3.0.0 (#3002) - * `site.posts` is now a Collection instead of an Array (#4055) - * 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) - * Move to Rouge as default highlighter (#3323) - * Mimic GitHub Pages `.html` extension stripping behavior in WEBrick (#3452) - * Always include file extension on output files (#3490) - * Improved permalinks for pages and collections (#3538) - * 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) - * Add a Code of Conduct for the Jekyll project (#3925) - * Added permalink time variables (#3990) - * Add `--incremental` flag to enable incremental regen (disabled by default) (#4059) - -### Minor Enhancements - - * Deprecate access to Document#data properties and Collection#docs methods (#4058) - * Sort static files just once, and call `site_payload` once for all collections (#3204) - * Separate `jekyll docs` and optimize external gem handling (#3241) - * Improve `Site#getConverterImpl` and call it `Site#find_converter_instance` (#3240) - * Use relative path for `path` Liquid variable in Documents for consistency (#2908) - * Generalize `Utils#slugify` for any scripts (#3047) - * Added basic microdata to post template in site template (#3189) - * Store log messages in an array of messages. (#3244) - * Allow collection documents to override `output` property in front matter (#3172) - * Keep file modification times between builds for static files (#3220) - * Only downcase mixed-case categories for the URL (#2571) - * Added per post `excerpt_separator` functionality (#3274) - * Allow collections YAML to end with three dots (#3134) - * Add mode parameter to `slugify` Liquid filter (#2918) - * Perf: `Markdown#matches` should avoid regexp (#3321) - * Perf: Use frozen regular expressions for `Utils#slugify` (#3321) - * Split off Textile support into jekyll-textile-converter (#3319) - * Improve the navigation menu alignment in the site template on small - screens (#3331) - * Show the regeneration time after the initial generation (#3378) - * Site template: Switch default font to Helvetica Neue (#3376) - * Make the `include` tag a teensy bit faster. (#3391) - * Add `pkill -f jekyll` to ways to kill. (#3397) - * Site template: collapsed, variable-driven font declaration (#3360) - * Site template: Don't always show the scrollbar in code blocks (#3419) - * Site template: Remove undefined `text` class from `p` element (#3440) - * Site template: Optimize text rendering for legibility (#3382) - * Add `draft?` method to identify if Post is a Draft & expose to Liquid (#3456) - * Write regeneration metadata even on full rebuild (#3464) - * Perf: Use `String#end_with?("/")` instead of regexp when checking paths (#3516) - * Docs: document 'ordinal' built-in permalink style (#3532) - * Upgrade liquid-c to 3.x (#3531) - * Use consistent syntax for deprecation warning (#3535) - * Added build --destination and --source flags (#3418) - * Site template: remove unused `page.meta` attribute (#3537) - * Improve the error message when sorting null objects (#3520) - * Added liquid-md5 plugin (#3598) - * Documentation: RR replaced with RSpec Mocks (#3600) - * Documentation: Fix subpath. (#3599) - * Create 'tmp' dir for test_tags if it doesn't exist (#3609) - * Extract reading of data from `Site` to reduce responsibilities. (#3545) - * Removed the word 'Jekyll' a few times from the comments (#3617) - * `bin/jekyll`: with no args, exit with exit code 1 (#3619) - * Incremental build if destination file missing (#3614) - * Static files `mtime` liquid should return a `Time` obj (#3596) - * Use `Jekyll::Post`s for both LSI indexing and lookup. (#3629) - * Add `charset=utf-8` for HTML and XML pages in WEBrick (#3649) - * Set log level to debug when verbose flag is set (#3665) - * Added a mention on the Gemfile to complete the instructions (#3671) - * Perf: Cache `Document#to_liquid` and invalidate where necessary (#3693) - * Perf: `Jekyll::Cleaner#existing_files`: Call `keep_file_regex` and - `keep_dirs` only once, not once per iteration (#3696) - * Omit jekyll/jekyll-help from list of resources. (#3698) - * Add basic `jekyll doctor` test to detect fsnotify (OSX) anomalies. (#3704) - * Added talk.jekyllrb.com to "Have questions?" (#3694) - * 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) - * Make the directory for includes configurable (#3782) - * Rename directory configurations to match `*_dir` convention for consistency (#3782) - * Internal: trigger hooks by owner symbol (#3871) - * Update MIME types from mime-db (#3933) - * Add header to site template `_config.yml` for clarity & direction (#3997) - * Site template: add timezone offset to post date frontmatter (#4001) - * Make a constant for the regex to find hidden files (#4032) - * Site template: refactor github & twitter icons into includes (#4049) - * Site template: add background to Kramdown Rouge-ified backtick code blocks (#4053) - -### Bug Fixes - - * `post_url`: fix access deprecation warning & fix deprecation msg (#4060) - * Perform jekyll-paginate deprecation warning correctly. (#3580) - * Make permalink parsing consistent with pages (#3014) - * `time()`pre-filter method should accept a `Date` object (#3299) - * Remove unneeded end tag for `link` in site template (#3236) - * Kramdown: Use `enable_coderay` key instead of `use_coderay` (#3237) - * Unescape `Document` output path (#2924) - * Fix nav items alignment when on multiple rows (#3264) - * Highlight: Only Strip Newlines/Carriage Returns, not Spaces (#3278) - * Find variables in front matter defaults by searching with relative file path. (#2774) - * Allow variables (e.g `:categories`) in YAML front matter permalinks (#3320) - * Handle nil URL placeholders in permalinks (#3325) - * Template: Fix nav items alignment when in "burger" mode (#3329) - * Template: Remove `!important` from nav SCSS introduced in #3329 (#3375) - * The `:title` URL placeholder for collections should be the filename slug. (#3383) - * Trim the generate time diff to just 3 places past the decimal place (#3415) - * The highlight tag should only clip the newlines before and after the *entire* block, not in between (#3401) - * highlight: fix problem with linenos and rouge. (#3436) - * `Site#read_data_file`: read CSV's with proper file encoding (#3455) - * Ignore `.jekyll-metadata` in site template (#3496) - * Template: Point documentation link to the documentation pages (#3502) - * Removed the trailing slash from the example `/blog` baseurl comment (#3485) - * Clear the regenerator cache every time we process (#3592) - * Readd (bring back) minitest-profile (#3628) - * Add WOFF2 font MIME type to Jekyll server MIME types (#3647) - * Be smarter about extracting the extname in `StaticFile` (#3632) - * Process metadata for all dependencies (#3608) - * Show error message if the YAML front matter on a page/post is invalid. (#3643) - * Upgrade redcarpet to 3.2 (Security fix: OSVDB-120415) (#3652) - * Create #mock_expects that goes directly to RSpec Mocks. (#3658) - * Open `.jekyll-metadata` in binary mode to read binary Marshal data (#3713) - * 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) - * Set `future` to `false` in the default config (#3892) - * filters: `where` should compare stringified versions of input & comparator (#3935) - * Read build options for `jekyll clean` command (#3828) - * Fix #3970: Use Gem::Version to compare versions, not `>`. - * Abort if no subcommand. Fixes confusing message. (#3992) - * Whole-post excerpts should match the post content (#4004) - * Change default font weight to 400 to fix bold/strong text issues (#4050) - * Document: Only auto-generate the excerpt if it's not overridden (#4062) - * Utils: `deep_merge_hashes` should also merge `default_proc` (45f69bb) - * Defaults: compare paths in `applies_path?` as `String`s to avoid confusion (7b81f00) - -### Development Fixes - - * Remove loader.rb and "modernize" `script/test`. (#3574) - * Improve the grammar in the documentation (#3233) - * Update the LICENSE text to match the MIT license exactly (#3253) - * Update rake task `site:publish` to fix minor bugs. (#3254) - * Switch to shields.io for the README badges. (#3255) - * Use `FileList` instead of `Dir.glob` in `site:publish` rake task (#3261) - * Fix test script to be platform-independent (#3279) - * Instead of symlinking `/tmp`, create and symlink a local `tmp` in the tests (#3258) - * Fix some spacing (#3312) - * Fix comment typo in `lib/jekyll/frontmatter_defaults.rb` (#3322) - * Move all `regenerate?` checking to `Regenerator` (#3326) - * Factor out a `read_data_file` call to keep things clean (#3380) - * Proof the site with CircleCI. (#3427) - * Update LICENSE to 2015. (#3477) - * Upgrade tests to use Minitest (#3492) - * Remove trailing whitespace (#3497) - * Use `fixture_site` for Document tests (#3511) - * Remove adapters deprecation warning (#3529) - * Minor fixes to `url.rb` to follow GitHub style guide (#3544) - * Minor changes to resolve deprecation warnings (#3547) - * Convert remaining textile test documents to markdown (#3528) - * Migrate the tests to use rspec-mocks (#3552) - * Remove `activesupport` (#3612) - * Added tests for `Jekyll:StaticFile` (#3633) - * 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) - * Add script to vendor mime types (#3933) - * Ignore .bundle dir in SimpleCov (#4033) - -### Site Enhancements - - * Add 'info' labels to certain notes in collections docs (#3601) - * Remove extra spaces, make the last sentence less awkward in permalink docs (#3603) - * Update the permalinks documentation to reflect the updates for 3.0 (#3556) - * Add blog post announcing Jekyll Help (#3523) - * Add Jekyll Talk to Help page on site (#3518) - * Change Ajax pagination resource link to use HTTPS (#3570) - * Fixing the default host on docs (#3229) - * Add `jekyll-thumbnail-filter` to list of third-party plugins (#2790) - * Add link to 'Adding Ajax pagination to Jekyll' to Resources page (#3186) - * Add a Resources link to tutorial on building dynamic navbars (#3185) - * Semantic structure improvements to the post and page layouts (#3251) - * Add new AsciiDoc plugin to list of third-party plugins. (#3277) - * Specify that all transformable collection documents must contain YAML front matter (#3271) - * Assorted accessibility fixes (#3256) - * Update configuration docs to mention `keep_files` for `destination` (#3288, #3296) - * Break when we successfully generate nav link to save CPU cycles. (#3291) - * Update usage docs to mention `keep_files` and a warning about `destination` cleaning (#3295) - * Add logic to automatically generate the `next_section` and `prev_section` navigation items (#3292) - * Some small fixes for the Plugins TOC. (#3306) - * Added versioning comment to configuration file (#3314) - * Add `jekyll-minifier` to list of third-party plugins (#3333) - * Add blog post about the Jekyll meet-up (#3332) - * Use `highlight` Liquid tag instead of the four-space tabs for code (#3336) - * 3.0.0.beta1 release post (#3346) - * Add `twa` to the list of third-party plugins (#3384) - * Remove extra spaces (#3388) - * Fix small grammar errors on a couple pages (#3396) - * Fix typo on Templates docs page (#3420) - * s/three/four for plugin type list (#3424) - * Release jekyllrb.com as a locally-compiled site. (#3426) - * Add a jekyllrb.com/help page which elucidates places from which to get help (#3428) - * Remove extraneous dash on Plugins doc page which caused a formatting error (#3431) - * Fix broken link to Jordan Thornquest's website. (#3438) - * Change the link to an extension (#3457) - * Fix Twitter link on the help page (#3466) - * Fix wording in code snippet highlighting section (#3475) - * Add a `/` to `paginate_path` in the Pagination documentation (#3479) - * Add a link on all the docs pages to "Improve this page". (#3510) - * Add jekyll-auto-image generator to the list of third-party plugins (#3489) - * Replace link to the proposed `picture` element spec (#3530) - * Add frontmatter date formatting information (#3469) - * Improve consistency and clarity of plugins options note (#3546) - * Add permalink warning to pagination docs (#3551) - * Fix grammar in Collections docs API stability warning (#3560) - * Restructure `excerpt_separator` documentation for clarity (#3550) - * Fix accidental line break in collections docs (#3585) - * Add information about the `.jekyll-metadata` file (#3597) - * Document addition of variable parameters to an include (#3581) - * Add `jekyll-files` to the list of third-party plugins. (#3586) - * Define the `install` step in the CI example `.travis.yml` (#3622) - * Expand collections documentation. (#3638) - * Add the "warning" note label to excluding `vendor` in the CI docs page (#3623) - * Upgrade pieces of the Ugrading guide for Jekyll 3 (#3607) - * Showing how to access specific data items (#3468) - * Clarify pagination works from within HTML files (#3467) - * Add note to `excerpt_separator` documentation that it can be set globally (#3667) - * Fix some names on Troubleshooting page (#3683) - * Add `remote_file_content` tag plugin to list of third-party plugins (#3691) - * Update the Redcarpet version on the Configuration page. (#3743) - * Update the link in the welcome post to point to Jekyll Talk (#3745) - * 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) - * Add `jekyll-youtube` to the list of third-party plugins (#3931) - * Add Views Router plugin (#3950) - * Update install docs (Core dependencies, Windows reqs, etc) (#3769) - * Use Jekyll Feed for jekyllrb.com (#3736) - * Add jekyll-umlauts to plugins.md ($3966) - * Troubleshooting: fix broken link, add other mac-specific info (#3968) - * Add a new site for learning purposes (#3917) - * Added documentation for Jekyll environment variables (#3989) - * Fix broken configuration documentation page (#3994) - * Add troubleshooting docs for installing on El Capitan (#3999) - * Add Lazy Tweet Embedding to the list of third-party plugins (#4015) - * Add installation instructions for 2 of 3 options for plugins (#4013) - * Add alternative jekyll gem installation instructions (#4018) - * Fix a few typos and formatting problems. (#4022) - * Fix pretty permalink example (#4029) - * Note that `_config.yml` is not reloaded during regeneration (#4034) - * Apply code block figure syntax to blocks in CONTRIBUTING (#4046) - * Add jekyll-smartify to the list of third-party plugins (#3572) - -## 2.5.3 / 2014-12-22 - -### Bug Fixes - - * When checking a Markdown extname, include position of the `.` (#3147) - * Fix `jsonify` Liquid filter handling of boolean values (#3154) - * Add comma to value of `viewport` meta tag (#3170) - * Set the link type for the RSS feed to `application/rss+xml` (#3176) - * Refactor `#as_liquid` (#3158) - -### Development Fixes - - * Exclude built-in bundles from being added to coverage report (#3180) - -### Site Enhancements - - * Add `@alfredxing` to the `@jekyll/core` team. :tada: (#3218) - * Document the `-q` option for the `build` and `serve` commands (#3149) - * Fix some minor typos/flow fixes in documentation website content (#3165) - * Add `keep_files` to configuration documentation (#3162) - * Repeat warning about cleaning of the `destination` directory (#3161) - * Add jekyll-500px-embed to list of third-party plugins (#3163) - * Simplified platform detection in Gemfile example for Windows (#3177) - * Add the `jekyll-jalali` plugin added to the list of third-party plugins. (#3198) - * Add Table of Contents to Troubleshooting page (#3196) - * Add `inline_highlight` plugin to list of third-party plugins (#3212) - * Add `jekyll-mermaid` plugin to list of third-party plugins (#3222) - -## 2.5.2 / 2014-11-17 - -### Minor Enhancements - - * `post_url` should match `post.name` instead of slugs and dates (#3058) - -### Bug Fixes - - * Fix bundle require for `:jekyll_plugins` (#3119) - * Remove duplicate regexp phrase: `^\A` (#3089) - * Remove duplicate `Conversion error:` message in `Convertible` (#3088) - * Print full conversion error message in `Renderer#convert` (#3090) - -### Site Enhancements - - * Change variable names in Google Analytics script (#3093) - * Mention CSV files in the docs for data files (#3101) - * Add trailing slash to `paginate_path` example. (#3091) - * Get rid of noifniof (`excerpt_separator`) (#3094) - * Sass improvements, around nesting mostly. (#3123) - * Add webmentions.io plugin to the list of third-party plugins (#3127) - * Add Sass mixins and use them. (#2904) - * Slightly compress jekyll-sticker.jpg. (#3133) - * Update gridism and separate out related but custom styles. (#3132) - * Add remote-include plugin to list of third-party plugins (#3136) - -## 2.5.1 / 2014-11-09 - -### Bug Fixes - - * Fix path sanitation bug related to Windows drive names (#3077) - -### Development Fixes - - * Add development time dependencies on minitest and test-unit to gemspec for cygwin (#3064) - * Use Travis's built-in caching. (#3075) - -## 2.5.0 / 2014-11-06 - -### Minor Enhancements - - * Require gems in `:jekyll_plugins` Gemfile group unless `JEKYLL_NO_BUNDLER_REQUIRE` is specified in the environment. (#2865) - * Centralize path sanitation in the `Site` object (#2882) - * Allow placeholders in permalinks (#3031) - * Allow users to specify the log level via `JEKYLL_LOG_LEVEL`. (#3067) - * Fancy Indexing with WEBrick (#3018) - * Allow Enumerables to be used with `where` filter. (#2986) - * Meta descriptions in the site template now use `page.excerpt` if it's available (#2964) - * Change indentation in `head.html` of site template to 2 spaces from 4 (#2973) - * Use a `$content-width` variable instead of a fixed value in the site template CSS (#2972) - * Strip newlines in site template `` description. (#2982) - * Add link to atom feed in `head` of site template files (#2996) - * Performance optimizations (#2994) - * Use `Hash#each_key` instead of `Hash#keys.each` to speed up iteration - over hash keys. (#3017) - * Further minor performance enhancements. (#3022) - * Add 'b' and 's' aliases for build and serve, respectively (#3065) - -### Bug Fixes - - * Fix Rouge's RedCarpet plugin interface integration (#2951) - * Remove `--watch` from the site template blog post since it defaults - to watching in in 2.4.0 (#2922) - * Fix code for media query mixin in site template (#2946) - * Allow post URL's to have `.htm` extensions (#2925) - * `Utils.slugify`: Don't create new objects when gsubbing (#2997) - * The jsonify filter should deep-convert to Liquid when given an Array. (#3032) - * Apply `jsonify` filter to Hashes deeply and effectively (#3063) - * Use `127.0.0.1` as default host instead of `0.0.0.0` (#3053) - * In the case that a Gemfile does not exist, ensure Jekyll doesn't fail on requiring the Gemfile group (#3066) - -### Development Fixes - - * Fix a typo in the doc block for `Jekyll::URL.escape_path` (#3052) - * Add integration test for `jekyll new --blank` in TestUnit (#2913) - * Add unit test for `jekyll new --force` logic (#2929) - * Update outdated comment for `Convertible#transform` (#2957) - * Add Hakiri badge to README. (#2953) - * Add some simple benchmarking tools. (#2993) - -### Site Enhancements - - * `NOKOGIRI_USE_SYSTEM_LIBRARIES=true` **decreases** installation time. (#3040) - * Add FormKeep to resources as Jekyll form backend (#3010) - * Fixing a mistake in the name of the new Liquid tag (#2969) - * Update Font Awesome to v4.2.0. (#2898) - * Fix link to #2895 in 2.4.0 release post. (#2899) - * Add Big Footnotes for Kramdown plugin to list of third-party plugins (#2916) - * Remove warning regarding GHP use of singular types for front matter defaults (#2919) - * Fix quote character typo in site documentation for templates (#2917) - * Point Liquid links to Liquid’s GitHub wiki (#2887) - * Add HTTP Basic Auth (.htaccess) plugin to list of third-party plugins (#2931) - * (Minor) Grammar & `_config.yml` filename fixes (#2911) - * Added `mathml.rb` to the list of third-party plugins. (#2937) - * Add `--force_polling` to the list of configuration options (#2943) - * Escape unicode characters in site CSS (#2906) - * Add note about using the github-pages gem via pages.github.com/versions.json (#2939) - * Update usage documentation to reflect 2.4 auto-enabling of `--watch`. (#2954) - * Add `--skip-initial-build` to configuration docs (#2949) - * Fix a minor typo in Templates docs page (#2959) - * Add a ditaa-ditaa plugin under Other section on the Plugins page (#2967) - * Add `build/serve -V` option to configuration documentation (#2948) - * Add 'Jekyll Twitter Plugin' to list of third-party plugins (#2979) - * Docs: Update normalize.css to v3.0.2. (#2981) - * Fix typo in Continuous Integration documentation (#2984) - * Clarify behavior of `:categories` in permalinks (#3011) - -## 2.4.0 / 2014-09-09 - -### Minor Enhancements - - * Support a new `relative_include` tag (#2870) - * Auto-enable watch on 'serve' (#2858) - * Render Liquid in CoffeeScript files (#2830) - * Array Liquid filters: `push`, `pop`, `unshift`, `shift` (#2895) - * Add `:title` to collection URL template fillers (#2864) - * Add support for CSV files in the `_data` directory (#2761) - * Add the `name` variable to collection permalinks (#2799) - * Add `inspect` liquid filter. (#2867) - * Add a `slugify` Liquid filter (#2880) - -### Bug Fixes - - * Use `Jekyll.sanitized_path` when adding static files to Collections (#2849) - * Fix encoding of `main.scss` in site template (#2771) - * Fix orientation bugs in default site template (#2862) - -### Development Fixes - - * Update simplecov gem to 0.9 (#2748) - * Remove `docs/` dir (#2768) - * add class `<< self` idiom to `New` command (#2817) - * Allow Travis to 'parallelize' our tests (#2859) - * Fix test for Liquid rendering in Sass (#2856) - * Fixing "vertycal" typo in site template's `_base.scss` (#2889) - -### Site Enhancements - - * Document the `name` variable for collection permalinks (#2829) - * Adds info about installing jekyll in current dir (#2839) - * Remove deprecated `jekyll-projectlist` plugin from list of third-party - plugins (#2742) - * Remove tag plugins that are built in to Jekyll (#2751) - * Add `markdown-writer` package for Atom Editor to list of third-party - plugins (#2763) - * Fix typo in site documentation for collections (#2764) - * Fix minor typo on plugins docs page (#2765) - * Replace markdown with HTML in `sass_dir` note on assets page (#2791) - * Fixed "bellow" typo in datafiles docs (#2879) - * Fix code/markdown issue in documentation for variables (#2877) - * Remove Good Include third-party plugin from plugins page (#2881) - * Add some more docs on `include_relative` (#2884) - -## 2.3.0 / 2014-08-10 - -### Minor Enhancements - - * Allow Convertibles to be converted by >= 1 converters (#2704) - * Allow Sass files to be rendered in Liquid, but never place them in layouts. (#2733) - * Add `jekyll help` command (#2707) - * Use `.scss` for `site_template` styles. (#2667) - * Don't require the `scope` key in front matter defaults (#2659) - * No longer set `permalink: pretty` in the `_config.yml` for the site template (#2680) - * Rework site template to utilize Sass (#2687) - * Notify the user when auto-regeneration is disabled. (#2696) - * Allow partial variables in include tag filename argument (#2693) - * Move instances of `Time.parse` into a Utils method (#2682) - * Ignore subfolders in the `_posts` folder (#2705) REVERTS (#2633) - * Front Matter default types should always be pluralized (#2732) - * Read in static files into `collection.files` as `StaticFile`s (#2737) - * Add `sassify` and `scssify` Liquid filters (#2739) - * Replace `classifier` gem with `classifier-reborn` (#2721) - -### Bug Fixes - - * Use only the last extname when multiple converters exist (#2722) - * Call `#to_liquid` before calling `#to_json` in jsonify filter (#2729) - * Use non padded config in `strftime` to avoid parse string twice (#2673) - * Replace deprecated Ruby methods with undeprecated ones (#2664) - * Catch errors when parsing Post `date` front matter value & produce nice error message (#2649) - * Allow static files in Collections (#2615) - * Fixed typo in `Deprecator#gracefully_require` error message (#2694) - * Remove preemptive loading of the 'classifier' gem. (#2697) - * Use case-insensitive checking for the file extensions when loading config files (#2718) - * When Reading Documents, Respect `encoding` Option (#2720) - * Refactor based on jekyll-watch clean-up. (#2716) - * `Document#to_s` should produce just the content of the document (#2731) - -### Development Fixes - - * Only include lib files in the gem (#2671) - * Fix `git diff` command in `proof` script (#2672) - * Make default rake task a multitask so tests run in parallel (#2735) - -### Site Enhancements - - * Use Sass and a Docs Collection (#2651) - * Add `latest_version.txt` file to the site (#2740) - * Be more ambiguous about `page.content`. But more transparent. (#2522) - * Streamlining front matter wording (instead of front-matter/frontmatter) (#2674) - * Add note that source directory cannot be modified in GitHub Pages (#2669) - * Fix links from #2669 to be actual HTML. Whoops. (#2679) - * Add link to `jekyll-slim` in list of third-party plugins (#2689) - * Add Barry Clark's Smashing Magazine tutorial to resources page (#2688) - * Reorganize and update default configuration settings (#2456) - * Fixing indentation in the configuration docs about Redcarpet exts (#2717) - * Use `null` in YAML instead of `nil` in default config list (#2719) - * Fix typo in Continuous Integration docs (#2708) - -## 2.2.0 / 2014-07-29 - -### Minor Enhancements - - * Throw a warning if the specified layout does not exist (#2620) - * Whitelist Pygments options in safe mode (#2642) - -### Bug Fixes - - * Remove unnecessary `Jekyll::Tags::IncludeTag#blank?` method (#2625) - * Categories in the path are ignored (#2633) - -### Development Fixes - - * Refactoring Errors & Requires of Third-Party stuff (#2591) - * Add further tests for categories (#2584) - * Proof site with html-proofer on change (#2605) - * Fix up bug in #2605 which caused proofing the site not to function (#2608) - * Use `bundle exec` in `script/proof` (#2610) - -### Site Enhancements - - * Update Kramdown urls (#2588) - * Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of - third-party plugins (#2596) - * Fix a bunch of broken links in the site (#2601) - * Replace dead links with working links (#2611) - * Add jekyll-hook to deployment methods (#2617) - * Added kramdown-with-pygments plugin to the list of third-party plugins (#2623) - * Update outdated "Extras" page and remove duplicate documentation (#2622) - * Add co2 plugin to list of third-party plugins (#2639) - * Attempt to clarify the way Sass imports happen (#2642) - -## 2.1.1 / 2014-07-01 - -### Bug Fixes - - * Patch read vulnerabilities for data & confirm none for layouts (#2563) - * Update Maruku dependency to allow use of the latest version (#2576) - * Remove conditional assignment from document URL to prevent stale urls (#2575) - -### Site Enhancements - - * Add vertical margin to `highlight` to separate code blocks (#2558) - * Add `html_pages` to Variables docs (#2567) - * Fixed broken link to Permalinks page (#2572) - * Update link to Windows installation guide (#2578) - -## 2.1.0 / 2014-06-28 - -### Minor Enhancements - - * Bump to the latest Liquid version, 2.6.1 (#2495) - * Add support for JSON files in the `_data` directory (#2369) - * Allow subclasses to override `EXCERPT_ATTRIBUTES_FOR_LIQUID` (#2408) - * Add `Jekyll.env` and `jekyll.environment` (the Liquid var) (#2417) - * Use `_config.yaml` or `_config.yml` (`.yml` takes precedence) (#2406) - * Override collection url template (#2418) - * Allow subdirectories in `_data` (#2395) - * Extract Pagination Generator into gem: `jekyll-paginate` (#2455) - * Utilize `date_to_rfc822` filter in site template (#2437) - * Add categories, last build datetime, and generator to site template - feed (#2438) - * Configurable, replaceable Logger-compliant logger (#2444) - * Extract `gist` tag into a separate gem (#2469) - * Add `collection` attribute to `Document#to_liquid` to access the - document's collection label. (#2436) - * Upgrade listen to `2.7.6 <= x < 3.0.0` (#2492) - * Allow configuration of different Twitter and GitHub usernames in site template (#2485) - * Bump Pygments to v0.6.0 (#2504) - * Front matter defaults for documents in collections (#2419) - * Include files with a url which ends in `/` in the `site.html_pages` list (#2524) - * Make `highlight` tag use `language-` prefix in CSS class (#2511) - * Lookup item property via `item#to_liquid` before `#data` or `#[]` in filters (#2493) - * Skip initial build of site on serve with flag (#2477) - * Add support for `hl_lines` in `highlight` tag (#2532) - * Spike out `--watch` flag into a separate gem (#2550) - -### Bug Fixes - - * Liquid `sort` filter should sort even if one of the values is `nil` (#2345) - * Remove padding on `pre code` in the site template CSS (#2383) - * Set `log_level` earlier to silence info level configuration output (#2393) - * Only list pages which have `title` in site template (#2411) - * Accept `Numeric` values for dates, not `Number` values (#2377) - * Prevent code from overflowing container in site template (#2429) - * Encode URLs in UTF-8 when escaping and unescaping (#2420) - * No Layouts or Liquid for Asset Files (#2431) - * Allow front matter defaults to set post categories (#2373) - * Fix command in subcommand deprecation warning (#2457) - * Keep all parent directories of files/dirs in `keep_files` (#2458) - * When using RedCarpet and Rouge without Rouge installed, fixed erroneous - error which stated that redcarpet was missing, not rouge. (#2464) - * Ignore *all* directories and files that merit it on auto-generation (#2459) - * Before copying file, explicitly remove the old one (#2535) - * Merge file system categories with categories from YAML. (#2531) - * Deep merge front matter defaults (#2490) - * Ensure exclude and include arrays are arrays of strings (#2542) - * Allow collections to have dots in their filenames (#2552) - * Collections shouldn't try to read in directories as files (#2552) - * Be quiet very quickly. (#2520) - -### Development Fixes - - * Test Ruby 2.1.2 instead of 2.1.1 (#2374) - * Add test for sorting UTF-8 characters (#2384) - * Use `https` for GitHub links in documentation (#2470) - * Remove coverage reporting with Coveralls (#2494) - * Fix a bit of missing TomDoc to `Jekyll::Commands::Build#build` (#2554) - -### Site Enhancements - - * Set `timezone` to `America/Los_Angeles` (#2394) - * Improve JavaScript in `anchor_links.html` (#2368) - * Remove note on Quickstart page about default markdown converter (#2387) - * Remove broken link in extras.md to a Maruku fork (#2401) - * Update Font Awesome to v4.1.0. (#2410) - * Fix broken link on Installation page to Templates page (#2421) - * Prevent table from extending parent width in permalink style table (#2424) - * Add collections to info about pagination support (#2389) - * Add `jekyll_github_sample` plugin to list of third-party plugins (#2463) - * Clarify documentation around front matter defaults and add details - about defaults for collections. (#2439) - * Add Jekyll Project Version Tag to list of third-party plugins (#2468) - * Use `https` for GitHub links across whole site (#2470) - * Add StickerMule + Jekyll post (#2476) - * Add Jekyll Asset Pipeline Reborn to list of third-party plugins (#2479) - * Add link to jekyll-compress-html to list of third-party plugins (#2514) - * Add Piwigo Gallery to list of third-party plugins (#2526) - * Set `show_drafts` to `false` in default configuration listing (#2536) - * Provide an updated link for Windows installation instructions (#2544) - * Remove `url` from configuration docs (#2547) - * Documentation for Continuous Integration for your Jekyll Site (#2432) - -## 2.0.3 / 2014-05-08 - -### Bug Fixes - - * Properly prefix links in site template with URL or baseurl depending upon - need. (#2319) - * Update gist tag comments and error message to require username (#2326) - * Fix `permalink` setting in site template (#2331) - * Don't fail if any of the path objects are nil (#2325) - * Instantiate all descendants for converters and generators, not just - direct subclasses (#2334) - * Replace all instances of `site.name` with `site.title` in site template (#2324) - * `Jekyll::Filters#time` now accepts UNIX timestamps in string or number form (#2339) - * Use `item_property` for `where` filter so it doesn't break on collections (#2359) - * Rescue errors thrown so `--watch` doesn't fail (#2364) - -### Site Enhancements - - * Add missing "as" to assets docs page (#2337) - * Update docs to reflect new `baseurl` default (#2341) - * Add links to headers who have an ID. (#2342) - * Use symbol instead of HTML number in `upgrading.md` (#2351) - * Fix link to front matter defaults docs (#2353) - * Fix for `History.markdown` in order to fix history page in docs (#2363) - -## 2.0.2 / 2014-05-07 - -### Bug Fixes - - * Correct use of `url` and `baseurl` in the site template. (#2317) - * Default `baseurl` to `""` (#2317) - -### Site Enhancements - - * Correct docs for the `gist` plugin so it always includes the username. (#2314) - * Clarify new (defaults, `where` filter) features in docs (#2316) - -## 2.0.1 / 2014-05-06 - -### Bug Fixes - - * Require `kramdown` gem instead of `maruku` gem - -## 2.0.0 / 2014-05-06 - -### Major Enhancements - * Add "Collections" feature (#2199) - * Add gem-based plugin whitelist to safe mode (#1657) - * Replace the commander command line parser with a more robust - solution for our needs called `mercenary` (#1706) - * Remove support for Ruby 1.8.x (#1780) - * Move to jekyll/jekyll from mojombo/jekyll (#1817) - * Allow custom markdown processors (#1872) - * Provide support for the Rouge syntax highlighter (#1859) - * Provide support for Sass (#1932) - * Provide a 300% improvement when generating sites that use - `Post#next` or `Post#previous` (#1983) - * Provide support for CoffeeScript (#1991) - * Replace Maruku with Kramdown as Default Markdown Processor (#1988) - * Expose `site.static_files` to Liquid (#2075) - * Complete redesign of the template site generated by `jekyll new` (#2050) - * Update Listen from 1.x to 2.x (#2097) - * Front matter defaults (#2205) - * Deprecate `relative_permalinks` configuration option (default to `false`) (#2307) - * Exclude files based on prefix as well as `fnmatch?` (#2303) - -### Minor Enhancements - * Move the EntryFilter class into the Jekyll module to avoid polluting the - global namespace (#1800) - * Add `group_by` Liquid filter create lists of items grouped by a common - property's value (#1788) - * Add support for Maruku's `fenced_code_blocks` option (#1799) - * Update Redcarpet dependency to ~> 3.0 (#1815) - * Automatically sort all pages by name (#1848) - * Better error message when time is not parseable (#1847) - * Allow `include` tag variable arguments to use filters (#1841) - * `post_url` tag should raise `ArgumentError` for invalid name (#1825) - * Bump dependency `mercenary` to `~> 0.2.0` (#1879) - * Bump dependency `safe_yaml` to `~> 1.0` (#1886) - * Allow sorting of content by custom properties (#1849) - * Add `--quiet` flag to silence output during build and serve (#1898) - * Add a `where` filter to filter arrays based on a key/value pair - (#1875) - * Route 404 errors to a custom 404 page in development (#1899) - * Excludes are now relative to the site source (#1916) - * Bring MIME Types file for `jekyll serve` to complete parity with GH Pages - servers (#1993) - * Adding Breakpoint to make new site template more responsive (#2038) - * Default to using the UTF-8 encoding when reading files. (#2031) - * Update Redcarpet dependency to ~> 3.1 (#2044) - * Remove support for Ruby 1.9.2 (#2045) - * Add `.mkdown` as valid Markdown extension (#2048) - * Add `index.xml` to the list of WEBrick directory index files (#2041) - * Make the `layouts` config key relative to CWD or to source (#2058) - * Update Kramdown to `~> 1.3` (#1894) - * Remove unnecessary references to `self` (#2090) - * Update to Mercenary v0.3.x (#2085) - * Ship Sass support as a separate gem (#2098) - * Extract core extensions into a Utils module (#2112) - * Refactor CLI & Commands For Greater Happiness (#2143) - * Provide useful error when Pygments returns `nil` and error out (#2148) - * Add support for unpublished drafts (#2164) - * Add `force_polling` option to the `serve` command (#2165) - * Clean up the `` in the site template (#2186) - * Permit YAML blocks to end with three dots to better conform with the - YAML spec (#2110) - * Use `File.exist?` instead of deprecated `File.exists?` (#2214) - * Require newline after start of YAML Front Matter header (#2211) - * Add the ability for pages to be marked as `published: false` (#1492) - * Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy - looking up of variable values in a Liquid context. (#2253) - * Remove literal lang name from class (#2292) - * Return `utf-8` encoding in header for webrick error page response (#2289) - * Make template site easier to customize (#2268) - * Add two-digit year to permalink template option (#2301) - * Add `site.documents` to Liquid payload (list of all docs) (#2295) - * Take into account missing values in the Liquid sort filter (#2299) - -### Bug Fixes - * Don't allow nil entries when loading posts (#1796) - * Remove the scrollbar that's always displayed in new sites generated - from the site template (#1805) - * Add `#path` to required methods in `Jekyll::Convertible` (#1866) - * Default Maruku fenced code blocks to ON for 2.0.0-dev (#1831) - * Change short opts for host and port for `jekyll docs` to be consistent with - other subcommands (#1877) - * Fix typos (#1910) - * Lock Maruku at 0.7.0 to prevent bugs caused by Maruku 0.7.1 (#1958) - * Fixes full path leak to source directory when using include tag (#1951) - * Don't generate pages that aren't being published (#1931) - * Use `SafeYAML.load` to avoid conflicts with other projects (#1982) - * Relative posts should never fail to build (#1976) - * Remove executable bits of non executable files (#2056) - * `#path` for a draft is now `_drafts` instead of `_posts` (#2042) - * Patch a couple show-stopping security vulnerabilities (#1946) - * Sanitize paths uniformly, in a Windows-friendly way (#2065, #2109) - * Update gem build steps to work correctly on Windows (#2118) - * Remove obsolete `normalize_options` method call from `bin/jekyll` (#2121). - * Remove `+` characters from Pygments lexer names when adding as a CSS - class (#994) - * Remove some code that caused Ruby interpreter warnings (#2178) - * Only strip the drive name if it begins the string (#2175) - * Remove default post with invalid date from site template (#2200) - * Fix `Post#url` and `Page#url` escape (#1568) - * Strip newlines from the `{% highlight %}` block content (#1823) - * Load in `rouge` only when it's been requested as the highlighter (#2189) - * Convert input to string before XML escaping (`xml_escape` liquid filter) (#2244) - * Modify configuration key for Collections and reset properly. (#2238) - * Avoid duplicated output using `highlight` tag (#2264) - * Only use Jekyll.logger for output (#2307) - * Close the file descriptor in `has_yaml_header?` (#2310) - * Add `output` to `Document` liquid output hash (#2309) - -### Development Fixes - * Add a link to the site in the README.md file (#1795) - * Add in History and site changes from `v1-stable` branch (#1836) - * Testing additions on the Excerpt class (#1893) - * Fix the `highlight` tag feature (#1859) - * Test Jekyll under Ruby 2.1.0 (#1900) - * Add script/cibuild for fun and profit (#1912) - * Use `Forwardable` for delegation between `Excerpt` and `Post` - (#1927) - * Rename `read_things` to `read_content` (#1928) - * Add `script/branding` script for ASCII art lovin' (#1936) - * Update the README to reflect the repo move (#1943) - * Add the project vision to the README (#1935) - * Speed up Travis CI builds by using Rebund (#1985) - * Use Yarp as a Gem proxy for Travis CI (#1984) - * Remove Yarp as a Gem proxy for Travis CI (#2004) - * Move the reading of layouts into its own class (#2020) - * Test Sass import (#2009) - * Switch Maruku and Kramdown in lists of Runtime vs. Development dependencies (#2049) - * Clean up the gemspec for the project (#2095) - * Add Japanese translation of README and CONTRIBUTING docs. (#2081) - * Re-align the tables in Cucumber (#2108) - * Trim trailing spaces and convert tabs to spaces (#2122) - * Fix the failing Travis scenarios due to Cucumber issues (#2155) - * Wrap `bundle install` in `travis_retry` to retry when RubyGems fails (#2160) - * Refactor tags and categories (#1639) - * Extract plugin management into its own class (#2197) - * Add missing tests for `Command` (#2216) - * Update `rr` link in CONTRIBUTING doc (#2247) - * Streamline Cucumber execution of `jekyll` subcommands (#2258) - * Refactor `Commands::Serve`. (#2269) - * Refactor `highlight` tag (#2154) - * Update `Util` hash functions with latest from Rails (#2273) - * Workaround for Travis bug (#2290) - -### Site Enhancements - * Document Kramdown's GFM parser option (#1791) - * Move CSS to includes & update normalize.css to v2.1.3 (#1787) - * Minify CSS only in production (#1803) - * Fix broken link to installation of Ruby on Mountain Lion blog post on - Troubleshooting docs page (#1797) - * Fix issues with 1.4.1 release blog post (#1804) - * Add note about deploying to OpenShift (#1812) - * Collect all Windows-related docs onto one page (#1818) - * Fixed typo in datafiles doc page (#1854) - * Clarify how to access `site` in docs (#1864) - * Add closing `` tag to `context.registers[:site]` note (#1867) - * Fix link to @mojombo's site source (#1897) - * Add `paginate: nil` to default configuration in docs (#1896) - * Add link to our License in the site footer (#1889) - * Add a charset note in "Writing Posts" doc page (#1902) - * Disallow selection of path and prompt in bash examples - * Add jekyll-compass to the plugin list (#1923) - * Add note in Posts docs about stripping `

` tags from excerpt (#1933) - * Add additional info about the new exclude behavior (#1938) - * Linkify 'awesome contributors' to point to the contributors graph on - GitHub (#1940) - * Update `docs/sites.md` link to GitHub Training materials (#1949) - * Update `master` with the release info from 1.4.3 (#1947) - * Define docs nav in datafile (#1953) - * Clarify the docs around the naming convention for posts (#1971) - * Add missing `next` and `previous` docs for post layouts and templates (#1970) - * Add note to `Writing posts` page about how to strip html from excerpt (#1962) - * Add `jekyll-humanize` plugin to plugin list (#1998) - * Add `jekyll-font-awesome` plugin to plugin list (#1999) - * Add `sublime-jekyll` to list of Editor plugins (#2001) - * Add `vim-jekyll` to the list of Editor plugins (#2005) - * Fix non-semantic nesting of `p` tags in `news_item` layout (#2013) - * Document destination folder cleaning (#2016) - * Updated instructions for NearlyFreeSpeech.NET installation (#2015) - * Update link to rack-jekyll on "Deployment Methods" page (#2047) - * Fix typo in /docs/configuration (#2073) - * Fix count in docs for `site.static_files` (#2077) - * Update configuration docs to indicate utf-8 is the default for 2.0.0 - and ASCII for 1.9.3 (#2074) - * Add info about unreleased feature to the site (#2061) - * Add whitespace to liquid example in GitHub Pages docs (#2084) - * Clarify the way Sass and CoffeeScript files are read in and output (#2067) - * Add lyche gallery tag plugin link to list of plugins (#2094) - * Add Jekyll Pages Directory plugin to list of plugins (#2096) - * Update Configuration docs page with new markdown extension (#2102) - * Add `jekyll-image-set` to the list of third-party plugins (#2105) - * Losslessly compress images (#2128) - * Update normalize.css to 3.0.0 (#2126) - * Update modernizr to v2.7.1 (#2129) - * Add `jekyll-ordinal` to list of third-party plugins (#2150) - * Add `jekyll_figure` to list of third-party plugins (#2158) - * Clarify the documentation for safe mode (#2163) - * Some HTML tidying (#2130) - * Remove modernizr and use html5shiv.js directly for IE less than v9 (#2131) - * Remove unused images (#2187) - * Use `array_to_sentence_string` filter when outputting news item - categories (#2191) - * Add link to Help repo in primary navigation bar (#2177) - * Switch to using an ico file for the shortcut icon (#2193) - * Use numbers to specify font weights and only bring in font weights used (#2185) - * Add a link to the list of all tz database time zones (#1824) - * Clean-up and improve documentation `feed.xml` (#2192) - * Remove duplicate entry in list of third-party plugins (#2206) - * Reduce the whitespace in the favicon. (#2213) - * Add `jekyll-page-collections` to list of third-party plugins (#2215) - * Add a cross-reference about `post_url` (#2243) - * Add `jekyll-live-tiles` to list of third-party plugins (#2250) - * Fixed broken link to GitHub training material site source (#2257) - * Update link to help repo, now called `jekyll-help` (#2277) - * Fix capitalization of 'Jekyll' on Deployment Methods page (#2291) - * Include plugins by sonnym in list of third-party plugins (#2297) - * Add deprecated articles keeper filter to list of third-party plugins (#2300) - * Simplify and improve our CSS. (#2127) - * Use black text color for the mobile navbar (#2306) - * Use the built in date filter and `site.time` for the copyright year. (#2305) - * Update html5shiv to v3.7.2 (#2304) - * Add 2.0.0 release post (#2298) - * Add docs for custom markdown processors (#2298) - * Add docs for `where` and `group_by` Liquid filters (#2298) - * Remove notes in docs for unreleased features (#2309) - -## 1.5.1 / 2014-03-27 - -### Bug Fixes - - * Only strip the drive name if it begins the string (#2176) - -## 1.5.0 / 2014-03-24 - -### Minor Enhancements - - * Loosen `safe_yaml` dependency to `~> 1.0` (#2167) - * Bump `safe_yaml` dependency to `~> 1.0.0` (#1942) - -### Bug Fixes - - * Fix issue where filesystem traversal restriction broke Windows (#2167) - * Lock `maruku` at `0.7.0` (#2167) - -### Development Fixes - - * Lock `cucumber` at `1.3.11` (#2167) - -## 1.4.3 / 2014-01-13 - -### Bug Fixes - * Patch show-stopping security vulnerabilities (#1944) - -## 1.4.2 / 2013-12-16 - -### Bug Fixes - * Turn on Maruku fenced code blocks by default (#1830) - -## 1.4.1 / 2013-12-09 - -### Bug Fixes - * Don't allow nil entries when loading posts (#1796) - -## 1.4.0 / 2013-12-07 - -### Major Enhancements - * Add support for TOML config files (#1765) - -### Minor Enhancements - * Sort plugins as a way to establish a load order (#1682) - * Update Maruku to 0.7.0 (#1775) - -### Bug Fixes - * Add a space between two words in a Pagination warning message (#1769) - * Upgrade `toml` gem to `v0.1.0` to maintain compat with Ruby 1.8.7 (#1778) - -### Development Fixes - * Remove some whitespace in the code (#1755) - * Remove some duplication in the reading of posts and drafts (#1779) - -### Site Enhancements - * Fixed case of a word in the Jekyll v1.3.0 release post (#1762) - * Fixed the mime type for the favicon (#1772) - -## 1.3.1 / 2013-11-26 - -### Minor Enhancements - * Add a `--prefix` option to passthrough for the importers (#1669) - * Push the paginator plugin lower in the plugin priority order so - other plugins run before it (#1759) - -### Bug Fixes - * Fix the include tag when ran in a loop (#1726) - * Fix errors when using `--watch` on 1.8.7 (#1730) - * Specify where the include is called from if an included file is - missing (#1746) - -### Development Fixes - * Extract `Site#filter_entries` into its own object (#1697) - * Enable Travis' bundle caching (#1734) - * Remove trailing whitespace in some files (#1736) - * Fix a duplicate test name (#1754) - -### Site Enhancements - * Update link to example Rakefile to point to specific commit (#1741) - * Fix drafts docs to indicate that draft time is based on file modification - time, not `Time.now` (#1695) - * Add `jekyll-monthly-archive-plugin` and `jekyll-category-archive-plugin` to - list of third-party plugins (#1693) - * Add `jekyll-asset-path-plugin` to list of third-party plugins (#1670) - * Add `emoji-for-jekyll` to list of third-part plugins (#1708) - * Fix previous section link on plugins page to point to pagination page (#1707) - * Add `org-mode` converter plugin to third-party plugins (#1711) - * Point "Blog migrations" page to http://import.jekyllrb.com (#1732) - * Add docs for `post_url` when posts are in subdirectories (#1718) - * Update the docs to point to `example.com` (#1448) - -## 1.3.0 / 2013-11-04 - -### Major Enhancements - * Add support for adding data as YAML files under a site's `_data` - directory (#1003) - * Allow variables to be used with `include` tags (#1495) - * Allow using gems for plugin management (#1557) - -### Minor Enhancements - * Decrease the specificity in the site template CSS (#1574) - * Add `encoding` configuration option (#1449) - * Provide better error handling for Jekyll's custom Liquid tags - (#1514) - * If an included file causes a Liquid error, add the path to the - include file that caused the error to the error message (#1596) - * If a layout causes a Liquid error, change the error message so that - we know it comes from the layout (#1601) - * Update Kramdown dependency to `~> 1.2` (#1610) - * Update `safe_yaml` dependency to `~> 0.9.7` (#1602) - * Allow layouts to be in subfolders like includes (#1622) - * Switch to listen for site watching while serving (#1589) - * Add a `json` liquid filter to be used in sites (#1651) - * Point people to the migration docs when the `jekyll-import` gem is - missing (#1662) - -### Bug Fixes - * Fix up matching against source and destination when the two - locations are similar (#1556) - * Fix the missing `pathname` require in certain cases (#1255) - * Use `+` instead of `Array#concat` when building `Post` attribute list (#1571) - * Print server address when launching a server (#1586) - * Downgrade to Maruku `~> 0.6.0` in order to avoid changes in rendering (#1598) - * Fix error with failing include tag when variable was file name (#1613) - * Downcase lexers before passing them to pygments (#1615) - * Capitalize the short verbose switch because it conflicts with the - built-in Commander switch (#1660) - * Fix compatibility with 1.8.x (#1665) - * Fix an error with the new file watching code due to library version - incompatibilities (#1687) - -### Development Fixes - * Add coverage reporting with Coveralls (#1539) - * Refactor the Liquid `include` tag (#1490) - * Update launchy dependency to `~> 2.3` (#1608) - * Update rr dependency to `~> 1.1` (#1604) - * Update cucumber dependency to `~> 1.3` (#1607) - * Update coveralls dependency to `~> 0.7.0` (#1606) - * Update rake dependency to `~> 10.1` (#1603) - * Clean up `site.rb` comments to be more concise/uniform (#1616) - * Use the master branch for the build badge in the readme (#1636) - * Refactor Site#render (#1638) - * Remove duplication in command line options (#1637) - * Add tests for all the coderay options (#1543) - * Improve some of the Cucumber test code (#1493) - * Improve comparisons of timestamps by ignoring the seconds (#1582) - -### Site Enhancements - * Fix params for `JekyllImport::WordPress.process` arguments (#1554) - * Add `jekyll-suggested-tweet` to list of third-party plugins (#1555) - * Link to Liquid's docs for tags and filters (#1553) - * Add note about installing Xcode on the Mac in the Installation docs (#1561) - * Simplify/generalize pagination docs (#1577) - * Add documentation for the new data sources feature (#1503) - * Add more information on how to create generators (#1590, #1592) - * Improve the instructions for mimicking GitHub Flavored Markdown - (#1614) - * Add `jekyll-import` warning note of missing dependencies (#1626) - * Fix grammar in the Usage section (#1635) - * Add documentation for the use of gems as plugins (#1656) - * Document the existence of a few additional plugins (#1405) - * Document that the `date_to_string` always returns a two digit day (#1663) - * Fix navigation in the "Working with Drafts" page (#1667) - * Fix an error with the data documentation (#1691) - -## 1.2.1 / 2013-09-14 - -### Minor Enhancements - * Print better messages for detached server. Mute output on detach. (#1518) - * Disable reverse lookup when running `jekyll serve` (#1363) - * Upgrade RedCarpet dependency to `~> 2.3.0` (#1515) - * Upgrade to Liquid `>= 2.5.2, < 2.6` (#1536) - -### Bug Fixes - * Fix file discrepancy in gemspec (#1522) - * Force rendering of Include tag (#1525) - -### Development Fixes - * Add a rake task to generate a new release post (#1404) - * Mute LSI output in tests (#1531) - * Update contributor documentation (#1537) - -### Site Enhancements - * Fix a couple of validation errors on the site (#1511) - * Make navigation menus reusable (#1507) - * Fix link to History page from Release v1.2.0 notes post. - * Fix markup in History file for command line options (#1512) - * Expand 1.2 release post title to 1.2.0 (#1516) - -## 1.2.0 / 2013-09-06 - -### Major Enhancements - * Disable automatically-generated excerpts when `excerpt_separator` is `""`. (#1386) - * Add checking for URL conflicts when running `jekyll doctor` (#1389) - -### Minor Enhancements - * Catch and fix invalid `paginate` values (#1390) - * Remove superfluous `div.container` from the default html template for - `jekyll new` (#1315) - * Add `-D` short-form switch for the drafts option (#1394) - * Update the links in the site template for Twitter and GitHub (#1400) - * Update dummy email address to example.com domain (#1408) - * Update normalize.css to v2.1.2 and minify; add rake task to update - normalize.css with greater ease. (#1430) - * Add the ability to detach the server ran by `jekyll serve` from it's - controlling terminal (#1443) - * Improve permalink generation for URLs with special characters (#944) - * Expose the current Jekyll version to posts and pages via a new - `jekyll.version` variable (#1481) - -### Bug Fixes - * Markdown extension matching matches only exact matches (#1382) - * Fixed NoMethodError when message passed to `Stevenson#message` is nil (#1388) - * Use binary mode when writing file (#1364) - * Fix 'undefined method `encoding` for "mailto"' errors w/ Ruby 1.8 and - Kramdown > 0.14.0 (#1397) - * Do not force the permalink to be a dir if it ends on .html (#963) - * When a Liquid Exception is caught, show the full path rel. to site source (#1415) - * Properly read in the config options when serving the docs locally - (#1444) - * Fixed `--layouts` option for `build` and `serve` commands (#1458) - * Remove kramdown as a runtime dependency since it's optional (#1498) - * Provide proper error handling for invalid file names in the include - tag (#1494) - -### Development Fixes - * Remove redundant argument to - Jekyll::Commands::New#scaffold_post_content (#1356) - * Add new dependencies to the README (#1360) - * Fix link to contributing page in README (#1424) - * Update TomDoc in Pager#initialize to match params (#1441) - * Refactor `Site#cleanup` into `Jekyll::Site::Cleaner` class (#1429) - * Several other small minor refactorings (#1341) - * Ignore `_site` in jekyllrb.com deploy (#1480) - * Add Gem version and dependency badge to README (#1497) - -### Site Enhancements - * Add info about new releases (#1353) - * Update plugin list with jekyll-rss plugin (#1354) - * Update the site list page with Ruby's official site (#1358) - * Add `jekyll-ditaa` to list of third-party plugins (#1370) - * Add `postfiles` to list of third-party plugins (#1373) - * For internal links, use full path including trailing `/` (#1411) - * Use curly apostrophes in the docs (#1419) - * Update the docs for Redcarpet in Jekyll (#1418) - * Add `pluralize` and `reading_time` filters to docs (#1439) - * Fix markup for the Kramdown options (#1445) - * Fix typos in the History file (#1454) - * Add trailing slash to site's post URL (#1462) - * Clarify that `--config` will take multiple files (#1474) - * Fix docs/templates.md private gist example (#1477) - * Use `site.repository` for Jekyll's GitHub URL (#1463) - * Add `jekyll-pageless-redirects` to list of third-party plugins (#1486) - * Clarify that `date_to_xmlschema` returns an ISO 8601 string (#1488) - * Add `jekyll-good-include` to list of third-party plugins (#1491) - * XML escape the blog post title in our feed (#1501) - * Add `jekyll-toc-generator` to list of third-party plugins (#1506) - -## 1.1.2 / 2013-07-25 - -### Bug Fixes - * Require Liquid 2.5.1 (#1349) - -## 1.1.1 / 2013-07-24 - -### Minor Enhancements - * Remove superfluous `table` selector from main.css in `jekyll new` template (#1328) - * Abort with non-zero exit codes (#1338) - -### Bug Fixes - * Fix up the rendering of excerpts (#1339) - -### Site Enhancements - * Add Jekyll Image Tag to the plugins list (#1306) - * Remove erroneous statement that `site.pages` are sorted alphabetically. - * Add info about the `_drafts` directory to the directory structure - docs (#1320) - * Improve the layout of the plugin listing by organizing it into - categories (#1310) - * Add generator-jekyllrb and grunt-jekyll to plugins page (#1330) - * Mention Kramdown as option for markdown parser on Extras page (#1318) - * Update Quick-Start page to include reminder that all requirements must be installed (#1327) - * Change filename in `include` example to an HTML file so as not to indicate that Jekyll - will automatically convert them. (#1303) - * Add an RSS feed for commits to Jekyll (#1343) - -## 1.1.0 / 2013-07-14 - -### Major Enhancements - * Add `docs` subcommand to read Jekyll's docs when offline. (#1046) - * Support passing parameters to templates in `include` tag (#1204) - * Add support for Liquid tags to post excerpts (#1302) - -### Minor Enhancements - * Search the hierarchy of pagination path up to site root to determine template page for - pagination. (#1198) - * Add the ability to generate a new Jekyll site without a template (#1171) - * Use redcarpet as the default markdown engine in newly generated - sites (#1245, #1247) - * Add `redcarpet` as a runtime dependency so `jekyll build` works out-of-the-box for new - sites. (#1247) - * In the generated site, remove files that will be replaced by a - directory (#1118) - * Fail loudly if a user-specified configuration file doesn't exist (#1098) - * Allow for all options for Kramdown HTML Converter (#1201) - -### Bug Fixes - * Fix pagination in subdirectories. (#1198) - * Fix an issue with directories and permalinks that have a plus sign - (+) in them (#1215) - * Provide better error reporting when generating sites (#1253) - * Latest posts first in non-LSI `related_posts` (#1271) - -### Development Fixes - * Merge the theme and layout Cucumber steps into one step (#1151) - * Restrict activesupport dependency to pre-4.0.0 to maintain compatibility with `<= 1.9.2` - * Include/exclude deprecation handling simplification (#1284) - * Convert README to Markdown. (#1267) - * Refactor Jekyll::Site (#1144) - -### Site Enhancements - * Add "News" section for release notes, along with an RSS feed (#1093, #1285, #1286) - * Add "History" page. - * Restructured docs sections to include "Meta" section. - * Add message to "Templates" page that specifies that Python must be installed in order - to use Pygments. (#1182) - * Update link to the official Maruku repo (#1175) - * Add documentation about `paginate_path` to "Templates" page in docs (#1129) - * Give the quick-start guide its own page (#1191) - * Update ProTip on Installation page in docs to point to all the info about Pygments and - the 'highlight' tag. (#1196) - * Run `site/img` through ImageOptim (thanks @qrush!) (#1208) - * Added Jade Converter to `site/docs/plugins` (#1210) - * Fix location of docs pages in Contributing pages (#1214) - * Add ReadInXMinutes plugin to the plugin list (#1222) - * Remove plugins from the plugin list that have equivalents in Jekyll - proper (#1223) - * Add jekyll-assets to the plugin list (#1225) - * Add jekyll-pandoc-mulitple-formats to the plugin list (#1229) - * Remove dead link to "Using Git to maintain your blog" (#1227) - * Tidy up the third-party plugins listing (#1228) - * Update contributor information (#1192) - * Update URL of article about Blogger migration (#1242) - * Specify that RedCarpet is the default for new Jekyll sites on Quickstart page (#1247) - * Added `site.pages` to Variables page in docs (#1251) - * Add Youku and Tudou Embed link on Plugins page. (#1250) - * Add note that `gist` tag supports private gists. (#1248) - * Add `jekyll-timeago` to list of third-party plugins. (#1260) - * Add `jekyll-swfobject` to list of third-party plugins. (#1263) - * Add `jekyll-picture-tag` to list of third-party plugins. (#1280) - * Update the GitHub Pages documentation regarding relative URLs - (#1291) - * Update the S3 deployment documentation (#1294) - * Add suggestion for Xcode CLT install to troubleshooting page in docs (#1296) - * Add 'Working with drafts' page to docs (#1289) - * Add information about time zones to the documentation for a page's - date (#1304) - -## 1.0.3 / 2013-06-07 - -### Minor Enhancements - * Add support to gist tag for private gists. (#1189) - * Fail loudly when Maruku errors out (#1190) - * Move the building of related posts into their own class (#1057) - * Removed trailing spaces in several places throughout the code (#1116) - * Add a `--force` option to `jekyll new` (#1115) - * Convert IDs in the site template to classes (#1170) - -### Bug Fixes - * Fix typo in Stevenson constant "ERROR". (#1166) - * Rename Jekyll::Logger to Jekyll::Stevenson to fix inheritance issue (#1106) - * Exit with a non-zero exit code when dealing with a Liquid error (#1121) - * Make the `exclude` and `include` options backwards compatible with - versions of Jekyll prior to 1.0 (#1114) - * Fix pagination on Windows (#1063) - * Fix the application of Pygments' Generic Output style to Go code - (#1156) - -### Site Enhancements - * Add a Pro Tip to docs about front matter variables being optional (#1147) - * Add changelog to site as History page in /docs/ (#1065) - * Add note to Upgrading page about new config options in 1.0.x (#1146) - * Documentation for `date_to_rfc822` and `uri_escape` (#1142) - * Documentation highlight boxes shouldn't show scrollbars if not necessary (#1123) - * Add link to jekyll-minibundle in the doc's plugins list (#1035) - * Quick patch for importers documentation - * Fix prefix for WordpressDotCom importer in docs (#1107) - * Add jekyll-contentblocks plugin to docs (#1068) - * Make code bits in notes look more natural, more readable (#1089) - * Fix logic for `relative_permalinks` instructions on Upgrading page (#1101) - * Add docs for post excerpt (#1072) - * Add docs for gist tag (#1072) - * Add docs indicating that Pygments does not need to be installed - separately (#1099, #1119) - * Update the migrator docs to be current (#1136) - * Add the Jekyll Gallery Plugin to the plugin list (#1143) - -### Development Fixes - * Use Jekyll.logger instead of Jekyll::Stevenson to log things (#1149) - * Fix pesky Cucumber infinite loop (#1139) - * Do not write posts with timezones in Cucumber tests (#1124) - * Use ISO formatted dates in Cucumber features (#1150) - -## 1.0.2 / 2013-05-12 - -### Major Enhancements - * Add `jekyll doctor` command to check site for any known compatibility problems (#1081) - * Backwards-compatibilize relative permalinks (#1081) - -### Minor Enhancements - * Add a `data-lang=""` attribute to Redcarpet code blocks (#1066) - * Deprecate old config `server_port`, match to `port` if `port` isn't set (#1084) - * Update pygments.rb version to 0.5.0 (#1061) - * Update Kramdown version to 1.0.2 (#1067) - -### Bug Fixes - * Fix issue when categories are numbers (#1078) - * Catching that Redcarpet gem isn't installed (#1059) - -### Site Enhancements - * Add documentation about `relative_permalinks` (#1081) - * Remove pygments-installation instructions, as pygments.rb is bundled with it (#1079) - * Move pages to be Pages for realz (#985) - * Updated links to Liquid documentation (#1073) - -## 1.0.1 / 2013-05-08 - -### Minor Enhancements - * Do not force use of `toc_token` when using `generate_tok` in RDiscount (#1048) - * Add newer `language-` class name prefix to code blocks (#1037) - * Commander error message now preferred over process abort with incorrect args (#1040) - -### Bug Fixes - * Make Redcarpet respect the pygments configuration option (#1053) - * Fix the index build with LSI (#1045) - * Don't print deprecation warning when no arguments are specified. (#1041) - * Add missing `

` to site template used by `new` subcommand, fixed typos in code (#1032) - -### Site Enhancements - * Changed https to http in the GitHub Pages link (#1051) - * Remove CSS cruft, fix typos, fix HTML errors (#1028) - * Removing manual install of Pip and Distribute (#1025) - * Updated URL for Markdown references plugin (#1022) - -### Development Fixes - * Markdownify history file (#1027) - * Update links on README to point to new jekyllrb.com (#1018) - -## 1.0.0 / 2013-05-06 - -### Major Enhancements - * Add `jekyll new` subcommand: generate a Jekyll scaffold (#764) - * Refactored Jekyll commands into subcommands: build, serve, and migrate. (#690) - * Removed importers/migrators from main project, migrated to jekyll-import sub-gem (#793) - * Added ability to render drafts in `_drafts` folder via command line (#833) - * Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) (#928) - -### Minor Enhancements - * Site template HTML5-ified (#964) - * Use post's directory path when matching for the `post_url` tag (#998) - * Loosen dependency on Pygments so it's only required when it's needed (#1015) - * Parse strings into Time objects for date-related Liquid filters (#1014) - * Tell the user if there is no subcommand specified (#1008) - * Freak out if the destination of `jekyll new` exists and is non-empty (#981) - * Add `timezone` configuration option for compilation (#957) - * Add deprecation messages for pre-1.0 CLI options (#959) - * Refactor and colorize logging (#959) - * Refactor Markdown parsing (#955) - * Added application/vnd.apple.pkpass to mime.types served by WEBrick (#907) - * Move template site to default markdown renderer (#961) - * Expose new attribute to Liquid via `page`: `page.path` (#951) - * Accept multiple config files from command line (#945) - * Add page variable to liquid custom tags and blocks (#413) - * Add `paginator.previous_page_path` and `paginator.next_page_path` (#942) - * Backwards compatibility for 'auto' (#821, #934) - * Added date_to_rfc822 used on RSS feeds (#892) - * Upgrade version of pygments.rb to 0.4.2 (#927) - * Added short month (e.g. "Sep") to permalink style options for posts (#890) - * Expose site.baseurl to Liquid templates (#869) - * Adds excerpt attribute to posts which contains first paragraph of content (#837) - * Accept custom configuration file via CLI (#863) - * Load in GitHub Pages MIME Types on `jekyll serve` (#847, #871) - * Improve debugability of error message for a malformed highlight tag (#785) - * Allow symlinked files in unsafe mode (#824) - * Add 'gist' Liquid tag to core (#822, #861) - * New format of Jekyll output (#795) - * Reinstate `--limit_posts` and `--future` switches (#788) - * Remove ambiguity from command descriptions (#815) - * Fix SafeYAML Warnings (#807) - * Relaxed Kramdown version to 0.14 (#808) - * Aliased `jekyll server` to `jekyll serve`. (#792) - * Updated gem versions for Kramdown, Rake, Shoulda, Cucumber, and RedCarpet. (#744) - * Refactored Jekyll subcommands into Jekyll::Commands submodule, which now contains them (#768) - * Rescue from import errors in Wordpress.com migrator (#671) - * Massively accelerate LSI performance (#664) - * Truncate post slugs when importing from Tumblr (#496) - * Add glob support to include, exclude option (#743) - * Layout of Page or Post defaults to 'page' or 'post', respectively (#580) - REPEALED by (#977) - * "Keep files" feature (#685) - * Output full path & name for files that don't parse (#745) - * Add source and destination directory protection (#535) - * Better YAML error message (#718) - * Bug Fixes - * Paginate in subdirectories properly (#1016) - * Ensure post and page URLs have a leading slash (#992) - * Catch all exceptions, not just StandardError descendents (#1007) - * Bullet-proof `limit_posts` option (#1004) - * Read in YAML as UTF-8 to accept non-ASCII chars (#836) - * Fix the CLI option `--plugins` to actually accept dirs and files (#993) - * Allow 'excerpt' in YAML front matter to override the extracted excerpt (#946) - * Fix cascade problem with site.baseurl, site.port and site.host. (#935) - * Filter out directories with valid post names (#875) - * Fix symlinked static files not being correctly built in unsafe mode (#909) - * Fix integration with directory_watcher 1.4.x (#916) - * Accepting strings as arguments to jekyll-import command (#910) - * Force usage of older directory_watcher gem as 1.5 is broken (#883) - * Ensure all Post categories are downcase (#842, #872) - * Force encoding of the rdiscount TOC to UTF8 to avoid conversion errors (#555) - * Patch for multibyte URI problem with `jekyll serve` (#723) - * Order plugin execution by priority (#864) - * Fixed Page#dir and Page#url for edge cases (#536) - * Fix broken `post_url` with posts with a time in their YAML front matter (#831) - * Look for plugins under the source directory (#654) - * Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long - post names (#775) - * Force Categories to be Strings (#767) - * Safe YAML plugin to prevent vulnerability (#777) - * Add SVG support to Jekyll/WEBrick. (#407, #406) - * Prevent custom destination from causing continuous regen on watch (#528, #820, #862) - -### Site Enhancements - * Responsify (#860) - * Fix spelling, punctuation and phrasal errors (#989) - * Update quickstart instructions with `new` command (#966) - * Add docs for page.excerpt (#956) - * Add docs for page.path (#951) - * Clean up site docs to prepare for 1.0 release (#918) - * Bring site into master branch with better preview/deploy (#709) - * Redesigned site (#583) - -### Development Fixes - * Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 (#938) - * Added "features:html" rake task for debugging purposes, cleaned up - Cucumber profiles (#832) - * Explicitly require HTTPS rubygems source in Gemfile (#826) - * Changed Ruby version for development to 1.9.3-p374 from p362 (#801) - * Including a link to the GitHub Ruby style guide in CONTRIBUTING.md (#806) - * Added script/bootstrap (#776) - * Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version - of greater than 1.9 (#771) - * Switch to Simplecov for coverage report (#765) - -## 0.12.1 / 2013-02-19 - -### Minor Enhancements - * Update Kramdown version to 0.14.1 (#744) - * Test Enhancements - * Update Rake version to 10.0.3 (#744) - * Update Shoulda version to 3.3.2 (#744) - * Update Redcarpet version to 2.2.2 (#744) - -## 0.12.0 / 2012-12-22 - -### Minor Enhancements - * Add ability to explicitly specify included files (#261) - * Add `--default-mimetype` option (#279) - * Allow setting of RedCloth options (#284) - * Add `post_url` Liquid tag for internal post linking (#369) - * Allow multiple plugin dirs to be specified (#438) - * Inline TOC token support for RDiscount (#333) - * Add the option to specify the paginated url format (#342) - * Swap out albino for pygments.rb (#569) - * Support Redcarpet 2 and fenced code blocks (#619) - * Better reporting of Liquid errors (#624) - * Bug Fixes - * Allow some special characters in highlight names - * URL escape category names in URL generation (#360) - * Fix error with `limit_posts` (#442) - * Properly select dotfile during directory scan (#363, #431, #377) - * Allow setting of Kramdown `smart_quotes` (#482) - * Ensure front matter is at start of file (#562) - -## 0.11.2 / 2011-12-27 - * Bug Fixes - * Fix gemspec - -## 0.11.1 / 2011-12-27 - * Bug Fixes - * Fix extra blank line in highlight blocks (#409) - * Update dependencies - -## 0.11.0 / 2011-07-10 - -### Major Enhancements - * Add command line importer functionality (#253) - * Add Redcarpet Markdown support (#318) - * Make markdown/textile extensions configurable (#312) - * Add `markdownify` filter - -### Minor Enhancements - * Switch to Albino gem - * Bundler support - * Use English library to avoid hoops (#292) - * Add Posterous importer (#254) - * Fixes for Wordpress importer (#274, #252, #271) - * Better error message for invalid post date (#291) - * Print formatted fatal exceptions to stdout on build failure - * Add Tumblr importer (#323) - * Add Enki importer (#320) - * Bug Fixes - * Secure additional path exploits - -## 0.10.0 / 2010-12-16 - * Bug Fixes - * Add `--no-server` option. - -## 0.9.0 / 2010-12-15 - -### Minor Enhancements - * Use OptionParser's `[no-]` functionality for better boolean parsing. - * Add Drupal migrator (#245) - * Complain about YAML and Liquid errors (#249) - * Remove orphaned files during regeneration (#247) - * Add Marley migrator (#28) - -## 0.8.0 / 2010-11-22 - -### Minor Enhancements - * Add wordpress.com importer (#207) - * Add `--limit-posts` cli option (#212) - * Add `uri_escape` filter (#234) - * Add `--base-url` cli option (#235) - * Improve MT migrator (#238) - * Add kramdown support (#239) - * Bug Fixes - * Fixed filename basename generation (#208) - * Set mode to UTF8 on Sequel connections (#237) - * Prevent `_includes` dir from being a symlink - -## 0.7.0 / 2010-08-24 - -### Minor Enhancements - * Add support for rdiscount extensions (#173) - * Bug Fixes - * Highlight should not be able to render local files - * The site configuration may not always provide a 'time' setting (#184) - -## 0.6.2 / 2010-06-25 - * Bug Fixes - * Fix Rakefile 'release' task (tag pushing was missing origin) - * Ensure that RedCloth is loaded when textilize filter is used (#183) - * Expand source, destination, and plugin paths (#180) - * Fix `page.url` to include full relative path (#181) - -## 0.6.1 / 2010-06-24 - * Bug Fixes - * Fix Markdown Pygments prefix and suffix (#178) - -## 0.6.0 / 2010-06-23 - -### Major Enhancements - * Proper plugin system (#19, #100) - * Add safe mode so unsafe converters/generators can be added - * Maruku is now the only processor dependency installed by default. - Other processors will be lazy-loaded when necessary (and prompt the - user to install them when necessary) (#57) - -### Minor Enhancements - * Inclusion/exclusion of future dated posts (#59) - * Generation for a specific time (#59) - * Allocate `site.time` on render not per site_payload invocation (#59) - * Pages now present in the site payload and can be used through the - `site.pages` and `site.html_pages` variables - * Generate phase added to site#process and pagination is now a generator - * Switch to RakeGem for build/test process - * Only regenerate static files when they have changed (#142) - * Allow arbitrary options to Pygments (#31) - * Allow URL to be set via command line option (#147) - * Bug Fixes - * Render highlighted code for non markdown/textile pages (#116) - * Fix highlighting on Ruby 1.9 (#65) - * Fix extension munging when pretty permalinks are enabled (#64) - * Stop sorting categories (#33) - * Preserve generated attributes over front matter (#119) - * Fix source directory binding using `Dir.pwd` (#75) - -## 0.5.7 / 2010-01-12 - -### Minor Enhancements - * Allow overriding of post date in the front matter (#62, #38) - * Bug Fixes - * Categories isn't always an array (#73) - * Empty tags causes error in read_posts (#84) - * Fix pagination to adhere to read/render/write paradigm - * Test Enhancement - * Cucumber features no longer use site.posts.first where a better - alternative is available - -## 0.5.6 / 2010-01-08 - * Bug Fixes - * Require redcloth >= 4.2.1 in tests (#92) - * Don't break on triple dashes in yaml front matter (#93) - -### Minor Enhancements - * Allow .mkd as markdown extension - * Use $stdout/err instead of constants (#99) - * Properly wrap code blocks (#91) - * Add javascript mime type for webrick (#98) - -## 0.5.5 / 2010-01-08 - * Bug Fixes - * Fix pagination % 0 bug (#78) - * Ensure all posts are processed first (#71) - -## NOTE - * After this point I will no longer be giving credit in the history; - that is what the commit log is for. - -## 0.5.4 / 2009-08-23 - * Bug Fixes - * Do not allow symlinks (security vulnerability) - -## 0.5.3 / 2009-07-14 - * Bug Fixes - * Solving the permalink bug where non-html files wouldn't work - (@jeffrydegrande) - -## 0.5.2 / 2009-06-24 - * Enhancements - * Added --paginate option to the executable along with a paginator object - for the payload (@calavera) - * Upgraded RedCloth to 4.2.1, which makes `` tags work once - again. - * Configuration options set in config.yml are now available through the - site payload (@vilcans) - * Posts can now have an empty YAML front matter or none at all - (@ bahuvrihi) - * Bug Fixes - * Fixing Ruby 1.9 issue that requires `#to_s` on the err object - (@Chrononaut) - * Fixes for pagination and ordering posts on the same day (@ujh) - * Made pages respect permalinks style and permalinks in yml front matter - (@eugenebolshakov) - * Index.html file should always have index.html permalink - (@eugenebolshakov) - * Added trailing slash to pretty permalink style so Apache is happy - (@eugenebolshakov) - * Bad markdown processor in config fails sooner and with better message - (@ gcnovus) - * Allow CRLFs in yaml front matter (@juretta) - * Added Date#xmlschema for Ruby versions < 1.9 - -## 0.5.1 / 2009-05-06 - -### Major Enhancements - * Next/previous posts in site payload (@pantulis, @tomo) - * Permalink templating system - * Moved most of the README out to the GitHub wiki - * Exclude option in configuration so specified files won't be brought over - with generated site (@duritong) - * Bug Fixes - * Making sure config.yaml references are all gone, using only config.yml - * Fixed syntax highlighting breaking for UTF-8 code (@henrik) - * Worked around RDiscount bug that prevents Markdown from getting parsed - after highlight (@henrik) - * CGI escaped post titles (@Chrononaut) - -## 0.5.0 / 2009-04-07 - -### Minor Enhancements - * Ability to set post categories via YAML (@qrush) - * Ability to set prevent a post from publishing via YAML (@qrush) - * Add textilize filter (@willcodeforfoo) - * Add 'pretty' permalink style for wordpress-like urls (@dysinger) - * Made it possible to enter categories from YAML as an array (@Chrononaut) - * Ignore Emacs autosave files (@Chrononaut) - * Bug Fixes - * Use block syntax of popen4 to ensure that subprocesses are properly disposed (@jqr) - * Close open4 streams to prevent zombies (@rtomayko) - * Only query required fields from the WP Database (@ariejan) - * Prevent `_posts` from being copied to the destination directory (@bdimcheff) - * Refactors - * Factored the filtering code into a method (@Chrononaut) - * Fix tests and convert to Shoulda (@qrush, @technicalpickles) - * Add Cucumber acceptance test suite (@qrush, @technicalpickles) - -## 0.4.1 - -### Minor Enhancements - * Changed date format on wordpress converter (zeropadding) (@dysinger) - * Bug Fixes - * Add Jekyll binary as executable to gemspec (@dysinger) - -## 0.4.0 / 2009-02-03 - -### Major Enhancements - * Switch to Jeweler for packaging tasks - -### Minor Enhancements - * Type importer (@codeslinger) - * `site.topics` accessor (@baz) - * Add `array_to_sentence_string` filter (@mchung) - * Add a converter for textpattern (@PerfectlyNormal) - * Add a working Mephisto / MySQL converter (@ivey) - * Allowing .htaccess files to be copied over into the generated site (@briandoll) - * Add option to not put file date in permalink URL (@mreid) - * Add line number capabilities to highlight blocks (@jcon) - * Bug Fixes - * Fix permalink behavior (@cavalle) - * Fixed an issue with pygments, markdown, and newlines (@zpinter) - * Ampersands need to be escaped (@pufuwozu, @ap) - * Test and fix the site.categories hash (@zzot) - * Fix site payload available to files (@matrix9180) - -## 0.3.0 / 2008-12-24 - -### Major Enhancements - * Added `--server` option to start a simple WEBrick server on destination - directory (@johnreilly and @mchung) - -### Minor Enhancements - * Added post categories based on directories containing `_posts` (@mreid) - * Added post topics based on directories underneath `_posts` - * Added new date filter that shows the full month name (@mreid) - * Merge Post's YAML front matter into its to_liquid payload (@remi) - * Restrict includes to regular files underneath `_includes` - * Bug Fixes - * Change YAML delimiter matcher so as to not chew up 2nd level markdown - headers (@mreid) - * Fix bug that meant page data (such as the date) was not available in - templates (@mreid) - * Properly reject directories in `_layouts` - -## 0.2.1 / 2008-12-15 - * Major Changes - * Use Maruku (pure Ruby) for Markdown by default (@mreid) - * Allow use of RDiscount with `--rdiscount` flag - -### Minor Enhancements - * Don't load directory_watcher unless it's needed (@pjhyett) - -## 0.2.0 / 2008-12-14 - * Major Changes - * related_posts is now found in `site.related_posts` - -## 0.1.6 / 2008-12-13 - * Major Features - * Include files in `_includes` with `{% include x.textile %}` - -## 0.1.5 / 2008-12-12 - -### Major Enhancements - * Code highlighting with Pygments if `--pygments` is specified - * Disable true LSI by default, enable with `--lsi` - -### Minor Enhancements - * Output informative message if RDiscount is not available (@JackDanger) - * Bug Fixes - * Prevent Jekyll from picking up the output directory as a source (@JackDanger) - * Skip `related_posts` when there is only one post (@JackDanger) - -## 0.1.4 / 2008-12-08 - * Bug Fixes - * DATA does not work properly with rubygems - -## 0.1.3 / 2008-12-06 - * Major Features - * Markdown support (@vanpelt) - * Mephisto and CSV converters (@vanpelt) - * Code hilighting (@vanpelt) - * Autobuild - * Bug Fixes - * Accept both `\r\n` and `\n` in YAML header (@vanpelt) - -## 0.1.2 / 2008-11-22 - * Major Features - * Add a real "related posts" implementation using Classifier - * Command Line Changes - * Allow cli to be called with 0, 1, or 2 args intuiting dir paths - if they are omitted - -## 0.1.1 / 2008-11-22 - * Minor Additions - * Posts now support introspectional data e.g. `{{ page.url }}` - -## 0.1.0 / 2008-11-05 - * First release - * Converts posts written in Textile - * Converts regular site pages - * Simple copy of binary files - -## 0.0.0 / 2008-10-19 - * Birthday! +IyMgSEVBRAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFVzZSBgTGlxdWlkOjpEcm9wYHMgaW5zdGVhZCBvZiBgSGFzaGBlcyBpbiBgI3RvX2xpcXVpZGAgKCM0Mjc3KQogICogQWRkICdzYW1wbGUnIExpcXVpZCBmaWx0ZXIgRXF1aXZhbGVudCB0byBBcnJheSNzYW1wbGUgZnVuY3Rpb25hbGl0eSAoIzQyMjMpCiAgKiBDYWNoZSBwYXJzZWQgaW5jbHVkZSBmaWxlIHRvIHNhdmUgbGlxdWlkIHBhcnNpbmcgdGltZS4gKCM0MTIwKQogICogU2xpZ2h0bHkgc3BlZWQgdXAgdXJsIHNhbml0aXphdGlvbiBhbmQgaGFuZGxlIG11bHRpcGxlcyBvZiAvLy8uICgjNDE2OCkKICAqIFByaW50IGRlYnVnIG1lc3NhZ2Ugd2hlbiBhIGRvY3VtZW50IGlzIHNraXBwZWQgZnJvbSByZWFkaW5nICgjNDE4MCkKICAqIEluY2x1ZGUgdGFnIHNob3VsZCBhY2NlcHQgbXVsdGlwbGUgdmFyaWFibGVzIGluIHRoZSBpbmNsdWRlIG5hbWUgKCM0MTgzKQogICogQWRkIGAtb2Agb3B0aW9uIHRvIHNlcnZlIGNvbW1hbmQgd2hpY2ggb3BlbnMgc2VydmVyIFVSTCAoIzQxNDQpCiAgKiBBZGQgQ29kZUNsaW1hdGUgcGxhdGZvcm0gZm9yIGJldHRlciBjb2RlIHF1YWxpdHkuICgjNDIyMCkKICAqIEdlbmVyYWwgaW1wcm92ZW1lbnRzIGZvciBXRUJyaWNrIHZpYSBqZWt5bGwgc2VydmUgc3VjaCBhcyBTU0wgJiBjdXN0b20gaGVhZGVycyAoIzQyMjQsICM0MjI4KQogICogQWRkIGEgZGVmYXVsdCBjaGFyc2V0IHRvIGNvbnRlbnQtdHlwZSBvbiB3ZWJyaWNrLiAoIzQyMzEpCiAgKiBTd2l0Y2ggYFBsdWdpbk1hbmFnZXJgIHRvIHVzZSBgcmVxdWlyZV93aXRoX2dyYWNlZnVsX2ZhaWxgIGZvciBiZXR0ZXIgVVggKCM0MjMzKQogICogQWxsb3cgcXVvdGVkIGRhdGUgaW4gZnJvbnQgbWF0dGVyIGRlZmF1bHRzICgjNDE4NCkKICAqIEFkZCBhIEpla3lsbCBkb2N0b3Igd2FybmluZyBmb3IgVVJMcyB0aGF0IG9ubHkgZGlmZmVyIGJ5IGNhc2UgKCMzMTcxKQogICogZHJvcHM6IGNyZWF0ZSBvbmUgYmFzZSBEcm9wIGNsYXNzIHdoaWNoIGNhbiBiZSBzZXQgYXMgbXV0YWJsZSBvciBub3QgKCM0Mjg1KQogICogZHJvcHM6IHByb3ZpZGUgYCN0b19oYCB0byBhbGxvdyBmb3IgaGFzaCBpbnRyb3NwZWN0aW9uICgjNDI4MSkKICAqIFNoaW0gc3ViY29tbWFuZHMgd2l0aCBpbmRpY2F0aW9uIG9mIGdlbSBwb3NzaWJseSByZXF1aXJlZCBzbyB1c2VycyBrbm93IGhvdyB0byB1c2UgdGhlbSAoIzQyNTQpCgojIyMgQnVnIEZpeGVzCgogICogUGFzcyBidWlsZCBvcHRpb25zIGludG8gYGNsZWFuYCBjb21tYW5kICgjNDE3NykKICAqIEFsbG93IHVzZXJzIHRvIHVzZSAuaHRtIGFuZCAueGh0bWwgKFhIVE1MNS4pICgjNDE2MCkKICAqIFByZXZlbnQgU2hlbGwgSW5qZWN0aW9uLiAoIzQyMDApCiAgKiBDb252ZXJ0aWJsZSBzaG91bGQgbWFrZSBsYXlvdXQgZGF0YSBhY2Nlc3NpYmxlIHZpYSBgbGF5b3V0YCBpbnN0ZWFkIG9mIGBwYWdlYCAoIzQyMDUpCiAgKiBBdm9pZCB1c2luZyBgRGlyLmdsb2JgIHdpdGggYWJzb2x1dGUgcGF0aCB0byBhbGxvdyBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIHBhdGggKCM0MTUwKQogICogSGFuZGxlIGVtcHR5IGNvbmZpZyBmaWxlcyAoIzQwNTIpCiAgKiBSZW5hbWUgYEBvcHRpb25zYCBzbyB0aGF0IGl0IGRvZXMgbm90IGltcGFjdCBMaXF1aWQuICgjNDE3MykKICAqIHV0aWxzL2Ryb3BzOiB1cGRhdGUgRHJvcCB0byBzdXBwb3J0IGBVdGlscy5kZWVwX21lcmdlX2hhc2hlc2AgKCM0Mjg5KQogICogTWFrZSBzdXJlIGpla3lsbC9kcm9wcy9kcm9wIGlzIGxvYWRlZCBmaXJzdC4gKCM0MjkyKQogICogQ29udmVydGlibGUvUGFnZS9SZW5kZXJlcjogdXNlIHBheWxvYWQgaGFzaCBhY2Nlc3NvciAmIHNldHRlciBzeW50YXggZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5ICgjNDMxMSkKICAqIERyb3A6IGZpeCBoYXNoIHNldHRlciBwcmVjZW5kZW5jZSAoIzQzMTIpCiAgKiB1dGlsczogYGhhc195YW1sX2hlYWRlcj9gIHNob3VsZCBhY2NlcHQgZmlsZXMgd2l0aCBleHRyYW5lb3VzIHNwYWNlcyAoIzQyOTApCiAgKiBFc2NhcGUgaHRtbCBmcm9tIHNpdGUudGl0bGUgYW5kIHBhZ2UudGl0bGUgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzQzMDcpCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBgamVreWxsLWRvY3NgIHNob3VsZCBiZSBlYXNpbHkgcmVsZWFzZS1hYmxlICgjNDE1MikKICAqIEFsbG93IHVzZSBvZiBDdWN1bWJlciAyLjEgb3IgZ3JlYXRlciAoIzQxODEpCiAgKiBNb2Rlcm5pemUgS3JhbWRvd24gZm9yIE1hcmtkb3duIGNvbnZlcnRlci4gKCM0MTA5KQogICogQ2hhbmdlIFRlc3REb2N0b3JDb21tYW5kIHRvIEpla3lsbFVuaXRUZXN0Li4uICgjNDI2MykKICAqIENyZWF0ZSBuYW1lc3BhY2VkIHJha2UgdGFza3MgaW4gc2VwYXJhdGUgYC5yYWtlYCBmaWxlcyB1bmRlciBgbGliL3Rhc2tzYCAoIzQyODIpCiAgKiBtYXJrZG93bjogcmVmYWN0b3IgZm9yIGdyZWF0ZXIgcmVhZGFiaWxpdHkgJiBlZmZpY2llbmN5ICgjMzc3MSkKICAqIEZpeCBtYW55IFJ1Ym9jb3Agc3R5bGUgZXJyb3JzICgjNDMwMSkKICAqIEZpeCBzcGVsbGluZyBvZiAiR2l0SHViIiBpbiBkb2NzIGFuZCBoaXN0b3J5ICgjNDMyMikKICAqIFJlb3JnYW5pemUgYW5kIGNsZWFudXAgdGhlIEdlbWZpbGUsIHNob3J0ZW4gcmVxdWlyZWQgZGVwZW5kcy4gKCM0MzE4KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogQWRkIHRocmVlIHBsdWdpbnMgdG8gZGlyZWN0b3J5ICgjNDE2MykKICAqIEFkZCB1cGdyYWRpbmcgZG9jcyBmcm9tIDIueCB0byAzLnggKCM0MTU3KQogICogQWRkIGBwcm90ZWN0X2VtYWlsYCB0byB0aGUgcGx1Z2lucyBpbmRleC4gKCM0MTY5KQogICogQWRkIGBqZWt5bGwtZGVwbG95YCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCM0MTc5KQogICogQ2xhcmlmeSBwbHVnaW4gZG9jcyAoIzQxNTQpCiAgKiBBZGQgS2lja3N0ZXIgdG8gZGVwbG95bWVudCBtZXRob2RzIGluIGRvY3VtZW50YXRpb24gKCM0MTkwKQogICogQWRkIERhdmlkQnVyZWxhJ3MgdHV0b3JpYWwgZm9yIFdpbmRvd3MgdG8gV2luZG93cyBkb2NzIHBhZ2UgKCM0MjEwKQogICogQ2hhbmdlIEdpdEh1YiBjb2RlIGJsb2NrIHRvIGhpZ2hsaWdodCB0YWcgdG8gYXZvaWQgaXQgb3ZlcmxhcHMgcGFyZW50IGRpdiAoIzQxMjEpCiAgKiBVcGRhdGUgRm9ybUtlZXAgbGluayB0byBiZSBzb21ldGhpbmcgbW9yZSBzcGVjaWZpYyB0byBKZWt5bGwgKCM0MjQzKQogICogUmVtb3ZlIGV4YW1wbGUgUm9nZXIgQ2hhcG1hbiBzaXRlLCBhcyB0aGUgZG9tYWluIGRvZXNuJ3QgZXhpc3QgKCM0MjQ5KQogICogQWRkZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBgZHJhZnRfcG9zdHNgIHRvIGNvbmZpZ3VyYXRpb24gZG9jcyAoIzQyNTEpCiAgKiBGaXggY2hlY2tsaXN0IGluIGBfYXNzZXRzLm1kYCAoIzQyNTkpCiAgKiBBZGQgTWFya2Rvd24gZXhhbXBsZXMgdG8gUGFnZXMgZG9jcyAoIzQyNzUpCiAgKiBBZGQgamVreWxsLXBhZ2luYXRlLWNhdGVnb3J5IHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzQyNzMpCiAgKiBBZGQgYGpla3lsbC1yZXNwb25zaXZlX2ltYWdlYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCM0Mjg2KQogICogQWRkIGBqZWt5bGwtY29tbW9ubWFya2AgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjNDI5OSkKICAqIEFkZCBkb2N1bWVudGF0aW9uIGZvciBpbmNyZW1lbnRhbCByZWdlbmVyYXRpb24gKCM0MjkzKQogICogQWRkIG5vdGUgYWJvdXQgcmVtb3ZhbCBvZiByZWxhdGl2ZSBwZXJtYWxpbmsgc3VwcG9ydCBpbiB1cGdyYWRpbmcgZG9jcyAoIzQzMDMpCiAgKiBBZGQgUHJvIFRpcCB0byB1c2UgZnJvbnQgbWF0dGVyIHZhcmlhYmxlIHRvIGNyZWF0ZSBjbGVhbiBVUkxzICgjNDI5NikKICAqIEZpeCBncmFtbWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBwb3N0cy4gKCM0MzMwKQoKIyMgMy4wLjEgLyAyMDE1LTExLTE3CgojIyMgQnVnIEZpeGVzCgogICogRG9jdW1lbnQ6IG9ubHkgc3VwZXJkaXJlY3RvcmllcyBvZiB0aGUgY29sbGVjdGlvbiBhcmUgY2F0ZWdvcmllcyAoIzQxMTApCiAgKiBgQ29udmVydGlibGUjcmVuZGVyX2xpcXVpZGAgc2hvdWxkIHVzZSBgcmVuZGVyIWAgdG8gY2F1c2UgZmFpbHVyZSBvbiBiYWQgTGlxdWlkICgjNDA3NykKICAqIERvbid0IGdlbmVyYXRlIGAuamVreWxsLW1ldGFkYXRhYCBpbiBub24taW5jcmVtZW50YWwgYnVpbGQgKCM0MDc5KQogICogU2V0IGBoaWdobGlnaHRlcmAgY29uZmlnIHZhbCB0byBga3JhbWRvd24uc3ludGF4X2hpZ2hsaWdodGVyYCAoIzQwOTApCiAgKiBBbGlnbiBob29rcyBpbXBsZW1lbnRhdGlvbiB3aXRoIGRvY3VtZW50YXRpb24gKCM0MTA0KQogICogRml4IHRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIGluIHRoZSBkb2N0b3IgY29tbWFuZCAoIzQxMTQpCiAgKiBGaXggY2FzZSBpbiBgOnRpdGxlYCBhbmQgYWRkIGA6c2x1Z2Agd2hpY2ggaXMgZG93bmNhc2VkICgjNDEwMCkKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEZpeCB0ZXN0IHdhcm5pbmdzIHdoZW4gZG9pbmcgcmFrZSB7dGVzdCxzcGVjfSBvciBzY3JpcHQvdGVzdCAoIzQwNzgpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBVcGRhdGUgbm9ybWFsaXplLmNzcyB0byB2My4wLjMuICgjNDA4NSkKICAqIFVwZGF0ZSBGb250IEF3ZXNvbWUgdG8gdjQuNC4wLiAoIzQwODYpCiAgKiBBZGRzIGEgbm90ZSBhYm91dCBpbnN0YWxsaW5nIHRoZSBqZWt5bGwtZ2lzdCBnZW0gdG8gbWFrZSBnaXN0IHRhZyB3b3JrICgjNDEwMSkKICAqIEFsaWduIGhvb2tzIGRvY3VtZW50YXRpb24gd2l0aCBpbXBsZW1lbnRhdGlvbiAoIzQxMDQpCiAgKiBBZGQgSmVreWxsIEZsaWNrciBQbHVnaW4gdG8gdGhlIGxpc3Qgb2YgdGhpcmQgcGFydHkgcGx1Z2lucyAoIzQxMTEpCiAgKiBSZW1vdmUgbGluayB0byBub3ctZGVsZXRlZCBibG9nIHBvc3QgKCM0MTI1KQogICogVXBkYXRlIHRoZSBsaXF1aWQgc3ludGF4IGluIHRoZSBwYWdpbmF0aW9uIGRvY3MgKCM0MTMwKQogICogQWRkIGpla3lsbC1sYW5ndWFnZS1wbHVnaW4gdG8gcGx1Z2lucy5tZCAoIzQxMzQpCiAgKiBVcGRhdGVkIHRvIHJlZmxlY3QgZmVlZGJhY2sgaW4gIzQxMjkgKCM0MTM3KQogICogQ2xhcmlmeSBhc3NldHMubWQgYmFzZWQgb24gZmVlZGJhY2sgb2YgIzQxMjkgKCM0MTQyKQogICogUmUtY29ycmVjdCB0aGUgbGlxdWlkIHN5bnRheCBpbiB0aGUgcGFnaW5hdGlvbiBkb2NzICgjNDE0MCkKCiMjIDMuMC4wIC8gMjAxNS0xMC0yNgoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIExpcXVpZCBwcm9maWxlciAoaS5lLiBrbm93IGhvdyBmYXN0IG9yIHNsb3cgeW91ciB0ZW1wbGF0ZXMgcmVuZGVyKSAoIzM3NjIpCiAgKiBJbmNyZW1lbnRhbCByZWdlbmVyYXRpb24gKCMzMTE2KQogICogQWRkIEhvb2tzOiBhIG5ldyBraW5kIG9mIHBsdWdpbiAoIzM1NTMpCiAgKiBVcGdyYWRlIHRvIExpcXVpZCAzLjAuMCAoIzMwMDIpCiAgKiBgc2l0ZS5wb3N0c2AgaXMgbm93IGEgQ29sbGVjdGlvbiBpbnN0ZWFkIG9mIGFuIEFycmF5ICgjNDA1NSkKICAqIEFkZCBiYXNpYyBzdXBwb3J0IGZvciBKUnVieSAoY29tbWl0OiAwZjQ0NzcpCiAgKiBEcm9wIHN1cHBvcnQgZm9yIFJ1YnkgMS45LjMuICgjMzIzNSkKICAqIFN1cHBvcnQgUnVieSB2Mi4yICgjMzIzNCkKICAqIFN1cHBvcnQgUkRpc2NvdW50IDIgKCMyNzY3KQogICogUmVtb3ZlIG1vc3QgcnVudGltZSBkZXBzICgjMzMyMykKICAqIE1vdmUgdG8gUm91Z2UgYXMgZGVmYXVsdCBoaWdobGlnaHRlciAoIzMzMjMpCiAgKiBNaW1pYyBHaXRIdWIgUGFnZXMgYC5odG1sYCBleHRlbnNpb24gc3RyaXBwaW5nIGJlaGF2aW9yIGluIFdFQnJpY2sgKCMzNDUyKQogICogQWx3YXlzIGluY2x1ZGUgZmlsZSBleHRlbnNpb24gb24gb3V0cHV0IGZpbGVzICgjMzQ5MCkKICAqIEltcHJvdmVkIHBlcm1hbGlua3MgZm9yIHBhZ2VzIGFuZCBjb2xsZWN0aW9ucyAoIzM1MzgpCiAgKiBTdW5zZXQgKGkuZS4gcmVtb3ZlKSBNYXJ1a3UgKCMzNjU1KQogICogUmVtb3ZlIHN1cHBvcnQgZm9yIHJlbGF0aXZlIHBlcm1hbGlua3MgKCMzNjc5KQogICogSXRlcmF0ZSBvdmVyIGBzaXRlLmNvbGxlY3Rpb25zYCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGEgaGFzaC4gKCMzNjcwKQogICogQWRhcHQgU3RhdGljRmlsZSBmb3IgY29sbGVjdGlvbnMsIGNvbmZpZyBkZWZhdWx0cyAoIzM4MjMpCiAgKiBBZGQgYSBDb2RlIG9mIENvbmR1Y3QgZm9yIHRoZSBKZWt5bGwgcHJvamVjdCAoIzM5MjUpCiAgKiBBZGRlZCBwZXJtYWxpbmsgdGltZSB2YXJpYWJsZXMgKCMzOTkwKQogICogQWRkIGAtLWluY3JlbWVudGFsYCBmbGFnIHRvIGVuYWJsZSBpbmNyZW1lbnRhbCByZWdlbiAoZGlzYWJsZWQgYnkgZGVmYXVsdCkgKCM0MDU5KQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIERlcHJlY2F0ZSBhY2Nlc3MgdG8gRG9jdW1lbnQjZGF0YSBwcm9wZXJ0aWVzIGFuZCBDb2xsZWN0aW9uI2RvY3MgbWV0aG9kcyAoIzQwNTgpCiAgKiBTb3J0IHN0YXRpYyBmaWxlcyBqdXN0IG9uY2UsIGFuZCBjYWxsIGBzaXRlX3BheWxvYWRgIG9uY2UgZm9yIGFsbCBjb2xsZWN0aW9ucyAoIzMyMDQpCiAgKiBTZXBhcmF0ZSBgamVreWxsIGRvY3NgIGFuZCBvcHRpbWl6ZSBleHRlcm5hbCBnZW0gaGFuZGxpbmcgKCMzMjQxKQogICogSW1wcm92ZSBgU2l0ZSNnZXRDb252ZXJ0ZXJJbXBsYCBhbmQgY2FsbCBpdCBgU2l0ZSNmaW5kX2NvbnZlcnRlcl9pbnN0YW5jZWAgKCMzMjQwKQogICogVXNlIHJlbGF0aXZlIHBhdGggZm9yIGBwYXRoYCBMaXF1aWQgdmFyaWFibGUgaW4gRG9jdW1lbnRzIGZvciBjb25zaXN0ZW5jeSAoIzI5MDgpCiAgKiBHZW5lcmFsaXplIGBVdGlscyNzbHVnaWZ5YCBmb3IgYW55IHNjcmlwdHMgKCMzMDQ3KQogICogQWRkZWQgYmFzaWMgbWljcm9kYXRhIHRvIHBvc3QgdGVtcGxhdGUgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzMxODkpCiAgKiBTdG9yZSBsb2cgbWVzc2FnZXMgaW4gYW4gYXJyYXkgb2YgbWVzc2FnZXMuICgjMzI0NCkKICAqIEFsbG93IGNvbGxlY3Rpb24gZG9jdW1lbnRzIHRvIG92ZXJyaWRlIGBvdXRwdXRgIHByb3BlcnR5IGluIGZyb250IG1hdHRlciAoIzMxNzIpCiAgKiBLZWVwIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIGJldHdlZW4gYnVpbGRzIGZvciBzdGF0aWMgZmlsZXMgKCMzMjIwKQogICogT25seSBkb3duY2FzZSBtaXhlZC1jYXNlIGNhdGVnb3JpZXMgZm9yIHRoZSBVUkwgKCMyNTcxKQogICogQWRkZWQgcGVyIHBvc3QgYGV4Y2VycHRfc2VwYXJhdG9yYCBmdW5jdGlvbmFsaXR5ICgjMzI3NCkKICAqIEFsbG93IGNvbGxlY3Rpb25zIFlBTUwgdG8gZW5kIHdpdGggdGhyZWUgZG90cyAoIzMxMzQpCiAgKiBBZGQgbW9kZSBwYXJhbWV0ZXIgdG8gYHNsdWdpZnlgIExpcXVpZCBmaWx0ZXIgKCMyOTE4KQogICogUGVyZjogYE1hcmtkb3duI21hdGNoZXNgIHNob3VsZCBhdm9pZCByZWdleHAgKCMzMzIxKQogICogUGVyZjogVXNlIGZyb3plbiByZWd1bGFyIGV4cHJlc3Npb25zIGZvciBgVXRpbHMjc2x1Z2lmeWAgKCMzMzIxKQogICogU3BsaXQgb2ZmIFRleHRpbGUgc3VwcG9ydCBpbnRvIGpla3lsbC10ZXh0aWxlLWNvbnZlcnRlciAoIzMzMTkpCiAgKiBJbXByb3ZlIHRoZSBuYXZpZ2F0aW9uIG1lbnUgYWxpZ25tZW50IGluIHRoZSBzaXRlIHRlbXBsYXRlIG9uIHNtYWxsIHNjcmVlbnMgKCMzMzMxKQogICogU2hvdyB0aGUgcmVnZW5lcmF0aW9uIHRpbWUgYWZ0ZXIgdGhlIGluaXRpYWwgZ2VuZXJhdGlvbiAoIzMzNzgpCiAgKiBTaXRlIHRlbXBsYXRlOiBTd2l0Y2ggZGVmYXVsdCBmb250IHRvIEhlbHZldGljYSBOZXVlICgjMzM3NikKICAqIE1ha2UgdGhlIGBpbmNsdWRlYCB0YWcgYSB0ZWVuc3kgYml0IGZhc3Rlci4gKCMzMzkxKQogICogQWRkIGBwa2lsbCAtZiBqZWt5bGxgIHRvIHdheXMgdG8ga2lsbC4gKCMzMzk3KQogICogU2l0ZSB0ZW1wbGF0ZTogY29sbGFwc2VkLCB2YXJpYWJsZS1kcml2ZW4gZm9udCBkZWNsYXJhdGlvbiAoIzMzNjApCiAgKiBTaXRlIHRlbXBsYXRlOiBEb24ndCBhbHdheXMgc2hvdyB0aGUgc2Nyb2xsYmFyIGluIGNvZGUgYmxvY2tzICgjMzQxOSkKICAqIFNpdGUgdGVtcGxhdGU6IFJlbW92ZSB1bmRlZmluZWQgYHRleHRgIGNsYXNzIGZyb20gYHBgIGVsZW1lbnQgKCMzNDQwKQogICogU2l0ZSB0ZW1wbGF0ZTogT3B0aW1pemUgdGV4dCByZW5kZXJpbmcgZm9yIGxlZ2liaWxpdHkgKCMzMzgyKQogICogQWRkIGBkcmFmdD9gIG1ldGhvZCB0byBpZGVudGlmeSBpZiBQb3N0IGlzIGEgRHJhZnQgJiBleHBvc2UgdG8gTGlxdWlkICgjMzQ1NikKICAqIFdyaXRlIHJlZ2VuZXJhdGlvbiBtZXRhZGF0YSBldmVuIG9uIGZ1bGwgcmVidWlsZCAoIzM0NjQpCiAgKiBQZXJmOiBVc2UgYFN0cmluZyNlbmRfd2l0aD8oIi8iKWAgaW5zdGVhZCBvZiByZWdleHAgd2hlbiBjaGVja2luZyBwYXRocyAoIzM1MTYpCiAgKiBEb2NzOiBkb2N1bWVudCAnb3JkaW5hbCcgYnVpbHQtaW4gcGVybWFsaW5rIHN0eWxlICgjMzUzMikKICAqIFVwZ3JhZGUgbGlxdWlkLWMgdG8gMy54ICgjMzUzMSkKICAqIFVzZSBjb25zaXN0ZW50IHN5bnRheCBmb3IgZGVwcmVjYXRpb24gd2FybmluZyAoIzM1MzUpCiAgKiBBZGRlZCBidWlsZCAtLWRlc3RpbmF0aW9uIGFuZCAtLXNvdXJjZSBmbGFncyAoIzM0MTgpCiAgKiBTaXRlIHRlbXBsYXRlOiByZW1vdmUgdW51c2VkIGBwYWdlLm1ldGFgIGF0dHJpYnV0ZSAoIzM1MzcpCiAgKiBJbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gc29ydGluZyBudWxsIG9iamVjdHMgKCMzNTIwKQogICogQWRkZWQgbGlxdWlkLW1kNSBwbHVnaW4gKCMzNTk4KQogICogRG9jdW1lbnRhdGlvbjogUlIgcmVwbGFjZWQgd2l0aCBSU3BlYyBNb2NrcyAoIzM2MDApCiAgKiBEb2N1bWVudGF0aW9uOiBGaXggc3VicGF0aC4gKCMzNTk5KQogICogQ3JlYXRlICd0bXAnIGRpciBmb3IgdGVzdF90YWdzIGlmIGl0IGRvZXNuJ3QgZXhpc3QgKCMzNjA5KQogICogRXh0cmFjdCByZWFkaW5nIG9mIGRhdGEgZnJvbSBgU2l0ZWAgdG8gcmVkdWNlIHJlc3BvbnNpYmlsaXRpZXMuICgjMzU0NSkKICAqIFJlbW92ZWQgdGhlIHdvcmQgJ0pla3lsbCcgYSBmZXcgdGltZXMgZnJvbSB0aGUgY29tbWVudHMgKCMzNjE3KQogICogYGJpbi9qZWt5bGxgOiB3aXRoIG5vIGFyZ3MsIGV4aXQgd2l0aCBleGl0IGNvZGUgMSAoIzM2MTkpCiAgKiBJbmNyZW1lbnRhbCBidWlsZCBpZiBkZXN0aW5hdGlvbiBmaWxlIG1pc3NpbmcgKCMzNjE0KQogICogU3RhdGljIGZpbGVzIGBtdGltZWAgbGlxdWlkIHNob3VsZCByZXR1cm4gYSBgVGltZWAgb2JqICgjMzU5NikKICAqIFVzZSBgSmVreWxsOjpQb3N0YHMgZm9yIGJvdGggTFNJIGluZGV4aW5nIGFuZCBsb29rdXAuICgjMzYyOSkKICAqIEFkZCBgY2hhcnNldD11dGYtOGAgZm9yIEhUTUwgYW5kIFhNTCBwYWdlcyBpbiBXRUJyaWNrICgjMzY0OSkKICAqIFNldCBsb2cgbGV2ZWwgdG8gZGVidWcgd2hlbiB2ZXJib3NlIGZsYWcgaXMgc2V0ICgjMzY2NSkKICAqIEFkZGVkIGEgbWVudGlvbiBvbiB0aGUgR2VtZmlsZSB0byBjb21wbGV0ZSB0aGUgaW5zdHJ1Y3Rpb25zICgjMzY3MSkKICAqIFBlcmY6IENhY2hlIGBEb2N1bWVudCN0b19saXF1aWRgIGFuZCBpbnZhbGlkYXRlIHdoZXJlIG5lY2Vzc2FyeSAoIzM2OTMpCiAgKiBQZXJmOiBgSmVreWxsOjpDbGVhbmVyI2V4aXN0aW5nX2ZpbGVzYDogQ2FsbCBga2VlcF9maWxlX3JlZ2V4YCBhbmQgYGtlZXBfZGlyc2Agb25seSBvbmNlLCBub3Qgb25jZSBwZXIgaXRlcmF0aW9uICgjMzY5NikKICAqIE9taXQgamVreWxsL2pla3lsbC1oZWxwIGZyb20gbGlzdCBvZiByZXNvdXJjZXMuICgjMzY5OCkKICAqIEFkZCBiYXNpYyBgamVreWxsIGRvY3RvcmAgdGVzdCB0byBkZXRlY3QgZnNub3RpZnkgKE9TWCkgYW5vbWFsaWVzLiAoIzM3MDQpCiAgKiBBZGRlZCB0YWxrLmpla3lsbHJiLmNvbSB0byAiSGF2ZSBxdWVzdGlvbnM/IiAoIzM2OTQpCiAgKiBQZXJmb3JtYW5jZTogU29ydCBmaWxlcyBvbmx5IG9uY2UgKCMzNzA3KQogICogUGVyZm9ybWFuY2U6IE1hcnNoYWwgbWV0YWRhdGEgKCMzNzA2KQogICogVXBncmFkZSBoaWdobGlnaHQgd3JhcHBlciBmcm9tIGBkaXZgIHRvIGBmaWd1cmVgICgjMzc3OSkKICAqIFVwZ3JhZGUgbWltZS10eXBlcyB0byBgfj4gMi42YCAoIzM3OTUpCiAgKiBVcGRhdGUgd2luZG93cy5tZCB3aXRoIFJ1YnkgdmVyc2lvbiBpbmZvICgjMzgxOCkKICAqIE1ha2UgdGhlIGRpcmVjdG9yeSBmb3IgaW5jbHVkZXMgY29uZmlndXJhYmxlICgjMzc4MikKICAqIFJlbmFtZSBkaXJlY3RvcnkgY29uZmlndXJhdGlvbnMgdG8gbWF0Y2ggYCpfZGlyYCBjb252ZW50aW9uIGZvciBjb25zaXN0ZW5jeSAoIzM3ODIpCiAgKiBJbnRlcm5hbDogdHJpZ2dlciBob29rcyBieSBvd25lciBzeW1ib2wgKCMzODcxKQogICogVXBkYXRlIE1JTUUgdHlwZXMgZnJvbSBtaW1lLWRiICgjMzkzMykKICAqIEFkZCBoZWFkZXIgdG8gc2l0ZSB0ZW1wbGF0ZSBgX2NvbmZpZy55bWxgIGZvciBjbGFyaXR5ICYgZGlyZWN0aW9uICgjMzk5NykKICAqIFNpdGUgdGVtcGxhdGU6IGFkZCB0aW1lem9uZSBvZmZzZXQgdG8gcG9zdCBkYXRlIGZyb250bWF0dGVyICgjNDAwMSkKICAqIE1ha2UgYSBjb25zdGFudCBmb3IgdGhlIHJlZ2V4IHRvIGZpbmQgaGlkZGVuIGZpbGVzICgjNDAzMikKICAqIFNpdGUgdGVtcGxhdGU6IHJlZmFjdG9yIGdpdGh1YiAmIHR3aXR0ZXIgaWNvbnMgaW50byBpbmNsdWRlcyAoIzQwNDkpCiAgKiBTaXRlIHRlbXBsYXRlOiBhZGQgYmFja2dyb3VuZCB0byBLcmFtZG93biBSb3VnZS1pZmllZCBiYWNrdGljayBjb2RlIGJsb2NrcyAoIzQwNTMpCgojIyMgQnVnIEZpeGVzCgogICogYHBvc3RfdXJsYDogZml4IGFjY2VzcyBkZXByZWNhdGlvbiB3YXJuaW5nICYgZml4IGRlcHJlY2F0aW9uIG1zZyAoIzQwNjApCiAgKiBQZXJmb3JtIGpla3lsbC1wYWdpbmF0ZSBkZXByZWNhdGlvbiB3YXJuaW5nIGNvcnJlY3RseS4gKCMzNTgwKQogICogTWFrZSBwZXJtYWxpbmsgcGFyc2luZyBjb25zaXN0ZW50IHdpdGggcGFnZXMgKCMzMDE0KQogICogYHRpbWUoKWBwcmUtZmlsdGVyIG1ldGhvZCBzaG91bGQgYWNjZXB0IGEgYERhdGVgIG9iamVjdCAoIzMyOTkpCiAgKiBSZW1vdmUgdW5uZWVkZWQgZW5kIHRhZyBmb3IgYGxpbmtgIGluIHNpdGUgdGVtcGxhdGUgKCMzMjM2KQogICogS3JhbWRvd246IFVzZSBgZW5hYmxlX2NvZGVyYXlgIGtleSBpbnN0ZWFkIG9mIGB1c2VfY29kZXJheWAgKCMzMjM3KQogICogVW5lc2NhcGUgYERvY3VtZW50YCBvdXRwdXQgcGF0aCAoIzI5MjQpCiAgKiBGaXggbmF2IGl0ZW1zIGFsaWdubWVudCB3aGVuIG9uIG11bHRpcGxlIHJvd3MgKCMzMjY0KQogICogSGlnaGxpZ2h0OiBPbmx5IFN0cmlwIE5ld2xpbmVzL0NhcnJpYWdlIFJldHVybnMsIG5vdCBTcGFjZXMgKCMzMjc4KQogICogRmluZCB2YXJpYWJsZXMgaW4gZnJvbnQgbWF0dGVyIGRlZmF1bHRzIGJ5IHNlYXJjaGluZyB3aXRoIHJlbGF0aXZlIGZpbGUgcGF0aC4gKCMyNzc0KQogICogQWxsb3cgdmFyaWFibGVzIChlLmcgYDpjYXRlZ29yaWVzYCkgaW4gWUFNTCBmcm9udCBtYXR0ZXIgcGVybWFsaW5rcyAoIzMzMjApCiAgKiBIYW5kbGUgbmlsIFVSTCBwbGFjZWhvbGRlcnMgaW4gcGVybWFsaW5rcyAoIzMzMjUpCiAgKiBUZW1wbGF0ZTogRml4IG5hdiBpdGVtcyBhbGlnbm1lbnQgd2hlbiBpbiAiYnVyZ2VyIiBtb2RlICgjMzMyOSkKICAqIFRlbXBsYXRlOiBSZW1vdmUgYCFpbXBvcnRhbnRgIGZyb20gbmF2IFNDU1MgaW50cm9kdWNlZCBpbiAjMzMyOSAoIzMzNzUpCiAgKiBUaGUgYDp0aXRsZWAgVVJMIHBsYWNlaG9sZGVyIGZvciBjb2xsZWN0aW9ucyBzaG91bGQgYmUgdGhlIGZpbGVuYW1lIHNsdWcuICgjMzM4MykKICAqIFRyaW0gdGhlIGdlbmVyYXRlIHRpbWUgZGlmZiB0byBqdXN0IDMgcGxhY2VzIHBhc3QgdGhlIGRlY2ltYWwgcGxhY2UgKCMzNDE1KQogICogVGhlIGhpZ2hsaWdodCB0YWcgc2hvdWxkIG9ubHkgY2xpcCB0aGUgbmV3bGluZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgKmVudGlyZSogYmxvY2ssIG5vdCBpbiBiZXR3ZWVuICgjMzQwMSkKICAqIGhpZ2hsaWdodDogZml4IHByb2JsZW0gd2l0aCBsaW5lbm9zIGFuZCByb3VnZS4gKCMzNDM2KQogICogYFNpdGUjcmVhZF9kYXRhX2ZpbGVgOiByZWFkIENTVidzIHdpdGggcHJvcGVyIGZpbGUgZW5jb2RpbmcgKCMzNDU1KQogICogSWdub3JlIGAuamVreWxsLW1ldGFkYXRhYCBpbiBzaXRlIHRlbXBsYXRlICgjMzQ5NikKICAqIFRlbXBsYXRlOiBQb2ludCBkb2N1bWVudGF0aW9uIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24gcGFnZXMgKCMzNTAyKQogICogUmVtb3ZlZCB0aGUgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZXhhbXBsZSBgL2Jsb2dgIGJhc2V1cmwgY29tbWVudCAoIzM0ODUpCiAgKiBDbGVhciB0aGUgcmVnZW5lcmF0b3IgY2FjaGUgZXZlcnkgdGltZSB3ZSBwcm9jZXNzICgjMzU5MikKICAqIFJlYWRkIChicmluZyBiYWNrKSBtaW5pdGVzdC1wcm9maWxlICgjMzYyOCkKICAqIEFkZCBXT0ZGMiBmb250IE1JTUUgdHlwZSB0byBKZWt5bGwgc2VydmVyIE1JTUUgdHlwZXMgKCMzNjQ3KQogICogQmUgc21hcnRlciBhYm91dCBleHRyYWN0aW5nIHRoZSBleHRuYW1lIGluIGBTdGF0aWNGaWxlYCAoIzM2MzIpCiAgKiBQcm9jZXNzIG1ldGFkYXRhIGZvciBhbGwgZGVwZW5kZW5jaWVzICgjMzYwOCkKICAqIFNob3cgZXJyb3IgbWVzc2FnZSBpZiB0aGUgWUFNTCBmcm9udCBtYXR0ZXIgb24gYSBwYWdlL3Bvc3QgaXMgaW52YWxpZC4gKCMzNjQzKQogICogVXBncmFkZSByZWRjYXJwZXQgdG8gMy4yIChTZWN1cml0eSBmaXg6IE9TVkRCLTEyMDQxNSkgKCMzNjUyKQogICogQ3JlYXRlICNtb2NrX2V4cGVjdHMgdGhhdCBnb2VzIGRpcmVjdGx5IHRvIFJTcGVjIE1vY2tzLiAoIzM2NTgpCiAgKiBPcGVuIGAuamVreWxsLW1ldGFkYXRhYCBpbiBiaW5hcnkgbW9kZSB0byByZWFkIGJpbmFyeSBNYXJzaGFsIGRhdGEgKCMzNzEzKQogICogSW5jcmVtZW50YWwgcmVnZW5lcmF0aW9uOiBoYW5kbGUgZGVsZXRlZCwgcmVuYW1lZCwgYW5kIG1vdmVkIGRlcGVuZGVuY2llcyAoIzM3MTcpCiAgKiBGaXggdHlwbyBvbiBsaW5lIDE5IG9mIHBhZ2luYXRpb24ubWQgKCMzNzYwKQogICogRml4IGl0IHNvIHRoYXQgJ2Jsb2cuaHRtbCcgbWF0Y2hlcyAnYmxvZy5odG1sJyAoIzM3MzIpCiAgKiBSZW1vdmUgb2NjYXNpb25hbGx5LXByb2JsZW1hdGljIGBlbnN1cmVgIGluIGBMaXF1aWRSZW5kZXJlcmAgKCMzODExKQogICogRml4ZWQgYW4gdW5jbGVhciBjb2RlIGNvbW1lbnQgaW4gc2l0ZSB0ZW1wbGF0ZSBTQ1NTICgjMzgzNykKICAqIEZpeCByZWFkaW5nIG9mIGJpbmFyeSBtZXRhZGF0YSBmaWxlICgjMzg0NSkKICAqIFJlbW92ZSB2YXIgY29sbGlzaW9uIHdpdGggc2l0ZSB0ZW1wbGF0ZSBoZWFkZXIgbWVudSBpdGVyYXRpb24gdmFyaWFibGUgKCMzODM4KQogICogQ2hhbmdlIG5vbi1leGlzdGVudCBgaGxfbGluZW5vc2AgdG8gYGhsX2xpbmVzYCB0byBhbGxvdyBwYXNzdGhyb3VnaCBpbiBzYWZlIG1vZGUgKCMzNzg3KQogICogQWRkIG1pc3NpbmcgZmxhZyB0byBkaXNhYmxlIHRoZSB3YXRjaGVyICgjMzgyMCkKICAqIFVwZGF0ZSBDSSBndWlkZSB0byBpbmNsdWRlIG1vcmUgZGlyZWN0IGV4cGxhbmF0aW9ucyBvZiB0aGUgZmxvdyAoIzM4OTEpCiAgKiBTZXQgYGZ1dHVyZWAgdG8gYGZhbHNlYCBpbiB0aGUgZGVmYXVsdCBjb25maWcgKCMzODkyKQogICogZmlsdGVyczogYHdoZXJlYCBzaG91bGQgY29tcGFyZSBzdHJpbmdpZmllZCB2ZXJzaW9ucyBvZiBpbnB1dCAmIGNvbXBhcmF0b3IgKCMzOTM1KQogICogUmVhZCBidWlsZCBvcHRpb25zIGZvciBgamVreWxsIGNsZWFuYCBjb21tYW5kICgjMzgyOCkKICAqIEZpeCAjMzk3MDogVXNlIEdlbTo6VmVyc2lvbiB0byBjb21wYXJlIHZlcnNpb25zLCBub3QgYD5gLgogICogQWJvcnQgaWYgbm8gc3ViY29tbWFuZC4gRml4ZXMgY29uZnVzaW5nIG1lc3NhZ2UuICgjMzk5MikKICAqIFdob2xlLXBvc3QgZXhjZXJwdHMgc2hvdWxkIG1hdGNoIHRoZSBwb3N0IGNvbnRlbnQgKCM0MDA0KQogICogQ2hhbmdlIGRlZmF1bHQgZm9udCB3ZWlnaHQgdG8gNDAwIHRvIGZpeCBib2xkL3N0cm9uZyB0ZXh0IGlzc3VlcyAoIzQwNTApCiAgKiBEb2N1bWVudDogT25seSBhdXRvLWdlbmVyYXRlIHRoZSBleGNlcnB0IGlmIGl0J3Mgbm90IG92ZXJyaWRkZW4gKCM0MDYyKQogICogVXRpbHM6IGBkZWVwX21lcmdlX2hhc2hlc2Agc2hvdWxkIGFsc28gbWVyZ2UgYGRlZmF1bHRfcHJvY2AgKDQ1ZjY5YmIpCiAgKiBEZWZhdWx0czogY29tcGFyZSBwYXRocyBpbiBgYXBwbGllc19wYXRoP2AgYXMgYFN0cmluZ2BzIHRvIGF2b2lkIGNvbmZ1c2lvbiAoN2I4MWYwMCkKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIFJlbW92ZSBsb2FkZXIucmIgYW5kICJtb2Rlcm5pemUiIGBzY3JpcHQvdGVzdGAuICgjMzU3NCkKICAqIEltcHJvdmUgdGhlIGdyYW1tYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gKCMzMjMzKQogICogVXBkYXRlIHRoZSBMSUNFTlNFIHRleHQgdG8gbWF0Y2ggdGhlIE1JVCBsaWNlbnNlIGV4YWN0bHkgKCMzMjUzKQogICogVXBkYXRlIHJha2UgdGFzayBgc2l0ZTpwdWJsaXNoYCB0byBmaXggbWlub3IgYnVncy4gKCMzMjU0KQogICogU3dpdGNoIHRvIHNoaWVsZHMuaW8gZm9yIHRoZSBSRUFETUUgYmFkZ2VzLiAoIzMyNTUpCiAgKiBVc2UgYEZpbGVMaXN0YCBpbnN0ZWFkIG9mIGBEaXIuZ2xvYmAgaW4gYHNpdGU6cHVibGlzaGAgcmFrZSB0YXNrICgjMzI2MSkKICAqIEZpeCB0ZXN0IHNjcmlwdCB0byBiZSBwbGF0Zm9ybS1pbmRlcGVuZGVudCAoIzMyNzkpCiAgKiBJbnN0ZWFkIG9mIHN5bWxpbmtpbmcgYC90bXBgLCBjcmVhdGUgYW5kIHN5bWxpbmsgYSBsb2NhbCBgdG1wYCBpbiB0aGUgdGVzdHMgKCMzMjU4KQogICogRml4IHNvbWUgc3BhY2luZyAoIzMzMTIpCiAgKiBGaXggY29tbWVudCB0eXBvIGluIGBsaWIvamVreWxsL2Zyb250bWF0dGVyX2RlZmF1bHRzLnJiYCAoIzMzMjIpCiAgKiBNb3ZlIGFsbCBgcmVnZW5lcmF0ZT9gIGNoZWNraW5nIHRvIGBSZWdlbmVyYXRvcmAgKCMzMzI2KQogICogRmFjdG9yIG91dCBhIGByZWFkX2RhdGFfZmlsZWAgY2FsbCB0byBrZWVwIHRoaW5ncyBjbGVhbiAoIzMzODApCiAgKiBQcm9vZiB0aGUgc2l0ZSB3aXRoIENpcmNsZUNJLiAoIzM0MjcpCiAgKiBVcGRhdGUgTElDRU5TRSB0byAyMDE1LiAoIzM0NzcpCiAgKiBVcGdyYWRlIHRlc3RzIHRvIHVzZSBNaW5pdGVzdCAoIzM0OTIpCiAgKiBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSAoIzM0OTcpCiAgKiBVc2UgYGZpeHR1cmVfc2l0ZWAgZm9yIERvY3VtZW50IHRlc3RzICgjMzUxMSkKICAqIFJlbW92ZSBhZGFwdGVycyBkZXByZWNhdGlvbiB3YXJuaW5nICgjMzUyOSkKICAqIE1pbm9yIGZpeGVzIHRvIGB1cmwucmJgIHRvIGZvbGxvdyBHaXRIdWIgc3R5bGUgZ3VpZGUgKCMzNTQ0KQogICogTWlub3IgY2hhbmdlcyB0byByZXNvbHZlIGRlcHJlY2F0aW9uIHdhcm5pbmdzICgjMzU0NykKICAqIENvbnZlcnQgcmVtYWluaW5nIHRleHRpbGUgdGVzdCBkb2N1bWVudHMgdG8gbWFya2Rvd24gKCMzNTI4KQogICogTWlncmF0ZSB0aGUgdGVzdHMgdG8gdXNlIHJzcGVjLW1vY2tzICgjMzU1MikKICAqIFJlbW92ZSBgYWN0aXZlc3VwcG9ydGAgKCMzNjEyKQogICogQWRkZWQgdGVzdHMgZm9yIGBKZWt5bGw6U3RhdGljRmlsZWAgKCMzNjMzKQogICogRm9yY2UgbWluaXRlc3QgdmVyc2lvbiB0byA1LjUuMSAoIzM2NTcpCiAgKiBVcGRhdGUgdGhlIHdheSBjdWN1bWJlciBhY2Nlc3NlcyBNaW5pdGVzdCBhc3NlcnRpb25zICgjMzY3OCkKICAqIEFkZCBgc2NyaXB0L3J1Ynlwcm9mYCB0byBnZW5lcmF0ZSBjYWNoZWdyaW5kIGNhbGxncmFwaHMgKCMzNjkyKQogICogVXBncmFkZSBjdWN1bWJlciB0byAyLnggKCMzNzk1KQogICogVXBkYXRlIEtyYW1kb3duLiAoIzM4NTMpCiAgKiBVcGRhdGVkIHRoZSBzY3JpcHRzIHNoZWJhbmcgZm9yIHBvcnRhYmlsaXR5ICgjMzg1OCkKICAqIFVwZGF0ZSBKUnVieSB0ZXN0aW5nIHRvIDlLIChbM2FiMzg2Zl0oaHR0cHM6Ly9naXRodWIuY29tL2pla3lsbC9qZWt5bGwvY29tbWl0LzNhYjM4NmYxYjA5NmJlMjVhMjRmZTAzOGZjNzBmZDBmYjA4ZDU0NWQpKQogICogT3JnYW5pemUgZGVwZW5kZW5jaWVzIGludG8gZGV2IGFuZCB0ZXN0IGdyb3Vwcy4gKCMzODUyKQogICogQ29udHJpYnV0aW5nLm1kIHNob3VsZCByZWZlciB0byBgc2NyaXB0L2N1Y3VtYmVyYCAoIzM4OTQpCiAgKiBVcGRhdGUgY29udHJpYnV0aW5nIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCB3b3JrZmxvdyB1cGRhdGVzICgjMzg5NSkKICAqIEFkZCBzY3JpcHQgdG8gdmVuZG9yIG1pbWUgdHlwZXMgKCMzOTMzKQogICogSWdub3JlIC5idW5kbGUgZGlyIGluIFNpbXBsZUNvdiAoIzQwMzMpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBBZGQgJ2luZm8nIGxhYmVscyB0byBjZXJ0YWluIG5vdGVzIGluIGNvbGxlY3Rpb25zIGRvY3MgKCMzNjAxKQogICogUmVtb3ZlIGV4dHJhIHNwYWNlcywgbWFrZSB0aGUgbGFzdCBzZW50ZW5jZSBsZXNzIGF3a3dhcmQgaW4gcGVybWFsaW5rIGRvY3MgKCMzNjAzKQogICogVXBkYXRlIHRoZSBwZXJtYWxpbmtzIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCB0aGUgdXBkYXRlcyBmb3IgMy4wICgjMzU1NikKICAqIEFkZCBibG9nIHBvc3QgYW5ub3VuY2luZyBKZWt5bGwgSGVscCAoIzM1MjMpCiAgKiBBZGQgSmVreWxsIFRhbGsgdG8gSGVscCBwYWdlIG9uIHNpdGUgKCMzNTE4KQogICogQ2hhbmdlIEFqYXggcGFnaW5hdGlvbiByZXNvdXJjZSBsaW5rIHRvIHVzZSBIVFRQUyAoIzM1NzApCiAgKiBGaXhpbmcgdGhlIGRlZmF1bHQgaG9zdCBvbiBkb2NzICgjMzIyOSkKICAqIEFkZCBgamVreWxsLXRodW1ibmFpbC1maWx0ZXJgIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzI3OTApCiAgKiBBZGQgbGluayB0byAnQWRkaW5nIEFqYXggcGFnaW5hdGlvbiB0byBKZWt5bGwnIHRvIFJlc291cmNlcyBwYWdlICgjMzE4NikKICAqIEFkZCBhIFJlc291cmNlcyBsaW5rIHRvIHR1dG9yaWFsIG9uIGJ1aWxkaW5nIGR5bmFtaWMgbmF2YmFycyAoIzMxODUpCiAgKiBTZW1hbnRpYyBzdHJ1Y3R1cmUgaW1wcm92ZW1lbnRzIHRvIHRoZSBwb3N0IGFuZCBwYWdlIGxheW91dHMgKCMzMjUxKQogICogQWRkIG5ldyBBc2NpaURvYyBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zLiAoIzMyNzcpCiAgKiBTcGVjaWZ5IHRoYXQgYWxsIHRyYW5zZm9ybWFibGUgY29sbGVjdGlvbiBkb2N1bWVudHMgbXVzdCBjb250YWluIFlBTUwgZnJvbnQgbWF0dGVyICgjMzI3MSkKICAqIEFzc29ydGVkIGFjY2Vzc2liaWxpdHkgZml4ZXMgKCMzMjU2KQogICogVXBkYXRlIGNvbmZpZ3VyYXRpb24gZG9jcyB0byBtZW50aW9uIGBrZWVwX2ZpbGVzYCBmb3IgYGRlc3RpbmF0aW9uYCAoIzMyODgsICMzMjk2KQogICogQnJlYWsgd2hlbiB3ZSBzdWNjZXNzZnVsbHkgZ2VuZXJhdGUgbmF2IGxpbmsgdG8gc2F2ZSBDUFUgY3ljbGVzLiAoIzMyOTEpCiAgKiBVcGRhdGUgdXNhZ2UgZG9jcyB0byBtZW50aW9uIGBrZWVwX2ZpbGVzYCBhbmQgYSB3YXJuaW5nIGFib3V0IGBkZXN0aW5hdGlvbmAgY2xlYW5pbmcgKCMzMjk1KQogICogQWRkIGxvZ2ljIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlIGBuZXh0X3NlY3Rpb25gIGFuZCBgcHJldl9zZWN0aW9uYCBuYXZpZ2F0aW9uIGl0ZW1zICgjMzI5MikKICAqIFNvbWUgc21hbGwgZml4ZXMgZm9yIHRoZSBQbHVnaW5zIFRPQy4gKCMzMzA2KQogICogQWRkZWQgdmVyc2lvbmluZyBjb21tZW50IHRvIGNvbmZpZ3VyYXRpb24gZmlsZSAoIzMzMTQpCiAgKiBBZGQgYGpla3lsbC1taW5pZmllcmAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzMzMykKICAqIEFkZCBibG9nIHBvc3QgYWJvdXQgdGhlIEpla3lsbCBtZWV0LXVwICgjMzMzMikKICAqIFVzZSBgaGlnaGxpZ2h0YCBMaXF1aWQgdGFnIGluc3RlYWQgb2YgdGhlIGZvdXItc3BhY2UgdGFicyBmb3IgY29kZSAoIzMzMzYpCiAgKiAzLjAuMC5iZXRhMSByZWxlYXNlIHBvc3QgKCMzMzQ2KQogICogQWRkIGB0d2FgIHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzMzg0KQogICogUmVtb3ZlIGV4dHJhIHNwYWNlcyAoIzMzODgpCiAgKiBGaXggc21hbGwgZ3JhbW1hciBlcnJvcnMgb24gYSBjb3VwbGUgcGFnZXMgKCMzMzk2KQogICogRml4IHR5cG8gb24gVGVtcGxhdGVzIGRvY3MgcGFnZSAoIzM0MjApCiAgKiBzL3RocmVlL2ZvdXIgZm9yIHBsdWdpbiB0eXBlIGxpc3QgKCMzNDI0KQogICogUmVsZWFzZSBqZWt5bGxyYi5jb20gYXMgYSBsb2NhbGx5LWNvbXBpbGVkIHNpdGUuICgjMzQyNikKICAqIEFkZCBhIGpla3lsbHJiLmNvbS9oZWxwIHBhZ2Ugd2hpY2ggZWx1Y2lkYXRlcyBwbGFjZXMgZnJvbSB3aGljaCB0byBnZXQgaGVscCAoIzM0MjgpCiAgKiBSZW1vdmUgZXh0cmFuZW91cyBkYXNoIG9uIFBsdWdpbnMgZG9jIHBhZ2Ugd2hpY2ggY2F1c2VkIGEgZm9ybWF0dGluZyBlcnJvciAoIzM0MzEpCiAgKiBGaXggYnJva2VuIGxpbmsgdG8gSm9yZGFuIFRob3JucXVlc3QncyB3ZWJzaXRlLiAoIzM0MzgpCiAgKiBDaGFuZ2UgdGhlIGxpbmsgdG8gYW4gZXh0ZW5zaW9uICgjMzQ1NykKICAqIEZpeCBUd2l0dGVyIGxpbmsgb24gdGhlIGhlbHAgcGFnZSAoIzM0NjYpCiAgKiBGaXggd29yZGluZyBpbiBjb2RlIHNuaXBwZXQgaGlnaGxpZ2h0aW5nIHNlY3Rpb24gKCMzNDc1KQogICogQWRkIGEgYC9gIHRvIGBwYWdpbmF0ZV9wYXRoYCBpbiB0aGUgUGFnaW5hdGlvbiBkb2N1bWVudGF0aW9uICgjMzQ3OSkKICAqIEFkZCBhIGxpbmsgb24gYWxsIHRoZSBkb2NzIHBhZ2VzIHRvICJJbXByb3ZlIHRoaXMgcGFnZSIuICgjMzUxMCkKICAqIEFkZCBqZWt5bGwtYXV0by1pbWFnZSBnZW5lcmF0b3IgdG8gdGhlIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzM0ODkpCiAgKiBSZXBsYWNlIGxpbmsgdG8gdGhlIHByb3Bvc2VkIGBwaWN0dXJlYCBlbGVtZW50IHNwZWMgKCMzNTMwKQogICogQWRkIGZyb250bWF0dGVyIGRhdGUgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiAoIzM0NjkpCiAgKiBJbXByb3ZlIGNvbnNpc3RlbmN5IGFuZCBjbGFyaXR5IG9mIHBsdWdpbnMgb3B0aW9ucyBub3RlICgjMzU0NikKICAqIEFkZCBwZXJtYWxpbmsgd2FybmluZyB0byBwYWdpbmF0aW9uIGRvY3MgKCMzNTUxKQogICogRml4IGdyYW1tYXIgaW4gQ29sbGVjdGlvbnMgZG9jcyBBUEkgc3RhYmlsaXR5IHdhcm5pbmcgKCMzNTYwKQogICogUmVzdHJ1Y3R1cmUgYGV4Y2VycHRfc2VwYXJhdG9yYCBkb2N1bWVudGF0aW9uIGZvciBjbGFyaXR5ICgjMzU1MCkKICAqIEZpeCBhY2NpZGVudGFsIGxpbmUgYnJlYWsgaW4gY29sbGVjdGlvbnMgZG9jcyAoIzM1ODUpCiAgKiBBZGQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGAuamVreWxsLW1ldGFkYXRhYCBmaWxlICgjMzU5NykKICAqIERvY3VtZW50IGFkZGl0aW9uIG9mIHZhcmlhYmxlIHBhcmFtZXRlcnMgdG8gYW4gaW5jbHVkZSAoIzM1ODEpCiAgKiBBZGQgYGpla3lsbC1maWxlc2AgdG8gdGhlIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucy4gKCMzNTg2KQogICogRGVmaW5lIHRoZSBgaW5zdGFsbGAgc3RlcCBpbiB0aGUgQ0kgZXhhbXBsZSBgLnRyYXZpcy55bWxgICgjMzYyMikKICAqIEV4cGFuZCBjb2xsZWN0aW9ucyBkb2N1bWVudGF0aW9uLiAoIzM2MzgpCiAgKiBBZGQgdGhlICJ3YXJuaW5nIiBub3RlIGxhYmVsIHRvIGV4Y2x1ZGluZyBgdmVuZG9yYCBpbiB0aGUgQ0kgZG9jcyBwYWdlICgjMzYyMykKICAqIFVwZ3JhZGUgcGllY2VzIG9mIHRoZSBVZ3JhZGluZyBndWlkZSBmb3IgSmVreWxsIDMgKCMzNjA3KQogICogU2hvd2luZyBob3cgdG8gYWNjZXNzIHNwZWNpZmljIGRhdGEgaXRlbXMgKCMzNDY4KQogICogQ2xhcmlmeSBwYWdpbmF0aW9uIHdvcmtzIGZyb20gd2l0aGluIEhUTUwgZmlsZXMgKCMzNDY3KQogICogQWRkIG5vdGUgdG8gYGV4Y2VycHRfc2VwYXJhdG9yYCBkb2N1bWVudGF0aW9uIHRoYXQgaXQgY2FuIGJlIHNldCBnbG9iYWxseSAoIzM2NjcpCiAgKiBGaXggc29tZSBuYW1lcyBvbiBUcm91Ymxlc2hvb3RpbmcgcGFnZSAoIzM2ODMpCiAgKiBBZGQgYHJlbW90ZV9maWxlX2NvbnRlbnRgIHRhZyBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzY5MSkKICAqIFVwZGF0ZSB0aGUgUmVkY2FycGV0IHZlcnNpb24gb24gdGhlIENvbmZpZ3VyYXRpb24gcGFnZS4gKCMzNzQzKQogICogVXBkYXRlIHRoZSBsaW5rIGluIHRoZSB3ZWxjb21lIHBvc3QgdG8gcG9pbnQgdG8gSmVreWxsIFRhbGsgKCMzNzQ1KQogICogVXBkYXRlIGxpbmsgZm9yIG5hdmJhcnMgd2l0aCBkYXRhIGF0dHJpYnV0ZXMgdHV0b3JpYWwgKCMzNzI4KQogICogQWRkIGBqZWt5bGwtYXNjaWluZW1hYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzNzUwKQogICogVXBkYXRlIHBhZ2luYXRpb24gZXhhbXBsZSB0byBiZSBhZ25vc3RpYyB0byBmaXJzdCBwYWdpbmF0aW9uIGRpciAoIzM3NjMpCiAgKiBEZXRhaWxlZCBpbnN0cnVjdGlvbnMgZm9yIHJzeW5jIGRlcGxveW1lbnQgbWV0aG9kICgjMzg0OCkKICAqIEFkZCBKZWt5bGwgUG9ydGZvbGlvIEdlbmVyYXRvciB0byBsaXN0IG9mIHBsdWdpbnMgKCMzODgzKQogICogQWRkIGBzaXRlLmh0bWxfZmlsZXNgIHRvIHZhcmlhYmxlcyBkb2NzICgjMzg4MCkKICAqIEFkZCBTdGF0aWMgUHVibGlzaGVyIHRvb2wgdG8gbGlzdCBvZiBkZXBsb3ltZW50IG1ldGhvZHMgKCMzODY1KQogICogRml4IGEgZmV3IHR5cG9zLiAoIzM4OTcpCiAgKiBBZGQgYGpla3lsbC15b3V0dWJlYCB0byB0aGUgbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzkzMSkKICAqIEFkZCBWaWV3cyBSb3V0ZXIgcGx1Z2luICgjMzk1MCkKICAqIFVwZGF0ZSBpbnN0YWxsIGRvY3MgKENvcmUgZGVwZW5kZW5jaWVzLCBXaW5kb3dzIHJlcXMsIGV0YykgKCMzNzY5KQogICogVXNlIEpla3lsbCBGZWVkIGZvciBqZWt5bGxyYi5jb20gKCMzNzM2KQogICogQWRkIGpla3lsbC11bWxhdXRzIHRvIHBsdWdpbnMubWQgKCQzOTY2KQogICogVHJvdWJsZXNob290aW5nOiBmaXggYnJva2VuIGxpbmssIGFkZCBvdGhlciBtYWMtc3BlY2lmaWMgaW5mbyAoIzM5NjgpCiAgKiBBZGQgYSBuZXcgc2l0ZSBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKCMzOTE3KQogICogQWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgSmVreWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyAoIzM5ODkpCiAgKiBGaXggYnJva2VuIGNvbmZpZ3VyYXRpb24gZG9jdW1lbnRhdGlvbiBwYWdlICgjMzk5NCkKICAqIEFkZCB0cm91Ymxlc2hvb3RpbmcgZG9jcyBmb3IgaW5zdGFsbGluZyBvbiBFbCBDYXBpdGFuICgjMzk5OSkKICAqIEFkZCBMYXp5IFR3ZWV0IEVtYmVkZGluZyB0byB0aGUgbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjNDAxNSkKICAqIEFkZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciAyIG9mIDMgb3B0aW9ucyBmb3IgcGx1Z2lucyAoIzQwMTMpCiAgKiBBZGQgYWx0ZXJuYXRpdmUgamVreWxsIGdlbSBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zICgjNDAxOCkKICAqIEZpeCBhIGZldyB0eXBvcyBhbmQgZm9ybWF0dGluZyBwcm9ibGVtcy4gKCM0MDIyKQogICogRml4IHByZXR0eSBwZXJtYWxpbmsgZXhhbXBsZSAoIzQwMjkpCiAgKiBOb3RlIHRoYXQgYF9jb25maWcueW1sYCBpcyBub3QgcmVsb2FkZWQgZHVyaW5nIHJlZ2VuZXJhdGlvbiAoIzQwMzQpCiAgKiBBcHBseSBjb2RlIGJsb2NrIGZpZ3VyZSBzeW50YXggdG8gYmxvY2tzIGluIENPTlRSSUJVVElORyAoIzQwNDYpCiAgKiBBZGQgamVreWxsLXNtYXJ0aWZ5IHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzNTcyKQoKIyMgMi41LjMgLyAyMDE0LTEyLTIyCgojIyMgQnVnIEZpeGVzCgogICogV2hlbiBjaGVja2luZyBhIE1hcmtkb3duIGV4dG5hbWUsIGluY2x1ZGUgcG9zaXRpb24gb2YgdGhlIGAuYCAoIzMxNDcpCiAgKiBGaXggYGpzb25pZnlgIExpcXVpZCBmaWx0ZXIgaGFuZGxpbmcgb2YgYm9vbGVhbiB2YWx1ZXMgKCMzMTU0KQogICogQWRkIGNvbW1hIHRvIHZhbHVlIG9mIGB2aWV3cG9ydGAgbWV0YSB0YWcgKCMzMTcwKQogICogU2V0IHRoZSBsaW5rIHR5cGUgZm9yIHRoZSBSU1MgZmVlZCB0byBgYXBwbGljYXRpb24vcnNzK3htbGAgKCMzMTc2KQogICogUmVmYWN0b3IgYCNhc19saXF1aWRgICgjMzE1OCkKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEV4Y2x1ZGUgYnVpbHQtaW4gYnVuZGxlcyBmcm9tIGJlaW5nIGFkZGVkIHRvIGNvdmVyYWdlIHJlcG9ydCAoIzMxODApCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBBZGQgYEBhbGZyZWR4aW5nYCB0byB0aGUgYEBqZWt5bGwvY29yZWAgdGVhbS4gOnRhZGE6ICgjMzIxOCkKICAqIERvY3VtZW50IHRoZSBgLXFgIG9wdGlvbiBmb3IgdGhlIGBidWlsZGAgYW5kIGBzZXJ2ZWAgY29tbWFuZHMgKCMzMTQ5KQogICogRml4IHNvbWUgbWlub3IgdHlwb3MvZmxvdyBmaXhlcyBpbiBkb2N1bWVudGF0aW9uIHdlYnNpdGUgY29udGVudCAoIzMxNjUpCiAgKiBBZGQgYGtlZXBfZmlsZXNgIHRvIGNvbmZpZ3VyYXRpb24gZG9jdW1lbnRhdGlvbiAoIzMxNjIpCiAgKiBSZXBlYXQgd2FybmluZyBhYm91dCBjbGVhbmluZyBvZiB0aGUgYGRlc3RpbmF0aW9uYCBkaXJlY3RvcnkgKCMzMTYxKQogICogQWRkIGpla3lsbC01MDBweC1lbWJlZCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzMTYzKQogICogU2ltcGxpZmllZCBwbGF0Zm9ybSBkZXRlY3Rpb24gaW4gR2VtZmlsZSBleGFtcGxlIGZvciBXaW5kb3dzICgjMzE3NykKICAqIEFkZCB0aGUgYGpla3lsbC1qYWxhbGlgIHBsdWdpbiBhZGRlZCB0byB0aGUgbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zLiAoIzMxOTgpCiAgKiBBZGQgVGFibGUgb2YgQ29udGVudHMgdG8gVHJvdWJsZXNob290aW5nIHBhZ2UgKCMzMTk2KQogICogQWRkIGBpbmxpbmVfaGlnaGxpZ2h0YCBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzIxMikKICAqIEFkZCBgamVreWxsLW1lcm1haWRgIHBsdWdpbiB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzMjIyKQoKIyMgMi41LjIgLyAyMDE0LTExLTE3CgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogYHBvc3RfdXJsYCBzaG91bGQgbWF0Y2ggYHBvc3QubmFtZWAgaW5zdGVhZCBvZiBzbHVncyBhbmQgZGF0ZXMgKCMzMDU4KQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCBidW5kbGUgcmVxdWlyZSBmb3IgYDpqZWt5bGxfcGx1Z2luc2AgKCMzMTE5KQogICogUmVtb3ZlIGR1cGxpY2F0ZSByZWdleHAgcGhyYXNlOiBgXlxBYCAoIzMwODkpCiAgKiBSZW1vdmUgZHVwbGljYXRlIGBDb252ZXJzaW9uIGVycm9yOmAgbWVzc2FnZSBpbiBgQ29udmVydGlibGVgICgjMzA4OCkKICAqIFByaW50IGZ1bGwgY29udmVyc2lvbiBlcnJvciBtZXNzYWdlIGluIGBSZW5kZXJlciNjb252ZXJ0YCAoIzMwOTApCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBDaGFuZ2UgdmFyaWFibGUgbmFtZXMgaW4gR29vZ2xlIEFuYWx5dGljcyBzY3JpcHQgKCMzMDkzKQogICogTWVudGlvbiBDU1YgZmlsZXMgaW4gdGhlIGRvY3MgZm9yIGRhdGEgZmlsZXMgKCMzMTAxKQogICogQWRkIHRyYWlsaW5nIHNsYXNoIHRvIGBwYWdpbmF0ZV9wYXRoYCBleGFtcGxlLiAoIzMwOTEpCiAgKiBHZXQgcmlkIG9mIG5vaWZuaW9mIChgZXhjZXJwdF9zZXBhcmF0b3JgKSAoIzMwOTQpCiAgKiBTYXNzIGltcHJvdmVtZW50cywgYXJvdW5kIG5lc3RpbmcgbW9zdGx5LiAoIzMxMjMpCiAgKiBBZGQgd2VibWVudGlvbnMuaW8gcGx1Z2luIHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzMTI3KQogICogQWRkIFNhc3MgbWl4aW5zIGFuZCB1c2UgdGhlbS4gKCMyOTA0KQogICogU2xpZ2h0bHkgY29tcHJlc3MgamVreWxsLXN0aWNrZXIuanBnLiAoIzMxMzMpCiAgKiBVcGRhdGUgZ3JpZGlzbSBhbmQgc2VwYXJhdGUgb3V0IHJlbGF0ZWQgYnV0IGN1c3RvbSBzdHlsZXMuICgjMzEzMikKICAqIEFkZCByZW1vdGUtaW5jbHVkZSBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzEzNikKCiMjIDIuNS4xIC8gMjAxNC0xMS0wOQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCBwYXRoIHNhbml0YXRpb24gYnVnIHJlbGF0ZWQgdG8gV2luZG93cyBkcml2ZSBuYW1lcyAoIzMwNzcpCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBBZGQgZGV2ZWxvcG1lbnQgdGltZSBkZXBlbmRlbmNpZXMgb24gbWluaXRlc3QgYW5kIHRlc3QtdW5pdCB0byBnZW1zcGVjIGZvciBjeWd3aW4gKCMzMDY0KQogICogVXNlIFRyYXZpcydzIGJ1aWx0LWluIGNhY2hpbmcuICgjMzA3NSkKCiMjIDIuNS4wIC8gMjAxNC0xMS0wNgoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFJlcXVpcmUgZ2VtcyBpbiBgOmpla3lsbF9wbHVnaW5zYCBHZW1maWxlIGdyb3VwIHVubGVzcyBgSkVLWUxMX05PX0JVTkRMRVJfUkVRVUlSRWAgaXMgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudC4gKCMyODY1KQogICogQ2VudHJhbGl6ZSBwYXRoIHNhbml0YXRpb24gaW4gdGhlIGBTaXRlYCBvYmplY3QgKCMyODgyKQogICogQWxsb3cgcGxhY2Vob2xkZXJzIGluIHBlcm1hbGlua3MgKCMzMDMxKQogICogQWxsb3cgdXNlcnMgdG8gc3BlY2lmeSB0aGUgbG9nIGxldmVsIHZpYSBgSkVLWUxMX0xPR19MRVZFTGAuICgjMzA2NykKICAqIEZhbmN5IEluZGV4aW5nIHdpdGggV0VCcmljayAoIzMwMTgpCiAgKiBBbGxvdyBFbnVtZXJhYmxlcyB0byBiZSB1c2VkIHdpdGggYHdoZXJlYCBmaWx0ZXIuICgjMjk4NikKICAqIE1ldGEgZGVzY3JpcHRpb25zIGluIHRoZSBzaXRlIHRlbXBsYXRlIG5vdyB1c2UgYHBhZ2UuZXhjZXJwdGAgaWYgaXQncyBhdmFpbGFibGUgKCMyOTY0KQogICogQ2hhbmdlIGluZGVudGF0aW9uIGluIGBoZWFkLmh0bWxgIG9mIHNpdGUgdGVtcGxhdGUgdG8gMiBzcGFjZXMgZnJvbSA0ICgjMjk3MykKICAqIFVzZSBhIGAkY29udGVudC13aWR0aGAgdmFyaWFibGUgaW5zdGVhZCBvZiBhIGZpeGVkIHZhbHVlIGluIHRoZSBzaXRlIHRlbXBsYXRlIENTUyAoIzI5NzIpCiAgKiBTdHJpcCBuZXdsaW5lcyBpbiBzaXRlIHRlbXBsYXRlIGA8bWV0YT5gIGRlc2NyaXB0aW9uLiAoIzI5ODIpCiAgKiBBZGQgbGluayB0byBhdG9tIGZlZWQgaW4gYGhlYWRgIG9mIHNpdGUgdGVtcGxhdGUgZmlsZXMgKCMyOTk2KQogICogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyAoIzI5OTQpCiAgKiBVc2UgYEhhc2gjZWFjaF9rZXlgIGluc3RlYWQgb2YgYEhhc2gja2V5cy5lYWNoYCB0byBzcGVlZCB1cCBpdGVyYXRpb24gb3ZlciBoYXNoIGtleXMuICgjMzAxNykKICAqIEZ1cnRoZXIgbWlub3IgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLiAoIzMwMjIpCiAgKiBBZGQgJ2InIGFuZCAncycgYWxpYXNlcyBmb3IgYnVpbGQgYW5kIHNlcnZlLCByZXNwZWN0aXZlbHkgKCMzMDY1KQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCBSb3VnZSdzIFJlZENhcnBldCBwbHVnaW4gaW50ZXJmYWNlIGludGVncmF0aW9uICgjMjk1MSkKICAqIFJlbW92ZSBgLS13YXRjaGAgZnJvbSB0aGUgc2l0ZSB0ZW1wbGF0ZSBibG9nIHBvc3Qgc2luY2UgaXQgZGVmYXVsdHMgdG8gd2F0Y2hpbmcgaW4gaW4gMi40LjAgKCMyOTIyKQogICogRml4IGNvZGUgZm9yIG1lZGlhIHF1ZXJ5IG1peGluIGluIHNpdGUgdGVtcGxhdGUgKCMyOTQ2KQogICogQWxsb3cgcG9zdCBVUkwncyB0byBoYXZlIGAuaHRtYCBleHRlbnNpb25zICgjMjkyNSkKICAqIGBVdGlscy5zbHVnaWZ5YDogRG9uJ3QgY3JlYXRlIG5ldyBvYmplY3RzIHdoZW4gZ3N1YmJpbmcgKCMyOTk3KQogICogVGhlIGpzb25pZnkgZmlsdGVyIHNob3VsZCBkZWVwLWNvbnZlcnQgdG8gTGlxdWlkIHdoZW4gZ2l2ZW4gYW4gQXJyYXkuICgjMzAzMikKICAqIEFwcGx5IGBqc29uaWZ5YCBmaWx0ZXIgdG8gSGFzaGVzIGRlZXBseSBhbmQgZWZmZWN0aXZlbHkgKCMzMDYzKQogICogVXNlIGAxMjcuMC4wLjFgIGFzIGRlZmF1bHQgaG9zdCBpbnN0ZWFkIG9mIGAwLjAuMC4wYCAoIzMwNTMpCiAgKiBJbiB0aGUgY2FzZSB0aGF0IGEgR2VtZmlsZSBkb2VzIG5vdCBleGlzdCwgZW5zdXJlIEpla3lsbCBkb2Vzbid0IGZhaWwgb24gcmVxdWlyaW5nIHRoZSBHZW1maWxlIGdyb3VwICgjMzA2NikKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEZpeCBhIHR5cG8gaW4gdGhlIGRvYyBibG9jayBmb3IgYEpla3lsbDo6VVJMLmVzY2FwZV9wYXRoYCAoIzMwNTIpCiAgKiBBZGQgaW50ZWdyYXRpb24gdGVzdCBmb3IgYGpla3lsbCBuZXcgLS1ibGFua2AgaW4gVGVzdFVuaXQgKCMyOTEzKQogICogQWRkIHVuaXQgdGVzdCBmb3IgYGpla3lsbCBuZXcgLS1mb3JjZWAgbG9naWMgKCMyOTI5KQogICogVXBkYXRlIG91dGRhdGVkIGNvbW1lbnQgZm9yIGBDb252ZXJ0aWJsZSN0cmFuc2Zvcm1gICgjMjk1NykKICAqIEFkZCBIYWtpcmkgYmFkZ2UgdG8gUkVBRE1FLiAoIzI5NTMpCiAgKiBBZGQgc29tZSBzaW1wbGUgYmVuY2htYXJraW5nIHRvb2xzLiAoIzI5OTMpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBgTk9LT0dJUklfVVNFX1NZU1RFTV9MSUJSQVJJRVM9dHJ1ZWAgKipkZWNyZWFzZXMqKiBpbnN0YWxsYXRpb24gdGltZS4gKCMzMDQwKQogICogQWRkIEZvcm1LZWVwIHRvIHJlc291cmNlcyBhcyBKZWt5bGwgZm9ybSBiYWNrZW5kICgjMzAxMCkKICAqIEZpeGluZyBhIG1pc3Rha2UgaW4gdGhlIG5hbWUgb2YgdGhlIG5ldyBMaXF1aWQgdGFnICgjMjk2OSkKICAqIFVwZGF0ZSBGb250IEF3ZXNvbWUgdG8gdjQuMi4wLiAoIzI4OTgpCiAgKiBGaXggbGluayB0byAjMjg5NSBpbiAyLjQuMCByZWxlYXNlIHBvc3QuICgjMjg5OSkKICAqIEFkZCBCaWcgRm9vdG5vdGVzIGZvciBLcmFtZG93biBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjkxNikKICAqIFJlbW92ZSB3YXJuaW5nIHJlZ2FyZGluZyBHSFAgdXNlIG9mIHNpbmd1bGFyIHR5cGVzIGZvciBmcm9udCBtYXR0ZXIgZGVmYXVsdHMgKCMyOTE5KQogICogRml4IHF1b3RlIGNoYXJhY3RlciB0eXBvIGluIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgdGVtcGxhdGVzICgjMjkxNykKICAqIFBvaW50IExpcXVpZCBsaW5rcyB0byBMaXF1aWTigJlzIEdpdEh1YiB3aWtpICgjMjg4NykKICAqIEFkZCBIVFRQIEJhc2ljIEF1dGggKC5odGFjY2VzcykgcGx1Z2luIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzI5MzEpCiAgKiAoTWlub3IpIEdyYW1tYXIgJiBgX2NvbmZpZy55bWxgIGZpbGVuYW1lIGZpeGVzICgjMjkxMSkKICAqIEFkZGVkIGBtYXRobWwucmJgIHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMuICgjMjkzNykKICAqIEFkZCBgLS1mb3JjZV9wb2xsaW5nYCB0byB0aGUgbGlzdCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMgKCMyOTQzKQogICogRXNjYXBlIHVuaWNvZGUgY2hhcmFjdGVycyBpbiBzaXRlIENTUyAoIzI5MDYpCiAgKiBBZGQgbm90ZSBhYm91dCB1c2luZyB0aGUgZ2l0aHViLXBhZ2VzIGdlbSB2aWEgcGFnZXMuZ2l0aHViLmNvbS92ZXJzaW9ucy5qc29uICgjMjkzOSkKICAqIFVwZGF0ZSB1c2FnZSBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgMi40IGF1dG8tZW5hYmxpbmcgb2YgYC0td2F0Y2hgLiAoIzI5NTQpCiAgKiBBZGQgYC0tc2tpcC1pbml0aWFsLWJ1aWxkYCB0byBjb25maWd1cmF0aW9uIGRvY3MgKCMyOTQ5KQogICogRml4IGEgbWlub3IgdHlwbyBpbiBUZW1wbGF0ZXMgZG9jcyBwYWdlICgjMjk1OSkKICAqIEFkZCBhIGRpdGFhLWRpdGFhIHBsdWdpbiB1bmRlciBPdGhlciBzZWN0aW9uIG9uIHRoZSBQbHVnaW5zIHBhZ2UgKCMyOTY3KQogICogQWRkIGBidWlsZC9zZXJ2ZSAtVmAgb3B0aW9uIHRvIGNvbmZpZ3VyYXRpb24gZG9jdW1lbnRhdGlvbiAoIzI5NDgpCiAgKiBBZGQgJ0pla3lsbCBUd2l0dGVyIFBsdWdpbicgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjk3OSkKICAqIERvY3M6IFVwZGF0ZSBub3JtYWxpemUuY3NzIHRvIHYzLjAuMi4gKCMyOTgxKQogICogRml4IHR5cG8gaW4gQ29udGludW91cyBJbnRlZ3JhdGlvbiBkb2N1bWVudGF0aW9uICgjMjk4NCkKICAqIENsYXJpZnkgYmVoYXZpb3Igb2YgYDpjYXRlZ29yaWVzYCBpbiBwZXJtYWxpbmtzICgjMzAxMSkKCiMjIDIuNC4wIC8gMjAxNC0wOS0wOQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFN1cHBvcnQgYSBuZXcgYHJlbGF0aXZlX2luY2x1ZGVgIHRhZyAoIzI4NzApCiAgKiBBdXRvLWVuYWJsZSB3YXRjaCBvbiAnc2VydmUnICgjMjg1OCkKICAqIFJlbmRlciBMaXF1aWQgaW4gQ29mZmVlU2NyaXB0IGZpbGVzICgjMjgzMCkKICAqIEFycmF5IExpcXVpZCBmaWx0ZXJzOiBgcHVzaGAsIGBwb3BgLCBgdW5zaGlmdGAsIGBzaGlmdGAgKCMyODk1KQogICogQWRkIGA6dGl0bGVgIHRvIGNvbGxlY3Rpb24gVVJMIHRlbXBsYXRlIGZpbGxlcnMgKCMyODY0KQogICogQWRkIHN1cHBvcnQgZm9yIENTViBmaWxlcyBpbiB0aGUgYF9kYXRhYCBkaXJlY3RvcnkgKCMyNzYxKQogICogQWRkIHRoZSBgbmFtZWAgdmFyaWFibGUgdG8gY29sbGVjdGlvbiBwZXJtYWxpbmtzICgjMjc5OSkKICAqIEFkZCBgaW5zcGVjdGAgbGlxdWlkIGZpbHRlci4gKCMyODY3KQogICogQWRkIGEgYHNsdWdpZnlgIExpcXVpZCBmaWx0ZXIgKCMyODgwKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIFVzZSBgSmVreWxsLnNhbml0aXplZF9wYXRoYCB3aGVuIGFkZGluZyBzdGF0aWMgZmlsZXMgdG8gQ29sbGVjdGlvbnMgKCMyODQ5KQogICogRml4IGVuY29kaW5nIG9mIGBtYWluLnNjc3NgIGluIHNpdGUgdGVtcGxhdGUgKCMyNzcxKQogICogRml4IG9yaWVudGF0aW9uIGJ1Z3MgaW4gZGVmYXVsdCBzaXRlIHRlbXBsYXRlICgjMjg2MikKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIFVwZGF0ZSBzaW1wbGVjb3YgZ2VtIHRvIDAuOSAoIzI3NDgpCiAgKiBSZW1vdmUgYGRvY3MvYCBkaXIgKCMyNzY4KQogICogYWRkIGNsYXNzIGA8PCBzZWxmYCBpZGlvbSB0byBgTmV3YCBjb21tYW5kICgjMjgxNykKICAqIEFsbG93IFRyYXZpcyB0byAncGFyYWxsZWxpemUnIG91ciB0ZXN0cyAoIzI4NTkpCiAgKiBGaXggdGVzdCBmb3IgTGlxdWlkIHJlbmRlcmluZyBpbiBTYXNzICgjMjg1NikKICAqIEZpeGluZyAidmVydHljYWwiIHR5cG8gaW4gc2l0ZSB0ZW1wbGF0ZSdzIGBfYmFzZS5zY3NzYCAoIzI4ODkpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBEb2N1bWVudCB0aGUgYG5hbWVgIHZhcmlhYmxlIGZvciBjb2xsZWN0aW9uIHBlcm1hbGlua3MgKCMyODI5KQogICogQWRkcyBpbmZvIGFib3V0IGluc3RhbGxpbmcgamVreWxsIGluIGN1cnJlbnQgZGlyICgjMjgzOSkKICAqIFJlbW92ZSBkZXByZWNhdGVkIGBqZWt5bGwtcHJvamVjdGxpc3RgIHBsdWdpbiBmcm9tIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzI3NDIpCiAgKiBSZW1vdmUgdGFnIHBsdWdpbnMgdGhhdCBhcmUgYnVpbHQgaW4gdG8gSmVreWxsICgjMjc1MSkKICAqIEFkZCBgbWFya2Rvd24td3JpdGVyYCBwYWNrYWdlIGZvciBBdG9tIEVkaXRvciB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNzYzKQogICogRml4IHR5cG8gaW4gc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBjb2xsZWN0aW9ucyAoIzI3NjQpCiAgKiBGaXggbWlub3IgdHlwbyBvbiBwbHVnaW5zIGRvY3MgcGFnZSAoIzI3NjUpCiAgKiBSZXBsYWNlIG1hcmtkb3duIHdpdGggSFRNTCBpbiBgc2Fzc19kaXJgIG5vdGUgb24gYXNzZXRzIHBhZ2UgKCMyNzkxKQogICogRml4ZWQgImJlbGxvdyIgdHlwbyBpbiBkYXRhZmlsZXMgZG9jcyAoIzI4NzkpCiAgKiBGaXggY29kZS9tYXJrZG93biBpc3N1ZSBpbiBkb2N1bWVudGF0aW9uIGZvciB2YXJpYWJsZXMgKCMyODc3KQogICogUmVtb3ZlIEdvb2QgSW5jbHVkZSB0aGlyZC1wYXJ0eSBwbHVnaW4gZnJvbSBwbHVnaW5zIHBhZ2UgKCMyODgxKQogICogQWRkIHNvbWUgbW9yZSBkb2NzIG9uIGBpbmNsdWRlX3JlbGF0aXZlYCAoIzI4ODQpCgojIyAyLjMuMCAvIDIwMTQtMDgtMTAKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBBbGxvdyBDb252ZXJ0aWJsZXMgdG8gYmUgY29udmVydGVkIGJ5ID49IDEgY29udmVydGVycyAoIzI3MDQpCiAgKiBBbGxvdyBTYXNzIGZpbGVzIHRvIGJlIHJlbmRlcmVkIGluIExpcXVpZCwgYnV0IG5ldmVyIHBsYWNlIHRoZW0gaW4gbGF5b3V0cy4gKCMyNzMzKQogICogQWRkIGBqZWt5bGwgaGVscGAgY29tbWFuZCAoIzI3MDcpCiAgKiBVc2UgYC5zY3NzYCBmb3IgYHNpdGVfdGVtcGxhdGVgIHN0eWxlcy4gKCMyNjY3KQogICogRG9uJ3QgcmVxdWlyZSB0aGUgYHNjb3BlYCBrZXkgaW4gZnJvbnQgbWF0dGVyIGRlZmF1bHRzICgjMjY1OSkKICAqIE5vIGxvbmdlciBzZXQgYHBlcm1hbGluazogcHJldHR5YCBpbiB0aGUgYF9jb25maWcueW1sYCBmb3IgdGhlIHNpdGUgdGVtcGxhdGUgKCMyNjgwKQogICogUmV3b3JrIHNpdGUgdGVtcGxhdGUgdG8gdXRpbGl6ZSBTYXNzICgjMjY4NykKICAqIE5vdGlmeSB0aGUgdXNlciB3aGVuIGF1dG8tcmVnZW5lcmF0aW9uIGlzIGRpc2FibGVkLiAoIzI2OTYpCiAgKiBBbGxvdyBwYXJ0aWFsIHZhcmlhYmxlcyBpbiBpbmNsdWRlIHRhZyBmaWxlbmFtZSBhcmd1bWVudCAoIzI2OTMpCiAgKiBNb3ZlIGluc3RhbmNlcyBvZiBgVGltZS5wYXJzZWAgaW50byBhIFV0aWxzIG1ldGhvZCAoIzI2ODIpCiAgKiBJZ25vcmUgc3ViZm9sZGVycyBpbiB0aGUgYF9wb3N0c2AgZm9sZGVyICgjMjcwNSkgUkVWRVJUUyAoIzI2MzMpCiAgKiBGcm9udCBNYXR0ZXIgZGVmYXVsdCB0eXBlcyBzaG91bGQgYWx3YXlzIGJlIHBsdXJhbGl6ZWQgKCMyNzMyKQogICogUmVhZCBpbiBzdGF0aWMgZmlsZXMgaW50byBgY29sbGVjdGlvbi5maWxlc2AgYXMgYFN0YXRpY0ZpbGVgcyAoIzI3MzcpCiAgKiBBZGQgYHNhc3NpZnlgIGFuZCBgc2Nzc2lmeWAgTGlxdWlkIGZpbHRlcnMgKCMyNzM5KQogICogUmVwbGFjZSBgY2xhc3NpZmllcmAgZ2VtIHdpdGggYGNsYXNzaWZpZXItcmVib3JuYCAoIzI3MjEpCgojIyMgQnVnIEZpeGVzCgogICogVXNlIG9ubHkgdGhlIGxhc3QgZXh0bmFtZSB3aGVuIG11bHRpcGxlIGNvbnZlcnRlcnMgZXhpc3QgKCMyNzIyKQogICogQ2FsbCBgI3RvX2xpcXVpZGAgYmVmb3JlIGNhbGxpbmcgYCN0b19qc29uYCBpbiBqc29uaWZ5IGZpbHRlciAoIzI3MjkpCiAgKiBVc2Ugbm9uIHBhZGRlZCBjb25maWcgaW4gYHN0cmZ0aW1lYCB0byBhdm9pZCBwYXJzZSBzdHJpbmcgdHdpY2UgKCMyNjczKQogICogUmVwbGFjZSBkZXByZWNhdGVkIFJ1YnkgbWV0aG9kcyB3aXRoIHVuZGVwcmVjYXRlZCBvbmVzICgjMjY2NCkKICAqIENhdGNoIGVycm9ycyB3aGVuIHBhcnNpbmcgUG9zdCBgZGF0ZWAgZnJvbnQgbWF0dGVyIHZhbHVlICYgcHJvZHVjZSBuaWNlIGVycm9yIG1lc3NhZ2UgKCMyNjQ5KQogICogQWxsb3cgc3RhdGljIGZpbGVzIGluIENvbGxlY3Rpb25zICgjMjYxNSkKICAqIEZpeGVkIHR5cG8gaW4gYERlcHJlY2F0b3IjZ3JhY2VmdWxseV9yZXF1aXJlYCBlcnJvciBtZXNzYWdlICgjMjY5NCkKICAqIFJlbW92ZSBwcmVlbXB0aXZlIGxvYWRpbmcgb2YgdGhlICdjbGFzc2lmaWVyJyBnZW0uICgjMjY5NykKICAqIFVzZSBjYXNlLWluc2Vuc2l0aXZlIGNoZWNraW5nIGZvciB0aGUgZmlsZSBleHRlbnNpb25zIHdoZW4gbG9hZGluZyBjb25maWcgZmlsZXMgKCMyNzE4KQogICogV2hlbiBSZWFkaW5nIERvY3VtZW50cywgUmVzcGVjdCBgZW5jb2RpbmdgIE9wdGlvbiAoIzI3MjApCiAgKiBSZWZhY3RvciBiYXNlZCBvbiBqZWt5bGwtd2F0Y2ggY2xlYW4tdXAuICgjMjcxNikKICAqIGBEb2N1bWVudCN0b19zYCBzaG91bGQgcHJvZHVjZSBqdXN0IHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudCAoIzI3MzEpCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBPbmx5IGluY2x1ZGUgbGliIGZpbGVzIGluIHRoZSBnZW0gKCMyNjcxKQogICogRml4IGBnaXQgZGlmZmAgY29tbWFuZCBpbiBgcHJvb2ZgIHNjcmlwdCAoIzI2NzIpCiAgKiBNYWtlIGRlZmF1bHQgcmFrZSB0YXNrIGEgbXVsdGl0YXNrIHNvIHRlc3RzIHJ1biBpbiBwYXJhbGxlbCAoIzI3MzUpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBVc2UgU2FzcyBhbmQgYSBEb2NzIENvbGxlY3Rpb24gKCMyNjUxKQogICogQWRkIGBsYXRlc3RfdmVyc2lvbi50eHRgIGZpbGUgdG8gdGhlIHNpdGUgKCMyNzQwKQogICogQmUgbW9yZSBhbWJpZ3VvdXMgYWJvdXQgYHBhZ2UuY29udGVudGAuIEJ1dCBtb3JlIHRyYW5zcGFyZW50LiAoIzI1MjIpCiAgKiBTdHJlYW1saW5pbmcgZnJvbnQgbWF0dGVyIHdvcmRpbmcgKGluc3RlYWQgb2YgZnJvbnQtbWF0dGVyL2Zyb250bWF0dGVyKSAoIzI2NzQpCiAgKiBBZGQgbm90ZSB0aGF0IHNvdXJjZSBkaXJlY3RvcnkgY2Fubm90IGJlIG1vZGlmaWVkIGluIEdpdEh1YiBQYWdlcyAoIzI2NjkpCiAgKiBGaXggbGlua3MgZnJvbSAjMjY2OSB0byBiZSBhY3R1YWwgSFRNTC4gV2hvb3BzLiAoIzI2NzkpCiAgKiBBZGQgbGluayB0byBgamVreWxsLXNsaW1gIGluIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzI2ODkpCiAgKiBBZGQgQmFycnkgQ2xhcmsncyBTbWFzaGluZyBNYWdhemluZSB0dXRvcmlhbCB0byByZXNvdXJjZXMgcGFnZSAoIzI2ODgpCiAgKiBSZW9yZ2FuaXplIGFuZCB1cGRhdGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHNldHRpbmdzICgjMjQ1NikKICAqIEZpeGluZyBpbmRlbnRhdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBkb2NzIGFib3V0IFJlZGNhcnBldCBleHRzICgjMjcxNykKICAqIFVzZSBgbnVsbGAgaW4gWUFNTCBpbnN0ZWFkIG9mIGBuaWxgIGluIGRlZmF1bHQgY29uZmlnIGxpc3QgKCMyNzE5KQogICogRml4IHR5cG8gaW4gQ29udGludW91cyBJbnRlZ3JhdGlvbiBkb2NzICgjMjcwOCkKCiMjIDIuMi4wIC8gMjAxNC0wNy0yOQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFRocm93IGEgd2FybmluZyBpZiB0aGUgc3BlY2lmaWVkIGxheW91dCBkb2VzIG5vdCBleGlzdCAoIzI2MjApCiAgKiBXaGl0ZWxpc3QgUHlnbWVudHMgb3B0aW9ucyBpbiBzYWZlIG1vZGUgKCMyNjQyKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIFJlbW92ZSB1bm5lY2Vzc2FyeSBgSmVreWxsOjpUYWdzOjpJbmNsdWRlVGFnI2JsYW5rP2AgbWV0aG9kICgjMjYyNSkKICAqIENhdGVnb3JpZXMgaW4gdGhlIHBhdGggYXJlIGlnbm9yZWQgKCMyNjMzKQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogUmVmYWN0b3JpbmcgRXJyb3JzICYgUmVxdWlyZXMgb2YgVGhpcmQtUGFydHkgc3R1ZmYgKCMyNTkxKQogICogQWRkIGZ1cnRoZXIgdGVzdHMgZm9yIGNhdGVnb3JpZXMgKCMyNTg0KQogICogUHJvb2Ygc2l0ZSB3aXRoIGh0bWwtcHJvb2ZlciBvbiBjaGFuZ2UgKCMyNjA1KQogICogRml4IHVwIGJ1ZyBpbiAjMjYwNSB3aGljaCBjYXVzZWQgcHJvb2ZpbmcgdGhlIHNpdGUgbm90IHRvIGZ1bmN0aW9uICgjMjYwOCkKICAqIFVzZSBgYnVuZGxlIGV4ZWNgIGluIGBzY3JpcHQvcHJvb2ZgICgjMjYxMCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIFVwZGF0ZSBLcmFtZG93biB1cmxzICgjMjU4OCkKICAqIEFkZCBgSmVreWxsOjpBdXRvbGlua0VtYWlsYCBhbmQgYEpla3lsbDo6R2l0TWV0YWRhdGFgIHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNTk2KQogICogRml4IGEgYnVuY2ggb2YgYnJva2VuIGxpbmtzIGluIHRoZSBzaXRlICgjMjYwMSkKICAqIFJlcGxhY2UgZGVhZCBsaW5rcyB3aXRoIHdvcmtpbmcgbGlua3MgKCMyNjExKQogICogQWRkIGpla3lsbC1ob29rIHRvIGRlcGxveW1lbnQgbWV0aG9kcyAoIzI2MTcpCiAgKiBBZGRlZCBrcmFtZG93bi13aXRoLXB5Z21lbnRzIHBsdWdpbiB0byB0aGUgbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjYyMykKICAqIFVwZGF0ZSBvdXRkYXRlZCAiRXh0cmFzIiBwYWdlIGFuZCByZW1vdmUgZHVwbGljYXRlIGRvY3VtZW50YXRpb24gKCMyNjIyKQogICogQWRkIGNvMiBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjYzOSkKICAqIEF0dGVtcHQgdG8gY2xhcmlmeSB0aGUgd2F5IFNhc3MgaW1wb3J0cyBoYXBwZW4gKCMyNjQyKQoKIyMgMi4xLjEgLyAyMDE0LTA3LTAxCgojIyMgQnVnIEZpeGVzCgogICogUGF0Y2ggcmVhZCB2dWxuZXJhYmlsaXRpZXMgZm9yIGRhdGEgJiBjb25maXJtIG5vbmUgZm9yIGxheW91dHMgKCMyNTYzKQogICogVXBkYXRlIE1hcnVrdSBkZXBlbmRlbmN5IHRvIGFsbG93IHVzZSBvZiB0aGUgbGF0ZXN0IHZlcnNpb24gKCMyNTc2KQogICogUmVtb3ZlIGNvbmRpdGlvbmFsIGFzc2lnbm1lbnQgZnJvbSBkb2N1bWVudCBVUkwgdG8gcHJldmVudCBzdGFsZSB1cmxzICgjMjU3NSkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIEFkZCB2ZXJ0aWNhbCBtYXJnaW4gdG8gYGhpZ2hsaWdodGAgdG8gc2VwYXJhdGUgY29kZSBibG9ja3MgKCMyNTU4KQogICogQWRkIGBodG1sX3BhZ2VzYCB0byBWYXJpYWJsZXMgZG9jcyAoIzI1NjcpCiAgKiBGaXhlZCBicm9rZW4gbGluayB0byBQZXJtYWxpbmtzIHBhZ2UgKCMyNTcyKQogICogVXBkYXRlIGxpbmsgdG8gV2luZG93cyBpbnN0YWxsYXRpb24gZ3VpZGUgKCMyNTc4KQoKIyMgMi4xLjAgLyAyMDE0LTA2LTI4CgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQnVtcCB0byB0aGUgbGF0ZXN0IExpcXVpZCB2ZXJzaW9uLCAyLjYuMSAoIzI0OTUpCiAgKiBBZGQgc3VwcG9ydCBmb3IgSlNPTiBmaWxlcyBpbiB0aGUgYF9kYXRhYCBkaXJlY3RvcnkgKCMyMzY5KQogICogQWxsb3cgc3ViY2xhc3NlcyB0byBvdmVycmlkZSBgRVhDRVJQVF9BVFRSSUJVVEVTX0ZPUl9MSVFVSURgICgjMjQwOCkKICAqIEFkZCBgSmVreWxsLmVudmAgYW5kIGBqZWt5bGwuZW52aXJvbm1lbnRgICh0aGUgTGlxdWlkIHZhcikgKCMyNDE3KQogICogVXNlIGBfY29uZmlnLnlhbWxgIG9yIGBfY29uZmlnLnltbGAgKGAueW1sYCB0YWtlcyBwcmVjZWRlbmNlKSAoIzI0MDYpCiAgKiBPdmVycmlkZSBjb2xsZWN0aW9uIHVybCB0ZW1wbGF0ZSAoIzI0MTgpCiAgKiBBbGxvdyBzdWJkaXJlY3RvcmllcyBpbiBgX2RhdGFgICgjMjM5NSkKICAqIEV4dHJhY3QgUGFnaW5hdGlvbiBHZW5lcmF0b3IgaW50byBnZW06IGBqZWt5bGwtcGFnaW5hdGVgICgjMjQ1NSkKICAqIFV0aWxpemUgYGRhdGVfdG9fcmZjODIyYCBmaWx0ZXIgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzI0MzcpCiAgKiBBZGQgY2F0ZWdvcmllcywgbGFzdCBidWlsZCBkYXRldGltZSwgYW5kIGdlbmVyYXRvciB0byBzaXRlIHRlbXBsYXRlIGZlZWQgKCMyNDM4KQogICogQ29uZmlndXJhYmxlLCByZXBsYWNlYWJsZSBMb2dnZXItY29tcGxpYW50IGxvZ2dlciAoIzI0NDQpCiAgKiBFeHRyYWN0IGBnaXN0YCB0YWcgaW50byBhIHNlcGFyYXRlIGdlbSAoIzI0NjkpCiAgKiBBZGQgYGNvbGxlY3Rpb25gIGF0dHJpYnV0ZSB0byBgRG9jdW1lbnQjdG9fbGlxdWlkYCB0byBhY2Nlc3MgdGhlIGRvY3VtZW50J3MgY29sbGVjdGlvbiBsYWJlbC4gKCMyNDM2KQogICogVXBncmFkZSBsaXN0ZW4gdG8gYDIuNy42IDw9IHggPCAzLjAuMGAgKCMyNDkyKQogICogQWxsb3cgY29uZmlndXJhdGlvbiBvZiBkaWZmZXJlbnQgVHdpdHRlciBhbmQgR2l0SHViIHVzZXJuYW1lcyBpbiBzaXRlIHRlbXBsYXRlICgjMjQ4NSkKICAqIEJ1bXAgUHlnbWVudHMgdG8gdjAuNi4wICgjMjUwNCkKICAqIEZyb250IG1hdHRlciBkZWZhdWx0cyBmb3IgZG9jdW1lbnRzIGluIGNvbGxlY3Rpb25zICgjMjQxOSkKICAqIEluY2x1ZGUgZmlsZXMgd2l0aCBhIHVybCB3aGljaCBlbmRzIGluIGAvYCBpbiB0aGUgYHNpdGUuaHRtbF9wYWdlc2AgbGlzdCAoIzI1MjQpCiAgKiBNYWtlIGBoaWdobGlnaHRgIHRhZyB1c2UgYGxhbmd1YWdlLWAgcHJlZml4IGluIENTUyBjbGFzcyAoIzI1MTEpCiAgKiBMb29rdXAgaXRlbSBwcm9wZXJ0eSB2aWEgYGl0ZW0jdG9fbGlxdWlkYCBiZWZvcmUgYCNkYXRhYCBvciBgI1tdYCBpbiBmaWx0ZXJzICgjMjQ5MykKICAqIFNraXAgaW5pdGlhbCBidWlsZCBvZiBzaXRlIG9uIHNlcnZlIHdpdGggZmxhZyAoIzI0NzcpCiAgKiBBZGQgc3VwcG9ydCBmb3IgYGhsX2xpbmVzYCBpbiBgaGlnaGxpZ2h0YCB0YWcgKCMyNTMyKQogICogU3Bpa2Ugb3V0IGAtLXdhdGNoYCBmbGFnIGludG8gYSBzZXBhcmF0ZSBnZW0gKCMyNTUwKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIExpcXVpZCBgc29ydGAgZmlsdGVyIHNob3VsZCBzb3J0IGV2ZW4gaWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgYG5pbGAgKCMyMzQ1KQogICogUmVtb3ZlIHBhZGRpbmcgb24gYHByZSBjb2RlYCBpbiB0aGUgc2l0ZSB0ZW1wbGF0ZSBDU1MgKCMyMzgzKQogICogU2V0IGBsb2dfbGV2ZWxgIGVhcmxpZXIgdG8gc2lsZW5jZSBpbmZvIGxldmVsIGNvbmZpZ3VyYXRpb24gb3V0cHV0ICgjMjM5MykKICAqIE9ubHkgbGlzdCBwYWdlcyB3aGljaCBoYXZlIGB0aXRsZWAgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzI0MTEpCiAgKiBBY2NlcHQgYE51bWVyaWNgIHZhbHVlcyBmb3IgZGF0ZXMsIG5vdCBgTnVtYmVyYCB2YWx1ZXMgKCMyMzc3KQogICogUHJldmVudCBjb2RlIGZyb20gb3ZlcmZsb3dpbmcgY29udGFpbmVyIGluIHNpdGUgdGVtcGxhdGUgKCMyNDI5KQogICogRW5jb2RlIFVSTHMgaW4gVVRGLTggd2hlbiBlc2NhcGluZyBhbmQgdW5lc2NhcGluZyAoIzI0MjApCiAgKiBObyBMYXlvdXRzIG9yIExpcXVpZCBmb3IgQXNzZXQgRmlsZXMgKCMyNDMxKQogICogQWxsb3cgZnJvbnQgbWF0dGVyIGRlZmF1bHRzIHRvIHNldCBwb3N0IGNhdGVnb3JpZXMgKCMyMzczKQogICogRml4IGNvbW1hbmQgaW4gc3ViY29tbWFuZCBkZXByZWNhdGlvbiB3YXJuaW5nICgjMjQ1NykKICAqIEtlZXAgYWxsIHBhcmVudCBkaXJlY3RvcmllcyBvZiBmaWxlcy9kaXJzIGluIGBrZWVwX2ZpbGVzYCAoIzI0NTgpCiAgKiBXaGVuIHVzaW5nIFJlZENhcnBldCBhbmQgUm91Z2Ugd2l0aG91dCBSb3VnZSBpbnN0YWxsZWQsIGZpeGVkIGVycm9uZW91cyBlcnJvciB3aGljaCBzdGF0ZWQgdGhhdCByZWRjYXJwZXQgd2FzIG1pc3NpbmcsIG5vdCByb3VnZS4gKCMyNDY0KQogICogSWdub3JlICphbGwqIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyB0aGF0IG1lcml0IGl0IG9uIGF1dG8tZ2VuZXJhdGlvbiAoIzI0NTkpCiAgKiBCZWZvcmUgY29weWluZyBmaWxlLCBleHBsaWNpdGx5IHJlbW92ZSB0aGUgb2xkIG9uZSAoIzI1MzUpCiAgKiBNZXJnZSBmaWxlIHN5c3RlbSBjYXRlZ29yaWVzIHdpdGggY2F0ZWdvcmllcyBmcm9tIFlBTUwuICgjMjUzMSkKICAqIERlZXAgbWVyZ2UgZnJvbnQgbWF0dGVyIGRlZmF1bHRzICgjMjQ5MCkKICAqIEVuc3VyZSBleGNsdWRlIGFuZCBpbmNsdWRlIGFycmF5cyBhcmUgYXJyYXlzIG9mIHN0cmluZ3MgKCMyNTQyKQogICogQWxsb3cgY29sbGVjdGlvbnMgdG8gaGF2ZSBkb3RzIGluIHRoZWlyIGZpbGVuYW1lcyAoIzI1NTIpCiAgKiBDb2xsZWN0aW9ucyBzaG91bGRuJ3QgdHJ5IHRvIHJlYWQgaW4gZGlyZWN0b3JpZXMgYXMgZmlsZXMgKCMyNTUyKQogICogQmUgcXVpZXQgdmVyeSBxdWlja2x5LiAoIzI1MjApCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBUZXN0IFJ1YnkgMi4xLjIgaW5zdGVhZCBvZiAyLjEuMSAoIzIzNzQpCiAgKiBBZGQgdGVzdCBmb3Igc29ydGluZyBVVEYtOCBjaGFyYWN0ZXJzICgjMjM4NCkKICAqIFVzZSBgaHR0cHNgIGZvciBHaXRIdWIgbGlua3MgaW4gZG9jdW1lbnRhdGlvbiAoIzI0NzApCiAgKiBSZW1vdmUgY292ZXJhZ2UgcmVwb3J0aW5nIHdpdGggQ292ZXJhbGxzICgjMjQ5NCkKICAqIEZpeCBhIGJpdCBvZiBtaXNzaW5nIFRvbURvYyB0byBgSmVreWxsOjpDb21tYW5kczo6QnVpbGQjYnVpbGRgICgjMjU1NCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIFNldCBgdGltZXpvbmVgIHRvIGBBbWVyaWNhL0xvc19BbmdlbGVzYCAoIzIzOTQpCiAgKiBJbXByb3ZlIEphdmFTY3JpcHQgaW4gYGFuY2hvcl9saW5rcy5odG1sYCAoIzIzNjgpCiAgKiBSZW1vdmUgbm90ZSBvbiBRdWlja3N0YXJ0IHBhZ2UgYWJvdXQgZGVmYXVsdCBtYXJrZG93biBjb252ZXJ0ZXIgKCMyMzg3KQogICogUmVtb3ZlIGJyb2tlbiBsaW5rIGluIGV4dHJhcy5tZCB0byBhIE1hcnVrdSBmb3JrICgjMjQwMSkKICAqIFVwZGF0ZSBGb250IEF3ZXNvbWUgdG8gdjQuMS4wLiAoIzI0MTApCiAgKiBGaXggYnJva2VuIGxpbmsgb24gSW5zdGFsbGF0aW9uIHBhZ2UgdG8gVGVtcGxhdGVzIHBhZ2UgKCMyNDIxKQogICogUHJldmVudCB0YWJsZSBmcm9tIGV4dGVuZGluZyBwYXJlbnQgd2lkdGggaW4gcGVybWFsaW5rIHN0eWxlIHRhYmxlICgjMjQyNCkKICAqIEFkZCBjb2xsZWN0aW9ucyB0byBpbmZvIGFib3V0IHBhZ2luYXRpb24gc3VwcG9ydCAoIzIzODkpCiAgKiBBZGQgYGpla3lsbF9naXRodWJfc2FtcGxlYCBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjQ2MykKICAqIENsYXJpZnkgZG9jdW1lbnRhdGlvbiBhcm91bmQgZnJvbnQgbWF0dGVyIGRlZmF1bHRzIGFuZCBhZGQgZGV0YWlscyBhYm91dCBkZWZhdWx0cyBmb3IgY29sbGVjdGlvbnMuICgjMjQzOSkKICAqIEFkZCBKZWt5bGwgUHJvamVjdCBWZXJzaW9uIFRhZyB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNDY4KQogICogVXNlIGBodHRwc2AgZm9yIEdpdEh1YiBsaW5rcyBhY3Jvc3Mgd2hvbGUgc2l0ZSAoIzI0NzApCiAgKiBBZGQgU3RpY2tlck11bGUgKyBKZWt5bGwgcG9zdCAoIzI0NzYpCiAgKiBBZGQgSmVreWxsIEFzc2V0IFBpcGVsaW5lIFJlYm9ybiB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNDc5KQogICogQWRkIGxpbmsgdG8gamVreWxsLWNvbXByZXNzLWh0bWwgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjUxNCkKICAqIEFkZCBQaXdpZ28gR2FsbGVyeSB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNTI2KQogICogU2V0IGBzaG93X2RyYWZ0c2AgdG8gYGZhbHNlYCBpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbGlzdGluZyAoIzI1MzYpCiAgKiBQcm92aWRlIGFuIHVwZGF0ZWQgbGluayBmb3IgV2luZG93cyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zICgjMjU0NCkKICAqIFJlbW92ZSBgdXJsYCBmcm9tIGNvbmZpZ3VyYXRpb24gZG9jcyAoIzI1NDcpCiAgKiBEb2N1bWVudGF0aW9uIGZvciBDb250aW51b3VzIEludGVncmF0aW9uIGZvciB5b3VyIEpla3lsbCBTaXRlICgjMjQzMikKCiMjIDIuMC4zIC8gMjAxNC0wNS0wOAoKIyMjIEJ1ZyBGaXhlcwoKICAqIFByb3Blcmx5IHByZWZpeCBsaW5rcyBpbiBzaXRlIHRlbXBsYXRlIHdpdGggVVJMIG9yIGJhc2V1cmwgZGVwZW5kaW5nIHVwb24gbmVlZC4gKCMyMzE5KQogICogVXBkYXRlIGdpc3QgdGFnIGNvbW1lbnRzIGFuZCBlcnJvciBtZXNzYWdlIHRvIHJlcXVpcmUgdXNlcm5hbWUgKCMyMzI2KQogICogRml4IGBwZXJtYWxpbmtgIHNldHRpbmcgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzIzMzEpCiAgKiBEb24ndCBmYWlsIGlmIGFueSBvZiB0aGUgcGF0aCBvYmplY3RzIGFyZSBuaWwgKCMyMzI1KQogICogSW5zdGFudGlhdGUgYWxsIGRlc2NlbmRhbnRzIGZvciBjb252ZXJ0ZXJzIGFuZCBnZW5lcmF0b3JzLCBub3QganVzdCBkaXJlY3Qgc3ViY2xhc3NlcyAoIzIzMzQpCiAgKiBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgYHNpdGUubmFtZWAgd2l0aCBgc2l0ZS50aXRsZWAgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzIzMjQpCiAgKiBgSmVreWxsOjpGaWx0ZXJzI3RpbWVgIG5vdyBhY2NlcHRzIFVOSVggdGltZXN0YW1wcyBpbiBzdHJpbmcgb3IgbnVtYmVyIGZvcm0gKCMyMzM5KQogICogVXNlIGBpdGVtX3Byb3BlcnR5YCBmb3IgYHdoZXJlYCBmaWx0ZXIgc28gaXQgZG9lc24ndCBicmVhayBvbiBjb2xsZWN0aW9ucyAoIzIzNTkpCiAgKiBSZXNjdWUgZXJyb3JzIHRocm93biBzbyBgLS13YXRjaGAgZG9lc24ndCBmYWlsICgjMjM2NCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIEFkZCBtaXNzaW5nICJhcyIgdG8gYXNzZXRzIGRvY3MgcGFnZSAoIzIzMzcpCiAgKiBVcGRhdGUgZG9jcyB0byByZWZsZWN0IG5ldyBgYmFzZXVybGAgZGVmYXVsdCAoIzIzNDEpCiAgKiBBZGQgbGlua3MgdG8gaGVhZGVycyB3aG8gaGF2ZSBhbiBJRC4gKCMyMzQyKQogICogVXNlIHN5bWJvbCBpbnN0ZWFkIG9mIEhUTUwgbnVtYmVyIGluIGB1cGdyYWRpbmcubWRgICgjMjM1MSkKICAqIEZpeCBsaW5rIHRvIGZyb250IG1hdHRlciBkZWZhdWx0cyBkb2NzICgjMjM1MykKICAqIEZpeCBmb3IgYEhpc3RvcnkubWFya2Rvd25gIGluIG9yZGVyIHRvIGZpeCBoaXN0b3J5IHBhZ2UgaW4gZG9jcyAoIzIzNjMpCgojIyAyLjAuMiAvIDIwMTQtMDUtMDcKCiMjIyBCdWcgRml4ZXMKCiAgKiBDb3JyZWN0IHVzZSBvZiBgdXJsYCBhbmQgYGJhc2V1cmxgIGluIHRoZSBzaXRlIHRlbXBsYXRlLiAoIzIzMTcpCiAgKiBEZWZhdWx0IGBiYXNldXJsYCB0byBgIiJgICgjMjMxNykKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIENvcnJlY3QgZG9jcyBmb3IgdGhlIGBnaXN0YCBwbHVnaW4gc28gaXQgYWx3YXlzIGluY2x1ZGVzIHRoZSB1c2VybmFtZS4gKCMyMzE0KQogICogQ2xhcmlmeSBuZXcgKGRlZmF1bHRzLCBgd2hlcmVgIGZpbHRlcikgZmVhdHVyZXMgaW4gZG9jcyAoIzIzMTYpCgojIyAyLjAuMSAvIDIwMTQtMDUtMDYKCiMjIyBCdWcgRml4ZXMKCiAgKiBSZXF1aXJlIGBrcmFtZG93bmAgZ2VtIGluc3RlYWQgb2YgYG1hcnVrdWAgZ2VtCgojIyAyLjAuMCAvIDIwMTQtMDUtMDYKCiMjIyBNYWpvciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgIkNvbGxlY3Rpb25zIiBmZWF0dXJlICgjMjE5OSkKICAqIEFkZCBnZW0tYmFzZWQgcGx1Z2luIHdoaXRlbGlzdCB0byBzYWZlIG1vZGUgKCMxNjU3KQogICogUmVwbGFjZSB0aGUgY29tbWFuZGVyIGNvbW1hbmQgbGluZSBwYXJzZXIgd2l0aCBhIG1vcmUgcm9idXN0IHNvbHV0aW9uIGZvciBvdXIgbmVlZHMgY2FsbGVkIGBtZXJjZW5hcnlgICgjMTcwNikKICAqIFJlbW92ZSBzdXBwb3J0IGZvciBSdWJ5IDEuOC54ICgjMTc4MCkKICAqIE1vdmUgdG8gamVreWxsL2pla3lsbCBmcm9tIG1vam9tYm8vamVreWxsICgjMTgxNykKICAqIEFsbG93IGN1c3RvbSBtYXJrZG93biBwcm9jZXNzb3JzICgjMTg3MikKICAqIFByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIFJvdWdlIHN5bnRheCBoaWdobGlnaHRlciAoIzE4NTkpCiAgKiBQcm92aWRlIHN1cHBvcnQgZm9yIFNhc3MgKCMxOTMyKQogICogUHJvdmlkZSBhIDMwMCUgaW1wcm92ZW1lbnQgd2hlbiBnZW5lcmF0aW5nIHNpdGVzIHRoYXQgdXNlIGBQb3N0I25leHRgIG9yIGBQb3N0I3ByZXZpb3VzYCAoIzE5ODMpCiAgKiBQcm92aWRlIHN1cHBvcnQgZm9yIENvZmZlZVNjcmlwdCAoIzE5OTEpCiAgKiBSZXBsYWNlIE1hcnVrdSB3aXRoIEtyYW1kb3duIGFzIERlZmF1bHQgTWFya2Rvd24gUHJvY2Vzc29yICgjMTk4OCkKICAqIEV4cG9zZSBgc2l0ZS5zdGF0aWNfZmlsZXNgIHRvIExpcXVpZCAoIzIwNzUpCiAgKiBDb21wbGV0ZSByZWRlc2lnbiBvZiB0aGUgdGVtcGxhdGUgc2l0ZSBnZW5lcmF0ZWQgYnkgYGpla3lsbCBuZXdgICgjMjA1MCkKICAqIFVwZGF0ZSBMaXN0ZW4gZnJvbSAxLnggdG8gMi54ICgjMjA5NykKICAqIEZyb250IG1hdHRlciBkZWZhdWx0cyAoIzIyMDUpCiAgKiBEZXByZWNhdGUgYHJlbGF0aXZlX3Blcm1hbGlua3NgIGNvbmZpZ3VyYXRpb24gb3B0aW9uIChkZWZhdWx0IHRvIGBmYWxzZWApICgjMjMwNykKICAqIEV4Y2x1ZGUgZmlsZXMgYmFzZWQgb24gcHJlZml4IGFzIHdlbGwgYXMgYGZubWF0Y2g/YCAoIzIzMDMpCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogTW92ZSB0aGUgRW50cnlGaWx0ZXIgY2xhc3MgaW50byB0aGUgSmVreWxsIG1vZHVsZSB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UgKCMxODAwKQogICogQWRkIGBncm91cF9ieWAgTGlxdWlkIGZpbHRlciBjcmVhdGUgbGlzdHMgb2YgaXRlbXMgZ3JvdXBlZCBieSBhIGNvbW1vbiBwcm9wZXJ0eSdzIHZhbHVlICgjMTc4OCkKICAqIEFkZCBzdXBwb3J0IGZvciBNYXJ1a3UncyBgZmVuY2VkX2NvZGVfYmxvY2tzYCBvcHRpb24gKCMxNzk5KQogICogVXBkYXRlIFJlZGNhcnBldCBkZXBlbmRlbmN5IHRvIH4+IDMuMCAoIzE4MTUpCiAgKiBBdXRvbWF0aWNhbGx5IHNvcnQgYWxsIHBhZ2VzIGJ5IG5hbWUgKCMxODQ4KQogICogQmV0dGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aW1lIGlzIG5vdCBwYXJzZWFibGUgKCMxODQ3KQogICogQWxsb3cgYGluY2x1ZGVgIHRhZyB2YXJpYWJsZSBhcmd1bWVudHMgdG8gdXNlIGZpbHRlcnMgKCMxODQxKQogICogYHBvc3RfdXJsYCB0YWcgc2hvdWxkIHJhaXNlIGBBcmd1bWVudEVycm9yYCBmb3IgaW52YWxpZCBuYW1lICgjMTgyNSkKICAqIEJ1bXAgZGVwZW5kZW5jeSBgbWVyY2VuYXJ5YCB0byBgfj4gMC4yLjBgICgjMTg3OSkKICAqIEJ1bXAgZGVwZW5kZW5jeSBgc2FmZV95YW1sYCB0byBgfj4gMS4wYCAoIzE4ODYpCiAgKiBBbGxvdyBzb3J0aW5nIG9mIGNvbnRlbnQgYnkgY3VzdG9tIHByb3BlcnRpZXMgKCMxODQ5KQogICogQWRkIGAtLXF1aWV0YCBmbGFnIHRvIHNpbGVuY2Ugb3V0cHV0IGR1cmluZyBidWlsZCBhbmQgc2VydmUgKCMxODk4KQogICogQWRkIGEgYHdoZXJlYCBmaWx0ZXIgdG8gZmlsdGVyIGFycmF5cyBiYXNlZCBvbiBhIGtleS92YWx1ZSBwYWlyICgjMTg3NSkKICAqIFJvdXRlIDQwNCBlcnJvcnMgdG8gYSBjdXN0b20gNDA0IHBhZ2UgaW4gZGV2ZWxvcG1lbnQgKCMxODk5KQogICogRXhjbHVkZXMgYXJlIG5vdyByZWxhdGl2ZSB0byB0aGUgc2l0ZSBzb3VyY2UgKCMxOTE2KQogICogQnJpbmcgTUlNRSBUeXBlcyBmaWxlIGZvciBgamVreWxsIHNlcnZlYCB0byBjb21wbGV0ZSBwYXJpdHkgd2l0aCBHSCBQYWdlcyBzZXJ2ZXJzICgjMTk5MykKICAqIEFkZGluZyBCcmVha3BvaW50IHRvIG1ha2UgbmV3IHNpdGUgdGVtcGxhdGUgbW9yZSByZXNwb25zaXZlICgjMjAzOCkKICAqIERlZmF1bHQgdG8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nIHdoZW4gcmVhZGluZyBmaWxlcy4gKCMyMDMxKQogICogVXBkYXRlIFJlZGNhcnBldCBkZXBlbmRlbmN5IHRvIH4+IDMuMSAoIzIwNDQpCiAgKiBSZW1vdmUgc3VwcG9ydCBmb3IgUnVieSAxLjkuMiAoIzIwNDUpCiAgKiBBZGQgYC5ta2Rvd25gIGFzIHZhbGlkIE1hcmtkb3duIGV4dGVuc2lvbiAoIzIwNDgpCiAgKiBBZGQgYGluZGV4LnhtbGAgdG8gdGhlIGxpc3Qgb2YgV0VCcmljayBkaXJlY3RvcnkgaW5kZXggZmlsZXMgKCMyMDQxKQogICogTWFrZSB0aGUgYGxheW91dHNgIGNvbmZpZyBrZXkgcmVsYXRpdmUgdG8gQ1dEIG9yIHRvIHNvdXJjZSAoIzIwNTgpCiAgKiBVcGRhdGUgS3JhbWRvd24gdG8gYH4+IDEuM2AgKCMxODk0KQogICogUmVtb3ZlIHVubmVjZXNzYXJ5IHJlZmVyZW5jZXMgdG8gYHNlbGZgICgjMjA5MCkKICAqIFVwZGF0ZSB0byBNZXJjZW5hcnkgdjAuMy54ICgjMjA4NSkKICAqIFNoaXAgU2FzcyBzdXBwb3J0IGFzIGEgc2VwYXJhdGUgZ2VtICgjMjA5OCkKICAqIEV4dHJhY3QgY29yZSBleHRlbnNpb25zIGludG8gYSBVdGlscyBtb2R1bGUgKCMyMTEyKQogICogUmVmYWN0b3IgQ0xJICYgQ29tbWFuZHMgRm9yIEdyZWF0ZXIgSGFwcGluZXNzICgjMjE0MykKICAqIFByb3ZpZGUgdXNlZnVsIGVycm9yIHdoZW4gUHlnbWVudHMgcmV0dXJucyBgbmlsYCBhbmQgZXJyb3Igb3V0ICgjMjE0OCkKICAqIEFkZCBzdXBwb3J0IGZvciB1bnB1Ymxpc2hlZCBkcmFmdHMgKCMyMTY0KQogICogQWRkIGBmb3JjZV9wb2xsaW5nYCBvcHRpb24gdG8gdGhlIGBzZXJ2ZWAgY29tbWFuZCAoIzIxNjUpCiAgKiBDbGVhbiB1cCB0aGUgYDxoZWFkPmAgaW4gdGhlIHNpdGUgdGVtcGxhdGUgKCMyMTg2KQogICogUGVybWl0IFlBTUwgYmxvY2tzIHRvIGVuZCB3aXRoIHRocmVlIGRvdHMgdG8gYmV0dGVyIGNvbmZvcm0gd2l0aCB0aGUgWUFNTCBzcGVjICgjMjExMCkKICAqIFVzZSBgRmlsZS5leGlzdD9gIGluc3RlYWQgb2YgZGVwcmVjYXRlZCBgRmlsZS5leGlzdHM/YCAoIzIyMTQpCiAgKiBSZXF1aXJlIG5ld2xpbmUgYWZ0ZXIgc3RhcnQgb2YgWUFNTCBGcm9udCBNYXR0ZXIgaGVhZGVyICgjMjIxMSkKICAqIEFkZCB0aGUgYWJpbGl0eSBmb3IgcGFnZXMgdG8gYmUgbWFya2VkIGFzIGBwdWJsaXNoZWQ6IGZhbHNlYCAoIzE0OTIpCiAgKiBBZGQgYEpla3lsbDo6TGlxdWlkRXh0ZW5zaW9uc2Agd2l0aCBgLmxvb2t1cF92YXJpYWJsZWAgbWV0aG9kIGZvciBlYXN5IGxvb2tpbmcgdXAgb2YgdmFyaWFibGUgdmFsdWVzIGluIGEgTGlxdWlkIGNvbnRleHQuICgjMjI1MykKICAqIFJlbW92ZSBsaXRlcmFsIGxhbmcgbmFtZSBmcm9tIGNsYXNzICgjMjI5MikKICAqIFJldHVybiBgdXRmLThgIGVuY29kaW5nIGluIGhlYWRlciBmb3Igd2VicmljayBlcnJvciBwYWdlIHJlc3BvbnNlICgjMjI4OSkKICAqIE1ha2UgdGVtcGxhdGUgc2l0ZSBlYXNpZXIgdG8gY3VzdG9taXplICgjMjI2OCkKICAqIEFkZCB0d28tZGlnaXQgeWVhciB0byBwZXJtYWxpbmsgdGVtcGxhdGUgb3B0aW9uICgjMjMwMSkKICAqIEFkZCBgc2l0ZS5kb2N1bWVudHNgIHRvIExpcXVpZCBwYXlsb2FkIChsaXN0IG9mIGFsbCBkb2NzKSAoIzIyOTUpCiAgKiBUYWtlIGludG8gYWNjb3VudCBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgTGlxdWlkIHNvcnQgZmlsdGVyICgjMjI5OSkKCiMjIyBCdWcgRml4ZXMKCiAgKiBEb24ndCBhbGxvdyBuaWwgZW50cmllcyB3aGVuIGxvYWRpbmcgcG9zdHMgKCMxNzk2KQogICogUmVtb3ZlIHRoZSBzY3JvbGxiYXIgdGhhdCdzIGFsd2F5cyBkaXNwbGF5ZWQgaW4gbmV3IHNpdGVzIGdlbmVyYXRlZCBmcm9tIHRoZSBzaXRlIHRlbXBsYXRlICgjMTgwNSkKICAqIEFkZCBgI3BhdGhgIHRvIHJlcXVpcmVkIG1ldGhvZHMgaW4gYEpla3lsbDo6Q29udmVydGlibGVgICgjMTg2NikKICAqIERlZmF1bHQgTWFydWt1IGZlbmNlZCBjb2RlIGJsb2NrcyB0byBPTiBmb3IgMi4wLjAtZGV2ICgjMTgzMSkKICAqIENoYW5nZSBzaG9ydCBvcHRzIGZvciBob3N0IGFuZCBwb3J0IGZvciBgamVreWxsIGRvY3NgIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBzdWJjb21tYW5kcyAoIzE4NzcpCiAgKiBGaXggdHlwb3MgKCMxOTEwKQogICogTG9jayBNYXJ1a3UgYXQgMC43LjAgdG8gcHJldmVudCBidWdzIGNhdXNlZCBieSBNYXJ1a3UgMC43LjEgKCMxOTU4KQogICogRml4ZXMgZnVsbCBwYXRoIGxlYWsgdG8gc291cmNlIGRpcmVjdG9yeSB3aGVuIHVzaW5nIGluY2x1ZGUgdGFnICgjMTk1MSkKICAqIERvbid0IGdlbmVyYXRlIHBhZ2VzIHRoYXQgYXJlbid0IGJlaW5nIHB1Ymxpc2hlZCAoIzE5MzEpCiAgKiBVc2UgYFNhZmVZQU1MLmxvYWRgIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHByb2plY3RzICgjMTk4MikKICAqIFJlbGF0aXZlIHBvc3RzIHNob3VsZCBuZXZlciBmYWlsIHRvIGJ1aWxkICgjMTk3NikKICAqIFJlbW92ZSBleGVjdXRhYmxlIGJpdHMgb2Ygbm9uIGV4ZWN1dGFibGUgZmlsZXMgKCMyMDU2KQogICogYCNwYXRoYCBmb3IgYSBkcmFmdCBpcyBub3cgYF9kcmFmdHNgIGluc3RlYWQgb2YgYF9wb3N0c2AgKCMyMDQyKQogICogUGF0Y2ggYSBjb3VwbGUgc2hvdy1zdG9wcGluZyBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgKCMxOTQ2KQogICogU2FuaXRpemUgcGF0aHMgdW5pZm9ybWx5LCBpbiBhIFdpbmRvd3MtZnJpZW5kbHkgd2F5ICgjMjA2NSwgIzIxMDkpCiAgKiBVcGRhdGUgZ2VtIGJ1aWxkIHN0ZXBzIHRvIHdvcmsgY29ycmVjdGx5IG9uIFdpbmRvd3MgKCMyMTE4KQogICogUmVtb3ZlIG9ic29sZXRlIGBub3JtYWxpemVfb3B0aW9uc2AgbWV0aG9kIGNhbGwgZnJvbSBgYmluL2pla3lsbGAgKCMyMTIxKS4KICAqIFJlbW92ZSBgK2AgY2hhcmFjdGVycyBmcm9tIFB5Z21lbnRzIGxleGVyIG5hbWVzIHdoZW4gYWRkaW5nIGFzIGEgQ1NTIGNsYXNzICgjOTk0KQogICogUmVtb3ZlIHNvbWUgY29kZSB0aGF0IGNhdXNlZCBSdWJ5IGludGVycHJldGVyIHdhcm5pbmdzICgjMjE3OCkKICAqIE9ubHkgc3RyaXAgdGhlIGRyaXZlIG5hbWUgaWYgaXQgYmVnaW5zIHRoZSBzdHJpbmcgKCMyMTc1KQogICogUmVtb3ZlIGRlZmF1bHQgcG9zdCB3aXRoIGludmFsaWQgZGF0ZSBmcm9tIHNpdGUgdGVtcGxhdGUgKCMyMjAwKQogICogRml4IGBQb3N0I3VybGAgYW5kIGBQYWdlI3VybGAgZXNjYXBlICgjMTU2OCkKICAqIFN0cmlwIG5ld2xpbmVzIGZyb20gdGhlIGB7JSBoaWdobGlnaHQgJX1gIGJsb2NrIGNvbnRlbnQgKCMxODIzKQogICogTG9hZCBpbiBgcm91Z2VgIG9ubHkgd2hlbiBpdCdzIGJlZW4gcmVxdWVzdGVkIGFzIHRoZSBoaWdobGlnaHRlciAoIzIxODkpCiAgKiBDb252ZXJ0IGlucHV0IHRvIHN0cmluZyBiZWZvcmUgWE1MIGVzY2FwaW5nIChgeG1sX2VzY2FwZWAgbGlxdWlkIGZpbHRlcikgKCMyMjQ0KQogICogTW9kaWZ5IGNvbmZpZ3VyYXRpb24ga2V5IGZvciBDb2xsZWN0aW9ucyBhbmQgcmVzZXQgcHJvcGVybHkuICgjMjIzOCkKICAqIEF2b2lkIGR1cGxpY2F0ZWQgb3V0cHV0IHVzaW5nIGBoaWdobGlnaHRgIHRhZyAoIzIyNjQpCiAgKiBPbmx5IHVzZSBKZWt5bGwubG9nZ2VyIGZvciBvdXRwdXQgKCMyMzA3KQogICogQ2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgaGFzX3lhbWxfaGVhZGVyP2AgKCMyMzEwKQogICogQWRkIGBvdXRwdXRgIHRvIGBEb2N1bWVudGAgbGlxdWlkIG91dHB1dCBoYXNoICgjMjMwOSkKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEFkZCBhIGxpbmsgdG8gdGhlIHNpdGUgaW4gdGhlIFJFQURNRS5tZCBmaWxlICgjMTc5NSkKICAqIEFkZCBpbiBIaXN0b3J5IGFuZCBzaXRlIGNoYW5nZXMgZnJvbSBgdjEtc3RhYmxlYCBicmFuY2ggKCMxODM2KQogICogVGVzdGluZyBhZGRpdGlvbnMgb24gdGhlIEV4Y2VycHQgY2xhc3MgKCMxODkzKQogICogRml4IHRoZSBgaGlnaGxpZ2h0YCB0YWcgZmVhdHVyZSAoIzE4NTkpCiAgKiBUZXN0IEpla3lsbCB1bmRlciBSdWJ5IDIuMS4wICgjMTkwMCkKICAqIEFkZCBzY3JpcHQvY2lidWlsZCBmb3IgZnVuIGFuZCBwcm9maXQgKCMxOTEyKQogICogVXNlIGBGb3J3YXJkYWJsZWAgZm9yIGRlbGVnYXRpb24gYmV0d2VlbiBgRXhjZXJwdGAgYW5kIGBQb3N0YCAoIzE5MjcpCiAgKiBSZW5hbWUgYHJlYWRfdGhpbmdzYCB0byBgcmVhZF9jb250ZW50YCAoIzE5MjgpCiAgKiBBZGQgYHNjcmlwdC9icmFuZGluZ2Agc2NyaXB0IGZvciBBU0NJSSBhcnQgbG92aW4nICgjMTkzNikKICAqIFVwZGF0ZSB0aGUgUkVBRE1FIHRvIHJlZmxlY3QgdGhlIHJlcG8gbW92ZSAoIzE5NDMpCiAgKiBBZGQgdGhlIHByb2plY3QgdmlzaW9uIHRvIHRoZSBSRUFETUUgKCMxOTM1KQogICogU3BlZWQgdXAgVHJhdmlzIENJIGJ1aWxkcyBieSB1c2luZyBSZWJ1bmQgKCMxOTg1KQogICogVXNlIFlhcnAgYXMgYSBHZW0gcHJveHkgZm9yIFRyYXZpcyBDSSAoIzE5ODQpCiAgKiBSZW1vdmUgWWFycCBhcyBhIEdlbSBwcm94eSBmb3IgVHJhdmlzIENJICgjMjAwNCkKICAqIE1vdmUgdGhlIHJlYWRpbmcgb2YgbGF5b3V0cyBpbnRvIGl0cyBvd24gY2xhc3MgKCMyMDIwKQogICogVGVzdCBTYXNzIGltcG9ydCAoIzIwMDkpCiAgKiBTd2l0Y2ggTWFydWt1IGFuZCBLcmFtZG93biBpbiBsaXN0cyBvZiBSdW50aW1lIHZzLiBEZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMgKCMyMDQ5KQogICogQ2xlYW4gdXAgdGhlIGdlbXNwZWMgZm9yIHRoZSBwcm9qZWN0ICgjMjA5NSkKICAqIEFkZCBKYXBhbmVzZSB0cmFuc2xhdGlvbiBvZiBSRUFETUUgYW5kIENPTlRSSUJVVElORyBkb2NzLiAoIzIwODEpCiAgKiBSZS1hbGlnbiB0aGUgdGFibGVzIGluIEN1Y3VtYmVyICgjMjEwOCkKICAqIFRyaW0gdHJhaWxpbmcgc3BhY2VzIGFuZCBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzICgjMjEyMikKICAqIEZpeCB0aGUgZmFpbGluZyBUcmF2aXMgc2NlbmFyaW9zIGR1ZSB0byBDdWN1bWJlciBpc3N1ZXMgKCMyMTU1KQogICogV3JhcCBgYnVuZGxlIGluc3RhbGxgIGluIGB0cmF2aXNfcmV0cnlgIHRvIHJldHJ5IHdoZW4gUnVieUdlbXMgZmFpbHMgKCMyMTYwKQogICogUmVmYWN0b3IgdGFncyBhbmQgY2F0ZWdvcmllcyAoIzE2MzkpCiAgKiBFeHRyYWN0IHBsdWdpbiBtYW5hZ2VtZW50IGludG8gaXRzIG93biBjbGFzcyAoIzIxOTcpCiAgKiBBZGQgbWlzc2luZyB0ZXN0cyBmb3IgYENvbW1hbmRgICgjMjIxNikKICAqIFVwZGF0ZSBgcnJgIGxpbmsgaW4gQ09OVFJJQlVUSU5HIGRvYyAoIzIyNDcpCiAgKiBTdHJlYW1saW5lIEN1Y3VtYmVyIGV4ZWN1dGlvbiBvZiBgamVreWxsYCBzdWJjb21tYW5kcyAoIzIyNTgpCiAgKiBSZWZhY3RvciBgQ29tbWFuZHM6OlNlcnZlYC4gKCMyMjY5KQogICogUmVmYWN0b3IgYGhpZ2hsaWdodGAgdGFnICgjMjE1NCkKICAqIFVwZGF0ZSBgVXRpbGAgaGFzaCBmdW5jdGlvbnMgd2l0aCBsYXRlc3QgZnJvbSBSYWlscyAoIzIyNzMpCiAgKiBXb3JrYXJvdW5kIGZvciBUcmF2aXMgYnVnICgjMjI5MCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIERvY3VtZW50IEtyYW1kb3duJ3MgR0ZNIHBhcnNlciBvcHRpb24gKCMxNzkxKQogICogTW92ZSBDU1MgdG8gaW5jbHVkZXMgJiB1cGRhdGUgbm9ybWFsaXplLmNzcyB0byB2Mi4xLjMgKCMxNzg3KQogICogTWluaWZ5IENTUyBvbmx5IGluIHByb2R1Y3Rpb24gKCMxODAzKQogICogRml4IGJyb2tlbiBsaW5rIHRvIGluc3RhbGxhdGlvbiBvZiBSdWJ5IG9uIE1vdW50YWluIExpb24gYmxvZyBwb3N0IG9uIFRyb3VibGVzaG9vdGluZyBkb2NzIHBhZ2UgKCMxNzk3KQogICogRml4IGlzc3VlcyB3aXRoIDEuNC4xIHJlbGVhc2UgYmxvZyBwb3N0ICgjMTgwNCkKICAqIEFkZCBub3RlIGFib3V0IGRlcGxveWluZyB0byBPcGVuU2hpZnQgKCMxODEyKQogICogQ29sbGVjdCBhbGwgV2luZG93cy1yZWxhdGVkIGRvY3Mgb250byBvbmUgcGFnZSAoIzE4MTgpCiAgKiBGaXhlZCB0eXBvIGluIGRhdGFmaWxlcyBkb2MgcGFnZSAoIzE4NTQpCiAgKiBDbGFyaWZ5IGhvdyB0byBhY2Nlc3MgYHNpdGVgIGluIGRvY3MgKCMxODY0KQogICogQWRkIGNsb3NpbmcgYDxjb2RlPmAgdGFnIHRvIGBjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV1gIG5vdGUgKCMxODY3KQogICogRml4IGxpbmsgdG8gQG1vam9tYm8ncyBzaXRlIHNvdXJjZSAoIzE4OTcpCiAgKiBBZGQgYHBhZ2luYXRlOiBuaWxgIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiBkb2NzICgjMTg5NikKICAqIEFkZCBsaW5rIHRvIG91ciBMaWNlbnNlIGluIHRoZSBzaXRlIGZvb3RlciAoIzE4ODkpCiAgKiBBZGQgYSBjaGFyc2V0IG5vdGUgaW4gIldyaXRpbmcgUG9zdHMiIGRvYyBwYWdlICgjMTkwMikKICAqIERpc2FsbG93IHNlbGVjdGlvbiBvZiBwYXRoIGFuZCBwcm9tcHQgaW4gYmFzaCBleGFtcGxlcwogICogQWRkIGpla3lsbC1jb21wYXNzIHRvIHRoZSBwbHVnaW4gbGlzdCAoIzE5MjMpCiAgKiBBZGQgbm90ZSBpbiBQb3N0cyBkb2NzIGFib3V0IHN0cmlwcGluZyBgPHA+YCB0YWdzIGZyb20gZXhjZXJwdCAoIzE5MzMpCiAgKiBBZGQgYWRkaXRpb25hbCBpbmZvIGFib3V0IHRoZSBuZXcgZXhjbHVkZSBiZWhhdmlvciAoIzE5MzgpCiAgKiBMaW5raWZ5ICdhd2Vzb21lIGNvbnRyaWJ1dG9ycycgdG8gcG9pbnQgdG8gdGhlIGNvbnRyaWJ1dG9ycyBncmFwaCBvbiBHaXRIdWIgKCMxOTQwKQogICogVXBkYXRlIGBkb2NzL3NpdGVzLm1kYCBsaW5rIHRvIEdpdEh1YiBUcmFpbmluZyBtYXRlcmlhbHMgKCMxOTQ5KQogICogVXBkYXRlIGBtYXN0ZXJgIHdpdGggdGhlIHJlbGVhc2UgaW5mbyBmcm9tIDEuNC4zICgjMTk0NykKICAqIERlZmluZSBkb2NzIG5hdiBpbiBkYXRhZmlsZSAoIzE5NTMpCiAgKiBDbGFyaWZ5IHRoZSBkb2NzIGFyb3VuZCB0aGUgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHBvc3RzICgjMTk3MSkKICAqIEFkZCBtaXNzaW5nIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBkb2NzIGZvciBwb3N0IGxheW91dHMgYW5kIHRlbXBsYXRlcyAoIzE5NzApCiAgKiBBZGQgbm90ZSB0byBgV3JpdGluZyBwb3N0c2AgcGFnZSBhYm91dCBob3cgdG8gc3RyaXAgaHRtbCBmcm9tIGV4Y2VycHQgKCMxOTYyKQogICogQWRkIGBqZWt5bGwtaHVtYW5pemVgIHBsdWdpbiB0byBwbHVnaW4gbGlzdCAoIzE5OTgpCiAgKiBBZGQgYGpla3lsbC1mb250LWF3ZXNvbWVgIHBsdWdpbiB0byBwbHVnaW4gbGlzdCAoIzE5OTkpCiAgKiBBZGQgYHN1YmxpbWUtamVreWxsYCB0byBsaXN0IG9mIEVkaXRvciBwbHVnaW5zICgjMjAwMSkKICAqIEFkZCBgdmltLWpla3lsbGAgdG8gdGhlIGxpc3Qgb2YgRWRpdG9yIHBsdWdpbnMgKCMyMDA1KQogICogRml4IG5vbi1zZW1hbnRpYyBuZXN0aW5nIG9mIGBwYCB0YWdzIGluIGBuZXdzX2l0ZW1gIGxheW91dCAoIzIwMTMpCiAgKiBEb2N1bWVudCBkZXN0aW5hdGlvbiBmb2xkZXIgY2xlYW5pbmcgKCMyMDE2KQogICogVXBkYXRlZCBpbnN0cnVjdGlvbnMgZm9yIE5lYXJseUZyZWVTcGVlY2guTkVUIGluc3RhbGxhdGlvbiAoIzIwMTUpCiAgKiBVcGRhdGUgbGluayB0byByYWNrLWpla3lsbCBvbiAiRGVwbG95bWVudCBNZXRob2RzIiBwYWdlICgjMjA0NykKICAqIEZpeCB0eXBvIGluIC9kb2NzL2NvbmZpZ3VyYXRpb24gKCMyMDczKQogICogRml4IGNvdW50IGluIGRvY3MgZm9yIGBzaXRlLnN0YXRpY19maWxlc2AgKCMyMDc3KQogICogVXBkYXRlIGNvbmZpZ3VyYXRpb24gZG9jcyB0byBpbmRpY2F0ZSB1dGYtOCBpcyB0aGUgZGVmYXVsdCBmb3IgMi4wLjAgYW5kIEFTQ0lJIGZvciAxLjkuMyAoIzIwNzQpCiAgKiBBZGQgaW5mbyBhYm91dCB1bnJlbGVhc2VkIGZlYXR1cmUgdG8gdGhlIHNpdGUgKCMyMDYxKQogICogQWRkIHdoaXRlc3BhY2UgdG8gbGlxdWlkIGV4YW1wbGUgaW4gR2l0SHViIFBhZ2VzIGRvY3MgKCMyMDg0KQogICogQ2xhcmlmeSB0aGUgd2F5IFNhc3MgYW5kIENvZmZlZVNjcmlwdCBmaWxlcyBhcmUgcmVhZCBpbiBhbmQgb3V0cHV0ICgjMjA2NykKICAqIEFkZCBseWNoZSBnYWxsZXJ5IHRhZyBwbHVnaW4gbGluayB0byBsaXN0IG9mIHBsdWdpbnMgKCMyMDk0KQogICogQWRkIEpla3lsbCBQYWdlcyBEaXJlY3RvcnkgcGx1Z2luIHRvIGxpc3Qgb2YgcGx1Z2lucyAoIzIwOTYpCiAgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBkb2NzIHBhZ2Ugd2l0aCBuZXcgbWFya2Rvd24gZXh0ZW5zaW9uICgjMjEwMikKICAqIEFkZCBgamVreWxsLWltYWdlLXNldGAgdG8gdGhlIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzIxMDUpCiAgKiBMb3NzbGVzc2x5IGNvbXByZXNzIGltYWdlcyAoIzIxMjgpCiAgKiBVcGRhdGUgbm9ybWFsaXplLmNzcyB0byAzLjAuMCAoIzIxMjYpCiAgKiBVcGRhdGUgbW9kZXJuaXpyIHRvIHYyLjcuMSAoIzIxMjkpCiAgKiBBZGQgYGpla3lsbC1vcmRpbmFsYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyMTUwKQogICogQWRkIGBqZWt5bGxfZmlndXJlYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyMTU4KQogICogQ2xhcmlmeSB0aGUgZG9jdW1lbnRhdGlvbiBmb3Igc2FmZSBtb2RlICgjMjE2MykKICAqIFNvbWUgSFRNTCB0aWR5aW5nICgjMjEzMCkKICAqIFJlbW92ZSBtb2Rlcm5penIgYW5kIHVzZSBodG1sNXNoaXYuanMgZGlyZWN0bHkgZm9yIElFIGxlc3MgdGhhbiB2OSAoIzIxMzEpCiAgKiBSZW1vdmUgdW51c2VkIGltYWdlcyAoIzIxODcpCiAgKiBVc2UgYGFycmF5X3RvX3NlbnRlbmNlX3N0cmluZ2AgZmlsdGVyIHdoZW4gb3V0cHV0dGluZyBuZXdzIGl0ZW0gY2F0ZWdvcmllcyAoIzIxOTEpCiAgKiBBZGQgbGluayB0byBIZWxwIHJlcG8gaW4gcHJpbWFyeSBuYXZpZ2F0aW9uIGJhciAoIzIxNzcpCiAgKiBTd2l0Y2ggdG8gdXNpbmcgYW4gaWNvIGZpbGUgZm9yIHRoZSBzaG9ydGN1dCBpY29uICgjMjE5MykKICAqIFVzZSBudW1iZXJzIHRvIHNwZWNpZnkgZm9udCB3ZWlnaHRzIGFuZCBvbmx5IGJyaW5nIGluIGZvbnQgd2VpZ2h0cyB1c2VkICgjMjE4NSkKICAqIEFkZCBhIGxpbmsgdG8gdGhlIGxpc3Qgb2YgYWxsIHR6IGRhdGFiYXNlIHRpbWUgem9uZXMgKCMxODI0KQogICogQ2xlYW4tdXAgYW5kIGltcHJvdmUgZG9jdW1lbnRhdGlvbiBgZmVlZC54bWxgICgjMjE5MikKICAqIFJlbW92ZSBkdXBsaWNhdGUgZW50cnkgaW4gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjIwNikKICAqIFJlZHVjZSB0aGUgd2hpdGVzcGFjZSBpbiB0aGUgZmF2aWNvbi4gKCMyMjEzKQogICogQWRkIGBqZWt5bGwtcGFnZS1jb2xsZWN0aW9uc2AgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjIxNSkKICAqIEFkZCBhIGNyb3NzLXJlZmVyZW5jZSBhYm91dCBgcG9zdF91cmxgICgjMjI0MykKICAqIEFkZCBgamVreWxsLWxpdmUtdGlsZXNgIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzIyNTApCiAgKiBGaXhlZCBicm9rZW4gbGluayB0byBHaXRIdWIgdHJhaW5pbmcgbWF0ZXJpYWwgc2l0ZSBzb3VyY2UgKCMyMjU3KQogICogVXBkYXRlIGxpbmsgdG8gaGVscCByZXBvLCBub3cgY2FsbGVkIGBqZWt5bGwtaGVscGAgKCMyMjc3KQogICogRml4IGNhcGl0YWxpemF0aW9uIG9mICdKZWt5bGwnIG9uIERlcGxveW1lbnQgTWV0aG9kcyBwYWdlICgjMjI5MSkKICAqIEluY2x1ZGUgcGx1Z2lucyBieSBzb25ueW0gaW4gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjI5NykKICAqIEFkZCBkZXByZWNhdGVkIGFydGljbGVzIGtlZXBlciBmaWx0ZXIgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjMwMCkKICAqIFNpbXBsaWZ5IGFuZCBpbXByb3ZlIG91ciBDU1MuICgjMjEyNykKICAqIFVzZSBibGFjayB0ZXh0IGNvbG9yIGZvciB0aGUgbW9iaWxlIG5hdmJhciAoIzIzMDYpCiAgKiBVc2UgdGhlIGJ1aWx0IGluIGRhdGUgZmlsdGVyIGFuZCBgc2l0ZS50aW1lYCBmb3IgdGhlIGNvcHlyaWdodCB5ZWFyLiAoIzIzMDUpCiAgKiBVcGRhdGUgaHRtbDVzaGl2IHRvIHYzLjcuMiAoIzIzMDQpCiAgKiBBZGQgMi4wLjAgcmVsZWFzZSBwb3N0ICgjMjI5OCkKICAqIEFkZCBkb2NzIGZvciBjdXN0b20gbWFya2Rvd24gcHJvY2Vzc29ycyAoIzIyOTgpCiAgKiBBZGQgZG9jcyBmb3IgYHdoZXJlYCBhbmQgYGdyb3VwX2J5YCBMaXF1aWQgZmlsdGVycyAoIzIyOTgpCiAgKiBSZW1vdmUgbm90ZXMgaW4gZG9jcyBmb3IgdW5yZWxlYXNlZCBmZWF0dXJlcyAoIzIzMDkpCgojIyAxLjUuMSAvIDIwMTQtMDMtMjcKCiMjIyBCdWcgRml4ZXMKCiAgKiBPbmx5IHN0cmlwIHRoZSBkcml2ZSBuYW1lIGlmIGl0IGJlZ2lucyB0aGUgc3RyaW5nICgjMjE3NikKCiMjIDEuNS4wIC8gMjAxNC0wMy0yNAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIExvb3NlbiBgc2FmZV95YW1sYCBkZXBlbmRlbmN5IHRvIGB+PiAxLjBgICgjMjE2NykKICAqIEJ1bXAgYHNhZmVfeWFtbGAgZGVwZW5kZW5jeSB0byBgfj4gMS4wLjBgICgjMTk0MikKCiMjIyBCdWcgRml4ZXMKCiAgKiBGaXggaXNzdWUgd2hlcmUgZmlsZXN5c3RlbSB0cmF2ZXJzYWwgcmVzdHJpY3Rpb24gYnJva2UgV2luZG93cyAoIzIxNjcpCiAgKiBMb2NrIGBtYXJ1a3VgIGF0IGAwLjcuMGAgKCMyMTY3KQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogTG9jayBgY3VjdW1iZXJgIGF0IGAxLjMuMTFgICgjMjE2NykKCiMjIDEuNC4zIC8gMjAxNC0wMS0xMwoKIyMjIEJ1ZyBGaXhlcwoKICAqIFBhdGNoIHNob3ctc3RvcHBpbmcgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzICgjMTk0NCkKCiMjIDEuNC4yIC8gMjAxMy0xMi0xNgoKIyMjIEJ1ZyBGaXhlcwoKICAqIFR1cm4gb24gTWFydWt1IGZlbmNlZCBjb2RlIGJsb2NrcyBieSBkZWZhdWx0ICgjMTgzMCkKCiMjIDEuNC4xIC8gMjAxMy0xMi0wOQoKIyMjIEJ1ZyBGaXhlcwoKICAqIERvbid0IGFsbG93IG5pbCBlbnRyaWVzIHdoZW4gbG9hZGluZyBwb3N0cyAoIzE3OTYpCgojIyAxLjQuMCAvIDIwMTMtMTItMDcKCiMjIyBNYWpvciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgc3VwcG9ydCBmb3IgVE9NTCBjb25maWcgZmlsZXMgKCMxNzY1KQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFNvcnQgcGx1Z2lucyBhcyBhIHdheSB0byBlc3RhYmxpc2ggYSBsb2FkIG9yZGVyICgjMTY4MikKICAqIFVwZGF0ZSBNYXJ1a3UgdG8gMC43LjAgKCMxNzc1KQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEFkZCBhIHNwYWNlIGJldHdlZW4gdHdvIHdvcmRzIGluIGEgUGFnaW5hdGlvbiB3YXJuaW5nIG1lc3NhZ2UgKCMxNzY5KQogICogVXBncmFkZSBgdG9tbGAgZ2VtIHRvIGB2MC4xLjBgIHRvIG1haW50YWluIGNvbXBhdCB3aXRoIFJ1YnkgMS44LjcgKCMxNzc4KQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogUmVtb3ZlIHNvbWUgd2hpdGVzcGFjZSBpbiB0aGUgY29kZSAoIzE3NTUpCiAgKiBSZW1vdmUgc29tZSBkdXBsaWNhdGlvbiBpbiB0aGUgcmVhZGluZyBvZiBwb3N0cyBhbmQgZHJhZnRzICgjMTc3OSkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIEZpeGVkIGNhc2Ugb2YgYSB3b3JkIGluIHRoZSBKZWt5bGwgdjEuMy4wIHJlbGVhc2UgcG9zdCAoIzE3NjIpCiAgKiBGaXhlZCB0aGUgbWltZSB0eXBlIGZvciB0aGUgZmF2aWNvbiAoIzE3NzIpCgojIyAxLjMuMSAvIDIwMTMtMTEtMjYKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgYSBgLS1wcmVmaXhgIG9wdGlvbiB0byBwYXNzdGhyb3VnaCBmb3IgdGhlIGltcG9ydGVycyAoIzE2NjkpCiAgKiBQdXNoIHRoZSBwYWdpbmF0b3IgcGx1Z2luIGxvd2VyIGluIHRoZSBwbHVnaW4gcHJpb3JpdHkgb3JkZXIgc28gb3RoZXIgcGx1Z2lucyBydW4gYmVmb3JlIGl0ICgjMTc1OSkKCiMjIyBCdWcgRml4ZXMKCiAgKiBGaXggdGhlIGluY2x1ZGUgdGFnIHdoZW4gcmFuIGluIGEgbG9vcCAoIzE3MjYpCiAgKiBGaXggZXJyb3JzIHdoZW4gdXNpbmcgYC0td2F0Y2hgIG9uIDEuOC43ICgjMTczMCkKICAqIFNwZWNpZnkgd2hlcmUgdGhlIGluY2x1ZGUgaXMgY2FsbGVkIGZyb20gaWYgYW4gaW5jbHVkZWQgZmlsZSBpcyBtaXNzaW5nICgjMTc0NikKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEV4dHJhY3QgYFNpdGUjZmlsdGVyX2VudHJpZXNgIGludG8gaXRzIG93biBvYmplY3QgKCMxNjk3KQogICogRW5hYmxlIFRyYXZpcycgYnVuZGxlIGNhY2hpbmcgKCMxNzM0KQogICogUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gc29tZSBmaWxlcyAoIzE3MzYpCiAgKiBGaXggYSBkdXBsaWNhdGUgdGVzdCBuYW1lICgjMTc1NCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIFVwZGF0ZSBsaW5rIHRvIGV4YW1wbGUgUmFrZWZpbGUgdG8gcG9pbnQgdG8gc3BlY2lmaWMgY29tbWl0ICgjMTc0MSkKICAqIEZpeCBkcmFmdHMgZG9jcyB0byBpbmRpY2F0ZSB0aGF0IGRyYWZ0IHRpbWUgaXMgYmFzZWQgb24gZmlsZSBtb2RpZmljYXRpb24gdGltZSwgbm90IGBUaW1lLm5vd2AgKCMxNjk1KQogICogQWRkIGBqZWt5bGwtbW9udGhseS1hcmNoaXZlLXBsdWdpbmAgYW5kIGBqZWt5bGwtY2F0ZWdvcnktYXJjaGl2ZS1wbHVnaW5gIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzE2OTMpCiAgKiBBZGQgYGpla3lsbC1hc3NldC1wYXRoLXBsdWdpbmAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMTY3MCkKICAqIEFkZCBgZW1vamktZm9yLWpla3lsbGAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0IHBsdWdpbnMgKCMxNzA4KQogICogRml4IHByZXZpb3VzIHNlY3Rpb24gbGluayBvbiBwbHVnaW5zIHBhZ2UgdG8gcG9pbnQgdG8gcGFnaW5hdGlvbiBwYWdlICgjMTcwNykKICAqIEFkZCBgb3JnLW1vZGVgIGNvbnZlcnRlciBwbHVnaW4gdG8gdGhpcmQtcGFydHkgcGx1Z2lucyAoIzE3MTEpCiAgKiBQb2ludCAiQmxvZyBtaWdyYXRpb25zIiBwYWdlIHRvIGh0dHA6Ly9pbXBvcnQuamVreWxscmIuY29tICgjMTczMikKICAqIEFkZCBkb2NzIGZvciBgcG9zdF91cmxgIHdoZW4gcG9zdHMgYXJlIGluIHN1YmRpcmVjdG9yaWVzICgjMTcxOCkKICAqIFVwZGF0ZSB0aGUgZG9jcyB0byBwb2ludCB0byBgZXhhbXBsZS5jb21gICgjMTQ0OCkKCiMjIDEuMy4wIC8gMjAxMy0xMS0wNAoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIEFkZCBzdXBwb3J0IGZvciBhZGRpbmcgZGF0YSBhcyBZQU1MIGZpbGVzIHVuZGVyIGEgc2l0ZSdzIGBfZGF0YWAgZGlyZWN0b3J5ICgjMTAwMykKICAqIEFsbG93IHZhcmlhYmxlcyB0byBiZSB1c2VkIHdpdGggYGluY2x1ZGVgIHRhZ3MgKCMxNDk1KQogICogQWxsb3cgdXNpbmcgZ2VtcyBmb3IgcGx1Z2luIG1hbmFnZW1lbnQgKCMxNTU3KQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIERlY3JlYXNlIHRoZSBzcGVjaWZpY2l0eSBpbiB0aGUgc2l0ZSB0ZW1wbGF0ZSBDU1MgKCMxNTc0KQogICogQWRkIGBlbmNvZGluZ2AgY29uZmlndXJhdGlvbiBvcHRpb24gKCMxNDQ5KQogICogUHJvdmlkZSBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcgZm9yIEpla3lsbCdzIGN1c3RvbSBMaXF1aWQgdGFncyAoIzE1MTQpCiAgKiBJZiBhbiBpbmNsdWRlZCBmaWxlIGNhdXNlcyBhIExpcXVpZCBlcnJvciwgYWRkIHRoZSBwYXRoIHRvIHRoZSBpbmNsdWRlIGZpbGUgdGhhdCBjYXVzZWQgdGhlIGVycm9yIHRvIHRoZSBlcnJvciBtZXNzYWdlICgjMTU5NikKICAqIElmIGEgbGF5b3V0IGNhdXNlcyBhIExpcXVpZCBlcnJvciwgY2hhbmdlIHRoZSBlcnJvciBtZXNzYWdlIHNvIHRoYXQgd2Uga25vdyBpdCBjb21lcyBmcm9tIHRoZSBsYXlvdXQgKCMxNjAxKQogICogVXBkYXRlIEtyYW1kb3duIGRlcGVuZGVuY3kgdG8gYH4+IDEuMmAgKCMxNjEwKQogICogVXBkYXRlIGBzYWZlX3lhbWxgIGRlcGVuZGVuY3kgdG8gYH4+IDAuOS43YCAoIzE2MDIpCiAgKiBBbGxvdyBsYXlvdXRzIHRvIGJlIGluIHN1YmZvbGRlcnMgbGlrZSBpbmNsdWRlcyAoIzE2MjIpCiAgKiBTd2l0Y2ggdG8gbGlzdGVuIGZvciBzaXRlIHdhdGNoaW5nIHdoaWxlIHNlcnZpbmcgKCMxNTg5KQogICogQWRkIGEgYGpzb25gIGxpcXVpZCBmaWx0ZXIgdG8gYmUgdXNlZCBpbiBzaXRlcyAoIzE2NTEpCiAgKiBQb2ludCBwZW9wbGUgdG8gdGhlIG1pZ3JhdGlvbiBkb2NzIHdoZW4gdGhlIGBqZWt5bGwtaW1wb3J0YCBnZW0gaXMgbWlzc2luZyAoIzE2NjIpCgojIyMgQnVnIEZpeGVzCgogICogRml4IHVwIG1hdGNoaW5nIGFnYWluc3Qgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB3aGVuIHRoZSB0d28gbG9jYXRpb25zIGFyZSBzaW1pbGFyICgjMTU1NikKICAqIEZpeCB0aGUgbWlzc2luZyBgcGF0aG5hbWVgIHJlcXVpcmUgaW4gY2VydGFpbiBjYXNlcyAoIzEyNTUpCiAgKiBVc2UgYCtgIGluc3RlYWQgb2YgYEFycmF5I2NvbmNhdGAgd2hlbiBidWlsZGluZyBgUG9zdGAgYXR0cmlidXRlIGxpc3QgKCMxNTcxKQogICogUHJpbnQgc2VydmVyIGFkZHJlc3Mgd2hlbiBsYXVuY2hpbmcgYSBzZXJ2ZXIgKCMxNTg2KQogICogRG93bmdyYWRlIHRvIE1hcnVrdSBgfj4gMC42LjBgIGluIG9yZGVyIHRvIGF2b2lkIGNoYW5nZXMgaW4gcmVuZGVyaW5nICgjMTU5OCkKICAqIEZpeCBlcnJvciB3aXRoIGZhaWxpbmcgaW5jbHVkZSB0YWcgd2hlbiB2YXJpYWJsZSB3YXMgZmlsZSBuYW1lICgjMTYxMykKICAqIERvd25jYXNlIGxleGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHB5Z21lbnRzICgjMTYxNSkKICAqIENhcGl0YWxpemUgdGhlIHNob3J0IHZlcmJvc2Ugc3dpdGNoIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGggdGhlIGJ1aWx0LWluIENvbW1hbmRlciBzd2l0Y2ggKCMxNjYwKQogICogRml4IGNvbXBhdGliaWxpdHkgd2l0aCAxLjgueCAoIzE2NjUpCiAgKiBGaXggYW4gZXJyb3Igd2l0aCB0aGUgbmV3IGZpbGUgd2F0Y2hpbmcgY29kZSBkdWUgdG8gbGlicmFyeSB2ZXJzaW9uIGluY29tcGF0aWJpbGl0aWVzICgjMTY4NykKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEFkZCBjb3ZlcmFnZSByZXBvcnRpbmcgd2l0aCBDb3ZlcmFsbHMgKCMxNTM5KQogICogUmVmYWN0b3IgdGhlIExpcXVpZCBgaW5jbHVkZWAgdGFnICgjMTQ5MCkKICAqIFVwZGF0ZSBsYXVuY2h5IGRlcGVuZGVuY3kgdG8gYH4+IDIuM2AgKCMxNjA4KQogICogVXBkYXRlIHJyIGRlcGVuZGVuY3kgdG8gYH4+IDEuMWAgKCMxNjA0KQogICogVXBkYXRlIGN1Y3VtYmVyIGRlcGVuZGVuY3kgdG8gYH4+IDEuM2AgKCMxNjA3KQogICogVXBkYXRlIGNvdmVyYWxscyBkZXBlbmRlbmN5IHRvIGB+PiAwLjcuMGAgKCMxNjA2KQogICogVXBkYXRlIHJha2UgZGVwZW5kZW5jeSB0byBgfj4gMTAuMWAgKCMxNjAzKQogICogQ2xlYW4gdXAgYHNpdGUucmJgIGNvbW1lbnRzIHRvIGJlIG1vcmUgY29uY2lzZS91bmlmb3JtICgjMTYxNikKICAqIFVzZSB0aGUgbWFzdGVyIGJyYW5jaCBmb3IgdGhlIGJ1aWxkIGJhZGdlIGluIHRoZSByZWFkbWUgKCMxNjM2KQogICogUmVmYWN0b3IgU2l0ZSNyZW5kZXIgKCMxNjM4KQogICogUmVtb3ZlIGR1cGxpY2F0aW9uIGluIGNvbW1hbmQgbGluZSBvcHRpb25zICgjMTYzNykKICAqIEFkZCB0ZXN0cyBmb3IgYWxsIHRoZSBjb2RlcmF5IG9wdGlvbnMgKCMxNTQzKQogICogSW1wcm92ZSBzb21lIG9mIHRoZSBDdWN1bWJlciB0ZXN0IGNvZGUgKCMxNDkzKQogICogSW1wcm92ZSBjb21wYXJpc29ucyBvZiB0aW1lc3RhbXBzIGJ5IGlnbm9yaW5nIHRoZSBzZWNvbmRzICgjMTU4MikKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIEZpeCBwYXJhbXMgZm9yIGBKZWt5bGxJbXBvcnQ6OldvcmRQcmVzcy5wcm9jZXNzYCBhcmd1bWVudHMgKCMxNTU0KQogICogQWRkIGBqZWt5bGwtc3VnZ2VzdGVkLXR3ZWV0YCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMxNTU1KQogICogTGluayB0byBMaXF1aWQncyBkb2NzIGZvciB0YWdzIGFuZCBmaWx0ZXJzICgjMTU1MykKICAqIEFkZCBub3RlIGFib3V0IGluc3RhbGxpbmcgWGNvZGUgb24gdGhlIE1hYyBpbiB0aGUgSW5zdGFsbGF0aW9uIGRvY3MgKCMxNTYxKQogICogU2ltcGxpZnkvZ2VuZXJhbGl6ZSBwYWdpbmF0aW9uIGRvY3MgKCMxNTc3KQogICogQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoZSBuZXcgZGF0YSBzb3VyY2VzIGZlYXR1cmUgKCMxNTAzKQogICogQWRkIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNyZWF0ZSBnZW5lcmF0b3JzICgjMTU5MCwgIzE1OTIpCiAgKiBJbXByb3ZlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIG1pbWlja2luZyBHaXRIdWIgRmxhdm9yZWQgTWFya2Rvd24gKCMxNjE0KQogICogQWRkIGBqZWt5bGwtaW1wb3J0YCB3YXJuaW5nIG5vdGUgb2YgbWlzc2luZyBkZXBlbmRlbmNpZXMgKCMxNjI2KQogICogRml4IGdyYW1tYXIgaW4gdGhlIFVzYWdlIHNlY3Rpb24gKCMxNjM1KQogICogQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoZSB1c2Ugb2YgZ2VtcyBhcyBwbHVnaW5zICgjMTY1NikKICAqIERvY3VtZW50IHRoZSBleGlzdGVuY2Ugb2YgYSBmZXcgYWRkaXRpb25hbCBwbHVnaW5zICgjMTQwNSkKICAqIERvY3VtZW50IHRoYXQgdGhlIGBkYXRlX3RvX3N0cmluZ2AgYWx3YXlzIHJldHVybnMgYSB0d28gZGlnaXQgZGF5ICgjMTY2MykKICAqIEZpeCBuYXZpZ2F0aW9uIGluIHRoZSAiV29ya2luZyB3aXRoIERyYWZ0cyIgcGFnZSAoIzE2NjcpCiAgKiBGaXggYW4gZXJyb3Igd2l0aCB0aGUgZGF0YSBkb2N1bWVudGF0aW9uICgjMTY5MSkKCiMjIDEuMi4xIC8gMjAxMy0wOS0xNAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFByaW50IGJldHRlciBtZXNzYWdlcyBmb3IgZGV0YWNoZWQgc2VydmVyLiBNdXRlIG91dHB1dCBvbiBkZXRhY2guICgjMTUxOCkKICAqIERpc2FibGUgcmV2ZXJzZSBsb29rdXAgd2hlbiBydW5uaW5nIGBqZWt5bGwgc2VydmVgICgjMTM2MykKICAqIFVwZ3JhZGUgUmVkQ2FycGV0IGRlcGVuZGVuY3kgdG8gYH4+IDIuMy4wYCAoIzE1MTUpCiAgKiBVcGdyYWRlIHRvIExpcXVpZCBgPj0gMi41LjIsIDwgMi42YCAoIzE1MzYpCgojIyMgQnVnIEZpeGVzCgogICogRml4IGZpbGUgZGlzY3JlcGFuY3kgaW4gZ2Vtc3BlYyAoIzE1MjIpCiAgKiBGb3JjZSByZW5kZXJpbmcgb2YgSW5jbHVkZSB0YWcgKCMxNTI1KQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogQWRkIGEgcmFrZSB0YXNrIHRvIGdlbmVyYXRlIGEgbmV3IHJlbGVhc2UgcG9zdCAoIzE0MDQpCiAgKiBNdXRlIExTSSBvdXRwdXQgaW4gdGVzdHMgKCMxNTMxKQogICogVXBkYXRlIGNvbnRyaWJ1dG9yIGRvY3VtZW50YXRpb24gKCMxNTM3KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogRml4IGEgY291cGxlIG9mIHZhbGlkYXRpb24gZXJyb3JzIG9uIHRoZSBzaXRlICgjMTUxMSkKICAqIE1ha2UgbmF2aWdhdGlvbiBtZW51cyByZXVzYWJsZSAoIzE1MDcpCiAgKiBGaXggbGluayB0byBIaXN0b3J5IHBhZ2UgZnJvbSBSZWxlYXNlIHYxLjIuMCBub3RlcyBwb3N0LgogICogRml4IG1hcmt1cCBpbiBIaXN0b3J5IGZpbGUgZm9yIGNvbW1hbmQgbGluZSBvcHRpb25zICgjMTUxMikKICAqIEV4cGFuZCAxLjIgcmVsZWFzZSBwb3N0IHRpdGxlIHRvIDEuMi4wICgjMTUxNikKCiMjIDEuMi4wIC8gMjAxMy0wOS0wNgoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIERpc2FibGUgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgZXhjZXJwdHMgd2hlbiBgZXhjZXJwdF9zZXBhcmF0b3JgIGlzIGAiImAuICgjMTM4NikKICAqIEFkZCBjaGVja2luZyBmb3IgVVJMIGNvbmZsaWN0cyB3aGVuIHJ1bm5pbmcgYGpla3lsbCBkb2N0b3JgICgjMTM4OSkKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBDYXRjaCBhbmQgZml4IGludmFsaWQgYHBhZ2luYXRlYCB2YWx1ZXMgKCMxMzkwKQogICogUmVtb3ZlIHN1cGVyZmx1b3VzIGBkaXYuY29udGFpbmVyYCBmcm9tIHRoZSBkZWZhdWx0IGh0bWwgdGVtcGxhdGUgZm9yIGBqZWt5bGwgbmV3YCAoIzEzMTUpCiAgKiBBZGQgYC1EYCBzaG9ydC1mb3JtIHN3aXRjaCBmb3IgdGhlIGRyYWZ0cyBvcHRpb24gKCMxMzk0KQogICogVXBkYXRlIHRoZSBsaW5rcyBpbiB0aGUgc2l0ZSB0ZW1wbGF0ZSBmb3IgVHdpdHRlciBhbmQgR2l0SHViICgjMTQwMCkKICAqIFVwZGF0ZSBkdW1teSBlbWFpbCBhZGRyZXNzIHRvIGV4YW1wbGUuY29tIGRvbWFpbiAoIzE0MDgpCiAgKiBVcGRhdGUgbm9ybWFsaXplLmNzcyB0byB2Mi4xLjIgYW5kIG1pbmlmeTsgYWRkIHJha2UgdGFzayB0byB1cGRhdGUgbm9ybWFsaXplLmNzcyB3aXRoIGdyZWF0ZXIgZWFzZS4gKCMxNDMwKQogICogQWRkIHRoZSBhYmlsaXR5IHRvIGRldGFjaCB0aGUgc2VydmVyIHJhbiBieSBgamVreWxsIHNlcnZlYCBmcm9tIGl0J3MgY29udHJvbGxpbmcgdGVybWluYWwgKCMxNDQzKQogICogSW1wcm92ZSBwZXJtYWxpbmsgZ2VuZXJhdGlvbiBmb3IgVVJMcyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycyAoIzk0NCkKICAqIEV4cG9zZSB0aGUgY3VycmVudCBKZWt5bGwgdmVyc2lvbiB0byBwb3N0cyBhbmQgcGFnZXMgdmlhIGEgbmV3IGBqZWt5bGwudmVyc2lvbmAgdmFyaWFibGUgKCMxNDgxKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIE1hcmtkb3duIGV4dGVuc2lvbiBtYXRjaGluZyBtYXRjaGVzIG9ubHkgZXhhY3QgbWF0Y2hlcyAoIzEzODIpCiAgKiBGaXhlZCBOb01ldGhvZEVycm9yIHdoZW4gbWVzc2FnZSBwYXNzZWQgdG8gYFN0ZXZlbnNvbiNtZXNzYWdlYCBpcyBuaWwgKCMxMzg4KQogICogVXNlIGJpbmFyeSBtb2RlIHdoZW4gd3JpdGluZyBmaWxlICgjMTM2NCkKICAqIEZpeCAndW5kZWZpbmVkIG1ldGhvZCBgZW5jb2RpbmdgIGZvciAibWFpbHRvIicgZXJyb3JzIHcvIFJ1YnkgMS44IGFuZCBLcmFtZG93biA+IDAuMTQuMCAoIzEzOTcpCiAgKiBEbyBub3QgZm9yY2UgdGhlIHBlcm1hbGluayB0byBiZSBhIGRpciBpZiBpdCBlbmRzIG9uIC5odG1sICgjOTYzKQogICogV2hlbiBhIExpcXVpZCBFeGNlcHRpb24gaXMgY2F1Z2h0LCBzaG93IHRoZSBmdWxsIHBhdGggcmVsLiB0byBzaXRlIHNvdXJjZSAoIzE0MTUpCiAgKiBQcm9wZXJseSByZWFkIGluIHRoZSBjb25maWcgb3B0aW9ucyB3aGVuIHNlcnZpbmcgdGhlIGRvY3MgbG9jYWxseSAoIzE0NDQpCiAgKiBGaXhlZCBgLS1sYXlvdXRzYCBvcHRpb24gZm9yIGBidWlsZGAgYW5kIGBzZXJ2ZWAgY29tbWFuZHMgKCMxNDU4KQogICogUmVtb3ZlIGtyYW1kb3duIGFzIGEgcnVudGltZSBkZXBlbmRlbmN5IHNpbmNlIGl0J3Mgb3B0aW9uYWwgKCMxNDk4KQogICogUHJvdmlkZSBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgZm9yIGludmFsaWQgZmlsZSBuYW1lcyBpbiB0aGUgaW5jbHVkZSB0YWcgKCMxNDk0KQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogUmVtb3ZlIHJlZHVuZGFudCBhcmd1bWVudCB0byBKZWt5bGw6OkNvbW1hbmRzOjpOZXcjc2NhZmZvbGRfcG9zdF9jb250ZW50ICgjMTM1NikKICAqIEFkZCBuZXcgZGVwZW5kZW5jaWVzIHRvIHRoZSBSRUFETUUgKCMxMzYwKQogICogRml4IGxpbmsgdG8gY29udHJpYnV0aW5nIHBhZ2UgaW4gUkVBRE1FICgjMTQyNCkKICAqIFVwZGF0ZSBUb21Eb2MgaW4gUGFnZXIjaW5pdGlhbGl6ZSB0byBtYXRjaCBwYXJhbXMgKCMxNDQxKQogICogUmVmYWN0b3IgYFNpdGUjY2xlYW51cGAgaW50byBgSmVreWxsOjpTaXRlOjpDbGVhbmVyYCBjbGFzcyAoIzE0MjkpCiAgKiBTZXZlcmFsIG90aGVyIHNtYWxsIG1pbm9yIHJlZmFjdG9yaW5ncyAoIzEzNDEpCiAgKiBJZ25vcmUgYF9zaXRlYCBpbiBqZWt5bGxyYi5jb20gZGVwbG95ICgjMTQ4MCkKICAqIEFkZCBHZW0gdmVyc2lvbiBhbmQgZGVwZW5kZW5jeSBiYWRnZSB0byBSRUFETUUgKCMxNDk3KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogQWRkIGluZm8gYWJvdXQgbmV3IHJlbGVhc2VzICgjMTM1MykKICAqIFVwZGF0ZSBwbHVnaW4gbGlzdCB3aXRoIGpla3lsbC1yc3MgcGx1Z2luICgjMTM1NCkKICAqIFVwZGF0ZSB0aGUgc2l0ZSBsaXN0IHBhZ2Ugd2l0aCBSdWJ5J3Mgb2ZmaWNpYWwgc2l0ZSAoIzEzNTgpCiAgKiBBZGQgYGpla3lsbC1kaXRhYWAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMTM3MCkKICAqIEFkZCBgcG9zdGZpbGVzYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMxMzczKQogICogRm9yIGludGVybmFsIGxpbmtzLCB1c2UgZnVsbCBwYXRoIGluY2x1ZGluZyB0cmFpbGluZyBgL2AgKCMxNDExKQogICogVXNlIGN1cmx5IGFwb3N0cm9waGVzIGluIHRoZSBkb2NzICgjMTQxOSkKICAqIFVwZGF0ZSB0aGUgZG9jcyBmb3IgUmVkY2FycGV0IGluIEpla3lsbCAoIzE0MTgpCiAgKiBBZGQgYHBsdXJhbGl6ZWAgYW5kIGByZWFkaW5nX3RpbWVgIGZpbHRlcnMgdG8gZG9jcyAoIzE0MzkpCiAgKiBGaXggbWFya3VwIGZvciB0aGUgS3JhbWRvd24gb3B0aW9ucyAoIzE0NDUpCiAgKiBGaXggdHlwb3MgaW4gdGhlIEhpc3RvcnkgZmlsZSAoIzE0NTQpCiAgKiBBZGQgdHJhaWxpbmcgc2xhc2ggdG8gc2l0ZSdzIHBvc3QgVVJMICgjMTQ2MikKICAqIENsYXJpZnkgdGhhdCBgLS1jb25maWdgIHdpbGwgdGFrZSBtdWx0aXBsZSBmaWxlcyAoIzE0NzQpCiAgKiBGaXggZG9jcy90ZW1wbGF0ZXMubWQgcHJpdmF0ZSBnaXN0IGV4YW1wbGUgKCMxNDc3KQogICogVXNlIGBzaXRlLnJlcG9zaXRvcnlgIGZvciBKZWt5bGwncyBHaXRIdWIgVVJMICgjMTQ2MykKICAqIEFkZCBgamVreWxsLXBhZ2VsZXNzLXJlZGlyZWN0c2AgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMTQ4NikKICAqIENsYXJpZnkgdGhhdCBgZGF0ZV90b194bWxzY2hlbWFgIHJldHVybnMgYW4gSVNPIDg2MDEgc3RyaW5nICgjMTQ4OCkKICAqIEFkZCBgamVreWxsLWdvb2QtaW5jbHVkZWAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMTQ5MSkKICAqIFhNTCBlc2NhcGUgdGhlIGJsb2cgcG9zdCB0aXRsZSBpbiBvdXIgZmVlZCAoIzE1MDEpCiAgKiBBZGQgYGpla3lsbC10b2MtZ2VuZXJhdG9yYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMxNTA2KQoKIyMgMS4xLjIgLyAyMDEzLTA3LTI1CgojIyMgQnVnIEZpeGVzCgogICogUmVxdWlyZSBMaXF1aWQgMi41LjEgKCMxMzQ5KQoKIyMgMS4xLjEgLyAyMDEzLTA3LTI0CgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogUmVtb3ZlIHN1cGVyZmx1b3VzIGB0YWJsZWAgc2VsZWN0b3IgZnJvbSBtYWluLmNzcyBpbiBgamVreWxsIG5ld2AgdGVtcGxhdGUgKCMxMzI4KQogICogQWJvcnQgd2l0aCBub24temVybyBleGl0IGNvZGVzICgjMTMzOCkKCiMjIyBCdWcgRml4ZXMKCiAgKiBGaXggdXAgdGhlIHJlbmRlcmluZyBvZiBleGNlcnB0cyAoIzEzMzkpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBBZGQgSmVreWxsIEltYWdlIFRhZyB0byB0aGUgcGx1Z2lucyBsaXN0ICgjMTMwNikKICAqIFJlbW92ZSBlcnJvbmVvdXMgc3RhdGVtZW50IHRoYXQgYHNpdGUucGFnZXNgIGFyZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuCiAgKiBBZGQgaW5mbyBhYm91dCB0aGUgYF9kcmFmdHNgIGRpcmVjdG9yeSB0byB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBkb2NzICgjMTMyMCkKICAqIEltcHJvdmUgdGhlIGxheW91dCBvZiB0aGUgcGx1Z2luIGxpc3RpbmcgYnkgb3JnYW5pemluZyBpdCBpbnRvIGNhdGVnb3JpZXMgKCMxMzEwKQogICogQWRkIGdlbmVyYXRvci1qZWt5bGxyYiBhbmQgZ3J1bnQtamVreWxsIHRvIHBsdWdpbnMgcGFnZSAoIzEzMzApCiAgKiBNZW50aW9uIEtyYW1kb3duIGFzIG9wdGlvbiBmb3IgbWFya2Rvd24gcGFyc2VyIG9uIEV4dHJhcyBwYWdlICgjMTMxOCkKICAqIFVwZGF0ZSBRdWljay1TdGFydCBwYWdlIHRvIGluY2x1ZGUgcmVtaW5kZXIgdGhhdCBhbGwgcmVxdWlyZW1lbnRzIG11c3QgYmUgaW5zdGFsbGVkICgjMTMyNykKICAqIENoYW5nZSBmaWxlbmFtZSBpbiBgaW5jbHVkZWAgZXhhbXBsZSB0byBhbiBIVE1MIGZpbGUgc28gYXMgbm90IHRvIGluZGljYXRlIHRoYXQgSmVreWxsIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IHRoZW0uICgjMTMwMykKICAqIEFkZCBhbiBSU1MgZmVlZCBmb3IgY29tbWl0cyB0byBKZWt5bGwgKCMxMzQzKQoKIyMgMS4xLjAgLyAyMDEzLTA3LTE0CgojIyMgTWFqb3IgRW5oYW5jZW1lbnRzCgogICogQWRkIGBkb2NzYCBzdWJjb21tYW5kIHRvIHJlYWQgSmVreWxsJ3MgZG9jcyB3aGVuIG9mZmxpbmUuICgjMTA0NikKICAqIFN1cHBvcnQgcGFzc2luZyBwYXJhbWV0ZXJzIHRvIHRlbXBsYXRlcyBpbiBgaW5jbHVkZWAgdGFnICgjMTIwNCkKICAqIEFkZCBzdXBwb3J0IGZvciBMaXF1aWQgdGFncyB0byBwb3N0IGV4Y2VycHRzICgjMTMwMikKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBTZWFyY2ggdGhlIGhpZXJhcmNoeSBvZiBwYWdpbmF0aW9uIHBhdGggdXAgdG8gc2l0ZSByb290IHRvIGRldGVybWluZSB0ZW1wbGF0ZSBwYWdlIGZvciBwYWdpbmF0aW9uLiAoIzExOTgpCiAgKiBBZGQgdGhlIGFiaWxpdHkgdG8gZ2VuZXJhdGUgYSBuZXcgSmVreWxsIHNpdGUgd2l0aG91dCBhIHRlbXBsYXRlICgjMTE3MSkKICAqIFVzZSByZWRjYXJwZXQgYXMgdGhlIGRlZmF1bHQgbWFya2Rvd24gZW5naW5lIGluIG5ld2x5IGdlbmVyYXRlZCBzaXRlcyAoIzEyNDUsICMxMjQ3KQogICogQWRkIGByZWRjYXJwZXRgIGFzIGEgcnVudGltZSBkZXBlbmRlbmN5IHNvIGBqZWt5bGwgYnVpbGRgIHdvcmtzIG91dC1vZi10aGUtYm94IGZvciBuZXcgc2l0ZXMuICgjMTI0NykKICAqIEluIHRoZSBnZW5lcmF0ZWQgc2l0ZSwgcmVtb3ZlIGZpbGVzIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSBhIGRpcmVjdG9yeSAoIzExMTgpCiAgKiBGYWlsIGxvdWRseSBpZiBhIHVzZXItc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2Vzbid0IGV4aXN0ICgjMTA5OCkKICAqIEFsbG93IGZvciBhbGwgb3B0aW9ucyBmb3IgS3JhbWRvd24gSFRNTCBDb252ZXJ0ZXIgKCMxMjAxKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCBwYWdpbmF0aW9uIGluIHN1YmRpcmVjdG9yaWVzLiAoIzExOTgpCiAgKiBGaXggYW4gaXNzdWUgd2l0aCBkaXJlY3RvcmllcyBhbmQgcGVybWFsaW5rcyB0aGF0IGhhdmUgYSBwbHVzIHNpZ24gKCspIGluIHRoZW0gKCMxMjE1KQogICogUHJvdmlkZSBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIHdoZW4gZ2VuZXJhdGluZyBzaXRlcyAoIzEyNTMpCiAgKiBMYXRlc3QgcG9zdHMgZmlyc3QgaW4gbm9uLUxTSSBgcmVsYXRlZF9wb3N0c2AgKCMxMjcxKQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogTWVyZ2UgdGhlIHRoZW1lIGFuZCBsYXlvdXQgQ3VjdW1iZXIgc3RlcHMgaW50byBvbmUgc3RlcCAoIzExNTEpCiAgKiBSZXN0cmljdCBhY3RpdmVzdXBwb3J0IGRlcGVuZGVuY3kgdG8gcHJlLTQuMC4wIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBgPD0gMS45LjJgCiAgKiBJbmNsdWRlL2V4Y2x1ZGUgZGVwcmVjYXRpb24gaGFuZGxpbmcgc2ltcGxpZmljYXRpb24gKCMxMjg0KQogICogQ29udmVydCBSRUFETUUgdG8gTWFya2Rvd24uICgjMTI2NykKICAqIFJlZmFjdG9yIEpla3lsbDo6U2l0ZSAoIzExNDQpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBBZGQgIk5ld3MiIHNlY3Rpb24gZm9yIHJlbGVhc2Ugbm90ZXMsIGFsb25nIHdpdGggYW4gUlNTIGZlZWQgKCMxMDkzLCAjMTI4NSwgIzEyODYpCiAgKiBBZGQgIkhpc3RvcnkiIHBhZ2UuCiAgKiBSZXN0cnVjdHVyZWQgZG9jcyBzZWN0aW9ucyB0byBpbmNsdWRlICJNZXRhIiBzZWN0aW9uLgogICogQWRkIG1lc3NhZ2UgdG8gIlRlbXBsYXRlcyIgcGFnZSB0aGF0IHNwZWNpZmllcyB0aGF0IFB5dGhvbiBtdXN0IGJlIGluc3RhbGxlZCBpbiBvcmRlciB0byB1c2UgUHlnbWVudHMuICgjMTE4MikKICAqIFVwZGF0ZSBsaW5rIHRvIHRoZSBvZmZpY2lhbCBNYXJ1a3UgcmVwbyAoIzExNzUpCiAgKiBBZGQgZG9jdW1lbnRhdGlvbiBhYm91dCBgcGFnaW5hdGVfcGF0aGAgdG8gIlRlbXBsYXRlcyIgcGFnZSBpbiBkb2NzICgjMTEyOSkKICAqIEdpdmUgdGhlIHF1aWNrLXN0YXJ0IGd1aWRlIGl0cyBvd24gcGFnZSAoIzExOTEpCiAgKiBVcGRhdGUgUHJvVGlwIG9uIEluc3RhbGxhdGlvbiBwYWdlIGluIGRvY3MgdG8gcG9pbnQgdG8gYWxsIHRoZSBpbmZvIGFib3V0IFB5Z21lbnRzIGFuZCB0aGUgJ2hpZ2hsaWdodCcgdGFnLiAoIzExOTYpCiAgKiBSdW4gYHNpdGUvaW1nYCB0aHJvdWdoIEltYWdlT3B0aW0gKHRoYW5rcyBAcXJ1c2ghKSAoIzEyMDgpCiAgKiBBZGRlZCBKYWRlIENvbnZlcnRlciB0byBgc2l0ZS9kb2NzL3BsdWdpbnNgICgjMTIxMCkKICAqIEZpeCBsb2NhdGlvbiBvZiBkb2NzIHBhZ2VzIGluIENvbnRyaWJ1dGluZyBwYWdlcyAoIzEyMTQpCiAgKiBBZGQgUmVhZEluWE1pbnV0ZXMgcGx1Z2luIHRvIHRoZSBwbHVnaW4gbGlzdCAoIzEyMjIpCiAgKiBSZW1vdmUgcGx1Z2lucyBmcm9tIHRoZSBwbHVnaW4gbGlzdCB0aGF0IGhhdmUgZXF1aXZhbGVudHMgaW4gSmVreWxsIHByb3BlciAoIzEyMjMpCiAgKiBBZGQgamVreWxsLWFzc2V0cyB0byB0aGUgcGx1Z2luIGxpc3QgKCMxMjI1KQogICogQWRkIGpla3lsbC1wYW5kb2MtbXVsaXRwbGUtZm9ybWF0cyB0byB0aGUgcGx1Z2luIGxpc3QgKCMxMjI5KQogICogUmVtb3ZlIGRlYWQgbGluayB0byAiVXNpbmcgR2l0IHRvIG1haW50YWluIHlvdXIgYmxvZyIgKCMxMjI3KQogICogVGlkeSB1cCB0aGUgdGhpcmQtcGFydHkgcGx1Z2lucyBsaXN0aW5nICgjMTIyOCkKICAqIFVwZGF0ZSBjb250cmlidXRvciBpbmZvcm1hdGlvbiAoIzExOTIpCiAgKiBVcGRhdGUgVVJMIG9mIGFydGljbGUgYWJvdXQgQmxvZ2dlciBtaWdyYXRpb24gKCMxMjQyKQogICogU3BlY2lmeSB0aGF0IFJlZENhcnBldCBpcyB0aGUgZGVmYXVsdCBmb3IgbmV3IEpla3lsbCBzaXRlcyBvbiBRdWlja3N0YXJ0IHBhZ2UgKCMxMjQ3KQogICogQWRkZWQgYHNpdGUucGFnZXNgIHRvIFZhcmlhYmxlcyBwYWdlIGluIGRvY3MgKCMxMjUxKQogICogQWRkIFlvdWt1IGFuZCBUdWRvdSBFbWJlZCBsaW5rIG9uIFBsdWdpbnMgcGFnZS4gKCMxMjUwKQogICogQWRkIG5vdGUgdGhhdCBgZ2lzdGAgdGFnIHN1cHBvcnRzIHByaXZhdGUgZ2lzdHMuICgjMTI0OCkKICAqIEFkZCBgamVreWxsLXRpbWVhZ29gIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucy4gKCMxMjYwKQogICogQWRkIGBqZWt5bGwtc3dmb2JqZWN0YCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMuICgjMTI2MykKICAqIEFkZCBgamVreWxsLXBpY3R1cmUtdGFnYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMuICgjMTI4MCkKICAqIFVwZGF0ZSB0aGUgR2l0SHViIFBhZ2VzIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIHJlbGF0aXZlIFVSTHMgKCMxMjkxKQogICogVXBkYXRlIHRoZSBTMyBkZXBsb3ltZW50IGRvY3VtZW50YXRpb24gKCMxMjk0KQogICogQWRkIHN1Z2dlc3Rpb24gZm9yIFhjb2RlIENMVCBpbnN0YWxsIHRvIHRyb3VibGVzaG9vdGluZyBwYWdlIGluIGRvY3MgKCMxMjk2KQogICogQWRkICdXb3JraW5nIHdpdGggZHJhZnRzJyBwYWdlIHRvIGRvY3MgKCMxMjg5KQogICogQWRkIGluZm9ybWF0aW9uIGFib3V0IHRpbWUgem9uZXMgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIGEgcGFnZSdzIGRhdGUgKCMxMzA0KQoKIyMgMS4wLjMgLyAyMDEzLTA2LTA3CgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQWRkIHN1cHBvcnQgdG8gZ2lzdCB0YWcgZm9yIHByaXZhdGUgZ2lzdHMuICgjMTE4OSkKICAqIEZhaWwgbG91ZGx5IHdoZW4gTWFydWt1IGVycm9ycyBvdXQgKCMxMTkwKQogICogTW92ZSB0aGUgYnVpbGRpbmcgb2YgcmVsYXRlZCBwb3N0cyBpbnRvIHRoZWlyIG93biBjbGFzcyAoIzEwNTcpCiAgKiBSZW1vdmVkIHRyYWlsaW5nIHNwYWNlcyBpbiBzZXZlcmFsIHBsYWNlcyB0aHJvdWdob3V0IHRoZSBjb2RlICgjMTExNikKICAqIEFkZCBhIGAtLWZvcmNlYCBvcHRpb24gdG8gYGpla3lsbCBuZXdgICgjMTExNSkKICAqIENvbnZlcnQgSURzIGluIHRoZSBzaXRlIHRlbXBsYXRlIHRvIGNsYXNzZXMgKCMxMTcwKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCB0eXBvIGluIFN0ZXZlbnNvbiBjb25zdGFudCAiRVJST1IiLiAoIzExNjYpCiAgKiBSZW5hbWUgSmVreWxsOjpMb2dnZXIgdG8gSmVreWxsOjpTdGV2ZW5zb24gdG8gZml4IGluaGVyaXRhbmNlIGlzc3VlICgjMTEwNikKICAqIEV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSB3aGVuIGRlYWxpbmcgd2l0aCBhIExpcXVpZCBlcnJvciAoIzExMjEpCiAgKiBNYWtlIHRoZSBgZXhjbHVkZWAgYW5kIGBpbmNsdWRlYCBvcHRpb25zIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggdmVyc2lvbnMgb2YgSmVreWxsIHByaW9yIHRvIDEuMCAoIzExMTQpCiAgKiBGaXggcGFnaW5hdGlvbiBvbiBXaW5kb3dzICgjMTA2MykKICAqIEZpeCB0aGUgYXBwbGljYXRpb24gb2YgUHlnbWVudHMnIEdlbmVyaWMgT3V0cHV0IHN0eWxlIHRvIEdvIGNvZGUgKCMxMTU2KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogQWRkIGEgUHJvIFRpcCB0byBkb2NzIGFib3V0IGZyb250IG1hdHRlciB2YXJpYWJsZXMgYmVpbmcgb3B0aW9uYWwgKCMxMTQ3KQogICogQWRkIGNoYW5nZWxvZyB0byBzaXRlIGFzIEhpc3RvcnkgcGFnZSBpbiAvZG9jcy8gKCMxMDY1KQogICogQWRkIG5vdGUgdG8gVXBncmFkaW5nIHBhZ2UgYWJvdXQgbmV3IGNvbmZpZyBvcHRpb25zIGluIDEuMC54ICgjMTE0NikKICAqIERvY3VtZW50YXRpb24gZm9yIGBkYXRlX3RvX3JmYzgyMmAgYW5kIGB1cmlfZXNjYXBlYCAoIzExNDIpCiAgKiBEb2N1bWVudGF0aW9uIGhpZ2hsaWdodCBib3hlcyBzaG91bGRuJ3Qgc2hvdyBzY3JvbGxiYXJzIGlmIG5vdCBuZWNlc3NhcnkgKCMxMTIzKQogICogQWRkIGxpbmsgdG8gamVreWxsLW1pbmlidW5kbGUgaW4gdGhlIGRvYydzIHBsdWdpbnMgbGlzdCAoIzEwMzUpCiAgKiBRdWljayBwYXRjaCBmb3IgaW1wb3J0ZXJzIGRvY3VtZW50YXRpb24KICAqIEZpeCBwcmVmaXggZm9yIFdvcmRwcmVzc0RvdENvbSBpbXBvcnRlciBpbiBkb2NzICgjMTEwNykKICAqIEFkZCBqZWt5bGwtY29udGVudGJsb2NrcyBwbHVnaW4gdG8gZG9jcyAoIzEwNjgpCiAgKiBNYWtlIGNvZGUgYml0cyBpbiBub3RlcyBsb29rIG1vcmUgbmF0dXJhbCwgbW9yZSByZWFkYWJsZSAoIzEwODkpCiAgKiBGaXggbG9naWMgZm9yIGByZWxhdGl2ZV9wZXJtYWxpbmtzYCBpbnN0cnVjdGlvbnMgb24gVXBncmFkaW5nIHBhZ2UgKCMxMTAxKQogICogQWRkIGRvY3MgZm9yIHBvc3QgZXhjZXJwdCAoIzEwNzIpCiAgKiBBZGQgZG9jcyBmb3IgZ2lzdCB0YWcgKCMxMDcyKQogICogQWRkIGRvY3MgaW5kaWNhdGluZyB0aGF0IFB5Z21lbnRzIGRvZXMgbm90IG5lZWQgdG8gYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkgKCMxMDk5LCAjMTExOSkKICAqIFVwZGF0ZSB0aGUgbWlncmF0b3IgZG9jcyB0byBiZSBjdXJyZW50ICgjMTEzNikKICAqIEFkZCB0aGUgSmVreWxsIEdhbGxlcnkgUGx1Z2luIHRvIHRoZSBwbHVnaW4gbGlzdCAoIzExNDMpCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBVc2UgSmVreWxsLmxvZ2dlciBpbnN0ZWFkIG9mIEpla3lsbDo6U3RldmVuc29uIHRvIGxvZyB0aGluZ3MgKCMxMTQ5KQogICogRml4IHBlc2t5IEN1Y3VtYmVyIGluZmluaXRlIGxvb3AgKCMxMTM5KQogICogRG8gbm90IHdyaXRlIHBvc3RzIHdpdGggdGltZXpvbmVzIGluIEN1Y3VtYmVyIHRlc3RzICgjMTEyNCkKICAqIFVzZSBJU08gZm9ybWF0dGVkIGRhdGVzIGluIEN1Y3VtYmVyIGZlYXR1cmVzICgjMTE1MCkKCiMjIDEuMC4yIC8gMjAxMy0wNS0xMgoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIEFkZCBgamVreWxsIGRvY3RvcmAgY29tbWFuZCB0byBjaGVjayBzaXRlIGZvciBhbnkga25vd24gY29tcGF0aWJpbGl0eSBwcm9ibGVtcyAoIzEwODEpCiAgKiBCYWNrd2FyZHMtY29tcGF0aWJpbGl6ZSByZWxhdGl2ZSBwZXJtYWxpbmtzICgjMTA4MSkKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgYSBgZGF0YS1sYW5nPSI8bGFuZz4iYCBhdHRyaWJ1dGUgdG8gUmVkY2FycGV0IGNvZGUgYmxvY2tzICgjMTA2NikKICAqIERlcHJlY2F0ZSBvbGQgY29uZmlnIGBzZXJ2ZXJfcG9ydGAsIG1hdGNoIHRvIGBwb3J0YCBpZiBgcG9ydGAgaXNuJ3Qgc2V0ICgjMTA4NCkKICAqIFVwZGF0ZSBweWdtZW50cy5yYiB2ZXJzaW9uIHRvIDAuNS4wICgjMTA2MSkKICAqIFVwZGF0ZSBLcmFtZG93biB2ZXJzaW9uIHRvIDEuMC4yICgjMTA2NykKCiMjIyBCdWcgRml4ZXMKCiAgKiBGaXggaXNzdWUgd2hlbiBjYXRlZ29yaWVzIGFyZSBudW1iZXJzICgjMTA3OCkKICAqIENhdGNoaW5nIHRoYXQgUmVkY2FycGV0IGdlbSBpc24ndCBpbnN0YWxsZWQgKCMxMDU5KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogQWRkIGRvY3VtZW50YXRpb24gYWJvdXQgYHJlbGF0aXZlX3Blcm1hbGlua3NgICgjMTA4MSkKICAqIFJlbW92ZSBweWdtZW50cy1pbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLCBhcyBweWdtZW50cy5yYiBpcyBidW5kbGVkIHdpdGggaXQgKCMxMDc5KQogICogTW92ZSBwYWdlcyB0byBiZSBQYWdlcyBmb3IgcmVhbHogKCM5ODUpCiAgKiBVcGRhdGVkIGxpbmtzIHRvIExpcXVpZCBkb2N1bWVudGF0aW9uICgjMTA3MykKCiMjIDEuMC4xIC8gMjAxMy0wNS0wOAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIERvIG5vdCBmb3JjZSB1c2Ugb2YgYHRvY190b2tlbmAgd2hlbiB1c2luZyBgZ2VuZXJhdGVfdG9rYCBpbiBSRGlzY291bnQgKCMxMDQ4KQogICogQWRkIG5ld2VyIGBsYW5ndWFnZS1gIGNsYXNzIG5hbWUgcHJlZml4IHRvIGNvZGUgYmxvY2tzICgjMTAzNykKICAqIENvbW1hbmRlciBlcnJvciBtZXNzYWdlIG5vdyBwcmVmZXJyZWQgb3ZlciBwcm9jZXNzIGFib3J0IHdpdGggaW5jb3JyZWN0IGFyZ3MgKCMxMDQwKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIE1ha2UgUmVkY2FycGV0IHJlc3BlY3QgdGhlIHB5Z21lbnRzIGNvbmZpZ3VyYXRpb24gb3B0aW9uICgjMTA1MykKICAqIEZpeCB0aGUgaW5kZXggYnVpbGQgd2l0aCBMU0kgKCMxMDQ1KQogICogRG9uJ3QgcHJpbnQgZGVwcmVjYXRpb24gd2FybmluZyB3aGVuIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLiAoIzEwNDEpCiAgKiBBZGQgbWlzc2luZyBgPC9kaXY+YCB0byBzaXRlIHRlbXBsYXRlIHVzZWQgYnkgYG5ld2Agc3ViY29tbWFuZCwgZml4ZWQgdHlwb3MgaW4gY29kZSAoIzEwMzIpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBDaGFuZ2VkIGh0dHBzIHRvIGh0dHAgaW4gdGhlIEdpdEh1YiBQYWdlcyBsaW5rICgjMTA1MSkKICAqIFJlbW92ZSBDU1MgY3J1ZnQsIGZpeCB0eXBvcywgZml4IEhUTUwgZXJyb3JzICgjMTAyOCkKICAqIFJlbW92aW5nIG1hbnVhbCBpbnN0YWxsIG9mIFBpcCBhbmQgRGlzdHJpYnV0ZSAoIzEwMjUpCiAgKiBVcGRhdGVkIFVSTCBmb3IgTWFya2Rvd24gcmVmZXJlbmNlcyBwbHVnaW4gKCMxMDIyKQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogTWFya2Rvd25pZnkgaGlzdG9yeSBmaWxlICgjMTAyNykKICAqIFVwZGF0ZSBsaW5rcyBvbiBSRUFETUUgdG8gcG9pbnQgdG8gbmV3IGpla3lsbHJiLmNvbSAoIzEwMTgpCgojIyAxLjAuMCAvIDIwMTMtMDUtMDYKCiMjIyBNYWpvciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgYGpla3lsbCBuZXdgIHN1YmNvbW1hbmQ6IGdlbmVyYXRlIGEgSmVreWxsIHNjYWZmb2xkICgjNzY0KQogICogUmVmYWN0b3JlZCBKZWt5bGwgY29tbWFuZHMgaW50byBzdWJjb21tYW5kczogYnVpbGQsIHNlcnZlLCBhbmQgbWlncmF0ZS4gKCM2OTApCiAgKiBSZW1vdmVkIGltcG9ydGVycy9taWdyYXRvcnMgZnJvbSBtYWluIHByb2plY3QsIG1pZ3JhdGVkIHRvIGpla3lsbC1pbXBvcnQgc3ViLWdlbSAoIzc5MykKICAqIEFkZGVkIGFiaWxpdHkgdG8gcmVuZGVyIGRyYWZ0cyBpbiBgX2RyYWZ0c2AgZm9sZGVyIHZpYSBjb21tYW5kIGxpbmUgKCM4MzMpCiAgKiBBZGQgb3JkaW5hbCBkYXRlIHBlcm1hbGluayBzdHlsZSAoLzpjYXRlZ29yaWVzLzp5ZWFyLzp5X2RheS86dGl0bGUuaHRtbCkgKCM5MjgpCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogU2l0ZSB0ZW1wbGF0ZSBIVE1MNS1pZmllZCAoIzk2NCkKICAqIFVzZSBwb3N0J3MgZGlyZWN0b3J5IHBhdGggd2hlbiBtYXRjaGluZyBmb3IgdGhlIGBwb3N0X3VybGAgdGFnICgjOTk4KQogICogTG9vc2VuIGRlcGVuZGVuY3kgb24gUHlnbWVudHMgc28gaXQncyBvbmx5IHJlcXVpcmVkIHdoZW4gaXQncyBuZWVkZWQgKCMxMDE1KQogICogUGFyc2Ugc3RyaW5ncyBpbnRvIFRpbWUgb2JqZWN0cyBmb3IgZGF0ZS1yZWxhdGVkIExpcXVpZCBmaWx0ZXJzICgjMTAxNCkKICAqIFRlbGwgdGhlIHVzZXIgaWYgdGhlcmUgaXMgbm8gc3ViY29tbWFuZCBzcGVjaWZpZWQgKCMxMDA4KQogICogRnJlYWsgb3V0IGlmIHRoZSBkZXN0aW5hdGlvbiBvZiBgamVreWxsIG5ld2AgZXhpc3RzIGFuZCBpcyBub24tZW1wdHkgKCM5ODEpCiAgKiBBZGQgYHRpbWV6b25lYCBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgY29tcGlsYXRpb24gKCM5NTcpCiAgKiBBZGQgZGVwcmVjYXRpb24gbWVzc2FnZXMgZm9yIHByZS0xLjAgQ0xJIG9wdGlvbnMgKCM5NTkpCiAgKiBSZWZhY3RvciBhbmQgY29sb3JpemUgbG9nZ2luZyAoIzk1OSkKICAqIFJlZmFjdG9yIE1hcmtkb3duIHBhcnNpbmcgKCM5NTUpCiAgKiBBZGRlZCBhcHBsaWNhdGlvbi92bmQuYXBwbGUucGtwYXNzIHRvIG1pbWUudHlwZXMgc2VydmVkIGJ5IFdFQnJpY2sgKCM5MDcpCiAgKiBNb3ZlIHRlbXBsYXRlIHNpdGUgdG8gZGVmYXVsdCBtYXJrZG93biByZW5kZXJlciAoIzk2MSkKICAqIEV4cG9zZSBuZXcgYXR0cmlidXRlIHRvIExpcXVpZCB2aWEgYHBhZ2VgOiBgcGFnZS5wYXRoYCAoIzk1MSkKICAqIEFjY2VwdCBtdWx0aXBsZSBjb25maWcgZmlsZXMgZnJvbSBjb21tYW5kIGxpbmUgKCM5NDUpCiAgKiBBZGQgcGFnZSB2YXJpYWJsZSB0byBsaXF1aWQgY3VzdG9tIHRhZ3MgYW5kIGJsb2NrcyAoIzQxMykKICAqIEFkZCBgcGFnaW5hdG9yLnByZXZpb3VzX3BhZ2VfcGF0aGAgYW5kIGBwYWdpbmF0b3IubmV4dF9wYWdlX3BhdGhgICgjOTQyKQogICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yICdhdXRvJyAoIzgyMSwgIzkzNCkKICAqIEFkZGVkIGRhdGVfdG9fcmZjODIyIHVzZWQgb24gUlNTIGZlZWRzICgjODkyKQogICogVXBncmFkZSB2ZXJzaW9uIG9mIHB5Z21lbnRzLnJiIHRvIDAuNC4yICgjOTI3KQogICogQWRkZWQgc2hvcnQgbW9udGggKGUuZy4gIlNlcCIpIHRvIHBlcm1hbGluayBzdHlsZSBvcHRpb25zIGZvciBwb3N0cyAoIzg5MCkKICAqIEV4cG9zZSBzaXRlLmJhc2V1cmwgdG8gTGlxdWlkIHRlbXBsYXRlcyAoIzg2OSkKICAqIEFkZHMgZXhjZXJwdCBhdHRyaWJ1dGUgdG8gcG9zdHMgd2hpY2ggY29udGFpbnMgZmlyc3QgcGFyYWdyYXBoIG9mIGNvbnRlbnQgKCM4MzcpCiAgKiBBY2NlcHQgY3VzdG9tIGNvbmZpZ3VyYXRpb24gZmlsZSB2aWEgQ0xJICgjODYzKQogICogTG9hZCBpbiBHaXRIdWIgUGFnZXMgTUlNRSBUeXBlcyBvbiBgamVreWxsIHNlcnZlYCAoIzg0NywgIzg3MSkKICAqIEltcHJvdmUgZGVidWdhYmlsaXR5IG9mIGVycm9yIG1lc3NhZ2UgZm9yIGEgbWFsZm9ybWVkIGhpZ2hsaWdodCB0YWcgKCM3ODUpCiAgKiBBbGxvdyBzeW1saW5rZWQgZmlsZXMgaW4gdW5zYWZlIG1vZGUgKCM4MjQpCiAgKiBBZGQgJ2dpc3QnIExpcXVpZCB0YWcgdG8gY29yZSAoIzgyMiwgIzg2MSkKICAqIE5ldyBmb3JtYXQgb2YgSmVreWxsIG91dHB1dCAoIzc5NSkKICAqIFJlaW5zdGF0ZSBgLS1saW1pdF9wb3N0c2AgYW5kIGAtLWZ1dHVyZWAgc3dpdGNoZXMgKCM3ODgpCiAgKiBSZW1vdmUgYW1iaWd1aXR5IGZyb20gY29tbWFuZCBkZXNjcmlwdGlvbnMgKCM4MTUpCiAgKiBGaXggU2FmZVlBTUwgV2FybmluZ3MgKCM4MDcpCiAgKiBSZWxheGVkIEtyYW1kb3duIHZlcnNpb24gdG8gMC4xNCAoIzgwOCkKICAqIEFsaWFzZWQgYGpla3lsbCBzZXJ2ZXJgIHRvIGBqZWt5bGwgc2VydmVgLiAoIzc5MikKICAqIFVwZGF0ZWQgZ2VtIHZlcnNpb25zIGZvciBLcmFtZG93biwgUmFrZSwgU2hvdWxkYSwgQ3VjdW1iZXIsIGFuZCBSZWRDYXJwZXQuICgjNzQ0KQogICogUmVmYWN0b3JlZCBKZWt5bGwgc3ViY29tbWFuZHMgaW50byBKZWt5bGw6OkNvbW1hbmRzIHN1Ym1vZHVsZSwgd2hpY2ggbm93IGNvbnRhaW5zIHRoZW0gKCM3NjgpCiAgKiBSZXNjdWUgZnJvbSBpbXBvcnQgZXJyb3JzIGluIFdvcmRwcmVzcy5jb20gbWlncmF0b3IgKCM2NzEpCiAgKiBNYXNzaXZlbHkgYWNjZWxlcmF0ZSBMU0kgcGVyZm9ybWFuY2UgKCM2NjQpCiAgKiBUcnVuY2F0ZSBwb3N0IHNsdWdzIHdoZW4gaW1wb3J0aW5nIGZyb20gVHVtYmxyICgjNDk2KQogICogQWRkIGdsb2Igc3VwcG9ydCB0byBpbmNsdWRlLCBleGNsdWRlIG9wdGlvbiAoIzc0MykKICAqIExheW91dCBvZiBQYWdlIG9yIFBvc3QgZGVmYXVsdHMgdG8gJ3BhZ2UnIG9yICdwb3N0JywgcmVzcGVjdGl2ZWx5ICgjNTgwKSBSRVBFQUxFRCBieSAoIzk3NykKICAqICJLZWVwIGZpbGVzIiBmZWF0dXJlICgjNjg1KQogICogT3V0cHV0IGZ1bGwgcGF0aCAmIG5hbWUgZm9yIGZpbGVzIHRoYXQgZG9uJ3QgcGFyc2UgKCM3NDUpCiAgKiBBZGQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgcHJvdGVjdGlvbiAoIzUzNSkKICAqIEJldHRlciBZQU1MIGVycm9yIG1lc3NhZ2UgKCM3MTgpCiAgKiBCdWcgRml4ZXMKICAqIFBhZ2luYXRlIGluIHN1YmRpcmVjdG9yaWVzIHByb3Blcmx5ICgjMTAxNikKICAqIEVuc3VyZSBwb3N0IGFuZCBwYWdlIFVSTHMgaGF2ZSBhIGxlYWRpbmcgc2xhc2ggKCM5OTIpCiAgKiBDYXRjaCBhbGwgZXhjZXB0aW9ucywgbm90IGp1c3QgU3RhbmRhcmRFcnJvciBkZXNjZW5kZW50cyAoIzEwMDcpCiAgKiBCdWxsZXQtcHJvb2YgYGxpbWl0X3Bvc3RzYCBvcHRpb24gKCMxMDA0KQogICogUmVhZCBpbiBZQU1MIGFzIFVURi04IHRvIGFjY2VwdCBub24tQVNDSUkgY2hhcnMgKCM4MzYpCiAgKiBGaXggdGhlIENMSSBvcHRpb24gYC0tcGx1Z2luc2AgdG8gYWN0dWFsbHkgYWNjZXB0IGRpcnMgYW5kIGZpbGVzICgjOTkzKQogICogQWxsb3cgJ2V4Y2VycHQnIGluIFlBTUwgZnJvbnQgbWF0dGVyIHRvIG92ZXJyaWRlIHRoZSBleHRyYWN0ZWQgZXhjZXJwdCAoIzk0NikKICAqIEZpeCBjYXNjYWRlIHByb2JsZW0gd2l0aCBzaXRlLmJhc2V1cmwsIHNpdGUucG9ydCBhbmQgc2l0ZS5ob3N0LiAoIzkzNSkKICAqIEZpbHRlciBvdXQgZGlyZWN0b3JpZXMgd2l0aCB2YWxpZCBwb3N0IG5hbWVzICgjODc1KQogICogRml4IHN5bWxpbmtlZCBzdGF0aWMgZmlsZXMgbm90IGJlaW5nIGNvcnJlY3RseSBidWlsdCBpbiB1bnNhZmUgbW9kZSAoIzkwOSkKICAqIEZpeCBpbnRlZ3JhdGlvbiB3aXRoIGRpcmVjdG9yeV93YXRjaGVyIDEuNC54ICgjOTE2KQogICogQWNjZXB0aW5nIHN0cmluZ3MgYXMgYXJndW1lbnRzIHRvIGpla3lsbC1pbXBvcnQgY29tbWFuZCAoIzkxMCkKICAqIEZvcmNlIHVzYWdlIG9mIG9sZGVyIGRpcmVjdG9yeV93YXRjaGVyIGdlbSBhcyAxLjUgaXMgYnJva2VuICgjODgzKQogICogRW5zdXJlIGFsbCBQb3N0IGNhdGVnb3JpZXMgYXJlIGRvd25jYXNlICgjODQyLCAjODcyKQogICogRm9yY2UgZW5jb2Rpbmcgb2YgdGhlIHJkaXNjb3VudCBUT0MgdG8gVVRGOCB0byBhdm9pZCBjb252ZXJzaW9uIGVycm9ycyAoIzU1NSkKICAqIFBhdGNoIGZvciBtdWx0aWJ5dGUgVVJJIHByb2JsZW0gd2l0aCBgamVreWxsIHNlcnZlYCAoIzcyMykKICAqIE9yZGVyIHBsdWdpbiBleGVjdXRpb24gYnkgcHJpb3JpdHkgKCM4NjQpCiAgKiBGaXhlZCBQYWdlI2RpciBhbmQgUGFnZSN1cmwgZm9yIGVkZ2UgY2FzZXMgKCM1MzYpCiAgKiBGaXggYnJva2VuIGBwb3N0X3VybGAgd2l0aCBwb3N0cyB3aXRoIGEgdGltZSBpbiB0aGVpciBZQU1MIGZyb250IG1hdHRlciAoIzgzMSkKICAqIExvb2sgZm9yIHBsdWdpbnMgdW5kZXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkgKCM2NTQpCiAgKiBUdW1ibHIgTWlncmF0b3I6IGZpbmRzIGBfcG9zdHNgIGRpciBjb3JyZWN0bHksIGZpeGVzIHRydW5jYXRpb24gb2YgbG9uZyBwb3N0IG5hbWVzICgjNzc1KQogICogRm9yY2UgQ2F0ZWdvcmllcyB0byBiZSBTdHJpbmdzICgjNzY3KQogICogU2FmZSBZQU1MIHBsdWdpbiB0byBwcmV2ZW50IHZ1bG5lcmFiaWxpdHkgKCM3NzcpCiAgKiBBZGQgU1ZHIHN1cHBvcnQgdG8gSmVreWxsL1dFQnJpY2suICgjNDA3LCAjNDA2KQogICogUHJldmVudCBjdXN0b20gZGVzdGluYXRpb24gZnJvbSBjYXVzaW5nIGNvbnRpbnVvdXMgcmVnZW4gb24gd2F0Y2ggKCM1MjgsICM4MjAsICM4NjIpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBSZXNwb25zaWZ5ICgjODYwKQogICogRml4IHNwZWxsaW5nLCBwdW5jdHVhdGlvbiBhbmQgcGhyYXNhbCBlcnJvcnMgKCM5ODkpCiAgKiBVcGRhdGUgcXVpY2tzdGFydCBpbnN0cnVjdGlvbnMgd2l0aCBgbmV3YCBjb21tYW5kICgjOTY2KQogICogQWRkIGRvY3MgZm9yIHBhZ2UuZXhjZXJwdCAoIzk1NikKICAqIEFkZCBkb2NzIGZvciBwYWdlLnBhdGggKCM5NTEpCiAgKiBDbGVhbiB1cCBzaXRlIGRvY3MgdG8gcHJlcGFyZSBmb3IgMS4wIHJlbGVhc2UgKCM5MTgpCiAgKiBCcmluZyBzaXRlIGludG8gbWFzdGVyIGJyYW5jaCB3aXRoIGJldHRlciBwcmV2aWV3L2RlcGxveSAoIzcwOSkKICAqIFJlZGVzaWduZWQgc2l0ZSAoIzU4MykKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEV4Y2x1ZGUgQ3VjdW1iZXIgMS4yLjQsIHdoaWNoIGNhdXNlcyB0ZXN0cyB0byBmYWlsIGluIDEuOS4yICgjOTM4KQogICogQWRkZWQgImZlYXR1cmVzOmh0bWwiIHJha2UgdGFzayBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBjbGVhbmVkIHVwIEN1Y3VtYmVyIHByb2ZpbGVzICgjODMyKQogICogRXhwbGljaXRseSByZXF1aXJlIEhUVFBTIHJ1YnlnZW1zIHNvdXJjZSBpbiBHZW1maWxlICgjODI2KQogICogQ2hhbmdlZCBSdWJ5IHZlcnNpb24gZm9yIGRldmVsb3BtZW50IHRvIDEuOS4zLXAzNzQgZnJvbSBwMzYyICgjODAxKQogICogSW5jbHVkaW5nIGEgbGluayB0byB0aGUgR2l0SHViIFJ1Ynkgc3R5bGUgZ3VpZGUgaW4gQ09OVFJJQlVUSU5HLm1kICgjODA2KQogICogQWRkZWQgc2NyaXB0L2Jvb3RzdHJhcCAoIzc3NikKICAqIFJ1bm5pbmcgU2ltcGxlY292IHVuZGVyIDIgY29uZGl0aW9uczogRU5WKENPVkVSQUdFKT10cnVlIGFuZCB3aXRoIFJ1YnkgdmVyc2lvbiBvZiBncmVhdGVyIHRoYW4gMS45ICgjNzcxKQogICogU3dpdGNoIHRvIFNpbXBsZWNvdiBmb3IgY292ZXJhZ2UgcmVwb3J0ICgjNzY1KQoKIyMgMC4xMi4xIC8gMjAxMy0wMi0xOQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFVwZGF0ZSBLcmFtZG93biB2ZXJzaW9uIHRvIDAuMTQuMSAoIzc0NCkKICAqIFRlc3QgRW5oYW5jZW1lbnRzCiAgKiBVcGRhdGUgUmFrZSB2ZXJzaW9uIHRvIDEwLjAuMyAoIzc0NCkKICAqIFVwZGF0ZSBTaG91bGRhIHZlcnNpb24gdG8gMy4zLjIgKCM3NDQpCiAgKiBVcGRhdGUgUmVkY2FycGV0IHZlcnNpb24gdG8gMi4yLjIgKCM3NDQpCgojIyAwLjEyLjAgLyAyMDEyLTEyLTIyCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQWRkIGFiaWxpdHkgdG8gZXhwbGljaXRseSBzcGVjaWZ5IGluY2x1ZGVkIGZpbGVzICgjMjYxKQogICogQWRkIGAtLWRlZmF1bHQtbWltZXR5cGVgIG9wdGlvbiAoIzI3OSkKICAqIEFsbG93IHNldHRpbmcgb2YgUmVkQ2xvdGggb3B0aW9ucyAoIzI4NCkKICAqIEFkZCBgcG9zdF91cmxgIExpcXVpZCB0YWcgZm9yIGludGVybmFsIHBvc3QgbGlua2luZyAoIzM2OSkKICAqIEFsbG93IG11bHRpcGxlIHBsdWdpbiBkaXJzIHRvIGJlIHNwZWNpZmllZCAoIzQzOCkKICAqIElubGluZSBUT0MgdG9rZW4gc3VwcG9ydCBmb3IgUkRpc2NvdW50ICgjMzMzKQogICogQWRkIHRoZSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcGFnaW5hdGVkIHVybCBmb3JtYXQgKCMzNDIpCiAgKiBTd2FwIG91dCBhbGJpbm8gZm9yIHB5Z21lbnRzLnJiICgjNTY5KQogICogU3VwcG9ydCBSZWRjYXJwZXQgMiBhbmQgZmVuY2VkIGNvZGUgYmxvY2tzICgjNjE5KQogICogQmV0dGVyIHJlcG9ydGluZyBvZiBMaXF1aWQgZXJyb3JzICgjNjI0KQogICogQnVnIEZpeGVzCiAgKiBBbGxvdyBzb21lIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBoaWdobGlnaHQgbmFtZXMKICAqIFVSTCBlc2NhcGUgY2F0ZWdvcnkgbmFtZXMgaW4gVVJMIGdlbmVyYXRpb24gKCMzNjApCiAgKiBGaXggZXJyb3Igd2l0aCBgbGltaXRfcG9zdHNgICgjNDQyKQogICogUHJvcGVybHkgc2VsZWN0IGRvdGZpbGUgZHVyaW5nIGRpcmVjdG9yeSBzY2FuICgjMzYzLCAjNDMxLCAjMzc3KQogICogQWxsb3cgc2V0dGluZyBvZiBLcmFtZG93biBgc21hcnRfcXVvdGVzYCAoIzQ4MikKICAqIEVuc3VyZSBmcm9udCBtYXR0ZXIgaXMgYXQgc3RhcnQgb2YgZmlsZSAoIzU2MikKCiMjIDAuMTEuMiAvIDIwMTEtMTItMjcKCiAgKiBCdWcgRml4ZXMKICAqIEZpeCBnZW1zcGVjCgojIyAwLjExLjEgLyAyMDExLTEyLTI3CgogICogQnVnIEZpeGVzCiAgKiBGaXggZXh0cmEgYmxhbmsgbGluZSBpbiBoaWdobGlnaHQgYmxvY2tzICgjNDA5KQogICogVXBkYXRlIGRlcGVuZGVuY2llcwoKIyMgMC4xMS4wIC8gMjAxMS0wNy0xMAoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIEFkZCBjb21tYW5kIGxpbmUgaW1wb3J0ZXIgZnVuY3Rpb25hbGl0eSAoIzI1MykKICAqIEFkZCBSZWRjYXJwZXQgTWFya2Rvd24gc3VwcG9ydCAoIzMxOCkKICAqIE1ha2UgbWFya2Rvd24vdGV4dGlsZSBleHRlbnNpb25zIGNvbmZpZ3VyYWJsZSAoIzMxMikKICAqIEFkZCBgbWFya2Rvd25pZnlgIGZpbHRlcgoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFN3aXRjaCB0byBBbGJpbm8gZ2VtCiAgKiBCdW5kbGVyIHN1cHBvcnQKICAqIFVzZSBFbmdsaXNoIGxpYnJhcnkgdG8gYXZvaWQgaG9vcHMgKCMyOTIpCiAgKiBBZGQgUG9zdGVyb3VzIGltcG9ydGVyICgjMjU0KQogICogRml4ZXMgZm9yIFdvcmRwcmVzcyBpbXBvcnRlciAoIzI3NCwgIzI1MiwgIzI3MSkKICAqIEJldHRlciBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIHBvc3QgZGF0ZSAoIzI5MSkKICAqIFByaW50IGZvcm1hdHRlZCBmYXRhbCBleGNlcHRpb25zIHRvIHN0ZG91dCBvbiBidWlsZCBmYWlsdXJlCiAgKiBBZGQgVHVtYmxyIGltcG9ydGVyICgjMzIzKQogICogQWRkIEVua2kgaW1wb3J0ZXIgKCMzMjApCiAgKiBCdWcgRml4ZXMKICAqIFNlY3VyZSBhZGRpdGlvbmFsIHBhdGggZXhwbG9pdHMKCiMjIDAuMTAuMCAvIDIwMTAtMTItMTYKCiAgKiBCdWcgRml4ZXMKICAqIEFkZCBgLS1uby1zZXJ2ZXJgIG9wdGlvbi4KCiMjIDAuOS4wIC8gMjAxMC0xMi0xNQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFVzZSBPcHRpb25QYXJzZXIncyBgW25vLV1gIGZ1bmN0aW9uYWxpdHkgZm9yIGJldHRlciBib29sZWFuIHBhcnNpbmcuCiAgKiBBZGQgRHJ1cGFsIG1pZ3JhdG9yICgjMjQ1KQogICogQ29tcGxhaW4gYWJvdXQgWUFNTCBhbmQgTGlxdWlkIGVycm9ycyAoIzI0OSkKICAqIFJlbW92ZSBvcnBoYW5lZCBmaWxlcyBkdXJpbmcgcmVnZW5lcmF0aW9uICgjMjQ3KQogICogQWRkIE1hcmxleSBtaWdyYXRvciAoIzI4KQoKIyMgMC44LjAgLyAyMDEwLTExLTIyCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQWRkIHdvcmRwcmVzcy5jb20gaW1wb3J0ZXIgKCMyMDcpCiAgKiBBZGQgYC0tbGltaXQtcG9zdHNgIGNsaSBvcHRpb24gKCMyMTIpCiAgKiBBZGQgYHVyaV9lc2NhcGVgIGZpbHRlciAoIzIzNCkKICAqIEFkZCBgLS1iYXNlLXVybGAgY2xpIG9wdGlvbiAoIzIzNSkKICAqIEltcHJvdmUgTVQgbWlncmF0b3IgKCMyMzgpCiAgKiBBZGQga3JhbWRvd24gc3VwcG9ydCAoIzIzOSkKICAqIEJ1ZyBGaXhlcwogICogRml4ZWQgZmlsZW5hbWUgYmFzZW5hbWUgZ2VuZXJhdGlvbiAoIzIwOCkKICAqIFNldCBtb2RlIHRvIFVURjggb24gU2VxdWVsIGNvbm5lY3Rpb25zICgjMjM3KQogICogUHJldmVudCBgX2luY2x1ZGVzYCBkaXIgZnJvbSBiZWluZyBhIHN5bWxpbmsKCiMjIDAuNy4wIC8gMjAxMC0wOC0yNAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIEFkZCBzdXBwb3J0IGZvciByZGlzY291bnQgZXh0ZW5zaW9ucyAoIzE3MykKICAqIEJ1ZyBGaXhlcwogICogSGlnaGxpZ2h0IHNob3VsZCBub3QgYmUgYWJsZSB0byByZW5kZXIgbG9jYWwgZmlsZXMKICAqIFRoZSBzaXRlIGNvbmZpZ3VyYXRpb24gbWF5IG5vdCBhbHdheXMgcHJvdmlkZSBhICd0aW1lJyBzZXR0aW5nICgjMTg0KQoKIyMgMC42LjIgLyAyMDEwLTA2LTI1CgogICogQnVnIEZpeGVzCiAgKiBGaXggUmFrZWZpbGUgJ3JlbGVhc2UnIHRhc2sgKHRhZyBwdXNoaW5nIHdhcyBtaXNzaW5nIG9yaWdpbikKICAqIEVuc3VyZSB0aGF0IFJlZENsb3RoIGlzIGxvYWRlZCB3aGVuIHRleHRpbGl6ZSBmaWx0ZXIgaXMgdXNlZCAoIzE4MykKICAqIEV4cGFuZCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBhbmQgcGx1Z2luIHBhdGhzICgjMTgwKQogICogRml4IGBwYWdlLnVybGAgdG8gaW5jbHVkZSBmdWxsIHJlbGF0aXZlIHBhdGggKCMxODEpCgojIyAwLjYuMSAvIDIwMTAtMDYtMjQKCiAgKiBCdWcgRml4ZXMKICAqIEZpeCBNYXJrZG93biBQeWdtZW50cyBwcmVmaXggYW5kIHN1ZmZpeCAoIzE3OCkKCiMjIDAuNi4wIC8gMjAxMC0wNi0yMwoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIFByb3BlciBwbHVnaW4gc3lzdGVtICgjMTksICMxMDApCiAgKiBBZGQgc2FmZSBtb2RlIHNvIHVuc2FmZSBjb252ZXJ0ZXJzL2dlbmVyYXRvcnMgY2FuIGJlIGFkZGVkCiAgKiBNYXJ1a3UgaXMgbm93IHRoZSBvbmx5IHByb2Nlc3NvciBkZXBlbmRlbmN5IGluc3RhbGxlZCBieSBkZWZhdWx0LiBPdGhlciBwcm9jZXNzb3JzIHdpbGwgYmUgbGF6eS1sb2FkZWQgd2hlbiBuZWNlc3NhcnkgKGFuZCBwcm9tcHQgdGhlIHVzZXIgdG8gaW5zdGFsbCB0aGVtIHdoZW4gbmVjZXNzYXJ5KSAoIzU3KQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIEluY2x1c2lvbi9leGNsdXNpb24gb2YgZnV0dXJlIGRhdGVkIHBvc3RzICgjNTkpCiAgKiBHZW5lcmF0aW9uIGZvciBhIHNwZWNpZmljIHRpbWUgKCM1OSkKICAqIEFsbG9jYXRlIGBzaXRlLnRpbWVgIG9uIHJlbmRlciBub3QgcGVyIHNpdGVfcGF5bG9hZCBpbnZvY2F0aW9uICgjNTkpCiAgKiBQYWdlcyBub3cgcHJlc2VudCBpbiB0aGUgc2l0ZSBwYXlsb2FkIGFuZCBjYW4gYmUgdXNlZCB0aHJvdWdoIHRoZSBgc2l0ZS5wYWdlc2AgYW5kIGBzaXRlLmh0bWxfcGFnZXNgIHZhcmlhYmxlcwogICogR2VuZXJhdGUgcGhhc2UgYWRkZWQgdG8gc2l0ZSNwcm9jZXNzIGFuZCBwYWdpbmF0aW9uIGlzIG5vdyBhIGdlbmVyYXRvcgogICogU3dpdGNoIHRvIFJha2VHZW0gZm9yIGJ1aWxkL3Rlc3QgcHJvY2VzcwogICogT25seSByZWdlbmVyYXRlIHN0YXRpYyBmaWxlcyB3aGVuIHRoZXkgaGF2ZSBjaGFuZ2VkICgjMTQyKQogICogQWxsb3cgYXJiaXRyYXJ5IG9wdGlvbnMgdG8gUHlnbWVudHMgKCMzMSkKICAqIEFsbG93IFVSTCB0byBiZSBzZXQgdmlhIGNvbW1hbmQgbGluZSBvcHRpb24gKCMxNDcpCiAgKiBCdWcgRml4ZXMKICAqIFJlbmRlciBoaWdobGlnaHRlZCBjb2RlIGZvciBub24gbWFya2Rvd24vdGV4dGlsZSBwYWdlcyAoIzExNikKICAqIEZpeCBoaWdobGlnaHRpbmcgb24gUnVieSAxLjkgKCM2NSkKICAqIEZpeCBleHRlbnNpb24gbXVuZ2luZyB3aGVuIHByZXR0eSBwZXJtYWxpbmtzIGFyZSBlbmFibGVkICgjNjQpCiAgKiBTdG9wIHNvcnRpbmcgY2F0ZWdvcmllcyAoIzMzKQogICogUHJlc2VydmUgZ2VuZXJhdGVkIGF0dHJpYnV0ZXMgb3ZlciBmcm9udCBtYXR0ZXIgKCMxMTkpCiAgKiBGaXggc291cmNlIGRpcmVjdG9yeSBiaW5kaW5nIHVzaW5nIGBEaXIucHdkYCAoIzc1KQoKIyMgMC41LjcgLyAyMDEwLTAxLTEyCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQWxsb3cgb3ZlcnJpZGluZyBvZiBwb3N0IGRhdGUgaW4gdGhlIGZyb250IG1hdHRlciAoIzYyLCAjMzgpCiAgKiBCdWcgRml4ZXMKICAqIENhdGVnb3JpZXMgaXNuJ3QgYWx3YXlzIGFuIGFycmF5ICgjNzMpCiAgKiBFbXB0eSB0YWdzIGNhdXNlcyBlcnJvciBpbiByZWFkX3Bvc3RzICgjODQpCiAgKiBGaXggcGFnaW5hdGlvbiB0byBhZGhlcmUgdG8gcmVhZC9yZW5kZXIvd3JpdGUgcGFyYWRpZ20KICAqIFRlc3QgRW5oYW5jZW1lbnQKICAqIEN1Y3VtYmVyIGZlYXR1cmVzIG5vIGxvbmdlciB1c2Ugc2l0ZS5wb3N0cy5maXJzdCB3aGVyZSBhIGJldHRlciBhbHRlcm5hdGl2ZSBpcyBhdmFpbGFibGUKCiMjIDAuNS42IC8gMjAxMC0wMS0wOAoKICAqIEJ1ZyBGaXhlcwogICogUmVxdWlyZSByZWRjbG90aCA+PSA0LjIuMSBpbiB0ZXN0cyAoIzkyKQogICogRG9uJ3QgYnJlYWsgb24gdHJpcGxlIGRhc2hlcyBpbiB5YW1sIGZyb250IG1hdHRlciAoIzkzKQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIEFsbG93IC5ta2QgYXMgbWFya2Rvd24gZXh0ZW5zaW9uCiAgKiBVc2UgJHN0ZG91dC9lcnIgaW5zdGVhZCBvZiBjb25zdGFudHMgKCM5OSkKICAqIFByb3Blcmx5IHdyYXAgY29kZSBibG9ja3MgKCM5MSkKICAqIEFkZCBqYXZhc2NyaXB0IG1pbWUgdHlwZSBmb3Igd2VicmljayAoIzk4KQoKIyMgMC41LjUgLyAyMDEwLTAxLTA4CgogICogQnVnIEZpeGVzCiAgKiBGaXggcGFnaW5hdGlvbiAlIDAgYnVnICgjNzgpCiAgKiBFbnN1cmUgYWxsIHBvc3RzIGFyZSBwcm9jZXNzZWQgZmlyc3QgKCM3MSkgIyMgTk9URQogICogQWZ0ZXIgdGhpcyBwb2ludCBJIHdpbGwgbm8gbG9uZ2VyIGJlIGdpdmluZyBjcmVkaXQgaW4gdGhlIGhpc3Rvcnk7IHRoYXQgaXMgd2hhdCB0aGUgY29tbWl0IGxvZyBpcyBmb3IuCgojIyAwLjUuNCAvIDIwMDktMDgtMjMKCiAgKiBCdWcgRml4ZXMKICAqIERvIG5vdCBhbGxvdyBzeW1saW5rcyAoc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSkKCiMjIDAuNS4zIC8gMjAwOS0wNy0xNAoKICAqIEJ1ZyBGaXhlcwogICogU29sdmluZyB0aGUgcGVybWFsaW5rIGJ1ZyB3aGVyZSBub24taHRtbCBmaWxlcyB3b3VsZG4ndCB3b3JrIChAamVmZnJ5ZGVncmFuZGUpCgojIyAwLjUuMiAvIDIwMDktMDYtMjQKCiAgKiBFbmhhbmNlbWVudHMKICAqIEFkZGVkIC0tcGFnaW5hdGUgb3B0aW9uIHRvIHRoZSBleGVjdXRhYmxlIGFsb25nIHdpdGggYSBwYWdpbmF0b3Igb2JqZWN0IGZvciB0aGUgcGF5bG9hZCAoQGNhbGF2ZXJhKQogICogVXBncmFkZWQgUmVkQ2xvdGggdG8gNC4yLjEsIHdoaWNoIG1ha2VzIGA8bm90ZXh0aWxlPmAgdGFncyB3b3JrIG9uY2UgYWdhaW4uCiAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgc2V0IGluIGNvbmZpZy55bWwgYXJlIG5vdyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgc2l0ZSBwYXlsb2FkIChAdmlsY2FucykKICAqIFBvc3RzIGNhbiBub3cgaGF2ZSBhbiBlbXB0eSBZQU1MIGZyb250IG1hdHRlciBvciBub25lIGF0IGFsbCAoQCBiYWh1dnJpaGkpCiAgKiBCdWcgRml4ZXMKICAqIEZpeGluZyBSdWJ5IDEuOSBpc3N1ZSB0aGF0IHJlcXVpcmVzIGAjdG9fc2Agb24gdGhlIGVyciBvYmplY3QgKEBDaHJvbm9uYXV0KQogICogRml4ZXMgZm9yIHBhZ2luYXRpb24gYW5kIG9yZGVyaW5nIHBvc3RzIG9uIHRoZSBzYW1lIGRheSAoQHVqaCkKICAqIE1hZGUgcGFnZXMgcmVzcGVjdCBwZXJtYWxpbmtzIHN0eWxlIGFuZCBwZXJtYWxpbmtzIGluIHltbCBmcm9udCBtYXR0ZXIgKEBldWdlbmVib2xzaGFrb3YpCiAgKiBJbmRleC5odG1sIGZpbGUgc2hvdWxkIGFsd2F5cyBoYXZlIGluZGV4Lmh0bWwgcGVybWFsaW5rIChAZXVnZW5lYm9sc2hha292KQogICogQWRkZWQgdHJhaWxpbmcgc2xhc2ggdG8gcHJldHR5IHBlcm1hbGluayBzdHlsZSBzbyBBcGFjaGUgaXMgaGFwcHkgKEBldWdlbmVib2xzaGFrb3YpCiAgKiBCYWQgbWFya2Rvd24gcHJvY2Vzc29yIGluIGNvbmZpZyBmYWlscyBzb29uZXIgYW5kIHdpdGggYmV0dGVyIG1lc3NhZ2UgKEAgZ2Nub3Z1cykKICAqIEFsbG93IENSTEZzIGluIHlhbWwgZnJvbnQgbWF0dGVyIChAanVyZXR0YSkKICAqIEFkZGVkIERhdGUjeG1sc2NoZW1hIGZvciBSdWJ5IHZlcnNpb25zIDwgMS45CgojIyAwLjUuMSAvIDIwMDktMDUtMDYKCiMjIyBNYWpvciBFbmhhbmNlbWVudHMKCiAgKiBOZXh0L3ByZXZpb3VzIHBvc3RzIGluIHNpdGUgcGF5bG9hZCAoQHBhbnR1bGlzLCBAdG9tbykKICAqIFBlcm1hbGluayB0ZW1wbGF0aW5nIHN5c3RlbQogICogTW92ZWQgbW9zdCBvZiB0aGUgUkVBRE1FIG91dCB0byB0aGUgR2l0SHViIHdpa2kKICAqIEV4Y2x1ZGUgb3B0aW9uIGluIGNvbmZpZ3VyYXRpb24gc28gc3BlY2lmaWVkIGZpbGVzIHdvbid0IGJlIGJyb3VnaHQgb3ZlciB3aXRoIGdlbmVyYXRlZCBzaXRlIChAZHVyaXRvbmcpCiAgKiBCdWcgRml4ZXMKICAqIE1ha2luZyBzdXJlIGNvbmZpZy55YW1sIHJlZmVyZW5jZXMgYXJlIGFsbCBnb25lLCB1c2luZyBvbmx5IGNvbmZpZy55bWwKICAqIEZpeGVkIHN5bnRheCBoaWdobGlnaHRpbmcgYnJlYWtpbmcgZm9yIFVURi04IGNvZGUgKEBoZW5yaWspCiAgKiBXb3JrZWQgYXJvdW5kIFJEaXNjb3VudCBidWcgdGhhdCBwcmV2ZW50cyBNYXJrZG93biBmcm9tIGdldHRpbmcgcGFyc2VkIGFmdGVyIGhpZ2hsaWdodCAoQGhlbnJpaykKICAqIENHSSBlc2NhcGVkIHBvc3QgdGl0bGVzIChAQ2hyb25vbmF1dCkKCiMjIDAuNS4wIC8gMjAwOS0wNC0wNwoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIEFiaWxpdHkgdG8gc2V0IHBvc3QgY2F0ZWdvcmllcyB2aWEgWUFNTCAoQHFydXNoKQogICogQWJpbGl0eSB0byBzZXQgcHJldmVudCBhIHBvc3QgZnJvbSBwdWJsaXNoaW5nIHZpYSBZQU1MIChAcXJ1c2gpCiAgKiBBZGQgdGV4dGlsaXplIGZpbHRlciAoQHdpbGxjb2RlZm9yZm9vKQogICogQWRkICdwcmV0dHknIHBlcm1hbGluayBzdHlsZSBmb3Igd29yZHByZXNzLWxpa2UgdXJscyAoQGR5c2luZ2VyKQogICogTWFkZSBpdCBwb3NzaWJsZSB0byBlbnRlciBjYXRlZ29yaWVzIGZyb20gWUFNTCBhcyBhbiBhcnJheSAoQENocm9ub25hdXQpCiAgKiBJZ25vcmUgRW1hY3MgYXV0b3NhdmUgZmlsZXMgKEBDaHJvbm9uYXV0KQogICogQnVnIEZpeGVzCiAgKiBVc2UgYmxvY2sgc3ludGF4IG9mIHBvcGVuNCB0byBlbnN1cmUgdGhhdCBzdWJwcm9jZXNzZXMgYXJlIHByb3Blcmx5IGRpc3Bvc2VkIChAanFyKQogICogQ2xvc2Ugb3BlbjQgc3RyZWFtcyB0byBwcmV2ZW50IHpvbWJpZXMgKEBydG9tYXlrbykKICAqIE9ubHkgcXVlcnkgcmVxdWlyZWQgZmllbGRzIGZyb20gdGhlIFdQIERhdGFiYXNlIChAYXJpZWphbikKICAqIFByZXZlbnQgYF9wb3N0c2AgZnJvbSBiZWluZyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSAoQGJkaW1jaGVmZikKICAqIFJlZmFjdG9ycwogICogRmFjdG9yZWQgdGhlIGZpbHRlcmluZyBjb2RlIGludG8gYSBtZXRob2QgKEBDaHJvbm9uYXV0KQogICogRml4IHRlc3RzIGFuZCBjb252ZXJ0IHRvIFNob3VsZGEgKEBxcnVzaCwgQHRlY2huaWNhbHBpY2tsZXMpCiAgKiBBZGQgQ3VjdW1iZXIgYWNjZXB0YW5jZSB0ZXN0IHN1aXRlIChAcXJ1c2gsIEB0ZWNobmljYWxwaWNrbGVzKQoKIyMgMC40LjEKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBDaGFuZ2VkIGRhdGUgZm9ybWF0IG9uIHdvcmRwcmVzcyBjb252ZXJ0ZXIgKHplcm9wYWRkaW5nKSAoQGR5c2luZ2VyKQogICogQnVnIEZpeGVzCiAgKiBBZGQgSmVreWxsIGJpbmFyeSBhcyBleGVjdXRhYmxlIHRvIGdlbXNwZWMgKEBkeXNpbmdlcikKCiMjIDAuNC4wIC8gMjAwOS0wMi0wMwoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIFN3aXRjaCB0byBKZXdlbGVyIGZvciBwYWNrYWdpbmcgdGFza3MKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBUeXBlIGltcG9ydGVyIChAY29kZXNsaW5nZXIpCiAgKiBgc2l0ZS50b3BpY3NgIGFjY2Vzc29yIChAYmF6KQogICogQWRkIGBhcnJheV90b19zZW50ZW5jZV9zdHJpbmdgIGZpbHRlciAoQG1jaHVuZykKICAqIEFkZCBhIGNvbnZlcnRlciBmb3IgdGV4dHBhdHRlcm4gKEBQZXJmZWN0bHlOb3JtYWwpCiAgKiBBZGQgYSB3b3JraW5nIE1lcGhpc3RvIC8gTXlTUUwgY29udmVydGVyIChAaXZleSkKICAqIEFsbG93aW5nIC5odGFjY2VzcyBmaWxlcyB0byBiZSBjb3BpZWQgb3ZlciBpbnRvIHRoZSBnZW5lcmF0ZWQgc2l0ZSAoQGJyaWFuZG9sbCkKICAqIEFkZCBvcHRpb24gdG8gbm90IHB1dCBmaWxlIGRhdGUgaW4gcGVybWFsaW5rIFVSTCAoQG1yZWlkKQogICogQWRkIGxpbmUgbnVtYmVyIGNhcGFiaWxpdGllcyB0byBoaWdobGlnaHQgYmxvY2tzIChAamNvbikKICAqIEJ1ZyBGaXhlcwogICogRml4IHBlcm1hbGluayBiZWhhdmlvciAoQGNhdmFsbGUpCiAgKiBGaXhlZCBhbiBpc3N1ZSB3aXRoIHB5Z21lbnRzLCBtYXJrZG93biwgYW5kIG5ld2xpbmVzIChAenBpbnRlcikKICAqIEFtcGVyc2FuZHMgbmVlZCB0byBiZSBlc2NhcGVkIChAcHVmdXdvenUsIEBhcCkKICAqIFRlc3QgYW5kIGZpeCB0aGUgc2l0ZS5jYXRlZ29yaWVzIGhhc2ggKEB6em90KQogICogRml4IHNpdGUgcGF5bG9hZCBhdmFpbGFibGUgdG8gZmlsZXMgKEBtYXRyaXg5MTgwKQoKIyMgMC4zLjAgLyAyMDA4LTEyLTI0CgojIyMgTWFqb3IgRW5oYW5jZW1lbnRzCgogICogQWRkZWQgYC0tc2VydmVyYCBvcHRpb24gdG8gc3RhcnQgYSBzaW1wbGUgV0VCcmljayBzZXJ2ZXIgb24gZGVzdGluYXRpb24gZGlyZWN0b3J5IChAam9obnJlaWxseSBhbmQgQG1jaHVuZykKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBBZGRlZCBwb3N0IGNhdGVnb3JpZXMgYmFzZWQgb24gZGlyZWN0b3JpZXMgY29udGFpbmluZyBgX3Bvc3RzYCAoQG1yZWlkKQogICogQWRkZWQgcG9zdCB0b3BpY3MgYmFzZWQgb24gZGlyZWN0b3JpZXMgdW5kZXJuZWF0aCBgX3Bvc3RzYAogICogQWRkZWQgbmV3IGRhdGUgZmlsdGVyIHRoYXQgc2hvd3MgdGhlIGZ1bGwgbW9udGggbmFtZSAoQG1yZWlkKQogICogTWVyZ2UgUG9zdCdzIFlBTUwgZnJvbnQgbWF0dGVyIGludG8gaXRzIHRvX2xpcXVpZCBwYXlsb2FkIChAcmVtaSkKICAqIFJlc3RyaWN0IGluY2x1ZGVzIHRvIHJlZ3VsYXIgZmlsZXMgdW5kZXJuZWF0aCBgX2luY2x1ZGVzYAogICogQnVnIEZpeGVzCiAgKiBDaGFuZ2UgWUFNTCBkZWxpbWl0ZXIgbWF0Y2hlciBzbyBhcyB0byBub3QgY2hldyB1cCAybmQgbGV2ZWwgbWFya2Rvd24gaGVhZGVycyAoQG1yZWlkKQogICogRml4IGJ1ZyB0aGF0IG1lYW50IHBhZ2UgZGF0YSAoc3VjaCBhcyB0aGUgZGF0ZSkgd2FzIG5vdCBhdmFpbGFibGUgaW4gdGVtcGxhdGVzIChAbXJlaWQpCiAgKiBQcm9wZXJseSByZWplY3QgZGlyZWN0b3JpZXMgaW4gYF9sYXlvdXRzYAoKIyMgMC4yLjEgLyAyMDA4LTEyLTE1CgogICogTWFqb3IgQ2hhbmdlcwogICogVXNlIE1hcnVrdSAocHVyZSBSdWJ5KSBmb3IgTWFya2Rvd24gYnkgZGVmYXVsdCAoQG1yZWlkKQogICogQWxsb3cgdXNlIG9mIFJEaXNjb3VudCB3aXRoIGAtLXJkaXNjb3VudGAgZmxhZwoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIERvbid0IGxvYWQgZGlyZWN0b3J5X3dhdGNoZXIgdW5sZXNzIGl0J3MgbmVlZGVkIChAcGpoeWV0dCkKCiMjIDAuMi4wIC8gMjAwOC0xMi0xNAoKICAqIE1ham9yIENoYW5nZXMKICAqIHJlbGF0ZWRfcG9zdHMgaXMgbm93IGZvdW5kIGluIGBzaXRlLnJlbGF0ZWRfcG9zdHNgCgojIyAwLjEuNiAvIDIwMDgtMTItMTMKCiAgKiBNYWpvciBGZWF0dXJlcwogICogSW5jbHVkZSBmaWxlcyBpbiBgX2luY2x1ZGVzYCB3aXRoIGB7JSBpbmNsdWRlIHgudGV4dGlsZSAlfWAKCiMjIDAuMS41IC8gMjAwOC0xMi0xMgoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIENvZGUgaGlnaGxpZ2h0aW5nIHdpdGggUHlnbWVudHMgaWYgYC0tcHlnbWVudHNgIGlzIHNwZWNpZmllZAogICogRGlzYWJsZSB0cnVlIExTSSBieSBkZWZhdWx0LCBlbmFibGUgd2l0aCBgLS1sc2lgCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogT3V0cHV0IGluZm9ybWF0aXZlIG1lc3NhZ2UgaWYgUkRpc2NvdW50IGlzIG5vdCBhdmFpbGFibGUgKEBKYWNrRGFuZ2VyKQogICogQnVnIEZpeGVzCiAgKiBQcmV2ZW50IEpla3lsbCBmcm9tIHBpY2tpbmcgdXAgdGhlIG91dHB1dCBkaXJlY3RvcnkgYXMgYSBzb3VyY2UgKEBKYWNrRGFuZ2VyKQogICogU2tpcCBgcmVsYXRlZF9wb3N0c2Agd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBwb3N0IChASmFja0RhbmdlcikKCiMjIDAuMS40IC8gMjAwOC0xMi0wOAoKICAqIEJ1ZyBGaXhlcwogICogREFUQSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IHdpdGggcnVieWdlbXMKCiMjIDAuMS4zIC8gMjAwOC0xMi0wNgoKICAqIE1ham9yIEZlYXR1cmVzCiAgKiBNYXJrZG93biBzdXBwb3J0IChAdmFucGVsdCkKICAqIE1lcGhpc3RvIGFuZCBDU1YgY29udmVydGVycyAoQHZhbnBlbHQpCiAgKiBDb2RlIGhpbGlnaHRpbmcgKEB2YW5wZWx0KQogICogQXV0b2J1aWxkCiAgKiBCdWcgRml4ZXMKICAqIEFjY2VwdCBib3RoIGBcclxuYCBhbmQgYFxuYCBpbiBZQU1MIGhlYWRlciAoQHZhbnBlbHQpCgojIyAwLjEuMiAvIDIwMDgtMTEtMjIKCiAgKiBNYWpvciBGZWF0dXJlcwogICogQWRkIGEgcmVhbCAicmVsYXRlZCBwb3N0cyIgaW1wbGVtZW50YXRpb24gdXNpbmcgQ2xhc3NpZmllcgogICogQ29tbWFuZCBMaW5lIENoYW5nZXMKICAqIEFsbG93IGNsaSB0byBiZSBjYWxsZWQgd2l0aCAwLCAxLCBvciAyIGFyZ3MgaW50dWl0aW5nIGRpciBwYXRocyBpZiB0aGV5IGFyZSBvbWl0dGVkCgojIyAwLjEuMSAvIDIwMDgtMTEtMjIKCiAgKiBNaW5vciBBZGRpdGlvbnMKICAqIFBvc3RzIG5vdyBzdXBwb3J0IGludHJvc3BlY3Rpb25hbCBkYXRhIGUuZy4gYHt7IHBhZ2UudXJsIH19YAoKIyMgMC4xLjAgLyAyMDA4LTExLTA1CgogICogRmlyc3QgcmVsZWFzZQogICogQ29udmVydHMgcG9zdHMgd3JpdHRlbiBpbiBUZXh0aWxlCiAgKiBDb252ZXJ0cyByZWd1bGFyIHNpdGUgcGFnZXMKICAqIFNpbXBsZSBjb3B5IG9mIGJpbmFyeSBmaWxlcwoKIyMgMC4wLjAgLyAyMDA4LTEwLTE5CgogICogQmlydGhkYXkhCg== \ No newline at end of file From 97a6a312ac232f629b38b8bafec0786d6e037800 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 7 Jan 2016 22:27:47 -0800 Subject: [PATCH 0232/4996] Revert "Update history to reflect merge of #4330 [ci skip]" This reverts commit a12ee551399eadd2b970f08629b39cb02f8381f8. --- History.markdown | 1917 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1916 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 7db11b3ef9e..a1ad1b896bf 100644 --- a/History.markdown +++ b/History.markdown @@ -1 +1,1916 @@ -IyMgSEVBRAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFVzZSBgTGlxdWlkOjpEcm9wYHMgaW5zdGVhZCBvZiBgSGFzaGBlcyBpbiBgI3RvX2xpcXVpZGAgKCM0Mjc3KQogICogQWRkICdzYW1wbGUnIExpcXVpZCBmaWx0ZXIgRXF1aXZhbGVudCB0byBBcnJheSNzYW1wbGUgZnVuY3Rpb25hbGl0eSAoIzQyMjMpCiAgKiBDYWNoZSBwYXJzZWQgaW5jbHVkZSBmaWxlIHRvIHNhdmUgbGlxdWlkIHBhcnNpbmcgdGltZS4gKCM0MTIwKQogICogU2xpZ2h0bHkgc3BlZWQgdXAgdXJsIHNhbml0aXphdGlvbiBhbmQgaGFuZGxlIG11bHRpcGxlcyBvZiAvLy8uICgjNDE2OCkKICAqIFByaW50IGRlYnVnIG1lc3NhZ2Ugd2hlbiBhIGRvY3VtZW50IGlzIHNraXBwZWQgZnJvbSByZWFkaW5nICgjNDE4MCkKICAqIEluY2x1ZGUgdGFnIHNob3VsZCBhY2NlcHQgbXVsdGlwbGUgdmFyaWFibGVzIGluIHRoZSBpbmNsdWRlIG5hbWUgKCM0MTgzKQogICogQWRkIGAtb2Agb3B0aW9uIHRvIHNlcnZlIGNvbW1hbmQgd2hpY2ggb3BlbnMgc2VydmVyIFVSTCAoIzQxNDQpCiAgKiBBZGQgQ29kZUNsaW1hdGUgcGxhdGZvcm0gZm9yIGJldHRlciBjb2RlIHF1YWxpdHkuICgjNDIyMCkKICAqIEdlbmVyYWwgaW1wcm92ZW1lbnRzIGZvciBXRUJyaWNrIHZpYSBqZWt5bGwgc2VydmUgc3VjaCBhcyBTU0wgJiBjdXN0b20gaGVhZGVycyAoIzQyMjQsICM0MjI4KQogICogQWRkIGEgZGVmYXVsdCBjaGFyc2V0IHRvIGNvbnRlbnQtdHlwZSBvbiB3ZWJyaWNrLiAoIzQyMzEpCiAgKiBTd2l0Y2ggYFBsdWdpbk1hbmFnZXJgIHRvIHVzZSBgcmVxdWlyZV93aXRoX2dyYWNlZnVsX2ZhaWxgIGZvciBiZXR0ZXIgVVggKCM0MjMzKQogICogQWxsb3cgcXVvdGVkIGRhdGUgaW4gZnJvbnQgbWF0dGVyIGRlZmF1bHRzICgjNDE4NCkKICAqIEFkZCBhIEpla3lsbCBkb2N0b3Igd2FybmluZyBmb3IgVVJMcyB0aGF0IG9ubHkgZGlmZmVyIGJ5IGNhc2UgKCMzMTcxKQogICogZHJvcHM6IGNyZWF0ZSBvbmUgYmFzZSBEcm9wIGNsYXNzIHdoaWNoIGNhbiBiZSBzZXQgYXMgbXV0YWJsZSBvciBub3QgKCM0Mjg1KQogICogZHJvcHM6IHByb3ZpZGUgYCN0b19oYCB0byBhbGxvdyBmb3IgaGFzaCBpbnRyb3NwZWN0aW9uICgjNDI4MSkKICAqIFNoaW0gc3ViY29tbWFuZHMgd2l0aCBpbmRpY2F0aW9uIG9mIGdlbSBwb3NzaWJseSByZXF1aXJlZCBzbyB1c2VycyBrbm93IGhvdyB0byB1c2UgdGhlbSAoIzQyNTQpCgojIyMgQnVnIEZpeGVzCgogICogUGFzcyBidWlsZCBvcHRpb25zIGludG8gYGNsZWFuYCBjb21tYW5kICgjNDE3NykKICAqIEFsbG93IHVzZXJzIHRvIHVzZSAuaHRtIGFuZCAueGh0bWwgKFhIVE1MNS4pICgjNDE2MCkKICAqIFByZXZlbnQgU2hlbGwgSW5qZWN0aW9uLiAoIzQyMDApCiAgKiBDb252ZXJ0aWJsZSBzaG91bGQgbWFrZSBsYXlvdXQgZGF0YSBhY2Nlc3NpYmxlIHZpYSBgbGF5b3V0YCBpbnN0ZWFkIG9mIGBwYWdlYCAoIzQyMDUpCiAgKiBBdm9pZCB1c2luZyBgRGlyLmdsb2JgIHdpdGggYWJzb2x1dGUgcGF0aCB0byBhbGxvdyBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIHBhdGggKCM0MTUwKQogICogSGFuZGxlIGVtcHR5IGNvbmZpZyBmaWxlcyAoIzQwNTIpCiAgKiBSZW5hbWUgYEBvcHRpb25zYCBzbyB0aGF0IGl0IGRvZXMgbm90IGltcGFjdCBMaXF1aWQuICgjNDE3MykKICAqIHV0aWxzL2Ryb3BzOiB1cGRhdGUgRHJvcCB0byBzdXBwb3J0IGBVdGlscy5kZWVwX21lcmdlX2hhc2hlc2AgKCM0Mjg5KQogICogTWFrZSBzdXJlIGpla3lsbC9kcm9wcy9kcm9wIGlzIGxvYWRlZCBmaXJzdC4gKCM0MjkyKQogICogQ29udmVydGlibGUvUGFnZS9SZW5kZXJlcjogdXNlIHBheWxvYWQgaGFzaCBhY2Nlc3NvciAmIHNldHRlciBzeW50YXggZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5ICgjNDMxMSkKICAqIERyb3A6IGZpeCBoYXNoIHNldHRlciBwcmVjZW5kZW5jZSAoIzQzMTIpCiAgKiB1dGlsczogYGhhc195YW1sX2hlYWRlcj9gIHNob3VsZCBhY2NlcHQgZmlsZXMgd2l0aCBleHRyYW5lb3VzIHNwYWNlcyAoIzQyOTApCiAgKiBFc2NhcGUgaHRtbCBmcm9tIHNpdGUudGl0bGUgYW5kIHBhZ2UudGl0bGUgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzQzMDcpCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBgamVreWxsLWRvY3NgIHNob3VsZCBiZSBlYXNpbHkgcmVsZWFzZS1hYmxlICgjNDE1MikKICAqIEFsbG93IHVzZSBvZiBDdWN1bWJlciAyLjEgb3IgZ3JlYXRlciAoIzQxODEpCiAgKiBNb2Rlcm5pemUgS3JhbWRvd24gZm9yIE1hcmtkb3duIGNvbnZlcnRlci4gKCM0MTA5KQogICogQ2hhbmdlIFRlc3REb2N0b3JDb21tYW5kIHRvIEpla3lsbFVuaXRUZXN0Li4uICgjNDI2MykKICAqIENyZWF0ZSBuYW1lc3BhY2VkIHJha2UgdGFza3MgaW4gc2VwYXJhdGUgYC5yYWtlYCBmaWxlcyB1bmRlciBgbGliL3Rhc2tzYCAoIzQyODIpCiAgKiBtYXJrZG93bjogcmVmYWN0b3IgZm9yIGdyZWF0ZXIgcmVhZGFiaWxpdHkgJiBlZmZpY2llbmN5ICgjMzc3MSkKICAqIEZpeCBtYW55IFJ1Ym9jb3Agc3R5bGUgZXJyb3JzICgjNDMwMSkKICAqIEZpeCBzcGVsbGluZyBvZiAiR2l0SHViIiBpbiBkb2NzIGFuZCBoaXN0b3J5ICgjNDMyMikKICAqIFJlb3JnYW5pemUgYW5kIGNsZWFudXAgdGhlIEdlbWZpbGUsIHNob3J0ZW4gcmVxdWlyZWQgZGVwZW5kcy4gKCM0MzE4KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogQWRkIHRocmVlIHBsdWdpbnMgdG8gZGlyZWN0b3J5ICgjNDE2MykKICAqIEFkZCB1cGdyYWRpbmcgZG9jcyBmcm9tIDIueCB0byAzLnggKCM0MTU3KQogICogQWRkIGBwcm90ZWN0X2VtYWlsYCB0byB0aGUgcGx1Z2lucyBpbmRleC4gKCM0MTY5KQogICogQWRkIGBqZWt5bGwtZGVwbG95YCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCM0MTc5KQogICogQ2xhcmlmeSBwbHVnaW4gZG9jcyAoIzQxNTQpCiAgKiBBZGQgS2lja3N0ZXIgdG8gZGVwbG95bWVudCBtZXRob2RzIGluIGRvY3VtZW50YXRpb24gKCM0MTkwKQogICogQWRkIERhdmlkQnVyZWxhJ3MgdHV0b3JpYWwgZm9yIFdpbmRvd3MgdG8gV2luZG93cyBkb2NzIHBhZ2UgKCM0MjEwKQogICogQ2hhbmdlIEdpdEh1YiBjb2RlIGJsb2NrIHRvIGhpZ2hsaWdodCB0YWcgdG8gYXZvaWQgaXQgb3ZlcmxhcHMgcGFyZW50IGRpdiAoIzQxMjEpCiAgKiBVcGRhdGUgRm9ybUtlZXAgbGluayB0byBiZSBzb21ldGhpbmcgbW9yZSBzcGVjaWZpYyB0byBKZWt5bGwgKCM0MjQzKQogICogUmVtb3ZlIGV4YW1wbGUgUm9nZXIgQ2hhcG1hbiBzaXRlLCBhcyB0aGUgZG9tYWluIGRvZXNuJ3QgZXhpc3QgKCM0MjQ5KQogICogQWRkZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBgZHJhZnRfcG9zdHNgIHRvIGNvbmZpZ3VyYXRpb24gZG9jcyAoIzQyNTEpCiAgKiBGaXggY2hlY2tsaXN0IGluIGBfYXNzZXRzLm1kYCAoIzQyNTkpCiAgKiBBZGQgTWFya2Rvd24gZXhhbXBsZXMgdG8gUGFnZXMgZG9jcyAoIzQyNzUpCiAgKiBBZGQgamVreWxsLXBhZ2luYXRlLWNhdGVnb3J5IHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzQyNzMpCiAgKiBBZGQgYGpla3lsbC1yZXNwb25zaXZlX2ltYWdlYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCM0Mjg2KQogICogQWRkIGBqZWt5bGwtY29tbW9ubWFya2AgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjNDI5OSkKICAqIEFkZCBkb2N1bWVudGF0aW9uIGZvciBpbmNyZW1lbnRhbCByZWdlbmVyYXRpb24gKCM0MjkzKQogICogQWRkIG5vdGUgYWJvdXQgcmVtb3ZhbCBvZiByZWxhdGl2ZSBwZXJtYWxpbmsgc3VwcG9ydCBpbiB1cGdyYWRpbmcgZG9jcyAoIzQzMDMpCiAgKiBBZGQgUHJvIFRpcCB0byB1c2UgZnJvbnQgbWF0dGVyIHZhcmlhYmxlIHRvIGNyZWF0ZSBjbGVhbiBVUkxzICgjNDI5NikKICAqIEZpeCBncmFtbWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBwb3N0cy4gKCM0MzMwKQoKIyMgMy4wLjEgLyAyMDE1LTExLTE3CgojIyMgQnVnIEZpeGVzCgogICogRG9jdW1lbnQ6IG9ubHkgc3VwZXJkaXJlY3RvcmllcyBvZiB0aGUgY29sbGVjdGlvbiBhcmUgY2F0ZWdvcmllcyAoIzQxMTApCiAgKiBgQ29udmVydGlibGUjcmVuZGVyX2xpcXVpZGAgc2hvdWxkIHVzZSBgcmVuZGVyIWAgdG8gY2F1c2UgZmFpbHVyZSBvbiBiYWQgTGlxdWlkICgjNDA3NykKICAqIERvbid0IGdlbmVyYXRlIGAuamVreWxsLW1ldGFkYXRhYCBpbiBub24taW5jcmVtZW50YWwgYnVpbGQgKCM0MDc5KQogICogU2V0IGBoaWdobGlnaHRlcmAgY29uZmlnIHZhbCB0byBga3JhbWRvd24uc3ludGF4X2hpZ2hsaWdodGVyYCAoIzQwOTApCiAgKiBBbGlnbiBob29rcyBpbXBsZW1lbnRhdGlvbiB3aXRoIGRvY3VtZW50YXRpb24gKCM0MTA0KQogICogRml4IHRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIGluIHRoZSBkb2N0b3IgY29tbWFuZCAoIzQxMTQpCiAgKiBGaXggY2FzZSBpbiBgOnRpdGxlYCBhbmQgYWRkIGA6c2x1Z2Agd2hpY2ggaXMgZG93bmNhc2VkICgjNDEwMCkKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEZpeCB0ZXN0IHdhcm5pbmdzIHdoZW4gZG9pbmcgcmFrZSB7dGVzdCxzcGVjfSBvciBzY3JpcHQvdGVzdCAoIzQwNzgpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBVcGRhdGUgbm9ybWFsaXplLmNzcyB0byB2My4wLjMuICgjNDA4NSkKICAqIFVwZGF0ZSBGb250IEF3ZXNvbWUgdG8gdjQuNC4wLiAoIzQwODYpCiAgKiBBZGRzIGEgbm90ZSBhYm91dCBpbnN0YWxsaW5nIHRoZSBqZWt5bGwtZ2lzdCBnZW0gdG8gbWFrZSBnaXN0IHRhZyB3b3JrICgjNDEwMSkKICAqIEFsaWduIGhvb2tzIGRvY3VtZW50YXRpb24gd2l0aCBpbXBsZW1lbnRhdGlvbiAoIzQxMDQpCiAgKiBBZGQgSmVreWxsIEZsaWNrciBQbHVnaW4gdG8gdGhlIGxpc3Qgb2YgdGhpcmQgcGFydHkgcGx1Z2lucyAoIzQxMTEpCiAgKiBSZW1vdmUgbGluayB0byBub3ctZGVsZXRlZCBibG9nIHBvc3QgKCM0MTI1KQogICogVXBkYXRlIHRoZSBsaXF1aWQgc3ludGF4IGluIHRoZSBwYWdpbmF0aW9uIGRvY3MgKCM0MTMwKQogICogQWRkIGpla3lsbC1sYW5ndWFnZS1wbHVnaW4gdG8gcGx1Z2lucy5tZCAoIzQxMzQpCiAgKiBVcGRhdGVkIHRvIHJlZmxlY3QgZmVlZGJhY2sgaW4gIzQxMjkgKCM0MTM3KQogICogQ2xhcmlmeSBhc3NldHMubWQgYmFzZWQgb24gZmVlZGJhY2sgb2YgIzQxMjkgKCM0MTQyKQogICogUmUtY29ycmVjdCB0aGUgbGlxdWlkIHN5bnRheCBpbiB0aGUgcGFnaW5hdGlvbiBkb2NzICgjNDE0MCkKCiMjIDMuMC4wIC8gMjAxNS0xMC0yNgoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIExpcXVpZCBwcm9maWxlciAoaS5lLiBrbm93IGhvdyBmYXN0IG9yIHNsb3cgeW91ciB0ZW1wbGF0ZXMgcmVuZGVyKSAoIzM3NjIpCiAgKiBJbmNyZW1lbnRhbCByZWdlbmVyYXRpb24gKCMzMTE2KQogICogQWRkIEhvb2tzOiBhIG5ldyBraW5kIG9mIHBsdWdpbiAoIzM1NTMpCiAgKiBVcGdyYWRlIHRvIExpcXVpZCAzLjAuMCAoIzMwMDIpCiAgKiBgc2l0ZS5wb3N0c2AgaXMgbm93IGEgQ29sbGVjdGlvbiBpbnN0ZWFkIG9mIGFuIEFycmF5ICgjNDA1NSkKICAqIEFkZCBiYXNpYyBzdXBwb3J0IGZvciBKUnVieSAoY29tbWl0OiAwZjQ0NzcpCiAgKiBEcm9wIHN1cHBvcnQgZm9yIFJ1YnkgMS45LjMuICgjMzIzNSkKICAqIFN1cHBvcnQgUnVieSB2Mi4yICgjMzIzNCkKICAqIFN1cHBvcnQgUkRpc2NvdW50IDIgKCMyNzY3KQogICogUmVtb3ZlIG1vc3QgcnVudGltZSBkZXBzICgjMzMyMykKICAqIE1vdmUgdG8gUm91Z2UgYXMgZGVmYXVsdCBoaWdobGlnaHRlciAoIzMzMjMpCiAgKiBNaW1pYyBHaXRIdWIgUGFnZXMgYC5odG1sYCBleHRlbnNpb24gc3RyaXBwaW5nIGJlaGF2aW9yIGluIFdFQnJpY2sgKCMzNDUyKQogICogQWx3YXlzIGluY2x1ZGUgZmlsZSBleHRlbnNpb24gb24gb3V0cHV0IGZpbGVzICgjMzQ5MCkKICAqIEltcHJvdmVkIHBlcm1hbGlua3MgZm9yIHBhZ2VzIGFuZCBjb2xsZWN0aW9ucyAoIzM1MzgpCiAgKiBTdW5zZXQgKGkuZS4gcmVtb3ZlKSBNYXJ1a3UgKCMzNjU1KQogICogUmVtb3ZlIHN1cHBvcnQgZm9yIHJlbGF0aXZlIHBlcm1hbGlua3MgKCMzNjc5KQogICogSXRlcmF0ZSBvdmVyIGBzaXRlLmNvbGxlY3Rpb25zYCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGEgaGFzaC4gKCMzNjcwKQogICogQWRhcHQgU3RhdGljRmlsZSBmb3IgY29sbGVjdGlvbnMsIGNvbmZpZyBkZWZhdWx0cyAoIzM4MjMpCiAgKiBBZGQgYSBDb2RlIG9mIENvbmR1Y3QgZm9yIHRoZSBKZWt5bGwgcHJvamVjdCAoIzM5MjUpCiAgKiBBZGRlZCBwZXJtYWxpbmsgdGltZSB2YXJpYWJsZXMgKCMzOTkwKQogICogQWRkIGAtLWluY3JlbWVudGFsYCBmbGFnIHRvIGVuYWJsZSBpbmNyZW1lbnRhbCByZWdlbiAoZGlzYWJsZWQgYnkgZGVmYXVsdCkgKCM0MDU5KQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIERlcHJlY2F0ZSBhY2Nlc3MgdG8gRG9jdW1lbnQjZGF0YSBwcm9wZXJ0aWVzIGFuZCBDb2xsZWN0aW9uI2RvY3MgbWV0aG9kcyAoIzQwNTgpCiAgKiBTb3J0IHN0YXRpYyBmaWxlcyBqdXN0IG9uY2UsIGFuZCBjYWxsIGBzaXRlX3BheWxvYWRgIG9uY2UgZm9yIGFsbCBjb2xsZWN0aW9ucyAoIzMyMDQpCiAgKiBTZXBhcmF0ZSBgamVreWxsIGRvY3NgIGFuZCBvcHRpbWl6ZSBleHRlcm5hbCBnZW0gaGFuZGxpbmcgKCMzMjQxKQogICogSW1wcm92ZSBgU2l0ZSNnZXRDb252ZXJ0ZXJJbXBsYCBhbmQgY2FsbCBpdCBgU2l0ZSNmaW5kX2NvbnZlcnRlcl9pbnN0YW5jZWAgKCMzMjQwKQogICogVXNlIHJlbGF0aXZlIHBhdGggZm9yIGBwYXRoYCBMaXF1aWQgdmFyaWFibGUgaW4gRG9jdW1lbnRzIGZvciBjb25zaXN0ZW5jeSAoIzI5MDgpCiAgKiBHZW5lcmFsaXplIGBVdGlscyNzbHVnaWZ5YCBmb3IgYW55IHNjcmlwdHMgKCMzMDQ3KQogICogQWRkZWQgYmFzaWMgbWljcm9kYXRhIHRvIHBvc3QgdGVtcGxhdGUgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzMxODkpCiAgKiBTdG9yZSBsb2cgbWVzc2FnZXMgaW4gYW4gYXJyYXkgb2YgbWVzc2FnZXMuICgjMzI0NCkKICAqIEFsbG93IGNvbGxlY3Rpb24gZG9jdW1lbnRzIHRvIG92ZXJyaWRlIGBvdXRwdXRgIHByb3BlcnR5IGluIGZyb250IG1hdHRlciAoIzMxNzIpCiAgKiBLZWVwIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIGJldHdlZW4gYnVpbGRzIGZvciBzdGF0aWMgZmlsZXMgKCMzMjIwKQogICogT25seSBkb3duY2FzZSBtaXhlZC1jYXNlIGNhdGVnb3JpZXMgZm9yIHRoZSBVUkwgKCMyNTcxKQogICogQWRkZWQgcGVyIHBvc3QgYGV4Y2VycHRfc2VwYXJhdG9yYCBmdW5jdGlvbmFsaXR5ICgjMzI3NCkKICAqIEFsbG93IGNvbGxlY3Rpb25zIFlBTUwgdG8gZW5kIHdpdGggdGhyZWUgZG90cyAoIzMxMzQpCiAgKiBBZGQgbW9kZSBwYXJhbWV0ZXIgdG8gYHNsdWdpZnlgIExpcXVpZCBmaWx0ZXIgKCMyOTE4KQogICogUGVyZjogYE1hcmtkb3duI21hdGNoZXNgIHNob3VsZCBhdm9pZCByZWdleHAgKCMzMzIxKQogICogUGVyZjogVXNlIGZyb3plbiByZWd1bGFyIGV4cHJlc3Npb25zIGZvciBgVXRpbHMjc2x1Z2lmeWAgKCMzMzIxKQogICogU3BsaXQgb2ZmIFRleHRpbGUgc3VwcG9ydCBpbnRvIGpla3lsbC10ZXh0aWxlLWNvbnZlcnRlciAoIzMzMTkpCiAgKiBJbXByb3ZlIHRoZSBuYXZpZ2F0aW9uIG1lbnUgYWxpZ25tZW50IGluIHRoZSBzaXRlIHRlbXBsYXRlIG9uIHNtYWxsIHNjcmVlbnMgKCMzMzMxKQogICogU2hvdyB0aGUgcmVnZW5lcmF0aW9uIHRpbWUgYWZ0ZXIgdGhlIGluaXRpYWwgZ2VuZXJhdGlvbiAoIzMzNzgpCiAgKiBTaXRlIHRlbXBsYXRlOiBTd2l0Y2ggZGVmYXVsdCBmb250IHRvIEhlbHZldGljYSBOZXVlICgjMzM3NikKICAqIE1ha2UgdGhlIGBpbmNsdWRlYCB0YWcgYSB0ZWVuc3kgYml0IGZhc3Rlci4gKCMzMzkxKQogICogQWRkIGBwa2lsbCAtZiBqZWt5bGxgIHRvIHdheXMgdG8ga2lsbC4gKCMzMzk3KQogICogU2l0ZSB0ZW1wbGF0ZTogY29sbGFwc2VkLCB2YXJpYWJsZS1kcml2ZW4gZm9udCBkZWNsYXJhdGlvbiAoIzMzNjApCiAgKiBTaXRlIHRlbXBsYXRlOiBEb24ndCBhbHdheXMgc2hvdyB0aGUgc2Nyb2xsYmFyIGluIGNvZGUgYmxvY2tzICgjMzQxOSkKICAqIFNpdGUgdGVtcGxhdGU6IFJlbW92ZSB1bmRlZmluZWQgYHRleHRgIGNsYXNzIGZyb20gYHBgIGVsZW1lbnQgKCMzNDQwKQogICogU2l0ZSB0ZW1wbGF0ZTogT3B0aW1pemUgdGV4dCByZW5kZXJpbmcgZm9yIGxlZ2liaWxpdHkgKCMzMzgyKQogICogQWRkIGBkcmFmdD9gIG1ldGhvZCB0byBpZGVudGlmeSBpZiBQb3N0IGlzIGEgRHJhZnQgJiBleHBvc2UgdG8gTGlxdWlkICgjMzQ1NikKICAqIFdyaXRlIHJlZ2VuZXJhdGlvbiBtZXRhZGF0YSBldmVuIG9uIGZ1bGwgcmVidWlsZCAoIzM0NjQpCiAgKiBQZXJmOiBVc2UgYFN0cmluZyNlbmRfd2l0aD8oIi8iKWAgaW5zdGVhZCBvZiByZWdleHAgd2hlbiBjaGVja2luZyBwYXRocyAoIzM1MTYpCiAgKiBEb2NzOiBkb2N1bWVudCAnb3JkaW5hbCcgYnVpbHQtaW4gcGVybWFsaW5rIHN0eWxlICgjMzUzMikKICAqIFVwZ3JhZGUgbGlxdWlkLWMgdG8gMy54ICgjMzUzMSkKICAqIFVzZSBjb25zaXN0ZW50IHN5bnRheCBmb3IgZGVwcmVjYXRpb24gd2FybmluZyAoIzM1MzUpCiAgKiBBZGRlZCBidWlsZCAtLWRlc3RpbmF0aW9uIGFuZCAtLXNvdXJjZSBmbGFncyAoIzM0MTgpCiAgKiBTaXRlIHRlbXBsYXRlOiByZW1vdmUgdW51c2VkIGBwYWdlLm1ldGFgIGF0dHJpYnV0ZSAoIzM1MzcpCiAgKiBJbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gc29ydGluZyBudWxsIG9iamVjdHMgKCMzNTIwKQogICogQWRkZWQgbGlxdWlkLW1kNSBwbHVnaW4gKCMzNTk4KQogICogRG9jdW1lbnRhdGlvbjogUlIgcmVwbGFjZWQgd2l0aCBSU3BlYyBNb2NrcyAoIzM2MDApCiAgKiBEb2N1bWVudGF0aW9uOiBGaXggc3VicGF0aC4gKCMzNTk5KQogICogQ3JlYXRlICd0bXAnIGRpciBmb3IgdGVzdF90YWdzIGlmIGl0IGRvZXNuJ3QgZXhpc3QgKCMzNjA5KQogICogRXh0cmFjdCByZWFkaW5nIG9mIGRhdGEgZnJvbSBgU2l0ZWAgdG8gcmVkdWNlIHJlc3BvbnNpYmlsaXRpZXMuICgjMzU0NSkKICAqIFJlbW92ZWQgdGhlIHdvcmQgJ0pla3lsbCcgYSBmZXcgdGltZXMgZnJvbSB0aGUgY29tbWVudHMgKCMzNjE3KQogICogYGJpbi9qZWt5bGxgOiB3aXRoIG5vIGFyZ3MsIGV4aXQgd2l0aCBleGl0IGNvZGUgMSAoIzM2MTkpCiAgKiBJbmNyZW1lbnRhbCBidWlsZCBpZiBkZXN0aW5hdGlvbiBmaWxlIG1pc3NpbmcgKCMzNjE0KQogICogU3RhdGljIGZpbGVzIGBtdGltZWAgbGlxdWlkIHNob3VsZCByZXR1cm4gYSBgVGltZWAgb2JqICgjMzU5NikKICAqIFVzZSBgSmVreWxsOjpQb3N0YHMgZm9yIGJvdGggTFNJIGluZGV4aW5nIGFuZCBsb29rdXAuICgjMzYyOSkKICAqIEFkZCBgY2hhcnNldD11dGYtOGAgZm9yIEhUTUwgYW5kIFhNTCBwYWdlcyBpbiBXRUJyaWNrICgjMzY0OSkKICAqIFNldCBsb2cgbGV2ZWwgdG8gZGVidWcgd2hlbiB2ZXJib3NlIGZsYWcgaXMgc2V0ICgjMzY2NSkKICAqIEFkZGVkIGEgbWVudGlvbiBvbiB0aGUgR2VtZmlsZSB0byBjb21wbGV0ZSB0aGUgaW5zdHJ1Y3Rpb25zICgjMzY3MSkKICAqIFBlcmY6IENhY2hlIGBEb2N1bWVudCN0b19saXF1aWRgIGFuZCBpbnZhbGlkYXRlIHdoZXJlIG5lY2Vzc2FyeSAoIzM2OTMpCiAgKiBQZXJmOiBgSmVreWxsOjpDbGVhbmVyI2V4aXN0aW5nX2ZpbGVzYDogQ2FsbCBga2VlcF9maWxlX3JlZ2V4YCBhbmQgYGtlZXBfZGlyc2Agb25seSBvbmNlLCBub3Qgb25jZSBwZXIgaXRlcmF0aW9uICgjMzY5NikKICAqIE9taXQgamVreWxsL2pla3lsbC1oZWxwIGZyb20gbGlzdCBvZiByZXNvdXJjZXMuICgjMzY5OCkKICAqIEFkZCBiYXNpYyBgamVreWxsIGRvY3RvcmAgdGVzdCB0byBkZXRlY3QgZnNub3RpZnkgKE9TWCkgYW5vbWFsaWVzLiAoIzM3MDQpCiAgKiBBZGRlZCB0YWxrLmpla3lsbHJiLmNvbSB0byAiSGF2ZSBxdWVzdGlvbnM/IiAoIzM2OTQpCiAgKiBQZXJmb3JtYW5jZTogU29ydCBmaWxlcyBvbmx5IG9uY2UgKCMzNzA3KQogICogUGVyZm9ybWFuY2U6IE1hcnNoYWwgbWV0YWRhdGEgKCMzNzA2KQogICogVXBncmFkZSBoaWdobGlnaHQgd3JhcHBlciBmcm9tIGBkaXZgIHRvIGBmaWd1cmVgICgjMzc3OSkKICAqIFVwZ3JhZGUgbWltZS10eXBlcyB0byBgfj4gMi42YCAoIzM3OTUpCiAgKiBVcGRhdGUgd2luZG93cy5tZCB3aXRoIFJ1YnkgdmVyc2lvbiBpbmZvICgjMzgxOCkKICAqIE1ha2UgdGhlIGRpcmVjdG9yeSBmb3IgaW5jbHVkZXMgY29uZmlndXJhYmxlICgjMzc4MikKICAqIFJlbmFtZSBkaXJlY3RvcnkgY29uZmlndXJhdGlvbnMgdG8gbWF0Y2ggYCpfZGlyYCBjb252ZW50aW9uIGZvciBjb25zaXN0ZW5jeSAoIzM3ODIpCiAgKiBJbnRlcm5hbDogdHJpZ2dlciBob29rcyBieSBvd25lciBzeW1ib2wgKCMzODcxKQogICogVXBkYXRlIE1JTUUgdHlwZXMgZnJvbSBtaW1lLWRiICgjMzkzMykKICAqIEFkZCBoZWFkZXIgdG8gc2l0ZSB0ZW1wbGF0ZSBgX2NvbmZpZy55bWxgIGZvciBjbGFyaXR5ICYgZGlyZWN0aW9uICgjMzk5NykKICAqIFNpdGUgdGVtcGxhdGU6IGFkZCB0aW1lem9uZSBvZmZzZXQgdG8gcG9zdCBkYXRlIGZyb250bWF0dGVyICgjNDAwMSkKICAqIE1ha2UgYSBjb25zdGFudCBmb3IgdGhlIHJlZ2V4IHRvIGZpbmQgaGlkZGVuIGZpbGVzICgjNDAzMikKICAqIFNpdGUgdGVtcGxhdGU6IHJlZmFjdG9yIGdpdGh1YiAmIHR3aXR0ZXIgaWNvbnMgaW50byBpbmNsdWRlcyAoIzQwNDkpCiAgKiBTaXRlIHRlbXBsYXRlOiBhZGQgYmFja2dyb3VuZCB0byBLcmFtZG93biBSb3VnZS1pZmllZCBiYWNrdGljayBjb2RlIGJsb2NrcyAoIzQwNTMpCgojIyMgQnVnIEZpeGVzCgogICogYHBvc3RfdXJsYDogZml4IGFjY2VzcyBkZXByZWNhdGlvbiB3YXJuaW5nICYgZml4IGRlcHJlY2F0aW9uIG1zZyAoIzQwNjApCiAgKiBQZXJmb3JtIGpla3lsbC1wYWdpbmF0ZSBkZXByZWNhdGlvbiB3YXJuaW5nIGNvcnJlY3RseS4gKCMzNTgwKQogICogTWFrZSBwZXJtYWxpbmsgcGFyc2luZyBjb25zaXN0ZW50IHdpdGggcGFnZXMgKCMzMDE0KQogICogYHRpbWUoKWBwcmUtZmlsdGVyIG1ldGhvZCBzaG91bGQgYWNjZXB0IGEgYERhdGVgIG9iamVjdCAoIzMyOTkpCiAgKiBSZW1vdmUgdW5uZWVkZWQgZW5kIHRhZyBmb3IgYGxpbmtgIGluIHNpdGUgdGVtcGxhdGUgKCMzMjM2KQogICogS3JhbWRvd246IFVzZSBgZW5hYmxlX2NvZGVyYXlgIGtleSBpbnN0ZWFkIG9mIGB1c2VfY29kZXJheWAgKCMzMjM3KQogICogVW5lc2NhcGUgYERvY3VtZW50YCBvdXRwdXQgcGF0aCAoIzI5MjQpCiAgKiBGaXggbmF2IGl0ZW1zIGFsaWdubWVudCB3aGVuIG9uIG11bHRpcGxlIHJvd3MgKCMzMjY0KQogICogSGlnaGxpZ2h0OiBPbmx5IFN0cmlwIE5ld2xpbmVzL0NhcnJpYWdlIFJldHVybnMsIG5vdCBTcGFjZXMgKCMzMjc4KQogICogRmluZCB2YXJpYWJsZXMgaW4gZnJvbnQgbWF0dGVyIGRlZmF1bHRzIGJ5IHNlYXJjaGluZyB3aXRoIHJlbGF0aXZlIGZpbGUgcGF0aC4gKCMyNzc0KQogICogQWxsb3cgdmFyaWFibGVzIChlLmcgYDpjYXRlZ29yaWVzYCkgaW4gWUFNTCBmcm9udCBtYXR0ZXIgcGVybWFsaW5rcyAoIzMzMjApCiAgKiBIYW5kbGUgbmlsIFVSTCBwbGFjZWhvbGRlcnMgaW4gcGVybWFsaW5rcyAoIzMzMjUpCiAgKiBUZW1wbGF0ZTogRml4IG5hdiBpdGVtcyBhbGlnbm1lbnQgd2hlbiBpbiAiYnVyZ2VyIiBtb2RlICgjMzMyOSkKICAqIFRlbXBsYXRlOiBSZW1vdmUgYCFpbXBvcnRhbnRgIGZyb20gbmF2IFNDU1MgaW50cm9kdWNlZCBpbiAjMzMyOSAoIzMzNzUpCiAgKiBUaGUgYDp0aXRsZWAgVVJMIHBsYWNlaG9sZGVyIGZvciBjb2xsZWN0aW9ucyBzaG91bGQgYmUgdGhlIGZpbGVuYW1lIHNsdWcuICgjMzM4MykKICAqIFRyaW0gdGhlIGdlbmVyYXRlIHRpbWUgZGlmZiB0byBqdXN0IDMgcGxhY2VzIHBhc3QgdGhlIGRlY2ltYWwgcGxhY2UgKCMzNDE1KQogICogVGhlIGhpZ2hsaWdodCB0YWcgc2hvdWxkIG9ubHkgY2xpcCB0aGUgbmV3bGluZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgKmVudGlyZSogYmxvY2ssIG5vdCBpbiBiZXR3ZWVuICgjMzQwMSkKICAqIGhpZ2hsaWdodDogZml4IHByb2JsZW0gd2l0aCBsaW5lbm9zIGFuZCByb3VnZS4gKCMzNDM2KQogICogYFNpdGUjcmVhZF9kYXRhX2ZpbGVgOiByZWFkIENTVidzIHdpdGggcHJvcGVyIGZpbGUgZW5jb2RpbmcgKCMzNDU1KQogICogSWdub3JlIGAuamVreWxsLW1ldGFkYXRhYCBpbiBzaXRlIHRlbXBsYXRlICgjMzQ5NikKICAqIFRlbXBsYXRlOiBQb2ludCBkb2N1bWVudGF0aW9uIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24gcGFnZXMgKCMzNTAyKQogICogUmVtb3ZlZCB0aGUgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZXhhbXBsZSBgL2Jsb2dgIGJhc2V1cmwgY29tbWVudCAoIzM0ODUpCiAgKiBDbGVhciB0aGUgcmVnZW5lcmF0b3IgY2FjaGUgZXZlcnkgdGltZSB3ZSBwcm9jZXNzICgjMzU5MikKICAqIFJlYWRkIChicmluZyBiYWNrKSBtaW5pdGVzdC1wcm9maWxlICgjMzYyOCkKICAqIEFkZCBXT0ZGMiBmb250IE1JTUUgdHlwZSB0byBKZWt5bGwgc2VydmVyIE1JTUUgdHlwZXMgKCMzNjQ3KQogICogQmUgc21hcnRlciBhYm91dCBleHRyYWN0aW5nIHRoZSBleHRuYW1lIGluIGBTdGF0aWNGaWxlYCAoIzM2MzIpCiAgKiBQcm9jZXNzIG1ldGFkYXRhIGZvciBhbGwgZGVwZW5kZW5jaWVzICgjMzYwOCkKICAqIFNob3cgZXJyb3IgbWVzc2FnZSBpZiB0aGUgWUFNTCBmcm9udCBtYXR0ZXIgb24gYSBwYWdlL3Bvc3QgaXMgaW52YWxpZC4gKCMzNjQzKQogICogVXBncmFkZSByZWRjYXJwZXQgdG8gMy4yIChTZWN1cml0eSBmaXg6IE9TVkRCLTEyMDQxNSkgKCMzNjUyKQogICogQ3JlYXRlICNtb2NrX2V4cGVjdHMgdGhhdCBnb2VzIGRpcmVjdGx5IHRvIFJTcGVjIE1vY2tzLiAoIzM2NTgpCiAgKiBPcGVuIGAuamVreWxsLW1ldGFkYXRhYCBpbiBiaW5hcnkgbW9kZSB0byByZWFkIGJpbmFyeSBNYXJzaGFsIGRhdGEgKCMzNzEzKQogICogSW5jcmVtZW50YWwgcmVnZW5lcmF0aW9uOiBoYW5kbGUgZGVsZXRlZCwgcmVuYW1lZCwgYW5kIG1vdmVkIGRlcGVuZGVuY2llcyAoIzM3MTcpCiAgKiBGaXggdHlwbyBvbiBsaW5lIDE5IG9mIHBhZ2luYXRpb24ubWQgKCMzNzYwKQogICogRml4IGl0IHNvIHRoYXQgJ2Jsb2cuaHRtbCcgbWF0Y2hlcyAnYmxvZy5odG1sJyAoIzM3MzIpCiAgKiBSZW1vdmUgb2NjYXNpb25hbGx5LXByb2JsZW1hdGljIGBlbnN1cmVgIGluIGBMaXF1aWRSZW5kZXJlcmAgKCMzODExKQogICogRml4ZWQgYW4gdW5jbGVhciBjb2RlIGNvbW1lbnQgaW4gc2l0ZSB0ZW1wbGF0ZSBTQ1NTICgjMzgzNykKICAqIEZpeCByZWFkaW5nIG9mIGJpbmFyeSBtZXRhZGF0YSBmaWxlICgjMzg0NSkKICAqIFJlbW92ZSB2YXIgY29sbGlzaW9uIHdpdGggc2l0ZSB0ZW1wbGF0ZSBoZWFkZXIgbWVudSBpdGVyYXRpb24gdmFyaWFibGUgKCMzODM4KQogICogQ2hhbmdlIG5vbi1leGlzdGVudCBgaGxfbGluZW5vc2AgdG8gYGhsX2xpbmVzYCB0byBhbGxvdyBwYXNzdGhyb3VnaCBpbiBzYWZlIG1vZGUgKCMzNzg3KQogICogQWRkIG1pc3NpbmcgZmxhZyB0byBkaXNhYmxlIHRoZSB3YXRjaGVyICgjMzgyMCkKICAqIFVwZGF0ZSBDSSBndWlkZSB0byBpbmNsdWRlIG1vcmUgZGlyZWN0IGV4cGxhbmF0aW9ucyBvZiB0aGUgZmxvdyAoIzM4OTEpCiAgKiBTZXQgYGZ1dHVyZWAgdG8gYGZhbHNlYCBpbiB0aGUgZGVmYXVsdCBjb25maWcgKCMzODkyKQogICogZmlsdGVyczogYHdoZXJlYCBzaG91bGQgY29tcGFyZSBzdHJpbmdpZmllZCB2ZXJzaW9ucyBvZiBpbnB1dCAmIGNvbXBhcmF0b3IgKCMzOTM1KQogICogUmVhZCBidWlsZCBvcHRpb25zIGZvciBgamVreWxsIGNsZWFuYCBjb21tYW5kICgjMzgyOCkKICAqIEZpeCAjMzk3MDogVXNlIEdlbTo6VmVyc2lvbiB0byBjb21wYXJlIHZlcnNpb25zLCBub3QgYD5gLgogICogQWJvcnQgaWYgbm8gc3ViY29tbWFuZC4gRml4ZXMgY29uZnVzaW5nIG1lc3NhZ2UuICgjMzk5MikKICAqIFdob2xlLXBvc3QgZXhjZXJwdHMgc2hvdWxkIG1hdGNoIHRoZSBwb3N0IGNvbnRlbnQgKCM0MDA0KQogICogQ2hhbmdlIGRlZmF1bHQgZm9udCB3ZWlnaHQgdG8gNDAwIHRvIGZpeCBib2xkL3N0cm9uZyB0ZXh0IGlzc3VlcyAoIzQwNTApCiAgKiBEb2N1bWVudDogT25seSBhdXRvLWdlbmVyYXRlIHRoZSBleGNlcnB0IGlmIGl0J3Mgbm90IG92ZXJyaWRkZW4gKCM0MDYyKQogICogVXRpbHM6IGBkZWVwX21lcmdlX2hhc2hlc2Agc2hvdWxkIGFsc28gbWVyZ2UgYGRlZmF1bHRfcHJvY2AgKDQ1ZjY5YmIpCiAgKiBEZWZhdWx0czogY29tcGFyZSBwYXRocyBpbiBgYXBwbGllc19wYXRoP2AgYXMgYFN0cmluZ2BzIHRvIGF2b2lkIGNvbmZ1c2lvbiAoN2I4MWYwMCkKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIFJlbW92ZSBsb2FkZXIucmIgYW5kICJtb2Rlcm5pemUiIGBzY3JpcHQvdGVzdGAuICgjMzU3NCkKICAqIEltcHJvdmUgdGhlIGdyYW1tYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gKCMzMjMzKQogICogVXBkYXRlIHRoZSBMSUNFTlNFIHRleHQgdG8gbWF0Y2ggdGhlIE1JVCBsaWNlbnNlIGV4YWN0bHkgKCMzMjUzKQogICogVXBkYXRlIHJha2UgdGFzayBgc2l0ZTpwdWJsaXNoYCB0byBmaXggbWlub3IgYnVncy4gKCMzMjU0KQogICogU3dpdGNoIHRvIHNoaWVsZHMuaW8gZm9yIHRoZSBSRUFETUUgYmFkZ2VzLiAoIzMyNTUpCiAgKiBVc2UgYEZpbGVMaXN0YCBpbnN0ZWFkIG9mIGBEaXIuZ2xvYmAgaW4gYHNpdGU6cHVibGlzaGAgcmFrZSB0YXNrICgjMzI2MSkKICAqIEZpeCB0ZXN0IHNjcmlwdCB0byBiZSBwbGF0Zm9ybS1pbmRlcGVuZGVudCAoIzMyNzkpCiAgKiBJbnN0ZWFkIG9mIHN5bWxpbmtpbmcgYC90bXBgLCBjcmVhdGUgYW5kIHN5bWxpbmsgYSBsb2NhbCBgdG1wYCBpbiB0aGUgdGVzdHMgKCMzMjU4KQogICogRml4IHNvbWUgc3BhY2luZyAoIzMzMTIpCiAgKiBGaXggY29tbWVudCB0eXBvIGluIGBsaWIvamVreWxsL2Zyb250bWF0dGVyX2RlZmF1bHRzLnJiYCAoIzMzMjIpCiAgKiBNb3ZlIGFsbCBgcmVnZW5lcmF0ZT9gIGNoZWNraW5nIHRvIGBSZWdlbmVyYXRvcmAgKCMzMzI2KQogICogRmFjdG9yIG91dCBhIGByZWFkX2RhdGFfZmlsZWAgY2FsbCB0byBrZWVwIHRoaW5ncyBjbGVhbiAoIzMzODApCiAgKiBQcm9vZiB0aGUgc2l0ZSB3aXRoIENpcmNsZUNJLiAoIzM0MjcpCiAgKiBVcGRhdGUgTElDRU5TRSB0byAyMDE1LiAoIzM0NzcpCiAgKiBVcGdyYWRlIHRlc3RzIHRvIHVzZSBNaW5pdGVzdCAoIzM0OTIpCiAgKiBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSAoIzM0OTcpCiAgKiBVc2UgYGZpeHR1cmVfc2l0ZWAgZm9yIERvY3VtZW50IHRlc3RzICgjMzUxMSkKICAqIFJlbW92ZSBhZGFwdGVycyBkZXByZWNhdGlvbiB3YXJuaW5nICgjMzUyOSkKICAqIE1pbm9yIGZpeGVzIHRvIGB1cmwucmJgIHRvIGZvbGxvdyBHaXRIdWIgc3R5bGUgZ3VpZGUgKCMzNTQ0KQogICogTWlub3IgY2hhbmdlcyB0byByZXNvbHZlIGRlcHJlY2F0aW9uIHdhcm5pbmdzICgjMzU0NykKICAqIENvbnZlcnQgcmVtYWluaW5nIHRleHRpbGUgdGVzdCBkb2N1bWVudHMgdG8gbWFya2Rvd24gKCMzNTI4KQogICogTWlncmF0ZSB0aGUgdGVzdHMgdG8gdXNlIHJzcGVjLW1vY2tzICgjMzU1MikKICAqIFJlbW92ZSBgYWN0aXZlc3VwcG9ydGAgKCMzNjEyKQogICogQWRkZWQgdGVzdHMgZm9yIGBKZWt5bGw6U3RhdGljRmlsZWAgKCMzNjMzKQogICogRm9yY2UgbWluaXRlc3QgdmVyc2lvbiB0byA1LjUuMSAoIzM2NTcpCiAgKiBVcGRhdGUgdGhlIHdheSBjdWN1bWJlciBhY2Nlc3NlcyBNaW5pdGVzdCBhc3NlcnRpb25zICgjMzY3OCkKICAqIEFkZCBgc2NyaXB0L3J1Ynlwcm9mYCB0byBnZW5lcmF0ZSBjYWNoZWdyaW5kIGNhbGxncmFwaHMgKCMzNjkyKQogICogVXBncmFkZSBjdWN1bWJlciB0byAyLnggKCMzNzk1KQogICogVXBkYXRlIEtyYW1kb3duLiAoIzM4NTMpCiAgKiBVcGRhdGVkIHRoZSBzY3JpcHRzIHNoZWJhbmcgZm9yIHBvcnRhYmlsaXR5ICgjMzg1OCkKICAqIFVwZGF0ZSBKUnVieSB0ZXN0aW5nIHRvIDlLIChbM2FiMzg2Zl0oaHR0cHM6Ly9naXRodWIuY29tL2pla3lsbC9qZWt5bGwvY29tbWl0LzNhYjM4NmYxYjA5NmJlMjVhMjRmZTAzOGZjNzBmZDBmYjA4ZDU0NWQpKQogICogT3JnYW5pemUgZGVwZW5kZW5jaWVzIGludG8gZGV2IGFuZCB0ZXN0IGdyb3Vwcy4gKCMzODUyKQogICogQ29udHJpYnV0aW5nLm1kIHNob3VsZCByZWZlciB0byBgc2NyaXB0L2N1Y3VtYmVyYCAoIzM4OTQpCiAgKiBVcGRhdGUgY29udHJpYnV0aW5nIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCB3b3JrZmxvdyB1cGRhdGVzICgjMzg5NSkKICAqIEFkZCBzY3JpcHQgdG8gdmVuZG9yIG1pbWUgdHlwZXMgKCMzOTMzKQogICogSWdub3JlIC5idW5kbGUgZGlyIGluIFNpbXBsZUNvdiAoIzQwMzMpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBBZGQgJ2luZm8nIGxhYmVscyB0byBjZXJ0YWluIG5vdGVzIGluIGNvbGxlY3Rpb25zIGRvY3MgKCMzNjAxKQogICogUmVtb3ZlIGV4dHJhIHNwYWNlcywgbWFrZSB0aGUgbGFzdCBzZW50ZW5jZSBsZXNzIGF3a3dhcmQgaW4gcGVybWFsaW5rIGRvY3MgKCMzNjAzKQogICogVXBkYXRlIHRoZSBwZXJtYWxpbmtzIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCB0aGUgdXBkYXRlcyBmb3IgMy4wICgjMzU1NikKICAqIEFkZCBibG9nIHBvc3QgYW5ub3VuY2luZyBKZWt5bGwgSGVscCAoIzM1MjMpCiAgKiBBZGQgSmVreWxsIFRhbGsgdG8gSGVscCBwYWdlIG9uIHNpdGUgKCMzNTE4KQogICogQ2hhbmdlIEFqYXggcGFnaW5hdGlvbiByZXNvdXJjZSBsaW5rIHRvIHVzZSBIVFRQUyAoIzM1NzApCiAgKiBGaXhpbmcgdGhlIGRlZmF1bHQgaG9zdCBvbiBkb2NzICgjMzIyOSkKICAqIEFkZCBgamVreWxsLXRodW1ibmFpbC1maWx0ZXJgIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzI3OTApCiAgKiBBZGQgbGluayB0byAnQWRkaW5nIEFqYXggcGFnaW5hdGlvbiB0byBKZWt5bGwnIHRvIFJlc291cmNlcyBwYWdlICgjMzE4NikKICAqIEFkZCBhIFJlc291cmNlcyBsaW5rIHRvIHR1dG9yaWFsIG9uIGJ1aWxkaW5nIGR5bmFtaWMgbmF2YmFycyAoIzMxODUpCiAgKiBTZW1hbnRpYyBzdHJ1Y3R1cmUgaW1wcm92ZW1lbnRzIHRvIHRoZSBwb3N0IGFuZCBwYWdlIGxheW91dHMgKCMzMjUxKQogICogQWRkIG5ldyBBc2NpaURvYyBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zLiAoIzMyNzcpCiAgKiBTcGVjaWZ5IHRoYXQgYWxsIHRyYW5zZm9ybWFibGUgY29sbGVjdGlvbiBkb2N1bWVudHMgbXVzdCBjb250YWluIFlBTUwgZnJvbnQgbWF0dGVyICgjMzI3MSkKICAqIEFzc29ydGVkIGFjY2Vzc2liaWxpdHkgZml4ZXMgKCMzMjU2KQogICogVXBkYXRlIGNvbmZpZ3VyYXRpb24gZG9jcyB0byBtZW50aW9uIGBrZWVwX2ZpbGVzYCBmb3IgYGRlc3RpbmF0aW9uYCAoIzMyODgsICMzMjk2KQogICogQnJlYWsgd2hlbiB3ZSBzdWNjZXNzZnVsbHkgZ2VuZXJhdGUgbmF2IGxpbmsgdG8gc2F2ZSBDUFUgY3ljbGVzLiAoIzMyOTEpCiAgKiBVcGRhdGUgdXNhZ2UgZG9jcyB0byBtZW50aW9uIGBrZWVwX2ZpbGVzYCBhbmQgYSB3YXJuaW5nIGFib3V0IGBkZXN0aW5hdGlvbmAgY2xlYW5pbmcgKCMzMjk1KQogICogQWRkIGxvZ2ljIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlIGBuZXh0X3NlY3Rpb25gIGFuZCBgcHJldl9zZWN0aW9uYCBuYXZpZ2F0aW9uIGl0ZW1zICgjMzI5MikKICAqIFNvbWUgc21hbGwgZml4ZXMgZm9yIHRoZSBQbHVnaW5zIFRPQy4gKCMzMzA2KQogICogQWRkZWQgdmVyc2lvbmluZyBjb21tZW50IHRvIGNvbmZpZ3VyYXRpb24gZmlsZSAoIzMzMTQpCiAgKiBBZGQgYGpla3lsbC1taW5pZmllcmAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzMzMykKICAqIEFkZCBibG9nIHBvc3QgYWJvdXQgdGhlIEpla3lsbCBtZWV0LXVwICgjMzMzMikKICAqIFVzZSBgaGlnaGxpZ2h0YCBMaXF1aWQgdGFnIGluc3RlYWQgb2YgdGhlIGZvdXItc3BhY2UgdGFicyBmb3IgY29kZSAoIzMzMzYpCiAgKiAzLjAuMC5iZXRhMSByZWxlYXNlIHBvc3QgKCMzMzQ2KQogICogQWRkIGB0d2FgIHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzMzg0KQogICogUmVtb3ZlIGV4dHJhIHNwYWNlcyAoIzMzODgpCiAgKiBGaXggc21hbGwgZ3JhbW1hciBlcnJvcnMgb24gYSBjb3VwbGUgcGFnZXMgKCMzMzk2KQogICogRml4IHR5cG8gb24gVGVtcGxhdGVzIGRvY3MgcGFnZSAoIzM0MjApCiAgKiBzL3RocmVlL2ZvdXIgZm9yIHBsdWdpbiB0eXBlIGxpc3QgKCMzNDI0KQogICogUmVsZWFzZSBqZWt5bGxyYi5jb20gYXMgYSBsb2NhbGx5LWNvbXBpbGVkIHNpdGUuICgjMzQyNikKICAqIEFkZCBhIGpla3lsbHJiLmNvbS9oZWxwIHBhZ2Ugd2hpY2ggZWx1Y2lkYXRlcyBwbGFjZXMgZnJvbSB3aGljaCB0byBnZXQgaGVscCAoIzM0MjgpCiAgKiBSZW1vdmUgZXh0cmFuZW91cyBkYXNoIG9uIFBsdWdpbnMgZG9jIHBhZ2Ugd2hpY2ggY2F1c2VkIGEgZm9ybWF0dGluZyBlcnJvciAoIzM0MzEpCiAgKiBGaXggYnJva2VuIGxpbmsgdG8gSm9yZGFuIFRob3JucXVlc3QncyB3ZWJzaXRlLiAoIzM0MzgpCiAgKiBDaGFuZ2UgdGhlIGxpbmsgdG8gYW4gZXh0ZW5zaW9uICgjMzQ1NykKICAqIEZpeCBUd2l0dGVyIGxpbmsgb24gdGhlIGhlbHAgcGFnZSAoIzM0NjYpCiAgKiBGaXggd29yZGluZyBpbiBjb2RlIHNuaXBwZXQgaGlnaGxpZ2h0aW5nIHNlY3Rpb24gKCMzNDc1KQogICogQWRkIGEgYC9gIHRvIGBwYWdpbmF0ZV9wYXRoYCBpbiB0aGUgUGFnaW5hdGlvbiBkb2N1bWVudGF0aW9uICgjMzQ3OSkKICAqIEFkZCBhIGxpbmsgb24gYWxsIHRoZSBkb2NzIHBhZ2VzIHRvICJJbXByb3ZlIHRoaXMgcGFnZSIuICgjMzUxMCkKICAqIEFkZCBqZWt5bGwtYXV0by1pbWFnZSBnZW5lcmF0b3IgdG8gdGhlIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzM0ODkpCiAgKiBSZXBsYWNlIGxpbmsgdG8gdGhlIHByb3Bvc2VkIGBwaWN0dXJlYCBlbGVtZW50IHNwZWMgKCMzNTMwKQogICogQWRkIGZyb250bWF0dGVyIGRhdGUgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiAoIzM0NjkpCiAgKiBJbXByb3ZlIGNvbnNpc3RlbmN5IGFuZCBjbGFyaXR5IG9mIHBsdWdpbnMgb3B0aW9ucyBub3RlICgjMzU0NikKICAqIEFkZCBwZXJtYWxpbmsgd2FybmluZyB0byBwYWdpbmF0aW9uIGRvY3MgKCMzNTUxKQogICogRml4IGdyYW1tYXIgaW4gQ29sbGVjdGlvbnMgZG9jcyBBUEkgc3RhYmlsaXR5IHdhcm5pbmcgKCMzNTYwKQogICogUmVzdHJ1Y3R1cmUgYGV4Y2VycHRfc2VwYXJhdG9yYCBkb2N1bWVudGF0aW9uIGZvciBjbGFyaXR5ICgjMzU1MCkKICAqIEZpeCBhY2NpZGVudGFsIGxpbmUgYnJlYWsgaW4gY29sbGVjdGlvbnMgZG9jcyAoIzM1ODUpCiAgKiBBZGQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGAuamVreWxsLW1ldGFkYXRhYCBmaWxlICgjMzU5NykKICAqIERvY3VtZW50IGFkZGl0aW9uIG9mIHZhcmlhYmxlIHBhcmFtZXRlcnMgdG8gYW4gaW5jbHVkZSAoIzM1ODEpCiAgKiBBZGQgYGpla3lsbC1maWxlc2AgdG8gdGhlIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucy4gKCMzNTg2KQogICogRGVmaW5lIHRoZSBgaW5zdGFsbGAgc3RlcCBpbiB0aGUgQ0kgZXhhbXBsZSBgLnRyYXZpcy55bWxgICgjMzYyMikKICAqIEV4cGFuZCBjb2xsZWN0aW9ucyBkb2N1bWVudGF0aW9uLiAoIzM2MzgpCiAgKiBBZGQgdGhlICJ3YXJuaW5nIiBub3RlIGxhYmVsIHRvIGV4Y2x1ZGluZyBgdmVuZG9yYCBpbiB0aGUgQ0kgZG9jcyBwYWdlICgjMzYyMykKICAqIFVwZ3JhZGUgcGllY2VzIG9mIHRoZSBVZ3JhZGluZyBndWlkZSBmb3IgSmVreWxsIDMgKCMzNjA3KQogICogU2hvd2luZyBob3cgdG8gYWNjZXNzIHNwZWNpZmljIGRhdGEgaXRlbXMgKCMzNDY4KQogICogQ2xhcmlmeSBwYWdpbmF0aW9uIHdvcmtzIGZyb20gd2l0aGluIEhUTUwgZmlsZXMgKCMzNDY3KQogICogQWRkIG5vdGUgdG8gYGV4Y2VycHRfc2VwYXJhdG9yYCBkb2N1bWVudGF0aW9uIHRoYXQgaXQgY2FuIGJlIHNldCBnbG9iYWxseSAoIzM2NjcpCiAgKiBGaXggc29tZSBuYW1lcyBvbiBUcm91Ymxlc2hvb3RpbmcgcGFnZSAoIzM2ODMpCiAgKiBBZGQgYHJlbW90ZV9maWxlX2NvbnRlbnRgIHRhZyBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzY5MSkKICAqIFVwZGF0ZSB0aGUgUmVkY2FycGV0IHZlcnNpb24gb24gdGhlIENvbmZpZ3VyYXRpb24gcGFnZS4gKCMzNzQzKQogICogVXBkYXRlIHRoZSBsaW5rIGluIHRoZSB3ZWxjb21lIHBvc3QgdG8gcG9pbnQgdG8gSmVreWxsIFRhbGsgKCMzNzQ1KQogICogVXBkYXRlIGxpbmsgZm9yIG5hdmJhcnMgd2l0aCBkYXRhIGF0dHJpYnV0ZXMgdHV0b3JpYWwgKCMzNzI4KQogICogQWRkIGBqZWt5bGwtYXNjaWluZW1hYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzNzUwKQogICogVXBkYXRlIHBhZ2luYXRpb24gZXhhbXBsZSB0byBiZSBhZ25vc3RpYyB0byBmaXJzdCBwYWdpbmF0aW9uIGRpciAoIzM3NjMpCiAgKiBEZXRhaWxlZCBpbnN0cnVjdGlvbnMgZm9yIHJzeW5jIGRlcGxveW1lbnQgbWV0aG9kICgjMzg0OCkKICAqIEFkZCBKZWt5bGwgUG9ydGZvbGlvIEdlbmVyYXRvciB0byBsaXN0IG9mIHBsdWdpbnMgKCMzODgzKQogICogQWRkIGBzaXRlLmh0bWxfZmlsZXNgIHRvIHZhcmlhYmxlcyBkb2NzICgjMzg4MCkKICAqIEFkZCBTdGF0aWMgUHVibGlzaGVyIHRvb2wgdG8gbGlzdCBvZiBkZXBsb3ltZW50IG1ldGhvZHMgKCMzODY1KQogICogRml4IGEgZmV3IHR5cG9zLiAoIzM4OTcpCiAgKiBBZGQgYGpla3lsbC15b3V0dWJlYCB0byB0aGUgbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzkzMSkKICAqIEFkZCBWaWV3cyBSb3V0ZXIgcGx1Z2luICgjMzk1MCkKICAqIFVwZGF0ZSBpbnN0YWxsIGRvY3MgKENvcmUgZGVwZW5kZW5jaWVzLCBXaW5kb3dzIHJlcXMsIGV0YykgKCMzNzY5KQogICogVXNlIEpla3lsbCBGZWVkIGZvciBqZWt5bGxyYi5jb20gKCMzNzM2KQogICogQWRkIGpla3lsbC11bWxhdXRzIHRvIHBsdWdpbnMubWQgKCQzOTY2KQogICogVHJvdWJsZXNob290aW5nOiBmaXggYnJva2VuIGxpbmssIGFkZCBvdGhlciBtYWMtc3BlY2lmaWMgaW5mbyAoIzM5NjgpCiAgKiBBZGQgYSBuZXcgc2l0ZSBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKCMzOTE3KQogICogQWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgSmVreWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyAoIzM5ODkpCiAgKiBGaXggYnJva2VuIGNvbmZpZ3VyYXRpb24gZG9jdW1lbnRhdGlvbiBwYWdlICgjMzk5NCkKICAqIEFkZCB0cm91Ymxlc2hvb3RpbmcgZG9jcyBmb3IgaW5zdGFsbGluZyBvbiBFbCBDYXBpdGFuICgjMzk5OSkKICAqIEFkZCBMYXp5IFR3ZWV0IEVtYmVkZGluZyB0byB0aGUgbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjNDAxNSkKICAqIEFkZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciAyIG9mIDMgb3B0aW9ucyBmb3IgcGx1Z2lucyAoIzQwMTMpCiAgKiBBZGQgYWx0ZXJuYXRpdmUgamVreWxsIGdlbSBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zICgjNDAxOCkKICAqIEZpeCBhIGZldyB0eXBvcyBhbmQgZm9ybWF0dGluZyBwcm9ibGVtcy4gKCM0MDIyKQogICogRml4IHByZXR0eSBwZXJtYWxpbmsgZXhhbXBsZSAoIzQwMjkpCiAgKiBOb3RlIHRoYXQgYF9jb25maWcueW1sYCBpcyBub3QgcmVsb2FkZWQgZHVyaW5nIHJlZ2VuZXJhdGlvbiAoIzQwMzQpCiAgKiBBcHBseSBjb2RlIGJsb2NrIGZpZ3VyZSBzeW50YXggdG8gYmxvY2tzIGluIENPTlRSSUJVVElORyAoIzQwNDYpCiAgKiBBZGQgamVreWxsLXNtYXJ0aWZ5IHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzNTcyKQoKIyMgMi41LjMgLyAyMDE0LTEyLTIyCgojIyMgQnVnIEZpeGVzCgogICogV2hlbiBjaGVja2luZyBhIE1hcmtkb3duIGV4dG5hbWUsIGluY2x1ZGUgcG9zaXRpb24gb2YgdGhlIGAuYCAoIzMxNDcpCiAgKiBGaXggYGpzb25pZnlgIExpcXVpZCBmaWx0ZXIgaGFuZGxpbmcgb2YgYm9vbGVhbiB2YWx1ZXMgKCMzMTU0KQogICogQWRkIGNvbW1hIHRvIHZhbHVlIG9mIGB2aWV3cG9ydGAgbWV0YSB0YWcgKCMzMTcwKQogICogU2V0IHRoZSBsaW5rIHR5cGUgZm9yIHRoZSBSU1MgZmVlZCB0byBgYXBwbGljYXRpb24vcnNzK3htbGAgKCMzMTc2KQogICogUmVmYWN0b3IgYCNhc19saXF1aWRgICgjMzE1OCkKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEV4Y2x1ZGUgYnVpbHQtaW4gYnVuZGxlcyBmcm9tIGJlaW5nIGFkZGVkIHRvIGNvdmVyYWdlIHJlcG9ydCAoIzMxODApCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBBZGQgYEBhbGZyZWR4aW5nYCB0byB0aGUgYEBqZWt5bGwvY29yZWAgdGVhbS4gOnRhZGE6ICgjMzIxOCkKICAqIERvY3VtZW50IHRoZSBgLXFgIG9wdGlvbiBmb3IgdGhlIGBidWlsZGAgYW5kIGBzZXJ2ZWAgY29tbWFuZHMgKCMzMTQ5KQogICogRml4IHNvbWUgbWlub3IgdHlwb3MvZmxvdyBmaXhlcyBpbiBkb2N1bWVudGF0aW9uIHdlYnNpdGUgY29udGVudCAoIzMxNjUpCiAgKiBBZGQgYGtlZXBfZmlsZXNgIHRvIGNvbmZpZ3VyYXRpb24gZG9jdW1lbnRhdGlvbiAoIzMxNjIpCiAgKiBSZXBlYXQgd2FybmluZyBhYm91dCBjbGVhbmluZyBvZiB0aGUgYGRlc3RpbmF0aW9uYCBkaXJlY3RvcnkgKCMzMTYxKQogICogQWRkIGpla3lsbC01MDBweC1lbWJlZCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzMTYzKQogICogU2ltcGxpZmllZCBwbGF0Zm9ybSBkZXRlY3Rpb24gaW4gR2VtZmlsZSBleGFtcGxlIGZvciBXaW5kb3dzICgjMzE3NykKICAqIEFkZCB0aGUgYGpla3lsbC1qYWxhbGlgIHBsdWdpbiBhZGRlZCB0byB0aGUgbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zLiAoIzMxOTgpCiAgKiBBZGQgVGFibGUgb2YgQ29udGVudHMgdG8gVHJvdWJsZXNob290aW5nIHBhZ2UgKCMzMTk2KQogICogQWRkIGBpbmxpbmVfaGlnaGxpZ2h0YCBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzIxMikKICAqIEFkZCBgamVreWxsLW1lcm1haWRgIHBsdWdpbiB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzMjIyKQoKIyMgMi41LjIgLyAyMDE0LTExLTE3CgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogYHBvc3RfdXJsYCBzaG91bGQgbWF0Y2ggYHBvc3QubmFtZWAgaW5zdGVhZCBvZiBzbHVncyBhbmQgZGF0ZXMgKCMzMDU4KQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCBidW5kbGUgcmVxdWlyZSBmb3IgYDpqZWt5bGxfcGx1Z2luc2AgKCMzMTE5KQogICogUmVtb3ZlIGR1cGxpY2F0ZSByZWdleHAgcGhyYXNlOiBgXlxBYCAoIzMwODkpCiAgKiBSZW1vdmUgZHVwbGljYXRlIGBDb252ZXJzaW9uIGVycm9yOmAgbWVzc2FnZSBpbiBgQ29udmVydGlibGVgICgjMzA4OCkKICAqIFByaW50IGZ1bGwgY29udmVyc2lvbiBlcnJvciBtZXNzYWdlIGluIGBSZW5kZXJlciNjb252ZXJ0YCAoIzMwOTApCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBDaGFuZ2UgdmFyaWFibGUgbmFtZXMgaW4gR29vZ2xlIEFuYWx5dGljcyBzY3JpcHQgKCMzMDkzKQogICogTWVudGlvbiBDU1YgZmlsZXMgaW4gdGhlIGRvY3MgZm9yIGRhdGEgZmlsZXMgKCMzMTAxKQogICogQWRkIHRyYWlsaW5nIHNsYXNoIHRvIGBwYWdpbmF0ZV9wYXRoYCBleGFtcGxlLiAoIzMwOTEpCiAgKiBHZXQgcmlkIG9mIG5vaWZuaW9mIChgZXhjZXJwdF9zZXBhcmF0b3JgKSAoIzMwOTQpCiAgKiBTYXNzIGltcHJvdmVtZW50cywgYXJvdW5kIG5lc3RpbmcgbW9zdGx5LiAoIzMxMjMpCiAgKiBBZGQgd2VibWVudGlvbnMuaW8gcGx1Z2luIHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMzMTI3KQogICogQWRkIFNhc3MgbWl4aW5zIGFuZCB1c2UgdGhlbS4gKCMyOTA0KQogICogU2xpZ2h0bHkgY29tcHJlc3MgamVreWxsLXN0aWNrZXIuanBnLiAoIzMxMzMpCiAgKiBVcGRhdGUgZ3JpZGlzbSBhbmQgc2VwYXJhdGUgb3V0IHJlbGF0ZWQgYnV0IGN1c3RvbSBzdHlsZXMuICgjMzEzMikKICAqIEFkZCByZW1vdGUtaW5jbHVkZSBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMzEzNikKCiMjIDIuNS4xIC8gMjAxNC0xMS0wOQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCBwYXRoIHNhbml0YXRpb24gYnVnIHJlbGF0ZWQgdG8gV2luZG93cyBkcml2ZSBuYW1lcyAoIzMwNzcpCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBBZGQgZGV2ZWxvcG1lbnQgdGltZSBkZXBlbmRlbmNpZXMgb24gbWluaXRlc3QgYW5kIHRlc3QtdW5pdCB0byBnZW1zcGVjIGZvciBjeWd3aW4gKCMzMDY0KQogICogVXNlIFRyYXZpcydzIGJ1aWx0LWluIGNhY2hpbmcuICgjMzA3NSkKCiMjIDIuNS4wIC8gMjAxNC0xMS0wNgoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFJlcXVpcmUgZ2VtcyBpbiBgOmpla3lsbF9wbHVnaW5zYCBHZW1maWxlIGdyb3VwIHVubGVzcyBgSkVLWUxMX05PX0JVTkRMRVJfUkVRVUlSRWAgaXMgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudC4gKCMyODY1KQogICogQ2VudHJhbGl6ZSBwYXRoIHNhbml0YXRpb24gaW4gdGhlIGBTaXRlYCBvYmplY3QgKCMyODgyKQogICogQWxsb3cgcGxhY2Vob2xkZXJzIGluIHBlcm1hbGlua3MgKCMzMDMxKQogICogQWxsb3cgdXNlcnMgdG8gc3BlY2lmeSB0aGUgbG9nIGxldmVsIHZpYSBgSkVLWUxMX0xPR19MRVZFTGAuICgjMzA2NykKICAqIEZhbmN5IEluZGV4aW5nIHdpdGggV0VCcmljayAoIzMwMTgpCiAgKiBBbGxvdyBFbnVtZXJhYmxlcyB0byBiZSB1c2VkIHdpdGggYHdoZXJlYCBmaWx0ZXIuICgjMjk4NikKICAqIE1ldGEgZGVzY3JpcHRpb25zIGluIHRoZSBzaXRlIHRlbXBsYXRlIG5vdyB1c2UgYHBhZ2UuZXhjZXJwdGAgaWYgaXQncyBhdmFpbGFibGUgKCMyOTY0KQogICogQ2hhbmdlIGluZGVudGF0aW9uIGluIGBoZWFkLmh0bWxgIG9mIHNpdGUgdGVtcGxhdGUgdG8gMiBzcGFjZXMgZnJvbSA0ICgjMjk3MykKICAqIFVzZSBhIGAkY29udGVudC13aWR0aGAgdmFyaWFibGUgaW5zdGVhZCBvZiBhIGZpeGVkIHZhbHVlIGluIHRoZSBzaXRlIHRlbXBsYXRlIENTUyAoIzI5NzIpCiAgKiBTdHJpcCBuZXdsaW5lcyBpbiBzaXRlIHRlbXBsYXRlIGA8bWV0YT5gIGRlc2NyaXB0aW9uLiAoIzI5ODIpCiAgKiBBZGQgbGluayB0byBhdG9tIGZlZWQgaW4gYGhlYWRgIG9mIHNpdGUgdGVtcGxhdGUgZmlsZXMgKCMyOTk2KQogICogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyAoIzI5OTQpCiAgKiBVc2UgYEhhc2gjZWFjaF9rZXlgIGluc3RlYWQgb2YgYEhhc2gja2V5cy5lYWNoYCB0byBzcGVlZCB1cCBpdGVyYXRpb24gb3ZlciBoYXNoIGtleXMuICgjMzAxNykKICAqIEZ1cnRoZXIgbWlub3IgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLiAoIzMwMjIpCiAgKiBBZGQgJ2InIGFuZCAncycgYWxpYXNlcyBmb3IgYnVpbGQgYW5kIHNlcnZlLCByZXNwZWN0aXZlbHkgKCMzMDY1KQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCBSb3VnZSdzIFJlZENhcnBldCBwbHVnaW4gaW50ZXJmYWNlIGludGVncmF0aW9uICgjMjk1MSkKICAqIFJlbW92ZSBgLS13YXRjaGAgZnJvbSB0aGUgc2l0ZSB0ZW1wbGF0ZSBibG9nIHBvc3Qgc2luY2UgaXQgZGVmYXVsdHMgdG8gd2F0Y2hpbmcgaW4gaW4gMi40LjAgKCMyOTIyKQogICogRml4IGNvZGUgZm9yIG1lZGlhIHF1ZXJ5IG1peGluIGluIHNpdGUgdGVtcGxhdGUgKCMyOTQ2KQogICogQWxsb3cgcG9zdCBVUkwncyB0byBoYXZlIGAuaHRtYCBleHRlbnNpb25zICgjMjkyNSkKICAqIGBVdGlscy5zbHVnaWZ5YDogRG9uJ3QgY3JlYXRlIG5ldyBvYmplY3RzIHdoZW4gZ3N1YmJpbmcgKCMyOTk3KQogICogVGhlIGpzb25pZnkgZmlsdGVyIHNob3VsZCBkZWVwLWNvbnZlcnQgdG8gTGlxdWlkIHdoZW4gZ2l2ZW4gYW4gQXJyYXkuICgjMzAzMikKICAqIEFwcGx5IGBqc29uaWZ5YCBmaWx0ZXIgdG8gSGFzaGVzIGRlZXBseSBhbmQgZWZmZWN0aXZlbHkgKCMzMDYzKQogICogVXNlIGAxMjcuMC4wLjFgIGFzIGRlZmF1bHQgaG9zdCBpbnN0ZWFkIG9mIGAwLjAuMC4wYCAoIzMwNTMpCiAgKiBJbiB0aGUgY2FzZSB0aGF0IGEgR2VtZmlsZSBkb2VzIG5vdCBleGlzdCwgZW5zdXJlIEpla3lsbCBkb2Vzbid0IGZhaWwgb24gcmVxdWlyaW5nIHRoZSBHZW1maWxlIGdyb3VwICgjMzA2NikKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEZpeCBhIHR5cG8gaW4gdGhlIGRvYyBibG9jayBmb3IgYEpla3lsbDo6VVJMLmVzY2FwZV9wYXRoYCAoIzMwNTIpCiAgKiBBZGQgaW50ZWdyYXRpb24gdGVzdCBmb3IgYGpla3lsbCBuZXcgLS1ibGFua2AgaW4gVGVzdFVuaXQgKCMyOTEzKQogICogQWRkIHVuaXQgdGVzdCBmb3IgYGpla3lsbCBuZXcgLS1mb3JjZWAgbG9naWMgKCMyOTI5KQogICogVXBkYXRlIG91dGRhdGVkIGNvbW1lbnQgZm9yIGBDb252ZXJ0aWJsZSN0cmFuc2Zvcm1gICgjMjk1NykKICAqIEFkZCBIYWtpcmkgYmFkZ2UgdG8gUkVBRE1FLiAoIzI5NTMpCiAgKiBBZGQgc29tZSBzaW1wbGUgYmVuY2htYXJraW5nIHRvb2xzLiAoIzI5OTMpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBgTk9LT0dJUklfVVNFX1NZU1RFTV9MSUJSQVJJRVM9dHJ1ZWAgKipkZWNyZWFzZXMqKiBpbnN0YWxsYXRpb24gdGltZS4gKCMzMDQwKQogICogQWRkIEZvcm1LZWVwIHRvIHJlc291cmNlcyBhcyBKZWt5bGwgZm9ybSBiYWNrZW5kICgjMzAxMCkKICAqIEZpeGluZyBhIG1pc3Rha2UgaW4gdGhlIG5hbWUgb2YgdGhlIG5ldyBMaXF1aWQgdGFnICgjMjk2OSkKICAqIFVwZGF0ZSBGb250IEF3ZXNvbWUgdG8gdjQuMi4wLiAoIzI4OTgpCiAgKiBGaXggbGluayB0byAjMjg5NSBpbiAyLjQuMCByZWxlYXNlIHBvc3QuICgjMjg5OSkKICAqIEFkZCBCaWcgRm9vdG5vdGVzIGZvciBLcmFtZG93biBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjkxNikKICAqIFJlbW92ZSB3YXJuaW5nIHJlZ2FyZGluZyBHSFAgdXNlIG9mIHNpbmd1bGFyIHR5cGVzIGZvciBmcm9udCBtYXR0ZXIgZGVmYXVsdHMgKCMyOTE5KQogICogRml4IHF1b3RlIGNoYXJhY3RlciB0eXBvIGluIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgdGVtcGxhdGVzICgjMjkxNykKICAqIFBvaW50IExpcXVpZCBsaW5rcyB0byBMaXF1aWTigJlzIEdpdEh1YiB3aWtpICgjMjg4NykKICAqIEFkZCBIVFRQIEJhc2ljIEF1dGggKC5odGFjY2VzcykgcGx1Z2luIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzI5MzEpCiAgKiAoTWlub3IpIEdyYW1tYXIgJiBgX2NvbmZpZy55bWxgIGZpbGVuYW1lIGZpeGVzICgjMjkxMSkKICAqIEFkZGVkIGBtYXRobWwucmJgIHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMuICgjMjkzNykKICAqIEFkZCBgLS1mb3JjZV9wb2xsaW5nYCB0byB0aGUgbGlzdCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMgKCMyOTQzKQogICogRXNjYXBlIHVuaWNvZGUgY2hhcmFjdGVycyBpbiBzaXRlIENTUyAoIzI5MDYpCiAgKiBBZGQgbm90ZSBhYm91dCB1c2luZyB0aGUgZ2l0aHViLXBhZ2VzIGdlbSB2aWEgcGFnZXMuZ2l0aHViLmNvbS92ZXJzaW9ucy5qc29uICgjMjkzOSkKICAqIFVwZGF0ZSB1c2FnZSBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgMi40IGF1dG8tZW5hYmxpbmcgb2YgYC0td2F0Y2hgLiAoIzI5NTQpCiAgKiBBZGQgYC0tc2tpcC1pbml0aWFsLWJ1aWxkYCB0byBjb25maWd1cmF0aW9uIGRvY3MgKCMyOTQ5KQogICogRml4IGEgbWlub3IgdHlwbyBpbiBUZW1wbGF0ZXMgZG9jcyBwYWdlICgjMjk1OSkKICAqIEFkZCBhIGRpdGFhLWRpdGFhIHBsdWdpbiB1bmRlciBPdGhlciBzZWN0aW9uIG9uIHRoZSBQbHVnaW5zIHBhZ2UgKCMyOTY3KQogICogQWRkIGBidWlsZC9zZXJ2ZSAtVmAgb3B0aW9uIHRvIGNvbmZpZ3VyYXRpb24gZG9jdW1lbnRhdGlvbiAoIzI5NDgpCiAgKiBBZGQgJ0pla3lsbCBUd2l0dGVyIFBsdWdpbicgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjk3OSkKICAqIERvY3M6IFVwZGF0ZSBub3JtYWxpemUuY3NzIHRvIHYzLjAuMi4gKCMyOTgxKQogICogRml4IHR5cG8gaW4gQ29udGludW91cyBJbnRlZ3JhdGlvbiBkb2N1bWVudGF0aW9uICgjMjk4NCkKICAqIENsYXJpZnkgYmVoYXZpb3Igb2YgYDpjYXRlZ29yaWVzYCBpbiBwZXJtYWxpbmtzICgjMzAxMSkKCiMjIDIuNC4wIC8gMjAxNC0wOS0wOQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFN1cHBvcnQgYSBuZXcgYHJlbGF0aXZlX2luY2x1ZGVgIHRhZyAoIzI4NzApCiAgKiBBdXRvLWVuYWJsZSB3YXRjaCBvbiAnc2VydmUnICgjMjg1OCkKICAqIFJlbmRlciBMaXF1aWQgaW4gQ29mZmVlU2NyaXB0IGZpbGVzICgjMjgzMCkKICAqIEFycmF5IExpcXVpZCBmaWx0ZXJzOiBgcHVzaGAsIGBwb3BgLCBgdW5zaGlmdGAsIGBzaGlmdGAgKCMyODk1KQogICogQWRkIGA6dGl0bGVgIHRvIGNvbGxlY3Rpb24gVVJMIHRlbXBsYXRlIGZpbGxlcnMgKCMyODY0KQogICogQWRkIHN1cHBvcnQgZm9yIENTViBmaWxlcyBpbiB0aGUgYF9kYXRhYCBkaXJlY3RvcnkgKCMyNzYxKQogICogQWRkIHRoZSBgbmFtZWAgdmFyaWFibGUgdG8gY29sbGVjdGlvbiBwZXJtYWxpbmtzICgjMjc5OSkKICAqIEFkZCBgaW5zcGVjdGAgbGlxdWlkIGZpbHRlci4gKCMyODY3KQogICogQWRkIGEgYHNsdWdpZnlgIExpcXVpZCBmaWx0ZXIgKCMyODgwKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIFVzZSBgSmVreWxsLnNhbml0aXplZF9wYXRoYCB3aGVuIGFkZGluZyBzdGF0aWMgZmlsZXMgdG8gQ29sbGVjdGlvbnMgKCMyODQ5KQogICogRml4IGVuY29kaW5nIG9mIGBtYWluLnNjc3NgIGluIHNpdGUgdGVtcGxhdGUgKCMyNzcxKQogICogRml4IG9yaWVudGF0aW9uIGJ1Z3MgaW4gZGVmYXVsdCBzaXRlIHRlbXBsYXRlICgjMjg2MikKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIFVwZGF0ZSBzaW1wbGVjb3YgZ2VtIHRvIDAuOSAoIzI3NDgpCiAgKiBSZW1vdmUgYGRvY3MvYCBkaXIgKCMyNzY4KQogICogYWRkIGNsYXNzIGA8PCBzZWxmYCBpZGlvbSB0byBgTmV3YCBjb21tYW5kICgjMjgxNykKICAqIEFsbG93IFRyYXZpcyB0byAncGFyYWxsZWxpemUnIG91ciB0ZXN0cyAoIzI4NTkpCiAgKiBGaXggdGVzdCBmb3IgTGlxdWlkIHJlbmRlcmluZyBpbiBTYXNzICgjMjg1NikKICAqIEZpeGluZyAidmVydHljYWwiIHR5cG8gaW4gc2l0ZSB0ZW1wbGF0ZSdzIGBfYmFzZS5zY3NzYCAoIzI4ODkpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBEb2N1bWVudCB0aGUgYG5hbWVgIHZhcmlhYmxlIGZvciBjb2xsZWN0aW9uIHBlcm1hbGlua3MgKCMyODI5KQogICogQWRkcyBpbmZvIGFib3V0IGluc3RhbGxpbmcgamVreWxsIGluIGN1cnJlbnQgZGlyICgjMjgzOSkKICAqIFJlbW92ZSBkZXByZWNhdGVkIGBqZWt5bGwtcHJvamVjdGxpc3RgIHBsdWdpbiBmcm9tIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzI3NDIpCiAgKiBSZW1vdmUgdGFnIHBsdWdpbnMgdGhhdCBhcmUgYnVpbHQgaW4gdG8gSmVreWxsICgjMjc1MSkKICAqIEFkZCBgbWFya2Rvd24td3JpdGVyYCBwYWNrYWdlIGZvciBBdG9tIEVkaXRvciB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNzYzKQogICogRml4IHR5cG8gaW4gc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBjb2xsZWN0aW9ucyAoIzI3NjQpCiAgKiBGaXggbWlub3IgdHlwbyBvbiBwbHVnaW5zIGRvY3MgcGFnZSAoIzI3NjUpCiAgKiBSZXBsYWNlIG1hcmtkb3duIHdpdGggSFRNTCBpbiBgc2Fzc19kaXJgIG5vdGUgb24gYXNzZXRzIHBhZ2UgKCMyNzkxKQogICogRml4ZWQgImJlbGxvdyIgdHlwbyBpbiBkYXRhZmlsZXMgZG9jcyAoIzI4NzkpCiAgKiBGaXggY29kZS9tYXJrZG93biBpc3N1ZSBpbiBkb2N1bWVudGF0aW9uIGZvciB2YXJpYWJsZXMgKCMyODc3KQogICogUmVtb3ZlIEdvb2QgSW5jbHVkZSB0aGlyZC1wYXJ0eSBwbHVnaW4gZnJvbSBwbHVnaW5zIHBhZ2UgKCMyODgxKQogICogQWRkIHNvbWUgbW9yZSBkb2NzIG9uIGBpbmNsdWRlX3JlbGF0aXZlYCAoIzI4ODQpCgojIyAyLjMuMCAvIDIwMTQtMDgtMTAKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBBbGxvdyBDb252ZXJ0aWJsZXMgdG8gYmUgY29udmVydGVkIGJ5ID49IDEgY29udmVydGVycyAoIzI3MDQpCiAgKiBBbGxvdyBTYXNzIGZpbGVzIHRvIGJlIHJlbmRlcmVkIGluIExpcXVpZCwgYnV0IG5ldmVyIHBsYWNlIHRoZW0gaW4gbGF5b3V0cy4gKCMyNzMzKQogICogQWRkIGBqZWt5bGwgaGVscGAgY29tbWFuZCAoIzI3MDcpCiAgKiBVc2UgYC5zY3NzYCBmb3IgYHNpdGVfdGVtcGxhdGVgIHN0eWxlcy4gKCMyNjY3KQogICogRG9uJ3QgcmVxdWlyZSB0aGUgYHNjb3BlYCBrZXkgaW4gZnJvbnQgbWF0dGVyIGRlZmF1bHRzICgjMjY1OSkKICAqIE5vIGxvbmdlciBzZXQgYHBlcm1hbGluazogcHJldHR5YCBpbiB0aGUgYF9jb25maWcueW1sYCBmb3IgdGhlIHNpdGUgdGVtcGxhdGUgKCMyNjgwKQogICogUmV3b3JrIHNpdGUgdGVtcGxhdGUgdG8gdXRpbGl6ZSBTYXNzICgjMjY4NykKICAqIE5vdGlmeSB0aGUgdXNlciB3aGVuIGF1dG8tcmVnZW5lcmF0aW9uIGlzIGRpc2FibGVkLiAoIzI2OTYpCiAgKiBBbGxvdyBwYXJ0aWFsIHZhcmlhYmxlcyBpbiBpbmNsdWRlIHRhZyBmaWxlbmFtZSBhcmd1bWVudCAoIzI2OTMpCiAgKiBNb3ZlIGluc3RhbmNlcyBvZiBgVGltZS5wYXJzZWAgaW50byBhIFV0aWxzIG1ldGhvZCAoIzI2ODIpCiAgKiBJZ25vcmUgc3ViZm9sZGVycyBpbiB0aGUgYF9wb3N0c2AgZm9sZGVyICgjMjcwNSkgUkVWRVJUUyAoIzI2MzMpCiAgKiBGcm9udCBNYXR0ZXIgZGVmYXVsdCB0eXBlcyBzaG91bGQgYWx3YXlzIGJlIHBsdXJhbGl6ZWQgKCMyNzMyKQogICogUmVhZCBpbiBzdGF0aWMgZmlsZXMgaW50byBgY29sbGVjdGlvbi5maWxlc2AgYXMgYFN0YXRpY0ZpbGVgcyAoIzI3MzcpCiAgKiBBZGQgYHNhc3NpZnlgIGFuZCBgc2Nzc2lmeWAgTGlxdWlkIGZpbHRlcnMgKCMyNzM5KQogICogUmVwbGFjZSBgY2xhc3NpZmllcmAgZ2VtIHdpdGggYGNsYXNzaWZpZXItcmVib3JuYCAoIzI3MjEpCgojIyMgQnVnIEZpeGVzCgogICogVXNlIG9ubHkgdGhlIGxhc3QgZXh0bmFtZSB3aGVuIG11bHRpcGxlIGNvbnZlcnRlcnMgZXhpc3QgKCMyNzIyKQogICogQ2FsbCBgI3RvX2xpcXVpZGAgYmVmb3JlIGNhbGxpbmcgYCN0b19qc29uYCBpbiBqc29uaWZ5IGZpbHRlciAoIzI3MjkpCiAgKiBVc2Ugbm9uIHBhZGRlZCBjb25maWcgaW4gYHN0cmZ0aW1lYCB0byBhdm9pZCBwYXJzZSBzdHJpbmcgdHdpY2UgKCMyNjczKQogICogUmVwbGFjZSBkZXByZWNhdGVkIFJ1YnkgbWV0aG9kcyB3aXRoIHVuZGVwcmVjYXRlZCBvbmVzICgjMjY2NCkKICAqIENhdGNoIGVycm9ycyB3aGVuIHBhcnNpbmcgUG9zdCBgZGF0ZWAgZnJvbnQgbWF0dGVyIHZhbHVlICYgcHJvZHVjZSBuaWNlIGVycm9yIG1lc3NhZ2UgKCMyNjQ5KQogICogQWxsb3cgc3RhdGljIGZpbGVzIGluIENvbGxlY3Rpb25zICgjMjYxNSkKICAqIEZpeGVkIHR5cG8gaW4gYERlcHJlY2F0b3IjZ3JhY2VmdWxseV9yZXF1aXJlYCBlcnJvciBtZXNzYWdlICgjMjY5NCkKICAqIFJlbW92ZSBwcmVlbXB0aXZlIGxvYWRpbmcgb2YgdGhlICdjbGFzc2lmaWVyJyBnZW0uICgjMjY5NykKICAqIFVzZSBjYXNlLWluc2Vuc2l0aXZlIGNoZWNraW5nIGZvciB0aGUgZmlsZSBleHRlbnNpb25zIHdoZW4gbG9hZGluZyBjb25maWcgZmlsZXMgKCMyNzE4KQogICogV2hlbiBSZWFkaW5nIERvY3VtZW50cywgUmVzcGVjdCBgZW5jb2RpbmdgIE9wdGlvbiAoIzI3MjApCiAgKiBSZWZhY3RvciBiYXNlZCBvbiBqZWt5bGwtd2F0Y2ggY2xlYW4tdXAuICgjMjcxNikKICAqIGBEb2N1bWVudCN0b19zYCBzaG91bGQgcHJvZHVjZSBqdXN0IHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudCAoIzI3MzEpCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBPbmx5IGluY2x1ZGUgbGliIGZpbGVzIGluIHRoZSBnZW0gKCMyNjcxKQogICogRml4IGBnaXQgZGlmZmAgY29tbWFuZCBpbiBgcHJvb2ZgIHNjcmlwdCAoIzI2NzIpCiAgKiBNYWtlIGRlZmF1bHQgcmFrZSB0YXNrIGEgbXVsdGl0YXNrIHNvIHRlc3RzIHJ1biBpbiBwYXJhbGxlbCAoIzI3MzUpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBVc2UgU2FzcyBhbmQgYSBEb2NzIENvbGxlY3Rpb24gKCMyNjUxKQogICogQWRkIGBsYXRlc3RfdmVyc2lvbi50eHRgIGZpbGUgdG8gdGhlIHNpdGUgKCMyNzQwKQogICogQmUgbW9yZSBhbWJpZ3VvdXMgYWJvdXQgYHBhZ2UuY29udGVudGAuIEJ1dCBtb3JlIHRyYW5zcGFyZW50LiAoIzI1MjIpCiAgKiBTdHJlYW1saW5pbmcgZnJvbnQgbWF0dGVyIHdvcmRpbmcgKGluc3RlYWQgb2YgZnJvbnQtbWF0dGVyL2Zyb250bWF0dGVyKSAoIzI2NzQpCiAgKiBBZGQgbm90ZSB0aGF0IHNvdXJjZSBkaXJlY3RvcnkgY2Fubm90IGJlIG1vZGlmaWVkIGluIEdpdEh1YiBQYWdlcyAoIzI2NjkpCiAgKiBGaXggbGlua3MgZnJvbSAjMjY2OSB0byBiZSBhY3R1YWwgSFRNTC4gV2hvb3BzLiAoIzI2NzkpCiAgKiBBZGQgbGluayB0byBgamVreWxsLXNsaW1gIGluIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzI2ODkpCiAgKiBBZGQgQmFycnkgQ2xhcmsncyBTbWFzaGluZyBNYWdhemluZSB0dXRvcmlhbCB0byByZXNvdXJjZXMgcGFnZSAoIzI2ODgpCiAgKiBSZW9yZ2FuaXplIGFuZCB1cGRhdGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHNldHRpbmdzICgjMjQ1NikKICAqIEZpeGluZyBpbmRlbnRhdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBkb2NzIGFib3V0IFJlZGNhcnBldCBleHRzICgjMjcxNykKICAqIFVzZSBgbnVsbGAgaW4gWUFNTCBpbnN0ZWFkIG9mIGBuaWxgIGluIGRlZmF1bHQgY29uZmlnIGxpc3QgKCMyNzE5KQogICogRml4IHR5cG8gaW4gQ29udGludW91cyBJbnRlZ3JhdGlvbiBkb2NzICgjMjcwOCkKCiMjIDIuMi4wIC8gMjAxNC0wNy0yOQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFRocm93IGEgd2FybmluZyBpZiB0aGUgc3BlY2lmaWVkIGxheW91dCBkb2VzIG5vdCBleGlzdCAoIzI2MjApCiAgKiBXaGl0ZWxpc3QgUHlnbWVudHMgb3B0aW9ucyBpbiBzYWZlIG1vZGUgKCMyNjQyKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIFJlbW92ZSB1bm5lY2Vzc2FyeSBgSmVreWxsOjpUYWdzOjpJbmNsdWRlVGFnI2JsYW5rP2AgbWV0aG9kICgjMjYyNSkKICAqIENhdGVnb3JpZXMgaW4gdGhlIHBhdGggYXJlIGlnbm9yZWQgKCMyNjMzKQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogUmVmYWN0b3JpbmcgRXJyb3JzICYgUmVxdWlyZXMgb2YgVGhpcmQtUGFydHkgc3R1ZmYgKCMyNTkxKQogICogQWRkIGZ1cnRoZXIgdGVzdHMgZm9yIGNhdGVnb3JpZXMgKCMyNTg0KQogICogUHJvb2Ygc2l0ZSB3aXRoIGh0bWwtcHJvb2ZlciBvbiBjaGFuZ2UgKCMyNjA1KQogICogRml4IHVwIGJ1ZyBpbiAjMjYwNSB3aGljaCBjYXVzZWQgcHJvb2ZpbmcgdGhlIHNpdGUgbm90IHRvIGZ1bmN0aW9uICgjMjYwOCkKICAqIFVzZSBgYnVuZGxlIGV4ZWNgIGluIGBzY3JpcHQvcHJvb2ZgICgjMjYxMCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIFVwZGF0ZSBLcmFtZG93biB1cmxzICgjMjU4OCkKICAqIEFkZCBgSmVreWxsOjpBdXRvbGlua0VtYWlsYCBhbmQgYEpla3lsbDo6R2l0TWV0YWRhdGFgIHRvIHRoZSBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNTk2KQogICogRml4IGEgYnVuY2ggb2YgYnJva2VuIGxpbmtzIGluIHRoZSBzaXRlICgjMjYwMSkKICAqIFJlcGxhY2UgZGVhZCBsaW5rcyB3aXRoIHdvcmtpbmcgbGlua3MgKCMyNjExKQogICogQWRkIGpla3lsbC1ob29rIHRvIGRlcGxveW1lbnQgbWV0aG9kcyAoIzI2MTcpCiAgKiBBZGRlZCBrcmFtZG93bi13aXRoLXB5Z21lbnRzIHBsdWdpbiB0byB0aGUgbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjYyMykKICAqIFVwZGF0ZSBvdXRkYXRlZCAiRXh0cmFzIiBwYWdlIGFuZCByZW1vdmUgZHVwbGljYXRlIGRvY3VtZW50YXRpb24gKCMyNjIyKQogICogQWRkIGNvMiBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjYzOSkKICAqIEF0dGVtcHQgdG8gY2xhcmlmeSB0aGUgd2F5IFNhc3MgaW1wb3J0cyBoYXBwZW4gKCMyNjQyKQoKIyMgMi4xLjEgLyAyMDE0LTA3LTAxCgojIyMgQnVnIEZpeGVzCgogICogUGF0Y2ggcmVhZCB2dWxuZXJhYmlsaXRpZXMgZm9yIGRhdGEgJiBjb25maXJtIG5vbmUgZm9yIGxheW91dHMgKCMyNTYzKQogICogVXBkYXRlIE1hcnVrdSBkZXBlbmRlbmN5IHRvIGFsbG93IHVzZSBvZiB0aGUgbGF0ZXN0IHZlcnNpb24gKCMyNTc2KQogICogUmVtb3ZlIGNvbmRpdGlvbmFsIGFzc2lnbm1lbnQgZnJvbSBkb2N1bWVudCBVUkwgdG8gcHJldmVudCBzdGFsZSB1cmxzICgjMjU3NSkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIEFkZCB2ZXJ0aWNhbCBtYXJnaW4gdG8gYGhpZ2hsaWdodGAgdG8gc2VwYXJhdGUgY29kZSBibG9ja3MgKCMyNTU4KQogICogQWRkIGBodG1sX3BhZ2VzYCB0byBWYXJpYWJsZXMgZG9jcyAoIzI1NjcpCiAgKiBGaXhlZCBicm9rZW4gbGluayB0byBQZXJtYWxpbmtzIHBhZ2UgKCMyNTcyKQogICogVXBkYXRlIGxpbmsgdG8gV2luZG93cyBpbnN0YWxsYXRpb24gZ3VpZGUgKCMyNTc4KQoKIyMgMi4xLjAgLyAyMDE0LTA2LTI4CgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQnVtcCB0byB0aGUgbGF0ZXN0IExpcXVpZCB2ZXJzaW9uLCAyLjYuMSAoIzI0OTUpCiAgKiBBZGQgc3VwcG9ydCBmb3IgSlNPTiBmaWxlcyBpbiB0aGUgYF9kYXRhYCBkaXJlY3RvcnkgKCMyMzY5KQogICogQWxsb3cgc3ViY2xhc3NlcyB0byBvdmVycmlkZSBgRVhDRVJQVF9BVFRSSUJVVEVTX0ZPUl9MSVFVSURgICgjMjQwOCkKICAqIEFkZCBgSmVreWxsLmVudmAgYW5kIGBqZWt5bGwuZW52aXJvbm1lbnRgICh0aGUgTGlxdWlkIHZhcikgKCMyNDE3KQogICogVXNlIGBfY29uZmlnLnlhbWxgIG9yIGBfY29uZmlnLnltbGAgKGAueW1sYCB0YWtlcyBwcmVjZWRlbmNlKSAoIzI0MDYpCiAgKiBPdmVycmlkZSBjb2xsZWN0aW9uIHVybCB0ZW1wbGF0ZSAoIzI0MTgpCiAgKiBBbGxvdyBzdWJkaXJlY3RvcmllcyBpbiBgX2RhdGFgICgjMjM5NSkKICAqIEV4dHJhY3QgUGFnaW5hdGlvbiBHZW5lcmF0b3IgaW50byBnZW06IGBqZWt5bGwtcGFnaW5hdGVgICgjMjQ1NSkKICAqIFV0aWxpemUgYGRhdGVfdG9fcmZjODIyYCBmaWx0ZXIgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzI0MzcpCiAgKiBBZGQgY2F0ZWdvcmllcywgbGFzdCBidWlsZCBkYXRldGltZSwgYW5kIGdlbmVyYXRvciB0byBzaXRlIHRlbXBsYXRlIGZlZWQgKCMyNDM4KQogICogQ29uZmlndXJhYmxlLCByZXBsYWNlYWJsZSBMb2dnZXItY29tcGxpYW50IGxvZ2dlciAoIzI0NDQpCiAgKiBFeHRyYWN0IGBnaXN0YCB0YWcgaW50byBhIHNlcGFyYXRlIGdlbSAoIzI0NjkpCiAgKiBBZGQgYGNvbGxlY3Rpb25gIGF0dHJpYnV0ZSB0byBgRG9jdW1lbnQjdG9fbGlxdWlkYCB0byBhY2Nlc3MgdGhlIGRvY3VtZW50J3MgY29sbGVjdGlvbiBsYWJlbC4gKCMyNDM2KQogICogVXBncmFkZSBsaXN0ZW4gdG8gYDIuNy42IDw9IHggPCAzLjAuMGAgKCMyNDkyKQogICogQWxsb3cgY29uZmlndXJhdGlvbiBvZiBkaWZmZXJlbnQgVHdpdHRlciBhbmQgR2l0SHViIHVzZXJuYW1lcyBpbiBzaXRlIHRlbXBsYXRlICgjMjQ4NSkKICAqIEJ1bXAgUHlnbWVudHMgdG8gdjAuNi4wICgjMjUwNCkKICAqIEZyb250IG1hdHRlciBkZWZhdWx0cyBmb3IgZG9jdW1lbnRzIGluIGNvbGxlY3Rpb25zICgjMjQxOSkKICAqIEluY2x1ZGUgZmlsZXMgd2l0aCBhIHVybCB3aGljaCBlbmRzIGluIGAvYCBpbiB0aGUgYHNpdGUuaHRtbF9wYWdlc2AgbGlzdCAoIzI1MjQpCiAgKiBNYWtlIGBoaWdobGlnaHRgIHRhZyB1c2UgYGxhbmd1YWdlLWAgcHJlZml4IGluIENTUyBjbGFzcyAoIzI1MTEpCiAgKiBMb29rdXAgaXRlbSBwcm9wZXJ0eSB2aWEgYGl0ZW0jdG9fbGlxdWlkYCBiZWZvcmUgYCNkYXRhYCBvciBgI1tdYCBpbiBmaWx0ZXJzICgjMjQ5MykKICAqIFNraXAgaW5pdGlhbCBidWlsZCBvZiBzaXRlIG9uIHNlcnZlIHdpdGggZmxhZyAoIzI0NzcpCiAgKiBBZGQgc3VwcG9ydCBmb3IgYGhsX2xpbmVzYCBpbiBgaGlnaGxpZ2h0YCB0YWcgKCMyNTMyKQogICogU3Bpa2Ugb3V0IGAtLXdhdGNoYCBmbGFnIGludG8gYSBzZXBhcmF0ZSBnZW0gKCMyNTUwKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIExpcXVpZCBgc29ydGAgZmlsdGVyIHNob3VsZCBzb3J0IGV2ZW4gaWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgYG5pbGAgKCMyMzQ1KQogICogUmVtb3ZlIHBhZGRpbmcgb24gYHByZSBjb2RlYCBpbiB0aGUgc2l0ZSB0ZW1wbGF0ZSBDU1MgKCMyMzgzKQogICogU2V0IGBsb2dfbGV2ZWxgIGVhcmxpZXIgdG8gc2lsZW5jZSBpbmZvIGxldmVsIGNvbmZpZ3VyYXRpb24gb3V0cHV0ICgjMjM5MykKICAqIE9ubHkgbGlzdCBwYWdlcyB3aGljaCBoYXZlIGB0aXRsZWAgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzI0MTEpCiAgKiBBY2NlcHQgYE51bWVyaWNgIHZhbHVlcyBmb3IgZGF0ZXMsIG5vdCBgTnVtYmVyYCB2YWx1ZXMgKCMyMzc3KQogICogUHJldmVudCBjb2RlIGZyb20gb3ZlcmZsb3dpbmcgY29udGFpbmVyIGluIHNpdGUgdGVtcGxhdGUgKCMyNDI5KQogICogRW5jb2RlIFVSTHMgaW4gVVRGLTggd2hlbiBlc2NhcGluZyBhbmQgdW5lc2NhcGluZyAoIzI0MjApCiAgKiBObyBMYXlvdXRzIG9yIExpcXVpZCBmb3IgQXNzZXQgRmlsZXMgKCMyNDMxKQogICogQWxsb3cgZnJvbnQgbWF0dGVyIGRlZmF1bHRzIHRvIHNldCBwb3N0IGNhdGVnb3JpZXMgKCMyMzczKQogICogRml4IGNvbW1hbmQgaW4gc3ViY29tbWFuZCBkZXByZWNhdGlvbiB3YXJuaW5nICgjMjQ1NykKICAqIEtlZXAgYWxsIHBhcmVudCBkaXJlY3RvcmllcyBvZiBmaWxlcy9kaXJzIGluIGBrZWVwX2ZpbGVzYCAoIzI0NTgpCiAgKiBXaGVuIHVzaW5nIFJlZENhcnBldCBhbmQgUm91Z2Ugd2l0aG91dCBSb3VnZSBpbnN0YWxsZWQsIGZpeGVkIGVycm9uZW91cyBlcnJvciB3aGljaCBzdGF0ZWQgdGhhdCByZWRjYXJwZXQgd2FzIG1pc3NpbmcsIG5vdCByb3VnZS4gKCMyNDY0KQogICogSWdub3JlICphbGwqIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyB0aGF0IG1lcml0IGl0IG9uIGF1dG8tZ2VuZXJhdGlvbiAoIzI0NTkpCiAgKiBCZWZvcmUgY29weWluZyBmaWxlLCBleHBsaWNpdGx5IHJlbW92ZSB0aGUgb2xkIG9uZSAoIzI1MzUpCiAgKiBNZXJnZSBmaWxlIHN5c3RlbSBjYXRlZ29yaWVzIHdpdGggY2F0ZWdvcmllcyBmcm9tIFlBTUwuICgjMjUzMSkKICAqIERlZXAgbWVyZ2UgZnJvbnQgbWF0dGVyIGRlZmF1bHRzICgjMjQ5MCkKICAqIEVuc3VyZSBleGNsdWRlIGFuZCBpbmNsdWRlIGFycmF5cyBhcmUgYXJyYXlzIG9mIHN0cmluZ3MgKCMyNTQyKQogICogQWxsb3cgY29sbGVjdGlvbnMgdG8gaGF2ZSBkb3RzIGluIHRoZWlyIGZpbGVuYW1lcyAoIzI1NTIpCiAgKiBDb2xsZWN0aW9ucyBzaG91bGRuJ3QgdHJ5IHRvIHJlYWQgaW4gZGlyZWN0b3JpZXMgYXMgZmlsZXMgKCMyNTUyKQogICogQmUgcXVpZXQgdmVyeSBxdWlja2x5LiAoIzI1MjApCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBUZXN0IFJ1YnkgMi4xLjIgaW5zdGVhZCBvZiAyLjEuMSAoIzIzNzQpCiAgKiBBZGQgdGVzdCBmb3Igc29ydGluZyBVVEYtOCBjaGFyYWN0ZXJzICgjMjM4NCkKICAqIFVzZSBgaHR0cHNgIGZvciBHaXRIdWIgbGlua3MgaW4gZG9jdW1lbnRhdGlvbiAoIzI0NzApCiAgKiBSZW1vdmUgY292ZXJhZ2UgcmVwb3J0aW5nIHdpdGggQ292ZXJhbGxzICgjMjQ5NCkKICAqIEZpeCBhIGJpdCBvZiBtaXNzaW5nIFRvbURvYyB0byBgSmVreWxsOjpDb21tYW5kczo6QnVpbGQjYnVpbGRgICgjMjU1NCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIFNldCBgdGltZXpvbmVgIHRvIGBBbWVyaWNhL0xvc19BbmdlbGVzYCAoIzIzOTQpCiAgKiBJbXByb3ZlIEphdmFTY3JpcHQgaW4gYGFuY2hvcl9saW5rcy5odG1sYCAoIzIzNjgpCiAgKiBSZW1vdmUgbm90ZSBvbiBRdWlja3N0YXJ0IHBhZ2UgYWJvdXQgZGVmYXVsdCBtYXJrZG93biBjb252ZXJ0ZXIgKCMyMzg3KQogICogUmVtb3ZlIGJyb2tlbiBsaW5rIGluIGV4dHJhcy5tZCB0byBhIE1hcnVrdSBmb3JrICgjMjQwMSkKICAqIFVwZGF0ZSBGb250IEF3ZXNvbWUgdG8gdjQuMS4wLiAoIzI0MTApCiAgKiBGaXggYnJva2VuIGxpbmsgb24gSW5zdGFsbGF0aW9uIHBhZ2UgdG8gVGVtcGxhdGVzIHBhZ2UgKCMyNDIxKQogICogUHJldmVudCB0YWJsZSBmcm9tIGV4dGVuZGluZyBwYXJlbnQgd2lkdGggaW4gcGVybWFsaW5rIHN0eWxlIHRhYmxlICgjMjQyNCkKICAqIEFkZCBjb2xsZWN0aW9ucyB0byBpbmZvIGFib3V0IHBhZ2luYXRpb24gc3VwcG9ydCAoIzIzODkpCiAgKiBBZGQgYGpla3lsbF9naXRodWJfc2FtcGxlYCBwbHVnaW4gdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjQ2MykKICAqIENsYXJpZnkgZG9jdW1lbnRhdGlvbiBhcm91bmQgZnJvbnQgbWF0dGVyIGRlZmF1bHRzIGFuZCBhZGQgZGV0YWlscyBhYm91dCBkZWZhdWx0cyBmb3IgY29sbGVjdGlvbnMuICgjMjQzOSkKICAqIEFkZCBKZWt5bGwgUHJvamVjdCBWZXJzaW9uIFRhZyB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNDY4KQogICogVXNlIGBodHRwc2AgZm9yIEdpdEh1YiBsaW5rcyBhY3Jvc3Mgd2hvbGUgc2l0ZSAoIzI0NzApCiAgKiBBZGQgU3RpY2tlck11bGUgKyBKZWt5bGwgcG9zdCAoIzI0NzYpCiAgKiBBZGQgSmVreWxsIEFzc2V0IFBpcGVsaW5lIFJlYm9ybiB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNDc5KQogICogQWRkIGxpbmsgdG8gamVreWxsLWNvbXByZXNzLWh0bWwgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjUxNCkKICAqIEFkZCBQaXdpZ28gR2FsbGVyeSB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyNTI2KQogICogU2V0IGBzaG93X2RyYWZ0c2AgdG8gYGZhbHNlYCBpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbGlzdGluZyAoIzI1MzYpCiAgKiBQcm92aWRlIGFuIHVwZGF0ZWQgbGluayBmb3IgV2luZG93cyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zICgjMjU0NCkKICAqIFJlbW92ZSBgdXJsYCBmcm9tIGNvbmZpZ3VyYXRpb24gZG9jcyAoIzI1NDcpCiAgKiBEb2N1bWVudGF0aW9uIGZvciBDb250aW51b3VzIEludGVncmF0aW9uIGZvciB5b3VyIEpla3lsbCBTaXRlICgjMjQzMikKCiMjIDIuMC4zIC8gMjAxNC0wNS0wOAoKIyMjIEJ1ZyBGaXhlcwoKICAqIFByb3Blcmx5IHByZWZpeCBsaW5rcyBpbiBzaXRlIHRlbXBsYXRlIHdpdGggVVJMIG9yIGJhc2V1cmwgZGVwZW5kaW5nIHVwb24gbmVlZC4gKCMyMzE5KQogICogVXBkYXRlIGdpc3QgdGFnIGNvbW1lbnRzIGFuZCBlcnJvciBtZXNzYWdlIHRvIHJlcXVpcmUgdXNlcm5hbWUgKCMyMzI2KQogICogRml4IGBwZXJtYWxpbmtgIHNldHRpbmcgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzIzMzEpCiAgKiBEb24ndCBmYWlsIGlmIGFueSBvZiB0aGUgcGF0aCBvYmplY3RzIGFyZSBuaWwgKCMyMzI1KQogICogSW5zdGFudGlhdGUgYWxsIGRlc2NlbmRhbnRzIGZvciBjb252ZXJ0ZXJzIGFuZCBnZW5lcmF0b3JzLCBub3QganVzdCBkaXJlY3Qgc3ViY2xhc3NlcyAoIzIzMzQpCiAgKiBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgYHNpdGUubmFtZWAgd2l0aCBgc2l0ZS50aXRsZWAgaW4gc2l0ZSB0ZW1wbGF0ZSAoIzIzMjQpCiAgKiBgSmVreWxsOjpGaWx0ZXJzI3RpbWVgIG5vdyBhY2NlcHRzIFVOSVggdGltZXN0YW1wcyBpbiBzdHJpbmcgb3IgbnVtYmVyIGZvcm0gKCMyMzM5KQogICogVXNlIGBpdGVtX3Byb3BlcnR5YCBmb3IgYHdoZXJlYCBmaWx0ZXIgc28gaXQgZG9lc24ndCBicmVhayBvbiBjb2xsZWN0aW9ucyAoIzIzNTkpCiAgKiBSZXNjdWUgZXJyb3JzIHRocm93biBzbyBgLS13YXRjaGAgZG9lc24ndCBmYWlsICgjMjM2NCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIEFkZCBtaXNzaW5nICJhcyIgdG8gYXNzZXRzIGRvY3MgcGFnZSAoIzIzMzcpCiAgKiBVcGRhdGUgZG9jcyB0byByZWZsZWN0IG5ldyBgYmFzZXVybGAgZGVmYXVsdCAoIzIzNDEpCiAgKiBBZGQgbGlua3MgdG8gaGVhZGVycyB3aG8gaGF2ZSBhbiBJRC4gKCMyMzQyKQogICogVXNlIHN5bWJvbCBpbnN0ZWFkIG9mIEhUTUwgbnVtYmVyIGluIGB1cGdyYWRpbmcubWRgICgjMjM1MSkKICAqIEZpeCBsaW5rIHRvIGZyb250IG1hdHRlciBkZWZhdWx0cyBkb2NzICgjMjM1MykKICAqIEZpeCBmb3IgYEhpc3RvcnkubWFya2Rvd25gIGluIG9yZGVyIHRvIGZpeCBoaXN0b3J5IHBhZ2UgaW4gZG9jcyAoIzIzNjMpCgojIyAyLjAuMiAvIDIwMTQtMDUtMDcKCiMjIyBCdWcgRml4ZXMKCiAgKiBDb3JyZWN0IHVzZSBvZiBgdXJsYCBhbmQgYGJhc2V1cmxgIGluIHRoZSBzaXRlIHRlbXBsYXRlLiAoIzIzMTcpCiAgKiBEZWZhdWx0IGBiYXNldXJsYCB0byBgIiJgICgjMjMxNykKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIENvcnJlY3QgZG9jcyBmb3IgdGhlIGBnaXN0YCBwbHVnaW4gc28gaXQgYWx3YXlzIGluY2x1ZGVzIHRoZSB1c2VybmFtZS4gKCMyMzE0KQogICogQ2xhcmlmeSBuZXcgKGRlZmF1bHRzLCBgd2hlcmVgIGZpbHRlcikgZmVhdHVyZXMgaW4gZG9jcyAoIzIzMTYpCgojIyAyLjAuMSAvIDIwMTQtMDUtMDYKCiMjIyBCdWcgRml4ZXMKCiAgKiBSZXF1aXJlIGBrcmFtZG93bmAgZ2VtIGluc3RlYWQgb2YgYG1hcnVrdWAgZ2VtCgojIyAyLjAuMCAvIDIwMTQtMDUtMDYKCiMjIyBNYWpvciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgIkNvbGxlY3Rpb25zIiBmZWF0dXJlICgjMjE5OSkKICAqIEFkZCBnZW0tYmFzZWQgcGx1Z2luIHdoaXRlbGlzdCB0byBzYWZlIG1vZGUgKCMxNjU3KQogICogUmVwbGFjZSB0aGUgY29tbWFuZGVyIGNvbW1hbmQgbGluZSBwYXJzZXIgd2l0aCBhIG1vcmUgcm9idXN0IHNvbHV0aW9uIGZvciBvdXIgbmVlZHMgY2FsbGVkIGBtZXJjZW5hcnlgICgjMTcwNikKICAqIFJlbW92ZSBzdXBwb3J0IGZvciBSdWJ5IDEuOC54ICgjMTc4MCkKICAqIE1vdmUgdG8gamVreWxsL2pla3lsbCBmcm9tIG1vam9tYm8vamVreWxsICgjMTgxNykKICAqIEFsbG93IGN1c3RvbSBtYXJrZG93biBwcm9jZXNzb3JzICgjMTg3MikKICAqIFByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIFJvdWdlIHN5bnRheCBoaWdobGlnaHRlciAoIzE4NTkpCiAgKiBQcm92aWRlIHN1cHBvcnQgZm9yIFNhc3MgKCMxOTMyKQogICogUHJvdmlkZSBhIDMwMCUgaW1wcm92ZW1lbnQgd2hlbiBnZW5lcmF0aW5nIHNpdGVzIHRoYXQgdXNlIGBQb3N0I25leHRgIG9yIGBQb3N0I3ByZXZpb3VzYCAoIzE5ODMpCiAgKiBQcm92aWRlIHN1cHBvcnQgZm9yIENvZmZlZVNjcmlwdCAoIzE5OTEpCiAgKiBSZXBsYWNlIE1hcnVrdSB3aXRoIEtyYW1kb3duIGFzIERlZmF1bHQgTWFya2Rvd24gUHJvY2Vzc29yICgjMTk4OCkKICAqIEV4cG9zZSBgc2l0ZS5zdGF0aWNfZmlsZXNgIHRvIExpcXVpZCAoIzIwNzUpCiAgKiBDb21wbGV0ZSByZWRlc2lnbiBvZiB0aGUgdGVtcGxhdGUgc2l0ZSBnZW5lcmF0ZWQgYnkgYGpla3lsbCBuZXdgICgjMjA1MCkKICAqIFVwZGF0ZSBMaXN0ZW4gZnJvbSAxLnggdG8gMi54ICgjMjA5NykKICAqIEZyb250IG1hdHRlciBkZWZhdWx0cyAoIzIyMDUpCiAgKiBEZXByZWNhdGUgYHJlbGF0aXZlX3Blcm1hbGlua3NgIGNvbmZpZ3VyYXRpb24gb3B0aW9uIChkZWZhdWx0IHRvIGBmYWxzZWApICgjMjMwNykKICAqIEV4Y2x1ZGUgZmlsZXMgYmFzZWQgb24gcHJlZml4IGFzIHdlbGwgYXMgYGZubWF0Y2g/YCAoIzIzMDMpCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogTW92ZSB0aGUgRW50cnlGaWx0ZXIgY2xhc3MgaW50byB0aGUgSmVreWxsIG1vZHVsZSB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UgKCMxODAwKQogICogQWRkIGBncm91cF9ieWAgTGlxdWlkIGZpbHRlciBjcmVhdGUgbGlzdHMgb2YgaXRlbXMgZ3JvdXBlZCBieSBhIGNvbW1vbiBwcm9wZXJ0eSdzIHZhbHVlICgjMTc4OCkKICAqIEFkZCBzdXBwb3J0IGZvciBNYXJ1a3UncyBgZmVuY2VkX2NvZGVfYmxvY2tzYCBvcHRpb24gKCMxNzk5KQogICogVXBkYXRlIFJlZGNhcnBldCBkZXBlbmRlbmN5IHRvIH4+IDMuMCAoIzE4MTUpCiAgKiBBdXRvbWF0aWNhbGx5IHNvcnQgYWxsIHBhZ2VzIGJ5IG5hbWUgKCMxODQ4KQogICogQmV0dGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aW1lIGlzIG5vdCBwYXJzZWFibGUgKCMxODQ3KQogICogQWxsb3cgYGluY2x1ZGVgIHRhZyB2YXJpYWJsZSBhcmd1bWVudHMgdG8gdXNlIGZpbHRlcnMgKCMxODQxKQogICogYHBvc3RfdXJsYCB0YWcgc2hvdWxkIHJhaXNlIGBBcmd1bWVudEVycm9yYCBmb3IgaW52YWxpZCBuYW1lICgjMTgyNSkKICAqIEJ1bXAgZGVwZW5kZW5jeSBgbWVyY2VuYXJ5YCB0byBgfj4gMC4yLjBgICgjMTg3OSkKICAqIEJ1bXAgZGVwZW5kZW5jeSBgc2FmZV95YW1sYCB0byBgfj4gMS4wYCAoIzE4ODYpCiAgKiBBbGxvdyBzb3J0aW5nIG9mIGNvbnRlbnQgYnkgY3VzdG9tIHByb3BlcnRpZXMgKCMxODQ5KQogICogQWRkIGAtLXF1aWV0YCBmbGFnIHRvIHNpbGVuY2Ugb3V0cHV0IGR1cmluZyBidWlsZCBhbmQgc2VydmUgKCMxODk4KQogICogQWRkIGEgYHdoZXJlYCBmaWx0ZXIgdG8gZmlsdGVyIGFycmF5cyBiYXNlZCBvbiBhIGtleS92YWx1ZSBwYWlyICgjMTg3NSkKICAqIFJvdXRlIDQwNCBlcnJvcnMgdG8gYSBjdXN0b20gNDA0IHBhZ2UgaW4gZGV2ZWxvcG1lbnQgKCMxODk5KQogICogRXhjbHVkZXMgYXJlIG5vdyByZWxhdGl2ZSB0byB0aGUgc2l0ZSBzb3VyY2UgKCMxOTE2KQogICogQnJpbmcgTUlNRSBUeXBlcyBmaWxlIGZvciBgamVreWxsIHNlcnZlYCB0byBjb21wbGV0ZSBwYXJpdHkgd2l0aCBHSCBQYWdlcyBzZXJ2ZXJzICgjMTk5MykKICAqIEFkZGluZyBCcmVha3BvaW50IHRvIG1ha2UgbmV3IHNpdGUgdGVtcGxhdGUgbW9yZSByZXNwb25zaXZlICgjMjAzOCkKICAqIERlZmF1bHQgdG8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nIHdoZW4gcmVhZGluZyBmaWxlcy4gKCMyMDMxKQogICogVXBkYXRlIFJlZGNhcnBldCBkZXBlbmRlbmN5IHRvIH4+IDMuMSAoIzIwNDQpCiAgKiBSZW1vdmUgc3VwcG9ydCBmb3IgUnVieSAxLjkuMiAoIzIwNDUpCiAgKiBBZGQgYC5ta2Rvd25gIGFzIHZhbGlkIE1hcmtkb3duIGV4dGVuc2lvbiAoIzIwNDgpCiAgKiBBZGQgYGluZGV4LnhtbGAgdG8gdGhlIGxpc3Qgb2YgV0VCcmljayBkaXJlY3RvcnkgaW5kZXggZmlsZXMgKCMyMDQxKQogICogTWFrZSB0aGUgYGxheW91dHNgIGNvbmZpZyBrZXkgcmVsYXRpdmUgdG8gQ1dEIG9yIHRvIHNvdXJjZSAoIzIwNTgpCiAgKiBVcGRhdGUgS3JhbWRvd24gdG8gYH4+IDEuM2AgKCMxODk0KQogICogUmVtb3ZlIHVubmVjZXNzYXJ5IHJlZmVyZW5jZXMgdG8gYHNlbGZgICgjMjA5MCkKICAqIFVwZGF0ZSB0byBNZXJjZW5hcnkgdjAuMy54ICgjMjA4NSkKICAqIFNoaXAgU2FzcyBzdXBwb3J0IGFzIGEgc2VwYXJhdGUgZ2VtICgjMjA5OCkKICAqIEV4dHJhY3QgY29yZSBleHRlbnNpb25zIGludG8gYSBVdGlscyBtb2R1bGUgKCMyMTEyKQogICogUmVmYWN0b3IgQ0xJICYgQ29tbWFuZHMgRm9yIEdyZWF0ZXIgSGFwcGluZXNzICgjMjE0MykKICAqIFByb3ZpZGUgdXNlZnVsIGVycm9yIHdoZW4gUHlnbWVudHMgcmV0dXJucyBgbmlsYCBhbmQgZXJyb3Igb3V0ICgjMjE0OCkKICAqIEFkZCBzdXBwb3J0IGZvciB1bnB1Ymxpc2hlZCBkcmFmdHMgKCMyMTY0KQogICogQWRkIGBmb3JjZV9wb2xsaW5nYCBvcHRpb24gdG8gdGhlIGBzZXJ2ZWAgY29tbWFuZCAoIzIxNjUpCiAgKiBDbGVhbiB1cCB0aGUgYDxoZWFkPmAgaW4gdGhlIHNpdGUgdGVtcGxhdGUgKCMyMTg2KQogICogUGVybWl0IFlBTUwgYmxvY2tzIHRvIGVuZCB3aXRoIHRocmVlIGRvdHMgdG8gYmV0dGVyIGNvbmZvcm0gd2l0aCB0aGUgWUFNTCBzcGVjICgjMjExMCkKICAqIFVzZSBgRmlsZS5leGlzdD9gIGluc3RlYWQgb2YgZGVwcmVjYXRlZCBgRmlsZS5leGlzdHM/YCAoIzIyMTQpCiAgKiBSZXF1aXJlIG5ld2xpbmUgYWZ0ZXIgc3RhcnQgb2YgWUFNTCBGcm9udCBNYXR0ZXIgaGVhZGVyICgjMjIxMSkKICAqIEFkZCB0aGUgYWJpbGl0eSBmb3IgcGFnZXMgdG8gYmUgbWFya2VkIGFzIGBwdWJsaXNoZWQ6IGZhbHNlYCAoIzE0OTIpCiAgKiBBZGQgYEpla3lsbDo6TGlxdWlkRXh0ZW5zaW9uc2Agd2l0aCBgLmxvb2t1cF92YXJpYWJsZWAgbWV0aG9kIGZvciBlYXN5IGxvb2tpbmcgdXAgb2YgdmFyaWFibGUgdmFsdWVzIGluIGEgTGlxdWlkIGNvbnRleHQuICgjMjI1MykKICAqIFJlbW92ZSBsaXRlcmFsIGxhbmcgbmFtZSBmcm9tIGNsYXNzICgjMjI5MikKICAqIFJldHVybiBgdXRmLThgIGVuY29kaW5nIGluIGhlYWRlciBmb3Igd2VicmljayBlcnJvciBwYWdlIHJlc3BvbnNlICgjMjI4OSkKICAqIE1ha2UgdGVtcGxhdGUgc2l0ZSBlYXNpZXIgdG8gY3VzdG9taXplICgjMjI2OCkKICAqIEFkZCB0d28tZGlnaXQgeWVhciB0byBwZXJtYWxpbmsgdGVtcGxhdGUgb3B0aW9uICgjMjMwMSkKICAqIEFkZCBgc2l0ZS5kb2N1bWVudHNgIHRvIExpcXVpZCBwYXlsb2FkIChsaXN0IG9mIGFsbCBkb2NzKSAoIzIyOTUpCiAgKiBUYWtlIGludG8gYWNjb3VudCBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgTGlxdWlkIHNvcnQgZmlsdGVyICgjMjI5OSkKCiMjIyBCdWcgRml4ZXMKCiAgKiBEb24ndCBhbGxvdyBuaWwgZW50cmllcyB3aGVuIGxvYWRpbmcgcG9zdHMgKCMxNzk2KQogICogUmVtb3ZlIHRoZSBzY3JvbGxiYXIgdGhhdCdzIGFsd2F5cyBkaXNwbGF5ZWQgaW4gbmV3IHNpdGVzIGdlbmVyYXRlZCBmcm9tIHRoZSBzaXRlIHRlbXBsYXRlICgjMTgwNSkKICAqIEFkZCBgI3BhdGhgIHRvIHJlcXVpcmVkIG1ldGhvZHMgaW4gYEpla3lsbDo6Q29udmVydGlibGVgICgjMTg2NikKICAqIERlZmF1bHQgTWFydWt1IGZlbmNlZCBjb2RlIGJsb2NrcyB0byBPTiBmb3IgMi4wLjAtZGV2ICgjMTgzMSkKICAqIENoYW5nZSBzaG9ydCBvcHRzIGZvciBob3N0IGFuZCBwb3J0IGZvciBgamVreWxsIGRvY3NgIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBzdWJjb21tYW5kcyAoIzE4NzcpCiAgKiBGaXggdHlwb3MgKCMxOTEwKQogICogTG9jayBNYXJ1a3UgYXQgMC43LjAgdG8gcHJldmVudCBidWdzIGNhdXNlZCBieSBNYXJ1a3UgMC43LjEgKCMxOTU4KQogICogRml4ZXMgZnVsbCBwYXRoIGxlYWsgdG8gc291cmNlIGRpcmVjdG9yeSB3aGVuIHVzaW5nIGluY2x1ZGUgdGFnICgjMTk1MSkKICAqIERvbid0IGdlbmVyYXRlIHBhZ2VzIHRoYXQgYXJlbid0IGJlaW5nIHB1Ymxpc2hlZCAoIzE5MzEpCiAgKiBVc2UgYFNhZmVZQU1MLmxvYWRgIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHByb2plY3RzICgjMTk4MikKICAqIFJlbGF0aXZlIHBvc3RzIHNob3VsZCBuZXZlciBmYWlsIHRvIGJ1aWxkICgjMTk3NikKICAqIFJlbW92ZSBleGVjdXRhYmxlIGJpdHMgb2Ygbm9uIGV4ZWN1dGFibGUgZmlsZXMgKCMyMDU2KQogICogYCNwYXRoYCBmb3IgYSBkcmFmdCBpcyBub3cgYF9kcmFmdHNgIGluc3RlYWQgb2YgYF9wb3N0c2AgKCMyMDQyKQogICogUGF0Y2ggYSBjb3VwbGUgc2hvdy1zdG9wcGluZyBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgKCMxOTQ2KQogICogU2FuaXRpemUgcGF0aHMgdW5pZm9ybWx5LCBpbiBhIFdpbmRvd3MtZnJpZW5kbHkgd2F5ICgjMjA2NSwgIzIxMDkpCiAgKiBVcGRhdGUgZ2VtIGJ1aWxkIHN0ZXBzIHRvIHdvcmsgY29ycmVjdGx5IG9uIFdpbmRvd3MgKCMyMTE4KQogICogUmVtb3ZlIG9ic29sZXRlIGBub3JtYWxpemVfb3B0aW9uc2AgbWV0aG9kIGNhbGwgZnJvbSBgYmluL2pla3lsbGAgKCMyMTIxKS4KICAqIFJlbW92ZSBgK2AgY2hhcmFjdGVycyBmcm9tIFB5Z21lbnRzIGxleGVyIG5hbWVzIHdoZW4gYWRkaW5nIGFzIGEgQ1NTIGNsYXNzICgjOTk0KQogICogUmVtb3ZlIHNvbWUgY29kZSB0aGF0IGNhdXNlZCBSdWJ5IGludGVycHJldGVyIHdhcm5pbmdzICgjMjE3OCkKICAqIE9ubHkgc3RyaXAgdGhlIGRyaXZlIG5hbWUgaWYgaXQgYmVnaW5zIHRoZSBzdHJpbmcgKCMyMTc1KQogICogUmVtb3ZlIGRlZmF1bHQgcG9zdCB3aXRoIGludmFsaWQgZGF0ZSBmcm9tIHNpdGUgdGVtcGxhdGUgKCMyMjAwKQogICogRml4IGBQb3N0I3VybGAgYW5kIGBQYWdlI3VybGAgZXNjYXBlICgjMTU2OCkKICAqIFN0cmlwIG5ld2xpbmVzIGZyb20gdGhlIGB7JSBoaWdobGlnaHQgJX1gIGJsb2NrIGNvbnRlbnQgKCMxODIzKQogICogTG9hZCBpbiBgcm91Z2VgIG9ubHkgd2hlbiBpdCdzIGJlZW4gcmVxdWVzdGVkIGFzIHRoZSBoaWdobGlnaHRlciAoIzIxODkpCiAgKiBDb252ZXJ0IGlucHV0IHRvIHN0cmluZyBiZWZvcmUgWE1MIGVzY2FwaW5nIChgeG1sX2VzY2FwZWAgbGlxdWlkIGZpbHRlcikgKCMyMjQ0KQogICogTW9kaWZ5IGNvbmZpZ3VyYXRpb24ga2V5IGZvciBDb2xsZWN0aW9ucyBhbmQgcmVzZXQgcHJvcGVybHkuICgjMjIzOCkKICAqIEF2b2lkIGR1cGxpY2F0ZWQgb3V0cHV0IHVzaW5nIGBoaWdobGlnaHRgIHRhZyAoIzIyNjQpCiAgKiBPbmx5IHVzZSBKZWt5bGwubG9nZ2VyIGZvciBvdXRwdXQgKCMyMzA3KQogICogQ2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgaGFzX3lhbWxfaGVhZGVyP2AgKCMyMzEwKQogICogQWRkIGBvdXRwdXRgIHRvIGBEb2N1bWVudGAgbGlxdWlkIG91dHB1dCBoYXNoICgjMjMwOSkKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEFkZCBhIGxpbmsgdG8gdGhlIHNpdGUgaW4gdGhlIFJFQURNRS5tZCBmaWxlICgjMTc5NSkKICAqIEFkZCBpbiBIaXN0b3J5IGFuZCBzaXRlIGNoYW5nZXMgZnJvbSBgdjEtc3RhYmxlYCBicmFuY2ggKCMxODM2KQogICogVGVzdGluZyBhZGRpdGlvbnMgb24gdGhlIEV4Y2VycHQgY2xhc3MgKCMxODkzKQogICogRml4IHRoZSBgaGlnaGxpZ2h0YCB0YWcgZmVhdHVyZSAoIzE4NTkpCiAgKiBUZXN0IEpla3lsbCB1bmRlciBSdWJ5IDIuMS4wICgjMTkwMCkKICAqIEFkZCBzY3JpcHQvY2lidWlsZCBmb3IgZnVuIGFuZCBwcm9maXQgKCMxOTEyKQogICogVXNlIGBGb3J3YXJkYWJsZWAgZm9yIGRlbGVnYXRpb24gYmV0d2VlbiBgRXhjZXJwdGAgYW5kIGBQb3N0YCAoIzE5MjcpCiAgKiBSZW5hbWUgYHJlYWRfdGhpbmdzYCB0byBgcmVhZF9jb250ZW50YCAoIzE5MjgpCiAgKiBBZGQgYHNjcmlwdC9icmFuZGluZ2Agc2NyaXB0IGZvciBBU0NJSSBhcnQgbG92aW4nICgjMTkzNikKICAqIFVwZGF0ZSB0aGUgUkVBRE1FIHRvIHJlZmxlY3QgdGhlIHJlcG8gbW92ZSAoIzE5NDMpCiAgKiBBZGQgdGhlIHByb2plY3QgdmlzaW9uIHRvIHRoZSBSRUFETUUgKCMxOTM1KQogICogU3BlZWQgdXAgVHJhdmlzIENJIGJ1aWxkcyBieSB1c2luZyBSZWJ1bmQgKCMxOTg1KQogICogVXNlIFlhcnAgYXMgYSBHZW0gcHJveHkgZm9yIFRyYXZpcyBDSSAoIzE5ODQpCiAgKiBSZW1vdmUgWWFycCBhcyBhIEdlbSBwcm94eSBmb3IgVHJhdmlzIENJICgjMjAwNCkKICAqIE1vdmUgdGhlIHJlYWRpbmcgb2YgbGF5b3V0cyBpbnRvIGl0cyBvd24gY2xhc3MgKCMyMDIwKQogICogVGVzdCBTYXNzIGltcG9ydCAoIzIwMDkpCiAgKiBTd2l0Y2ggTWFydWt1IGFuZCBLcmFtZG93biBpbiBsaXN0cyBvZiBSdW50aW1lIHZzLiBEZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMgKCMyMDQ5KQogICogQ2xlYW4gdXAgdGhlIGdlbXNwZWMgZm9yIHRoZSBwcm9qZWN0ICgjMjA5NSkKICAqIEFkZCBKYXBhbmVzZSB0cmFuc2xhdGlvbiBvZiBSRUFETUUgYW5kIENPTlRSSUJVVElORyBkb2NzLiAoIzIwODEpCiAgKiBSZS1hbGlnbiB0aGUgdGFibGVzIGluIEN1Y3VtYmVyICgjMjEwOCkKICAqIFRyaW0gdHJhaWxpbmcgc3BhY2VzIGFuZCBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzICgjMjEyMikKICAqIEZpeCB0aGUgZmFpbGluZyBUcmF2aXMgc2NlbmFyaW9zIGR1ZSB0byBDdWN1bWJlciBpc3N1ZXMgKCMyMTU1KQogICogV3JhcCBgYnVuZGxlIGluc3RhbGxgIGluIGB0cmF2aXNfcmV0cnlgIHRvIHJldHJ5IHdoZW4gUnVieUdlbXMgZmFpbHMgKCMyMTYwKQogICogUmVmYWN0b3IgdGFncyBhbmQgY2F0ZWdvcmllcyAoIzE2MzkpCiAgKiBFeHRyYWN0IHBsdWdpbiBtYW5hZ2VtZW50IGludG8gaXRzIG93biBjbGFzcyAoIzIxOTcpCiAgKiBBZGQgbWlzc2luZyB0ZXN0cyBmb3IgYENvbW1hbmRgICgjMjIxNikKICAqIFVwZGF0ZSBgcnJgIGxpbmsgaW4gQ09OVFJJQlVUSU5HIGRvYyAoIzIyNDcpCiAgKiBTdHJlYW1saW5lIEN1Y3VtYmVyIGV4ZWN1dGlvbiBvZiBgamVreWxsYCBzdWJjb21tYW5kcyAoIzIyNTgpCiAgKiBSZWZhY3RvciBgQ29tbWFuZHM6OlNlcnZlYC4gKCMyMjY5KQogICogUmVmYWN0b3IgYGhpZ2hsaWdodGAgdGFnICgjMjE1NCkKICAqIFVwZGF0ZSBgVXRpbGAgaGFzaCBmdW5jdGlvbnMgd2l0aCBsYXRlc3QgZnJvbSBSYWlscyAoIzIyNzMpCiAgKiBXb3JrYXJvdW5kIGZvciBUcmF2aXMgYnVnICgjMjI5MCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIERvY3VtZW50IEtyYW1kb3duJ3MgR0ZNIHBhcnNlciBvcHRpb24gKCMxNzkxKQogICogTW92ZSBDU1MgdG8gaW5jbHVkZXMgJiB1cGRhdGUgbm9ybWFsaXplLmNzcyB0byB2Mi4xLjMgKCMxNzg3KQogICogTWluaWZ5IENTUyBvbmx5IGluIHByb2R1Y3Rpb24gKCMxODAzKQogICogRml4IGJyb2tlbiBsaW5rIHRvIGluc3RhbGxhdGlvbiBvZiBSdWJ5IG9uIE1vdW50YWluIExpb24gYmxvZyBwb3N0IG9uIFRyb3VibGVzaG9vdGluZyBkb2NzIHBhZ2UgKCMxNzk3KQogICogRml4IGlzc3VlcyB3aXRoIDEuNC4xIHJlbGVhc2UgYmxvZyBwb3N0ICgjMTgwNCkKICAqIEFkZCBub3RlIGFib3V0IGRlcGxveWluZyB0byBPcGVuU2hpZnQgKCMxODEyKQogICogQ29sbGVjdCBhbGwgV2luZG93cy1yZWxhdGVkIGRvY3Mgb250byBvbmUgcGFnZSAoIzE4MTgpCiAgKiBGaXhlZCB0eXBvIGluIGRhdGFmaWxlcyBkb2MgcGFnZSAoIzE4NTQpCiAgKiBDbGFyaWZ5IGhvdyB0byBhY2Nlc3MgYHNpdGVgIGluIGRvY3MgKCMxODY0KQogICogQWRkIGNsb3NpbmcgYDxjb2RlPmAgdGFnIHRvIGBjb250ZXh0LnJlZ2lzdGVyc1s6c2l0ZV1gIG5vdGUgKCMxODY3KQogICogRml4IGxpbmsgdG8gQG1vam9tYm8ncyBzaXRlIHNvdXJjZSAoIzE4OTcpCiAgKiBBZGQgYHBhZ2luYXRlOiBuaWxgIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiBkb2NzICgjMTg5NikKICAqIEFkZCBsaW5rIHRvIG91ciBMaWNlbnNlIGluIHRoZSBzaXRlIGZvb3RlciAoIzE4ODkpCiAgKiBBZGQgYSBjaGFyc2V0IG5vdGUgaW4gIldyaXRpbmcgUG9zdHMiIGRvYyBwYWdlICgjMTkwMikKICAqIERpc2FsbG93IHNlbGVjdGlvbiBvZiBwYXRoIGFuZCBwcm9tcHQgaW4gYmFzaCBleGFtcGxlcwogICogQWRkIGpla3lsbC1jb21wYXNzIHRvIHRoZSBwbHVnaW4gbGlzdCAoIzE5MjMpCiAgKiBBZGQgbm90ZSBpbiBQb3N0cyBkb2NzIGFib3V0IHN0cmlwcGluZyBgPHA+YCB0YWdzIGZyb20gZXhjZXJwdCAoIzE5MzMpCiAgKiBBZGQgYWRkaXRpb25hbCBpbmZvIGFib3V0IHRoZSBuZXcgZXhjbHVkZSBiZWhhdmlvciAoIzE5MzgpCiAgKiBMaW5raWZ5ICdhd2Vzb21lIGNvbnRyaWJ1dG9ycycgdG8gcG9pbnQgdG8gdGhlIGNvbnRyaWJ1dG9ycyBncmFwaCBvbiBHaXRIdWIgKCMxOTQwKQogICogVXBkYXRlIGBkb2NzL3NpdGVzLm1kYCBsaW5rIHRvIEdpdEh1YiBUcmFpbmluZyBtYXRlcmlhbHMgKCMxOTQ5KQogICogVXBkYXRlIGBtYXN0ZXJgIHdpdGggdGhlIHJlbGVhc2UgaW5mbyBmcm9tIDEuNC4zICgjMTk0NykKICAqIERlZmluZSBkb2NzIG5hdiBpbiBkYXRhZmlsZSAoIzE5NTMpCiAgKiBDbGFyaWZ5IHRoZSBkb2NzIGFyb3VuZCB0aGUgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHBvc3RzICgjMTk3MSkKICAqIEFkZCBtaXNzaW5nIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBkb2NzIGZvciBwb3N0IGxheW91dHMgYW5kIHRlbXBsYXRlcyAoIzE5NzApCiAgKiBBZGQgbm90ZSB0byBgV3JpdGluZyBwb3N0c2AgcGFnZSBhYm91dCBob3cgdG8gc3RyaXAgaHRtbCBmcm9tIGV4Y2VycHQgKCMxOTYyKQogICogQWRkIGBqZWt5bGwtaHVtYW5pemVgIHBsdWdpbiB0byBwbHVnaW4gbGlzdCAoIzE5OTgpCiAgKiBBZGQgYGpla3lsbC1mb250LWF3ZXNvbWVgIHBsdWdpbiB0byBwbHVnaW4gbGlzdCAoIzE5OTkpCiAgKiBBZGQgYHN1YmxpbWUtamVreWxsYCB0byBsaXN0IG9mIEVkaXRvciBwbHVnaW5zICgjMjAwMSkKICAqIEFkZCBgdmltLWpla3lsbGAgdG8gdGhlIGxpc3Qgb2YgRWRpdG9yIHBsdWdpbnMgKCMyMDA1KQogICogRml4IG5vbi1zZW1hbnRpYyBuZXN0aW5nIG9mIGBwYCB0YWdzIGluIGBuZXdzX2l0ZW1gIGxheW91dCAoIzIwMTMpCiAgKiBEb2N1bWVudCBkZXN0aW5hdGlvbiBmb2xkZXIgY2xlYW5pbmcgKCMyMDE2KQogICogVXBkYXRlZCBpbnN0cnVjdGlvbnMgZm9yIE5lYXJseUZyZWVTcGVlY2guTkVUIGluc3RhbGxhdGlvbiAoIzIwMTUpCiAgKiBVcGRhdGUgbGluayB0byByYWNrLWpla3lsbCBvbiAiRGVwbG95bWVudCBNZXRob2RzIiBwYWdlICgjMjA0NykKICAqIEZpeCB0eXBvIGluIC9kb2NzL2NvbmZpZ3VyYXRpb24gKCMyMDczKQogICogRml4IGNvdW50IGluIGRvY3MgZm9yIGBzaXRlLnN0YXRpY19maWxlc2AgKCMyMDc3KQogICogVXBkYXRlIGNvbmZpZ3VyYXRpb24gZG9jcyB0byBpbmRpY2F0ZSB1dGYtOCBpcyB0aGUgZGVmYXVsdCBmb3IgMi4wLjAgYW5kIEFTQ0lJIGZvciAxLjkuMyAoIzIwNzQpCiAgKiBBZGQgaW5mbyBhYm91dCB1bnJlbGVhc2VkIGZlYXR1cmUgdG8gdGhlIHNpdGUgKCMyMDYxKQogICogQWRkIHdoaXRlc3BhY2UgdG8gbGlxdWlkIGV4YW1wbGUgaW4gR2l0SHViIFBhZ2VzIGRvY3MgKCMyMDg0KQogICogQ2xhcmlmeSB0aGUgd2F5IFNhc3MgYW5kIENvZmZlZVNjcmlwdCBmaWxlcyBhcmUgcmVhZCBpbiBhbmQgb3V0cHV0ICgjMjA2NykKICAqIEFkZCBseWNoZSBnYWxsZXJ5IHRhZyBwbHVnaW4gbGluayB0byBsaXN0IG9mIHBsdWdpbnMgKCMyMDk0KQogICogQWRkIEpla3lsbCBQYWdlcyBEaXJlY3RvcnkgcGx1Z2luIHRvIGxpc3Qgb2YgcGx1Z2lucyAoIzIwOTYpCiAgKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBkb2NzIHBhZ2Ugd2l0aCBuZXcgbWFya2Rvd24gZXh0ZW5zaW9uICgjMjEwMikKICAqIEFkZCBgamVreWxsLWltYWdlLXNldGAgdG8gdGhlIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzIxMDUpCiAgKiBMb3NzbGVzc2x5IGNvbXByZXNzIGltYWdlcyAoIzIxMjgpCiAgKiBVcGRhdGUgbm9ybWFsaXplLmNzcyB0byAzLjAuMCAoIzIxMjYpCiAgKiBVcGRhdGUgbW9kZXJuaXpyIHRvIHYyLjcuMSAoIzIxMjkpCiAgKiBBZGQgYGpla3lsbC1vcmRpbmFsYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyMTUwKQogICogQWRkIGBqZWt5bGxfZmlndXJlYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMyMTU4KQogICogQ2xhcmlmeSB0aGUgZG9jdW1lbnRhdGlvbiBmb3Igc2FmZSBtb2RlICgjMjE2MykKICAqIFNvbWUgSFRNTCB0aWR5aW5nICgjMjEzMCkKICAqIFJlbW92ZSBtb2Rlcm5penIgYW5kIHVzZSBodG1sNXNoaXYuanMgZGlyZWN0bHkgZm9yIElFIGxlc3MgdGhhbiB2OSAoIzIxMzEpCiAgKiBSZW1vdmUgdW51c2VkIGltYWdlcyAoIzIxODcpCiAgKiBVc2UgYGFycmF5X3RvX3NlbnRlbmNlX3N0cmluZ2AgZmlsdGVyIHdoZW4gb3V0cHV0dGluZyBuZXdzIGl0ZW0gY2F0ZWdvcmllcyAoIzIxOTEpCiAgKiBBZGQgbGluayB0byBIZWxwIHJlcG8gaW4gcHJpbWFyeSBuYXZpZ2F0aW9uIGJhciAoIzIxNzcpCiAgKiBTd2l0Y2ggdG8gdXNpbmcgYW4gaWNvIGZpbGUgZm9yIHRoZSBzaG9ydGN1dCBpY29uICgjMjE5MykKICAqIFVzZSBudW1iZXJzIHRvIHNwZWNpZnkgZm9udCB3ZWlnaHRzIGFuZCBvbmx5IGJyaW5nIGluIGZvbnQgd2VpZ2h0cyB1c2VkICgjMjE4NSkKICAqIEFkZCBhIGxpbmsgdG8gdGhlIGxpc3Qgb2YgYWxsIHR6IGRhdGFiYXNlIHRpbWUgem9uZXMgKCMxODI0KQogICogQ2xlYW4tdXAgYW5kIGltcHJvdmUgZG9jdW1lbnRhdGlvbiBgZmVlZC54bWxgICgjMjE5MikKICAqIFJlbW92ZSBkdXBsaWNhdGUgZW50cnkgaW4gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjIwNikKICAqIFJlZHVjZSB0aGUgd2hpdGVzcGFjZSBpbiB0aGUgZmF2aWNvbi4gKCMyMjEzKQogICogQWRkIGBqZWt5bGwtcGFnZS1jb2xsZWN0aW9uc2AgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjIxNSkKICAqIEFkZCBhIGNyb3NzLXJlZmVyZW5jZSBhYm91dCBgcG9zdF91cmxgICgjMjI0MykKICAqIEFkZCBgamVreWxsLWxpdmUtdGlsZXNgIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzIyNTApCiAgKiBGaXhlZCBicm9rZW4gbGluayB0byBHaXRIdWIgdHJhaW5pbmcgbWF0ZXJpYWwgc2l0ZSBzb3VyY2UgKCMyMjU3KQogICogVXBkYXRlIGxpbmsgdG8gaGVscCByZXBvLCBub3cgY2FsbGVkIGBqZWt5bGwtaGVscGAgKCMyMjc3KQogICogRml4IGNhcGl0YWxpemF0aW9uIG9mICdKZWt5bGwnIG9uIERlcGxveW1lbnQgTWV0aG9kcyBwYWdlICgjMjI5MSkKICAqIEluY2x1ZGUgcGx1Z2lucyBieSBzb25ueW0gaW4gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjI5NykKICAqIEFkZCBkZXByZWNhdGVkIGFydGljbGVzIGtlZXBlciBmaWx0ZXIgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMjMwMCkKICAqIFNpbXBsaWZ5IGFuZCBpbXByb3ZlIG91ciBDU1MuICgjMjEyNykKICAqIFVzZSBibGFjayB0ZXh0IGNvbG9yIGZvciB0aGUgbW9iaWxlIG5hdmJhciAoIzIzMDYpCiAgKiBVc2UgdGhlIGJ1aWx0IGluIGRhdGUgZmlsdGVyIGFuZCBgc2l0ZS50aW1lYCBmb3IgdGhlIGNvcHlyaWdodCB5ZWFyLiAoIzIzMDUpCiAgKiBVcGRhdGUgaHRtbDVzaGl2IHRvIHYzLjcuMiAoIzIzMDQpCiAgKiBBZGQgMi4wLjAgcmVsZWFzZSBwb3N0ICgjMjI5OCkKICAqIEFkZCBkb2NzIGZvciBjdXN0b20gbWFya2Rvd24gcHJvY2Vzc29ycyAoIzIyOTgpCiAgKiBBZGQgZG9jcyBmb3IgYHdoZXJlYCBhbmQgYGdyb3VwX2J5YCBMaXF1aWQgZmlsdGVycyAoIzIyOTgpCiAgKiBSZW1vdmUgbm90ZXMgaW4gZG9jcyBmb3IgdW5yZWxlYXNlZCBmZWF0dXJlcyAoIzIzMDkpCgojIyAxLjUuMSAvIDIwMTQtMDMtMjcKCiMjIyBCdWcgRml4ZXMKCiAgKiBPbmx5IHN0cmlwIHRoZSBkcml2ZSBuYW1lIGlmIGl0IGJlZ2lucyB0aGUgc3RyaW5nICgjMjE3NikKCiMjIDEuNS4wIC8gMjAxNC0wMy0yNAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIExvb3NlbiBgc2FmZV95YW1sYCBkZXBlbmRlbmN5IHRvIGB+PiAxLjBgICgjMjE2NykKICAqIEJ1bXAgYHNhZmVfeWFtbGAgZGVwZW5kZW5jeSB0byBgfj4gMS4wLjBgICgjMTk0MikKCiMjIyBCdWcgRml4ZXMKCiAgKiBGaXggaXNzdWUgd2hlcmUgZmlsZXN5c3RlbSB0cmF2ZXJzYWwgcmVzdHJpY3Rpb24gYnJva2UgV2luZG93cyAoIzIxNjcpCiAgKiBMb2NrIGBtYXJ1a3VgIGF0IGAwLjcuMGAgKCMyMTY3KQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogTG9jayBgY3VjdW1iZXJgIGF0IGAxLjMuMTFgICgjMjE2NykKCiMjIDEuNC4zIC8gMjAxNC0wMS0xMwoKIyMjIEJ1ZyBGaXhlcwoKICAqIFBhdGNoIHNob3ctc3RvcHBpbmcgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzICgjMTk0NCkKCiMjIDEuNC4yIC8gMjAxMy0xMi0xNgoKIyMjIEJ1ZyBGaXhlcwoKICAqIFR1cm4gb24gTWFydWt1IGZlbmNlZCBjb2RlIGJsb2NrcyBieSBkZWZhdWx0ICgjMTgzMCkKCiMjIDEuNC4xIC8gMjAxMy0xMi0wOQoKIyMjIEJ1ZyBGaXhlcwoKICAqIERvbid0IGFsbG93IG5pbCBlbnRyaWVzIHdoZW4gbG9hZGluZyBwb3N0cyAoIzE3OTYpCgojIyAxLjQuMCAvIDIwMTMtMTItMDcKCiMjIyBNYWpvciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgc3VwcG9ydCBmb3IgVE9NTCBjb25maWcgZmlsZXMgKCMxNzY1KQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFNvcnQgcGx1Z2lucyBhcyBhIHdheSB0byBlc3RhYmxpc2ggYSBsb2FkIG9yZGVyICgjMTY4MikKICAqIFVwZGF0ZSBNYXJ1a3UgdG8gMC43LjAgKCMxNzc1KQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEFkZCBhIHNwYWNlIGJldHdlZW4gdHdvIHdvcmRzIGluIGEgUGFnaW5hdGlvbiB3YXJuaW5nIG1lc3NhZ2UgKCMxNzY5KQogICogVXBncmFkZSBgdG9tbGAgZ2VtIHRvIGB2MC4xLjBgIHRvIG1haW50YWluIGNvbXBhdCB3aXRoIFJ1YnkgMS44LjcgKCMxNzc4KQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogUmVtb3ZlIHNvbWUgd2hpdGVzcGFjZSBpbiB0aGUgY29kZSAoIzE3NTUpCiAgKiBSZW1vdmUgc29tZSBkdXBsaWNhdGlvbiBpbiB0aGUgcmVhZGluZyBvZiBwb3N0cyBhbmQgZHJhZnRzICgjMTc3OSkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIEZpeGVkIGNhc2Ugb2YgYSB3b3JkIGluIHRoZSBKZWt5bGwgdjEuMy4wIHJlbGVhc2UgcG9zdCAoIzE3NjIpCiAgKiBGaXhlZCB0aGUgbWltZSB0eXBlIGZvciB0aGUgZmF2aWNvbiAoIzE3NzIpCgojIyAxLjMuMSAvIDIwMTMtMTEtMjYKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgYSBgLS1wcmVmaXhgIG9wdGlvbiB0byBwYXNzdGhyb3VnaCBmb3IgdGhlIGltcG9ydGVycyAoIzE2NjkpCiAgKiBQdXNoIHRoZSBwYWdpbmF0b3IgcGx1Z2luIGxvd2VyIGluIHRoZSBwbHVnaW4gcHJpb3JpdHkgb3JkZXIgc28gb3RoZXIgcGx1Z2lucyBydW4gYmVmb3JlIGl0ICgjMTc1OSkKCiMjIyBCdWcgRml4ZXMKCiAgKiBGaXggdGhlIGluY2x1ZGUgdGFnIHdoZW4gcmFuIGluIGEgbG9vcCAoIzE3MjYpCiAgKiBGaXggZXJyb3JzIHdoZW4gdXNpbmcgYC0td2F0Y2hgIG9uIDEuOC43ICgjMTczMCkKICAqIFNwZWNpZnkgd2hlcmUgdGhlIGluY2x1ZGUgaXMgY2FsbGVkIGZyb20gaWYgYW4gaW5jbHVkZWQgZmlsZSBpcyBtaXNzaW5nICgjMTc0NikKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEV4dHJhY3QgYFNpdGUjZmlsdGVyX2VudHJpZXNgIGludG8gaXRzIG93biBvYmplY3QgKCMxNjk3KQogICogRW5hYmxlIFRyYXZpcycgYnVuZGxlIGNhY2hpbmcgKCMxNzM0KQogICogUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gc29tZSBmaWxlcyAoIzE3MzYpCiAgKiBGaXggYSBkdXBsaWNhdGUgdGVzdCBuYW1lICgjMTc1NCkKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIFVwZGF0ZSBsaW5rIHRvIGV4YW1wbGUgUmFrZWZpbGUgdG8gcG9pbnQgdG8gc3BlY2lmaWMgY29tbWl0ICgjMTc0MSkKICAqIEZpeCBkcmFmdHMgZG9jcyB0byBpbmRpY2F0ZSB0aGF0IGRyYWZ0IHRpbWUgaXMgYmFzZWQgb24gZmlsZSBtb2RpZmljYXRpb24gdGltZSwgbm90IGBUaW1lLm5vd2AgKCMxNjk1KQogICogQWRkIGBqZWt5bGwtbW9udGhseS1hcmNoaXZlLXBsdWdpbmAgYW5kIGBqZWt5bGwtY2F0ZWdvcnktYXJjaGl2ZS1wbHVnaW5gIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucyAoIzE2OTMpCiAgKiBBZGQgYGpla3lsbC1hc3NldC1wYXRoLXBsdWdpbmAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMTY3MCkKICAqIEFkZCBgZW1vamktZm9yLWpla3lsbGAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0IHBsdWdpbnMgKCMxNzA4KQogICogRml4IHByZXZpb3VzIHNlY3Rpb24gbGluayBvbiBwbHVnaW5zIHBhZ2UgdG8gcG9pbnQgdG8gcGFnaW5hdGlvbiBwYWdlICgjMTcwNykKICAqIEFkZCBgb3JnLW1vZGVgIGNvbnZlcnRlciBwbHVnaW4gdG8gdGhpcmQtcGFydHkgcGx1Z2lucyAoIzE3MTEpCiAgKiBQb2ludCAiQmxvZyBtaWdyYXRpb25zIiBwYWdlIHRvIGh0dHA6Ly9pbXBvcnQuamVreWxscmIuY29tICgjMTczMikKICAqIEFkZCBkb2NzIGZvciBgcG9zdF91cmxgIHdoZW4gcG9zdHMgYXJlIGluIHN1YmRpcmVjdG9yaWVzICgjMTcxOCkKICAqIFVwZGF0ZSB0aGUgZG9jcyB0byBwb2ludCB0byBgZXhhbXBsZS5jb21gICgjMTQ0OCkKCiMjIDEuMy4wIC8gMjAxMy0xMS0wNAoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIEFkZCBzdXBwb3J0IGZvciBhZGRpbmcgZGF0YSBhcyBZQU1MIGZpbGVzIHVuZGVyIGEgc2l0ZSdzIGBfZGF0YWAgZGlyZWN0b3J5ICgjMTAwMykKICAqIEFsbG93IHZhcmlhYmxlcyB0byBiZSB1c2VkIHdpdGggYGluY2x1ZGVgIHRhZ3MgKCMxNDk1KQogICogQWxsb3cgdXNpbmcgZ2VtcyBmb3IgcGx1Z2luIG1hbmFnZW1lbnQgKCMxNTU3KQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIERlY3JlYXNlIHRoZSBzcGVjaWZpY2l0eSBpbiB0aGUgc2l0ZSB0ZW1wbGF0ZSBDU1MgKCMxNTc0KQogICogQWRkIGBlbmNvZGluZ2AgY29uZmlndXJhdGlvbiBvcHRpb24gKCMxNDQ5KQogICogUHJvdmlkZSBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcgZm9yIEpla3lsbCdzIGN1c3RvbSBMaXF1aWQgdGFncyAoIzE1MTQpCiAgKiBJZiBhbiBpbmNsdWRlZCBmaWxlIGNhdXNlcyBhIExpcXVpZCBlcnJvciwgYWRkIHRoZSBwYXRoIHRvIHRoZSBpbmNsdWRlIGZpbGUgdGhhdCBjYXVzZWQgdGhlIGVycm9yIHRvIHRoZSBlcnJvciBtZXNzYWdlICgjMTU5NikKICAqIElmIGEgbGF5b3V0IGNhdXNlcyBhIExpcXVpZCBlcnJvciwgY2hhbmdlIHRoZSBlcnJvciBtZXNzYWdlIHNvIHRoYXQgd2Uga25vdyBpdCBjb21lcyBmcm9tIHRoZSBsYXlvdXQgKCMxNjAxKQogICogVXBkYXRlIEtyYW1kb3duIGRlcGVuZGVuY3kgdG8gYH4+IDEuMmAgKCMxNjEwKQogICogVXBkYXRlIGBzYWZlX3lhbWxgIGRlcGVuZGVuY3kgdG8gYH4+IDAuOS43YCAoIzE2MDIpCiAgKiBBbGxvdyBsYXlvdXRzIHRvIGJlIGluIHN1YmZvbGRlcnMgbGlrZSBpbmNsdWRlcyAoIzE2MjIpCiAgKiBTd2l0Y2ggdG8gbGlzdGVuIGZvciBzaXRlIHdhdGNoaW5nIHdoaWxlIHNlcnZpbmcgKCMxNTg5KQogICogQWRkIGEgYGpzb25gIGxpcXVpZCBmaWx0ZXIgdG8gYmUgdXNlZCBpbiBzaXRlcyAoIzE2NTEpCiAgKiBQb2ludCBwZW9wbGUgdG8gdGhlIG1pZ3JhdGlvbiBkb2NzIHdoZW4gdGhlIGBqZWt5bGwtaW1wb3J0YCBnZW0gaXMgbWlzc2luZyAoIzE2NjIpCgojIyMgQnVnIEZpeGVzCgogICogRml4IHVwIG1hdGNoaW5nIGFnYWluc3Qgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB3aGVuIHRoZSB0d28gbG9jYXRpb25zIGFyZSBzaW1pbGFyICgjMTU1NikKICAqIEZpeCB0aGUgbWlzc2luZyBgcGF0aG5hbWVgIHJlcXVpcmUgaW4gY2VydGFpbiBjYXNlcyAoIzEyNTUpCiAgKiBVc2UgYCtgIGluc3RlYWQgb2YgYEFycmF5I2NvbmNhdGAgd2hlbiBidWlsZGluZyBgUG9zdGAgYXR0cmlidXRlIGxpc3QgKCMxNTcxKQogICogUHJpbnQgc2VydmVyIGFkZHJlc3Mgd2hlbiBsYXVuY2hpbmcgYSBzZXJ2ZXIgKCMxNTg2KQogICogRG93bmdyYWRlIHRvIE1hcnVrdSBgfj4gMC42LjBgIGluIG9yZGVyIHRvIGF2b2lkIGNoYW5nZXMgaW4gcmVuZGVyaW5nICgjMTU5OCkKICAqIEZpeCBlcnJvciB3aXRoIGZhaWxpbmcgaW5jbHVkZSB0YWcgd2hlbiB2YXJpYWJsZSB3YXMgZmlsZSBuYW1lICgjMTYxMykKICAqIERvd25jYXNlIGxleGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHB5Z21lbnRzICgjMTYxNSkKICAqIENhcGl0YWxpemUgdGhlIHNob3J0IHZlcmJvc2Ugc3dpdGNoIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGggdGhlIGJ1aWx0LWluIENvbW1hbmRlciBzd2l0Y2ggKCMxNjYwKQogICogRml4IGNvbXBhdGliaWxpdHkgd2l0aCAxLjgueCAoIzE2NjUpCiAgKiBGaXggYW4gZXJyb3Igd2l0aCB0aGUgbmV3IGZpbGUgd2F0Y2hpbmcgY29kZSBkdWUgdG8gbGlicmFyeSB2ZXJzaW9uIGluY29tcGF0aWJpbGl0aWVzICgjMTY4NykKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEFkZCBjb3ZlcmFnZSByZXBvcnRpbmcgd2l0aCBDb3ZlcmFsbHMgKCMxNTM5KQogICogUmVmYWN0b3IgdGhlIExpcXVpZCBgaW5jbHVkZWAgdGFnICgjMTQ5MCkKICAqIFVwZGF0ZSBsYXVuY2h5IGRlcGVuZGVuY3kgdG8gYH4+IDIuM2AgKCMxNjA4KQogICogVXBkYXRlIHJyIGRlcGVuZGVuY3kgdG8gYH4+IDEuMWAgKCMxNjA0KQogICogVXBkYXRlIGN1Y3VtYmVyIGRlcGVuZGVuY3kgdG8gYH4+IDEuM2AgKCMxNjA3KQogICogVXBkYXRlIGNvdmVyYWxscyBkZXBlbmRlbmN5IHRvIGB+PiAwLjcuMGAgKCMxNjA2KQogICogVXBkYXRlIHJha2UgZGVwZW5kZW5jeSB0byBgfj4gMTAuMWAgKCMxNjAzKQogICogQ2xlYW4gdXAgYHNpdGUucmJgIGNvbW1lbnRzIHRvIGJlIG1vcmUgY29uY2lzZS91bmlmb3JtICgjMTYxNikKICAqIFVzZSB0aGUgbWFzdGVyIGJyYW5jaCBmb3IgdGhlIGJ1aWxkIGJhZGdlIGluIHRoZSByZWFkbWUgKCMxNjM2KQogICogUmVmYWN0b3IgU2l0ZSNyZW5kZXIgKCMxNjM4KQogICogUmVtb3ZlIGR1cGxpY2F0aW9uIGluIGNvbW1hbmQgbGluZSBvcHRpb25zICgjMTYzNykKICAqIEFkZCB0ZXN0cyBmb3IgYWxsIHRoZSBjb2RlcmF5IG9wdGlvbnMgKCMxNTQzKQogICogSW1wcm92ZSBzb21lIG9mIHRoZSBDdWN1bWJlciB0ZXN0IGNvZGUgKCMxNDkzKQogICogSW1wcm92ZSBjb21wYXJpc29ucyBvZiB0aW1lc3RhbXBzIGJ5IGlnbm9yaW5nIHRoZSBzZWNvbmRzICgjMTU4MikKCiMjIyBTaXRlIEVuaGFuY2VtZW50cwoKICAqIEZpeCBwYXJhbXMgZm9yIGBKZWt5bGxJbXBvcnQ6OldvcmRQcmVzcy5wcm9jZXNzYCBhcmd1bWVudHMgKCMxNTU0KQogICogQWRkIGBqZWt5bGwtc3VnZ2VzdGVkLXR3ZWV0YCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMxNTU1KQogICogTGluayB0byBMaXF1aWQncyBkb2NzIGZvciB0YWdzIGFuZCBmaWx0ZXJzICgjMTU1MykKICAqIEFkZCBub3RlIGFib3V0IGluc3RhbGxpbmcgWGNvZGUgb24gdGhlIE1hYyBpbiB0aGUgSW5zdGFsbGF0aW9uIGRvY3MgKCMxNTYxKQogICogU2ltcGxpZnkvZ2VuZXJhbGl6ZSBwYWdpbmF0aW9uIGRvY3MgKCMxNTc3KQogICogQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoZSBuZXcgZGF0YSBzb3VyY2VzIGZlYXR1cmUgKCMxNTAzKQogICogQWRkIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNyZWF0ZSBnZW5lcmF0b3JzICgjMTU5MCwgIzE1OTIpCiAgKiBJbXByb3ZlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIG1pbWlja2luZyBHaXRIdWIgRmxhdm9yZWQgTWFya2Rvd24gKCMxNjE0KQogICogQWRkIGBqZWt5bGwtaW1wb3J0YCB3YXJuaW5nIG5vdGUgb2YgbWlzc2luZyBkZXBlbmRlbmNpZXMgKCMxNjI2KQogICogRml4IGdyYW1tYXIgaW4gdGhlIFVzYWdlIHNlY3Rpb24gKCMxNjM1KQogICogQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoZSB1c2Ugb2YgZ2VtcyBhcyBwbHVnaW5zICgjMTY1NikKICAqIERvY3VtZW50IHRoZSBleGlzdGVuY2Ugb2YgYSBmZXcgYWRkaXRpb25hbCBwbHVnaW5zICgjMTQwNSkKICAqIERvY3VtZW50IHRoYXQgdGhlIGBkYXRlX3RvX3N0cmluZ2AgYWx3YXlzIHJldHVybnMgYSB0d28gZGlnaXQgZGF5ICgjMTY2MykKICAqIEZpeCBuYXZpZ2F0aW9uIGluIHRoZSAiV29ya2luZyB3aXRoIERyYWZ0cyIgcGFnZSAoIzE2NjcpCiAgKiBGaXggYW4gZXJyb3Igd2l0aCB0aGUgZGF0YSBkb2N1bWVudGF0aW9uICgjMTY5MSkKCiMjIDEuMi4xIC8gMjAxMy0wOS0xNAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFByaW50IGJldHRlciBtZXNzYWdlcyBmb3IgZGV0YWNoZWQgc2VydmVyLiBNdXRlIG91dHB1dCBvbiBkZXRhY2guICgjMTUxOCkKICAqIERpc2FibGUgcmV2ZXJzZSBsb29rdXAgd2hlbiBydW5uaW5nIGBqZWt5bGwgc2VydmVgICgjMTM2MykKICAqIFVwZ3JhZGUgUmVkQ2FycGV0IGRlcGVuZGVuY3kgdG8gYH4+IDIuMy4wYCAoIzE1MTUpCiAgKiBVcGdyYWRlIHRvIExpcXVpZCBgPj0gMi41LjIsIDwgMi42YCAoIzE1MzYpCgojIyMgQnVnIEZpeGVzCgogICogRml4IGZpbGUgZGlzY3JlcGFuY3kgaW4gZ2Vtc3BlYyAoIzE1MjIpCiAgKiBGb3JjZSByZW5kZXJpbmcgb2YgSW5jbHVkZSB0YWcgKCMxNTI1KQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogQWRkIGEgcmFrZSB0YXNrIHRvIGdlbmVyYXRlIGEgbmV3IHJlbGVhc2UgcG9zdCAoIzE0MDQpCiAgKiBNdXRlIExTSSBvdXRwdXQgaW4gdGVzdHMgKCMxNTMxKQogICogVXBkYXRlIGNvbnRyaWJ1dG9yIGRvY3VtZW50YXRpb24gKCMxNTM3KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogRml4IGEgY291cGxlIG9mIHZhbGlkYXRpb24gZXJyb3JzIG9uIHRoZSBzaXRlICgjMTUxMSkKICAqIE1ha2UgbmF2aWdhdGlvbiBtZW51cyByZXVzYWJsZSAoIzE1MDcpCiAgKiBGaXggbGluayB0byBIaXN0b3J5IHBhZ2UgZnJvbSBSZWxlYXNlIHYxLjIuMCBub3RlcyBwb3N0LgogICogRml4IG1hcmt1cCBpbiBIaXN0b3J5IGZpbGUgZm9yIGNvbW1hbmQgbGluZSBvcHRpb25zICgjMTUxMikKICAqIEV4cGFuZCAxLjIgcmVsZWFzZSBwb3N0IHRpdGxlIHRvIDEuMi4wICgjMTUxNikKCiMjIDEuMi4wIC8gMjAxMy0wOS0wNgoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIERpc2FibGUgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgZXhjZXJwdHMgd2hlbiBgZXhjZXJwdF9zZXBhcmF0b3JgIGlzIGAiImAuICgjMTM4NikKICAqIEFkZCBjaGVja2luZyBmb3IgVVJMIGNvbmZsaWN0cyB3aGVuIHJ1bm5pbmcgYGpla3lsbCBkb2N0b3JgICgjMTM4OSkKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBDYXRjaCBhbmQgZml4IGludmFsaWQgYHBhZ2luYXRlYCB2YWx1ZXMgKCMxMzkwKQogICogUmVtb3ZlIHN1cGVyZmx1b3VzIGBkaXYuY29udGFpbmVyYCBmcm9tIHRoZSBkZWZhdWx0IGh0bWwgdGVtcGxhdGUgZm9yIGBqZWt5bGwgbmV3YCAoIzEzMTUpCiAgKiBBZGQgYC1EYCBzaG9ydC1mb3JtIHN3aXRjaCBmb3IgdGhlIGRyYWZ0cyBvcHRpb24gKCMxMzk0KQogICogVXBkYXRlIHRoZSBsaW5rcyBpbiB0aGUgc2l0ZSB0ZW1wbGF0ZSBmb3IgVHdpdHRlciBhbmQgR2l0SHViICgjMTQwMCkKICAqIFVwZGF0ZSBkdW1teSBlbWFpbCBhZGRyZXNzIHRvIGV4YW1wbGUuY29tIGRvbWFpbiAoIzE0MDgpCiAgKiBVcGRhdGUgbm9ybWFsaXplLmNzcyB0byB2Mi4xLjIgYW5kIG1pbmlmeTsgYWRkIHJha2UgdGFzayB0byB1cGRhdGUgbm9ybWFsaXplLmNzcyB3aXRoIGdyZWF0ZXIgZWFzZS4gKCMxNDMwKQogICogQWRkIHRoZSBhYmlsaXR5IHRvIGRldGFjaCB0aGUgc2VydmVyIHJhbiBieSBgamVreWxsIHNlcnZlYCBmcm9tIGl0J3MgY29udHJvbGxpbmcgdGVybWluYWwgKCMxNDQzKQogICogSW1wcm92ZSBwZXJtYWxpbmsgZ2VuZXJhdGlvbiBmb3IgVVJMcyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycyAoIzk0NCkKICAqIEV4cG9zZSB0aGUgY3VycmVudCBKZWt5bGwgdmVyc2lvbiB0byBwb3N0cyBhbmQgcGFnZXMgdmlhIGEgbmV3IGBqZWt5bGwudmVyc2lvbmAgdmFyaWFibGUgKCMxNDgxKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIE1hcmtkb3duIGV4dGVuc2lvbiBtYXRjaGluZyBtYXRjaGVzIG9ubHkgZXhhY3QgbWF0Y2hlcyAoIzEzODIpCiAgKiBGaXhlZCBOb01ldGhvZEVycm9yIHdoZW4gbWVzc2FnZSBwYXNzZWQgdG8gYFN0ZXZlbnNvbiNtZXNzYWdlYCBpcyBuaWwgKCMxMzg4KQogICogVXNlIGJpbmFyeSBtb2RlIHdoZW4gd3JpdGluZyBmaWxlICgjMTM2NCkKICAqIEZpeCAndW5kZWZpbmVkIG1ldGhvZCBgZW5jb2RpbmdgIGZvciAibWFpbHRvIicgZXJyb3JzIHcvIFJ1YnkgMS44IGFuZCBLcmFtZG93biA+IDAuMTQuMCAoIzEzOTcpCiAgKiBEbyBub3QgZm9yY2UgdGhlIHBlcm1hbGluayB0byBiZSBhIGRpciBpZiBpdCBlbmRzIG9uIC5odG1sICgjOTYzKQogICogV2hlbiBhIExpcXVpZCBFeGNlcHRpb24gaXMgY2F1Z2h0LCBzaG93IHRoZSBmdWxsIHBhdGggcmVsLiB0byBzaXRlIHNvdXJjZSAoIzE0MTUpCiAgKiBQcm9wZXJseSByZWFkIGluIHRoZSBjb25maWcgb3B0aW9ucyB3aGVuIHNlcnZpbmcgdGhlIGRvY3MgbG9jYWxseSAoIzE0NDQpCiAgKiBGaXhlZCBgLS1sYXlvdXRzYCBvcHRpb24gZm9yIGBidWlsZGAgYW5kIGBzZXJ2ZWAgY29tbWFuZHMgKCMxNDU4KQogICogUmVtb3ZlIGtyYW1kb3duIGFzIGEgcnVudGltZSBkZXBlbmRlbmN5IHNpbmNlIGl0J3Mgb3B0aW9uYWwgKCMxNDk4KQogICogUHJvdmlkZSBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgZm9yIGludmFsaWQgZmlsZSBuYW1lcyBpbiB0aGUgaW5jbHVkZSB0YWcgKCMxNDk0KQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogUmVtb3ZlIHJlZHVuZGFudCBhcmd1bWVudCB0byBKZWt5bGw6OkNvbW1hbmRzOjpOZXcjc2NhZmZvbGRfcG9zdF9jb250ZW50ICgjMTM1NikKICAqIEFkZCBuZXcgZGVwZW5kZW5jaWVzIHRvIHRoZSBSRUFETUUgKCMxMzYwKQogICogRml4IGxpbmsgdG8gY29udHJpYnV0aW5nIHBhZ2UgaW4gUkVBRE1FICgjMTQyNCkKICAqIFVwZGF0ZSBUb21Eb2MgaW4gUGFnZXIjaW5pdGlhbGl6ZSB0byBtYXRjaCBwYXJhbXMgKCMxNDQxKQogICogUmVmYWN0b3IgYFNpdGUjY2xlYW51cGAgaW50byBgSmVreWxsOjpTaXRlOjpDbGVhbmVyYCBjbGFzcyAoIzE0MjkpCiAgKiBTZXZlcmFsIG90aGVyIHNtYWxsIG1pbm9yIHJlZmFjdG9yaW5ncyAoIzEzNDEpCiAgKiBJZ25vcmUgYF9zaXRlYCBpbiBqZWt5bGxyYi5jb20gZGVwbG95ICgjMTQ4MCkKICAqIEFkZCBHZW0gdmVyc2lvbiBhbmQgZGVwZW5kZW5jeSBiYWRnZSB0byBSRUFETUUgKCMxNDk3KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogQWRkIGluZm8gYWJvdXQgbmV3IHJlbGVhc2VzICgjMTM1MykKICAqIFVwZGF0ZSBwbHVnaW4gbGlzdCB3aXRoIGpla3lsbC1yc3MgcGx1Z2luICgjMTM1NCkKICAqIFVwZGF0ZSB0aGUgc2l0ZSBsaXN0IHBhZ2Ugd2l0aCBSdWJ5J3Mgb2ZmaWNpYWwgc2l0ZSAoIzEzNTgpCiAgKiBBZGQgYGpla3lsbC1kaXRhYWAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMTM3MCkKICAqIEFkZCBgcG9zdGZpbGVzYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMxMzczKQogICogRm9yIGludGVybmFsIGxpbmtzLCB1c2UgZnVsbCBwYXRoIGluY2x1ZGluZyB0cmFpbGluZyBgL2AgKCMxNDExKQogICogVXNlIGN1cmx5IGFwb3N0cm9waGVzIGluIHRoZSBkb2NzICgjMTQxOSkKICAqIFVwZGF0ZSB0aGUgZG9jcyBmb3IgUmVkY2FycGV0IGluIEpla3lsbCAoIzE0MTgpCiAgKiBBZGQgYHBsdXJhbGl6ZWAgYW5kIGByZWFkaW5nX3RpbWVgIGZpbHRlcnMgdG8gZG9jcyAoIzE0MzkpCiAgKiBGaXggbWFya3VwIGZvciB0aGUgS3JhbWRvd24gb3B0aW9ucyAoIzE0NDUpCiAgKiBGaXggdHlwb3MgaW4gdGhlIEhpc3RvcnkgZmlsZSAoIzE0NTQpCiAgKiBBZGQgdHJhaWxpbmcgc2xhc2ggdG8gc2l0ZSdzIHBvc3QgVVJMICgjMTQ2MikKICAqIENsYXJpZnkgdGhhdCBgLS1jb25maWdgIHdpbGwgdGFrZSBtdWx0aXBsZSBmaWxlcyAoIzE0NzQpCiAgKiBGaXggZG9jcy90ZW1wbGF0ZXMubWQgcHJpdmF0ZSBnaXN0IGV4YW1wbGUgKCMxNDc3KQogICogVXNlIGBzaXRlLnJlcG9zaXRvcnlgIGZvciBKZWt5bGwncyBHaXRIdWIgVVJMICgjMTQ2MykKICAqIEFkZCBgamVreWxsLXBhZ2VsZXNzLXJlZGlyZWN0c2AgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMTQ4NikKICAqIENsYXJpZnkgdGhhdCBgZGF0ZV90b194bWxzY2hlbWFgIHJldHVybnMgYW4gSVNPIDg2MDEgc3RyaW5nICgjMTQ4OCkKICAqIEFkZCBgamVreWxsLWdvb2QtaW5jbHVkZWAgdG8gbGlzdCBvZiB0aGlyZC1wYXJ0eSBwbHVnaW5zICgjMTQ5MSkKICAqIFhNTCBlc2NhcGUgdGhlIGJsb2cgcG9zdCB0aXRsZSBpbiBvdXIgZmVlZCAoIzE1MDEpCiAgKiBBZGQgYGpla3lsbC10b2MtZ2VuZXJhdG9yYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMgKCMxNTA2KQoKIyMgMS4xLjIgLyAyMDEzLTA3LTI1CgojIyMgQnVnIEZpeGVzCgogICogUmVxdWlyZSBMaXF1aWQgMi41LjEgKCMxMzQ5KQoKIyMgMS4xLjEgLyAyMDEzLTA3LTI0CgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogUmVtb3ZlIHN1cGVyZmx1b3VzIGB0YWJsZWAgc2VsZWN0b3IgZnJvbSBtYWluLmNzcyBpbiBgamVreWxsIG5ld2AgdGVtcGxhdGUgKCMxMzI4KQogICogQWJvcnQgd2l0aCBub24temVybyBleGl0IGNvZGVzICgjMTMzOCkKCiMjIyBCdWcgRml4ZXMKCiAgKiBGaXggdXAgdGhlIHJlbmRlcmluZyBvZiBleGNlcnB0cyAoIzEzMzkpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBBZGQgSmVreWxsIEltYWdlIFRhZyB0byB0aGUgcGx1Z2lucyBsaXN0ICgjMTMwNikKICAqIFJlbW92ZSBlcnJvbmVvdXMgc3RhdGVtZW50IHRoYXQgYHNpdGUucGFnZXNgIGFyZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuCiAgKiBBZGQgaW5mbyBhYm91dCB0aGUgYF9kcmFmdHNgIGRpcmVjdG9yeSB0byB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBkb2NzICgjMTMyMCkKICAqIEltcHJvdmUgdGhlIGxheW91dCBvZiB0aGUgcGx1Z2luIGxpc3RpbmcgYnkgb3JnYW5pemluZyBpdCBpbnRvIGNhdGVnb3JpZXMgKCMxMzEwKQogICogQWRkIGdlbmVyYXRvci1qZWt5bGxyYiBhbmQgZ3J1bnQtamVreWxsIHRvIHBsdWdpbnMgcGFnZSAoIzEzMzApCiAgKiBNZW50aW9uIEtyYW1kb3duIGFzIG9wdGlvbiBmb3IgbWFya2Rvd24gcGFyc2VyIG9uIEV4dHJhcyBwYWdlICgjMTMxOCkKICAqIFVwZGF0ZSBRdWljay1TdGFydCBwYWdlIHRvIGluY2x1ZGUgcmVtaW5kZXIgdGhhdCBhbGwgcmVxdWlyZW1lbnRzIG11c3QgYmUgaW5zdGFsbGVkICgjMTMyNykKICAqIENoYW5nZSBmaWxlbmFtZSBpbiBgaW5jbHVkZWAgZXhhbXBsZSB0byBhbiBIVE1MIGZpbGUgc28gYXMgbm90IHRvIGluZGljYXRlIHRoYXQgSmVreWxsIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IHRoZW0uICgjMTMwMykKICAqIEFkZCBhbiBSU1MgZmVlZCBmb3IgY29tbWl0cyB0byBKZWt5bGwgKCMxMzQzKQoKIyMgMS4xLjAgLyAyMDEzLTA3LTE0CgojIyMgTWFqb3IgRW5oYW5jZW1lbnRzCgogICogQWRkIGBkb2NzYCBzdWJjb21tYW5kIHRvIHJlYWQgSmVreWxsJ3MgZG9jcyB3aGVuIG9mZmxpbmUuICgjMTA0NikKICAqIFN1cHBvcnQgcGFzc2luZyBwYXJhbWV0ZXJzIHRvIHRlbXBsYXRlcyBpbiBgaW5jbHVkZWAgdGFnICgjMTIwNCkKICAqIEFkZCBzdXBwb3J0IGZvciBMaXF1aWQgdGFncyB0byBwb3N0IGV4Y2VycHRzICgjMTMwMikKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBTZWFyY2ggdGhlIGhpZXJhcmNoeSBvZiBwYWdpbmF0aW9uIHBhdGggdXAgdG8gc2l0ZSByb290IHRvIGRldGVybWluZSB0ZW1wbGF0ZSBwYWdlIGZvciBwYWdpbmF0aW9uLiAoIzExOTgpCiAgKiBBZGQgdGhlIGFiaWxpdHkgdG8gZ2VuZXJhdGUgYSBuZXcgSmVreWxsIHNpdGUgd2l0aG91dCBhIHRlbXBsYXRlICgjMTE3MSkKICAqIFVzZSByZWRjYXJwZXQgYXMgdGhlIGRlZmF1bHQgbWFya2Rvd24gZW5naW5lIGluIG5ld2x5IGdlbmVyYXRlZCBzaXRlcyAoIzEyNDUsICMxMjQ3KQogICogQWRkIGByZWRjYXJwZXRgIGFzIGEgcnVudGltZSBkZXBlbmRlbmN5IHNvIGBqZWt5bGwgYnVpbGRgIHdvcmtzIG91dC1vZi10aGUtYm94IGZvciBuZXcgc2l0ZXMuICgjMTI0NykKICAqIEluIHRoZSBnZW5lcmF0ZWQgc2l0ZSwgcmVtb3ZlIGZpbGVzIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSBhIGRpcmVjdG9yeSAoIzExMTgpCiAgKiBGYWlsIGxvdWRseSBpZiBhIHVzZXItc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2Vzbid0IGV4aXN0ICgjMTA5OCkKICAqIEFsbG93IGZvciBhbGwgb3B0aW9ucyBmb3IgS3JhbWRvd24gSFRNTCBDb252ZXJ0ZXIgKCMxMjAxKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCBwYWdpbmF0aW9uIGluIHN1YmRpcmVjdG9yaWVzLiAoIzExOTgpCiAgKiBGaXggYW4gaXNzdWUgd2l0aCBkaXJlY3RvcmllcyBhbmQgcGVybWFsaW5rcyB0aGF0IGhhdmUgYSBwbHVzIHNpZ24gKCspIGluIHRoZW0gKCMxMjE1KQogICogUHJvdmlkZSBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIHdoZW4gZ2VuZXJhdGluZyBzaXRlcyAoIzEyNTMpCiAgKiBMYXRlc3QgcG9zdHMgZmlyc3QgaW4gbm9uLUxTSSBgcmVsYXRlZF9wb3N0c2AgKCMxMjcxKQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogTWVyZ2UgdGhlIHRoZW1lIGFuZCBsYXlvdXQgQ3VjdW1iZXIgc3RlcHMgaW50byBvbmUgc3RlcCAoIzExNTEpCiAgKiBSZXN0cmljdCBhY3RpdmVzdXBwb3J0IGRlcGVuZGVuY3kgdG8gcHJlLTQuMC4wIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBgPD0gMS45LjJgCiAgKiBJbmNsdWRlL2V4Y2x1ZGUgZGVwcmVjYXRpb24gaGFuZGxpbmcgc2ltcGxpZmljYXRpb24gKCMxMjg0KQogICogQ29udmVydCBSRUFETUUgdG8gTWFya2Rvd24uICgjMTI2NykKICAqIFJlZmFjdG9yIEpla3lsbDo6U2l0ZSAoIzExNDQpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBBZGQgIk5ld3MiIHNlY3Rpb24gZm9yIHJlbGVhc2Ugbm90ZXMsIGFsb25nIHdpdGggYW4gUlNTIGZlZWQgKCMxMDkzLCAjMTI4NSwgIzEyODYpCiAgKiBBZGQgIkhpc3RvcnkiIHBhZ2UuCiAgKiBSZXN0cnVjdHVyZWQgZG9jcyBzZWN0aW9ucyB0byBpbmNsdWRlICJNZXRhIiBzZWN0aW9uLgogICogQWRkIG1lc3NhZ2UgdG8gIlRlbXBsYXRlcyIgcGFnZSB0aGF0IHNwZWNpZmllcyB0aGF0IFB5dGhvbiBtdXN0IGJlIGluc3RhbGxlZCBpbiBvcmRlciB0byB1c2UgUHlnbWVudHMuICgjMTE4MikKICAqIFVwZGF0ZSBsaW5rIHRvIHRoZSBvZmZpY2lhbCBNYXJ1a3UgcmVwbyAoIzExNzUpCiAgKiBBZGQgZG9jdW1lbnRhdGlvbiBhYm91dCBgcGFnaW5hdGVfcGF0aGAgdG8gIlRlbXBsYXRlcyIgcGFnZSBpbiBkb2NzICgjMTEyOSkKICAqIEdpdmUgdGhlIHF1aWNrLXN0YXJ0IGd1aWRlIGl0cyBvd24gcGFnZSAoIzExOTEpCiAgKiBVcGRhdGUgUHJvVGlwIG9uIEluc3RhbGxhdGlvbiBwYWdlIGluIGRvY3MgdG8gcG9pbnQgdG8gYWxsIHRoZSBpbmZvIGFib3V0IFB5Z21lbnRzIGFuZCB0aGUgJ2hpZ2hsaWdodCcgdGFnLiAoIzExOTYpCiAgKiBSdW4gYHNpdGUvaW1nYCB0aHJvdWdoIEltYWdlT3B0aW0gKHRoYW5rcyBAcXJ1c2ghKSAoIzEyMDgpCiAgKiBBZGRlZCBKYWRlIENvbnZlcnRlciB0byBgc2l0ZS9kb2NzL3BsdWdpbnNgICgjMTIxMCkKICAqIEZpeCBsb2NhdGlvbiBvZiBkb2NzIHBhZ2VzIGluIENvbnRyaWJ1dGluZyBwYWdlcyAoIzEyMTQpCiAgKiBBZGQgUmVhZEluWE1pbnV0ZXMgcGx1Z2luIHRvIHRoZSBwbHVnaW4gbGlzdCAoIzEyMjIpCiAgKiBSZW1vdmUgcGx1Z2lucyBmcm9tIHRoZSBwbHVnaW4gbGlzdCB0aGF0IGhhdmUgZXF1aXZhbGVudHMgaW4gSmVreWxsIHByb3BlciAoIzEyMjMpCiAgKiBBZGQgamVreWxsLWFzc2V0cyB0byB0aGUgcGx1Z2luIGxpc3QgKCMxMjI1KQogICogQWRkIGpla3lsbC1wYW5kb2MtbXVsaXRwbGUtZm9ybWF0cyB0byB0aGUgcGx1Z2luIGxpc3QgKCMxMjI5KQogICogUmVtb3ZlIGRlYWQgbGluayB0byAiVXNpbmcgR2l0IHRvIG1haW50YWluIHlvdXIgYmxvZyIgKCMxMjI3KQogICogVGlkeSB1cCB0aGUgdGhpcmQtcGFydHkgcGx1Z2lucyBsaXN0aW5nICgjMTIyOCkKICAqIFVwZGF0ZSBjb250cmlidXRvciBpbmZvcm1hdGlvbiAoIzExOTIpCiAgKiBVcGRhdGUgVVJMIG9mIGFydGljbGUgYWJvdXQgQmxvZ2dlciBtaWdyYXRpb24gKCMxMjQyKQogICogU3BlY2lmeSB0aGF0IFJlZENhcnBldCBpcyB0aGUgZGVmYXVsdCBmb3IgbmV3IEpla3lsbCBzaXRlcyBvbiBRdWlja3N0YXJ0IHBhZ2UgKCMxMjQ3KQogICogQWRkZWQgYHNpdGUucGFnZXNgIHRvIFZhcmlhYmxlcyBwYWdlIGluIGRvY3MgKCMxMjUxKQogICogQWRkIFlvdWt1IGFuZCBUdWRvdSBFbWJlZCBsaW5rIG9uIFBsdWdpbnMgcGFnZS4gKCMxMjUwKQogICogQWRkIG5vdGUgdGhhdCBgZ2lzdGAgdGFnIHN1cHBvcnRzIHByaXZhdGUgZ2lzdHMuICgjMTI0OCkKICAqIEFkZCBgamVreWxsLXRpbWVhZ29gIHRvIGxpc3Qgb2YgdGhpcmQtcGFydHkgcGx1Z2lucy4gKCMxMjYwKQogICogQWRkIGBqZWt5bGwtc3dmb2JqZWN0YCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMuICgjMTI2MykKICAqIEFkZCBgamVreWxsLXBpY3R1cmUtdGFnYCB0byBsaXN0IG9mIHRoaXJkLXBhcnR5IHBsdWdpbnMuICgjMTI4MCkKICAqIFVwZGF0ZSB0aGUgR2l0SHViIFBhZ2VzIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIHJlbGF0aXZlIFVSTHMgKCMxMjkxKQogICogVXBkYXRlIHRoZSBTMyBkZXBsb3ltZW50IGRvY3VtZW50YXRpb24gKCMxMjk0KQogICogQWRkIHN1Z2dlc3Rpb24gZm9yIFhjb2RlIENMVCBpbnN0YWxsIHRvIHRyb3VibGVzaG9vdGluZyBwYWdlIGluIGRvY3MgKCMxMjk2KQogICogQWRkICdXb3JraW5nIHdpdGggZHJhZnRzJyBwYWdlIHRvIGRvY3MgKCMxMjg5KQogICogQWRkIGluZm9ybWF0aW9uIGFib3V0IHRpbWUgem9uZXMgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIGEgcGFnZSdzIGRhdGUgKCMxMzA0KQoKIyMgMS4wLjMgLyAyMDEzLTA2LTA3CgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQWRkIHN1cHBvcnQgdG8gZ2lzdCB0YWcgZm9yIHByaXZhdGUgZ2lzdHMuICgjMTE4OSkKICAqIEZhaWwgbG91ZGx5IHdoZW4gTWFydWt1IGVycm9ycyBvdXQgKCMxMTkwKQogICogTW92ZSB0aGUgYnVpbGRpbmcgb2YgcmVsYXRlZCBwb3N0cyBpbnRvIHRoZWlyIG93biBjbGFzcyAoIzEwNTcpCiAgKiBSZW1vdmVkIHRyYWlsaW5nIHNwYWNlcyBpbiBzZXZlcmFsIHBsYWNlcyB0aHJvdWdob3V0IHRoZSBjb2RlICgjMTExNikKICAqIEFkZCBhIGAtLWZvcmNlYCBvcHRpb24gdG8gYGpla3lsbCBuZXdgICgjMTExNSkKICAqIENvbnZlcnQgSURzIGluIHRoZSBzaXRlIHRlbXBsYXRlIHRvIGNsYXNzZXMgKCMxMTcwKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIEZpeCB0eXBvIGluIFN0ZXZlbnNvbiBjb25zdGFudCAiRVJST1IiLiAoIzExNjYpCiAgKiBSZW5hbWUgSmVreWxsOjpMb2dnZXIgdG8gSmVreWxsOjpTdGV2ZW5zb24gdG8gZml4IGluaGVyaXRhbmNlIGlzc3VlICgjMTEwNikKICAqIEV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSB3aGVuIGRlYWxpbmcgd2l0aCBhIExpcXVpZCBlcnJvciAoIzExMjEpCiAgKiBNYWtlIHRoZSBgZXhjbHVkZWAgYW5kIGBpbmNsdWRlYCBvcHRpb25zIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggdmVyc2lvbnMgb2YgSmVreWxsIHByaW9yIHRvIDEuMCAoIzExMTQpCiAgKiBGaXggcGFnaW5hdGlvbiBvbiBXaW5kb3dzICgjMTA2MykKICAqIEZpeCB0aGUgYXBwbGljYXRpb24gb2YgUHlnbWVudHMnIEdlbmVyaWMgT3V0cHV0IHN0eWxlIHRvIEdvIGNvZGUgKCMxMTU2KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogQWRkIGEgUHJvIFRpcCB0byBkb2NzIGFib3V0IGZyb250IG1hdHRlciB2YXJpYWJsZXMgYmVpbmcgb3B0aW9uYWwgKCMxMTQ3KQogICogQWRkIGNoYW5nZWxvZyB0byBzaXRlIGFzIEhpc3RvcnkgcGFnZSBpbiAvZG9jcy8gKCMxMDY1KQogICogQWRkIG5vdGUgdG8gVXBncmFkaW5nIHBhZ2UgYWJvdXQgbmV3IGNvbmZpZyBvcHRpb25zIGluIDEuMC54ICgjMTE0NikKICAqIERvY3VtZW50YXRpb24gZm9yIGBkYXRlX3RvX3JmYzgyMmAgYW5kIGB1cmlfZXNjYXBlYCAoIzExNDIpCiAgKiBEb2N1bWVudGF0aW9uIGhpZ2hsaWdodCBib3hlcyBzaG91bGRuJ3Qgc2hvdyBzY3JvbGxiYXJzIGlmIG5vdCBuZWNlc3NhcnkgKCMxMTIzKQogICogQWRkIGxpbmsgdG8gamVreWxsLW1pbmlidW5kbGUgaW4gdGhlIGRvYydzIHBsdWdpbnMgbGlzdCAoIzEwMzUpCiAgKiBRdWljayBwYXRjaCBmb3IgaW1wb3J0ZXJzIGRvY3VtZW50YXRpb24KICAqIEZpeCBwcmVmaXggZm9yIFdvcmRwcmVzc0RvdENvbSBpbXBvcnRlciBpbiBkb2NzICgjMTEwNykKICAqIEFkZCBqZWt5bGwtY29udGVudGJsb2NrcyBwbHVnaW4gdG8gZG9jcyAoIzEwNjgpCiAgKiBNYWtlIGNvZGUgYml0cyBpbiBub3RlcyBsb29rIG1vcmUgbmF0dXJhbCwgbW9yZSByZWFkYWJsZSAoIzEwODkpCiAgKiBGaXggbG9naWMgZm9yIGByZWxhdGl2ZV9wZXJtYWxpbmtzYCBpbnN0cnVjdGlvbnMgb24gVXBncmFkaW5nIHBhZ2UgKCMxMTAxKQogICogQWRkIGRvY3MgZm9yIHBvc3QgZXhjZXJwdCAoIzEwNzIpCiAgKiBBZGQgZG9jcyBmb3IgZ2lzdCB0YWcgKCMxMDcyKQogICogQWRkIGRvY3MgaW5kaWNhdGluZyB0aGF0IFB5Z21lbnRzIGRvZXMgbm90IG5lZWQgdG8gYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkgKCMxMDk5LCAjMTExOSkKICAqIFVwZGF0ZSB0aGUgbWlncmF0b3IgZG9jcyB0byBiZSBjdXJyZW50ICgjMTEzNikKICAqIEFkZCB0aGUgSmVreWxsIEdhbGxlcnkgUGx1Z2luIHRvIHRoZSBwbHVnaW4gbGlzdCAoIzExNDMpCgojIyMgRGV2ZWxvcG1lbnQgRml4ZXMKCiAgKiBVc2UgSmVreWxsLmxvZ2dlciBpbnN0ZWFkIG9mIEpla3lsbDo6U3RldmVuc29uIHRvIGxvZyB0aGluZ3MgKCMxMTQ5KQogICogRml4IHBlc2t5IEN1Y3VtYmVyIGluZmluaXRlIGxvb3AgKCMxMTM5KQogICogRG8gbm90IHdyaXRlIHBvc3RzIHdpdGggdGltZXpvbmVzIGluIEN1Y3VtYmVyIHRlc3RzICgjMTEyNCkKICAqIFVzZSBJU08gZm9ybWF0dGVkIGRhdGVzIGluIEN1Y3VtYmVyIGZlYXR1cmVzICgjMTE1MCkKCiMjIDEuMC4yIC8gMjAxMy0wNS0xMgoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIEFkZCBgamVreWxsIGRvY3RvcmAgY29tbWFuZCB0byBjaGVjayBzaXRlIGZvciBhbnkga25vd24gY29tcGF0aWJpbGl0eSBwcm9ibGVtcyAoIzEwODEpCiAgKiBCYWNrd2FyZHMtY29tcGF0aWJpbGl6ZSByZWxhdGl2ZSBwZXJtYWxpbmtzICgjMTA4MSkKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgYSBgZGF0YS1sYW5nPSI8bGFuZz4iYCBhdHRyaWJ1dGUgdG8gUmVkY2FycGV0IGNvZGUgYmxvY2tzICgjMTA2NikKICAqIERlcHJlY2F0ZSBvbGQgY29uZmlnIGBzZXJ2ZXJfcG9ydGAsIG1hdGNoIHRvIGBwb3J0YCBpZiBgcG9ydGAgaXNuJ3Qgc2V0ICgjMTA4NCkKICAqIFVwZGF0ZSBweWdtZW50cy5yYiB2ZXJzaW9uIHRvIDAuNS4wICgjMTA2MSkKICAqIFVwZGF0ZSBLcmFtZG93biB2ZXJzaW9uIHRvIDEuMC4yICgjMTA2NykKCiMjIyBCdWcgRml4ZXMKCiAgKiBGaXggaXNzdWUgd2hlbiBjYXRlZ29yaWVzIGFyZSBudW1iZXJzICgjMTA3OCkKICAqIENhdGNoaW5nIHRoYXQgUmVkY2FycGV0IGdlbSBpc24ndCBpbnN0YWxsZWQgKCMxMDU5KQoKIyMjIFNpdGUgRW5oYW5jZW1lbnRzCgogICogQWRkIGRvY3VtZW50YXRpb24gYWJvdXQgYHJlbGF0aXZlX3Blcm1hbGlua3NgICgjMTA4MSkKICAqIFJlbW92ZSBweWdtZW50cy1pbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLCBhcyBweWdtZW50cy5yYiBpcyBidW5kbGVkIHdpdGggaXQgKCMxMDc5KQogICogTW92ZSBwYWdlcyB0byBiZSBQYWdlcyBmb3IgcmVhbHogKCM5ODUpCiAgKiBVcGRhdGVkIGxpbmtzIHRvIExpcXVpZCBkb2N1bWVudGF0aW9uICgjMTA3MykKCiMjIDEuMC4xIC8gMjAxMy0wNS0wOAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIERvIG5vdCBmb3JjZSB1c2Ugb2YgYHRvY190b2tlbmAgd2hlbiB1c2luZyBgZ2VuZXJhdGVfdG9rYCBpbiBSRGlzY291bnQgKCMxMDQ4KQogICogQWRkIG5ld2VyIGBsYW5ndWFnZS1gIGNsYXNzIG5hbWUgcHJlZml4IHRvIGNvZGUgYmxvY2tzICgjMTAzNykKICAqIENvbW1hbmRlciBlcnJvciBtZXNzYWdlIG5vdyBwcmVmZXJyZWQgb3ZlciBwcm9jZXNzIGFib3J0IHdpdGggaW5jb3JyZWN0IGFyZ3MgKCMxMDQwKQoKIyMjIEJ1ZyBGaXhlcwoKICAqIE1ha2UgUmVkY2FycGV0IHJlc3BlY3QgdGhlIHB5Z21lbnRzIGNvbmZpZ3VyYXRpb24gb3B0aW9uICgjMTA1MykKICAqIEZpeCB0aGUgaW5kZXggYnVpbGQgd2l0aCBMU0kgKCMxMDQ1KQogICogRG9uJ3QgcHJpbnQgZGVwcmVjYXRpb24gd2FybmluZyB3aGVuIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLiAoIzEwNDEpCiAgKiBBZGQgbWlzc2luZyBgPC9kaXY+YCB0byBzaXRlIHRlbXBsYXRlIHVzZWQgYnkgYG5ld2Agc3ViY29tbWFuZCwgZml4ZWQgdHlwb3MgaW4gY29kZSAoIzEwMzIpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBDaGFuZ2VkIGh0dHBzIHRvIGh0dHAgaW4gdGhlIEdpdEh1YiBQYWdlcyBsaW5rICgjMTA1MSkKICAqIFJlbW92ZSBDU1MgY3J1ZnQsIGZpeCB0eXBvcywgZml4IEhUTUwgZXJyb3JzICgjMTAyOCkKICAqIFJlbW92aW5nIG1hbnVhbCBpbnN0YWxsIG9mIFBpcCBhbmQgRGlzdHJpYnV0ZSAoIzEwMjUpCiAgKiBVcGRhdGVkIFVSTCBmb3IgTWFya2Rvd24gcmVmZXJlbmNlcyBwbHVnaW4gKCMxMDIyKQoKIyMjIERldmVsb3BtZW50IEZpeGVzCgogICogTWFya2Rvd25pZnkgaGlzdG9yeSBmaWxlICgjMTAyNykKICAqIFVwZGF0ZSBsaW5rcyBvbiBSRUFETUUgdG8gcG9pbnQgdG8gbmV3IGpla3lsbHJiLmNvbSAoIzEwMTgpCgojIyAxLjAuMCAvIDIwMTMtMDUtMDYKCiMjIyBNYWpvciBFbmhhbmNlbWVudHMKCiAgKiBBZGQgYGpla3lsbCBuZXdgIHN1YmNvbW1hbmQ6IGdlbmVyYXRlIGEgSmVreWxsIHNjYWZmb2xkICgjNzY0KQogICogUmVmYWN0b3JlZCBKZWt5bGwgY29tbWFuZHMgaW50byBzdWJjb21tYW5kczogYnVpbGQsIHNlcnZlLCBhbmQgbWlncmF0ZS4gKCM2OTApCiAgKiBSZW1vdmVkIGltcG9ydGVycy9taWdyYXRvcnMgZnJvbSBtYWluIHByb2plY3QsIG1pZ3JhdGVkIHRvIGpla3lsbC1pbXBvcnQgc3ViLWdlbSAoIzc5MykKICAqIEFkZGVkIGFiaWxpdHkgdG8gcmVuZGVyIGRyYWZ0cyBpbiBgX2RyYWZ0c2AgZm9sZGVyIHZpYSBjb21tYW5kIGxpbmUgKCM4MzMpCiAgKiBBZGQgb3JkaW5hbCBkYXRlIHBlcm1hbGluayBzdHlsZSAoLzpjYXRlZ29yaWVzLzp5ZWFyLzp5X2RheS86dGl0bGUuaHRtbCkgKCM5MjgpCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogU2l0ZSB0ZW1wbGF0ZSBIVE1MNS1pZmllZCAoIzk2NCkKICAqIFVzZSBwb3N0J3MgZGlyZWN0b3J5IHBhdGggd2hlbiBtYXRjaGluZyBmb3IgdGhlIGBwb3N0X3VybGAgdGFnICgjOTk4KQogICogTG9vc2VuIGRlcGVuZGVuY3kgb24gUHlnbWVudHMgc28gaXQncyBvbmx5IHJlcXVpcmVkIHdoZW4gaXQncyBuZWVkZWQgKCMxMDE1KQogICogUGFyc2Ugc3RyaW5ncyBpbnRvIFRpbWUgb2JqZWN0cyBmb3IgZGF0ZS1yZWxhdGVkIExpcXVpZCBmaWx0ZXJzICgjMTAxNCkKICAqIFRlbGwgdGhlIHVzZXIgaWYgdGhlcmUgaXMgbm8gc3ViY29tbWFuZCBzcGVjaWZpZWQgKCMxMDA4KQogICogRnJlYWsgb3V0IGlmIHRoZSBkZXN0aW5hdGlvbiBvZiBgamVreWxsIG5ld2AgZXhpc3RzIGFuZCBpcyBub24tZW1wdHkgKCM5ODEpCiAgKiBBZGQgYHRpbWV6b25lYCBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgY29tcGlsYXRpb24gKCM5NTcpCiAgKiBBZGQgZGVwcmVjYXRpb24gbWVzc2FnZXMgZm9yIHByZS0xLjAgQ0xJIG9wdGlvbnMgKCM5NTkpCiAgKiBSZWZhY3RvciBhbmQgY29sb3JpemUgbG9nZ2luZyAoIzk1OSkKICAqIFJlZmFjdG9yIE1hcmtkb3duIHBhcnNpbmcgKCM5NTUpCiAgKiBBZGRlZCBhcHBsaWNhdGlvbi92bmQuYXBwbGUucGtwYXNzIHRvIG1pbWUudHlwZXMgc2VydmVkIGJ5IFdFQnJpY2sgKCM5MDcpCiAgKiBNb3ZlIHRlbXBsYXRlIHNpdGUgdG8gZGVmYXVsdCBtYXJrZG93biByZW5kZXJlciAoIzk2MSkKICAqIEV4cG9zZSBuZXcgYXR0cmlidXRlIHRvIExpcXVpZCB2aWEgYHBhZ2VgOiBgcGFnZS5wYXRoYCAoIzk1MSkKICAqIEFjY2VwdCBtdWx0aXBsZSBjb25maWcgZmlsZXMgZnJvbSBjb21tYW5kIGxpbmUgKCM5NDUpCiAgKiBBZGQgcGFnZSB2YXJpYWJsZSB0byBsaXF1aWQgY3VzdG9tIHRhZ3MgYW5kIGJsb2NrcyAoIzQxMykKICAqIEFkZCBgcGFnaW5hdG9yLnByZXZpb3VzX3BhZ2VfcGF0aGAgYW5kIGBwYWdpbmF0b3IubmV4dF9wYWdlX3BhdGhgICgjOTQyKQogICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yICdhdXRvJyAoIzgyMSwgIzkzNCkKICAqIEFkZGVkIGRhdGVfdG9fcmZjODIyIHVzZWQgb24gUlNTIGZlZWRzICgjODkyKQogICogVXBncmFkZSB2ZXJzaW9uIG9mIHB5Z21lbnRzLnJiIHRvIDAuNC4yICgjOTI3KQogICogQWRkZWQgc2hvcnQgbW9udGggKGUuZy4gIlNlcCIpIHRvIHBlcm1hbGluayBzdHlsZSBvcHRpb25zIGZvciBwb3N0cyAoIzg5MCkKICAqIEV4cG9zZSBzaXRlLmJhc2V1cmwgdG8gTGlxdWlkIHRlbXBsYXRlcyAoIzg2OSkKICAqIEFkZHMgZXhjZXJwdCBhdHRyaWJ1dGUgdG8gcG9zdHMgd2hpY2ggY29udGFpbnMgZmlyc3QgcGFyYWdyYXBoIG9mIGNvbnRlbnQgKCM4MzcpCiAgKiBBY2NlcHQgY3VzdG9tIGNvbmZpZ3VyYXRpb24gZmlsZSB2aWEgQ0xJICgjODYzKQogICogTG9hZCBpbiBHaXRIdWIgUGFnZXMgTUlNRSBUeXBlcyBvbiBgamVreWxsIHNlcnZlYCAoIzg0NywgIzg3MSkKICAqIEltcHJvdmUgZGVidWdhYmlsaXR5IG9mIGVycm9yIG1lc3NhZ2UgZm9yIGEgbWFsZm9ybWVkIGhpZ2hsaWdodCB0YWcgKCM3ODUpCiAgKiBBbGxvdyBzeW1saW5rZWQgZmlsZXMgaW4gdW5zYWZlIG1vZGUgKCM4MjQpCiAgKiBBZGQgJ2dpc3QnIExpcXVpZCB0YWcgdG8gY29yZSAoIzgyMiwgIzg2MSkKICAqIE5ldyBmb3JtYXQgb2YgSmVreWxsIG91dHB1dCAoIzc5NSkKICAqIFJlaW5zdGF0ZSBgLS1saW1pdF9wb3N0c2AgYW5kIGAtLWZ1dHVyZWAgc3dpdGNoZXMgKCM3ODgpCiAgKiBSZW1vdmUgYW1iaWd1aXR5IGZyb20gY29tbWFuZCBkZXNjcmlwdGlvbnMgKCM4MTUpCiAgKiBGaXggU2FmZVlBTUwgV2FybmluZ3MgKCM4MDcpCiAgKiBSZWxheGVkIEtyYW1kb3duIHZlcnNpb24gdG8gMC4xNCAoIzgwOCkKICAqIEFsaWFzZWQgYGpla3lsbCBzZXJ2ZXJgIHRvIGBqZWt5bGwgc2VydmVgLiAoIzc5MikKICAqIFVwZGF0ZWQgZ2VtIHZlcnNpb25zIGZvciBLcmFtZG93biwgUmFrZSwgU2hvdWxkYSwgQ3VjdW1iZXIsIGFuZCBSZWRDYXJwZXQuICgjNzQ0KQogICogUmVmYWN0b3JlZCBKZWt5bGwgc3ViY29tbWFuZHMgaW50byBKZWt5bGw6OkNvbW1hbmRzIHN1Ym1vZHVsZSwgd2hpY2ggbm93IGNvbnRhaW5zIHRoZW0gKCM3NjgpCiAgKiBSZXNjdWUgZnJvbSBpbXBvcnQgZXJyb3JzIGluIFdvcmRwcmVzcy5jb20gbWlncmF0b3IgKCM2NzEpCiAgKiBNYXNzaXZlbHkgYWNjZWxlcmF0ZSBMU0kgcGVyZm9ybWFuY2UgKCM2NjQpCiAgKiBUcnVuY2F0ZSBwb3N0IHNsdWdzIHdoZW4gaW1wb3J0aW5nIGZyb20gVHVtYmxyICgjNDk2KQogICogQWRkIGdsb2Igc3VwcG9ydCB0byBpbmNsdWRlLCBleGNsdWRlIG9wdGlvbiAoIzc0MykKICAqIExheW91dCBvZiBQYWdlIG9yIFBvc3QgZGVmYXVsdHMgdG8gJ3BhZ2UnIG9yICdwb3N0JywgcmVzcGVjdGl2ZWx5ICgjNTgwKSBSRVBFQUxFRCBieSAoIzk3NykKICAqICJLZWVwIGZpbGVzIiBmZWF0dXJlICgjNjg1KQogICogT3V0cHV0IGZ1bGwgcGF0aCAmIG5hbWUgZm9yIGZpbGVzIHRoYXQgZG9uJ3QgcGFyc2UgKCM3NDUpCiAgKiBBZGQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgcHJvdGVjdGlvbiAoIzUzNSkKICAqIEJldHRlciBZQU1MIGVycm9yIG1lc3NhZ2UgKCM3MTgpCiAgKiBCdWcgRml4ZXMKICAqIFBhZ2luYXRlIGluIHN1YmRpcmVjdG9yaWVzIHByb3Blcmx5ICgjMTAxNikKICAqIEVuc3VyZSBwb3N0IGFuZCBwYWdlIFVSTHMgaGF2ZSBhIGxlYWRpbmcgc2xhc2ggKCM5OTIpCiAgKiBDYXRjaCBhbGwgZXhjZXB0aW9ucywgbm90IGp1c3QgU3RhbmRhcmRFcnJvciBkZXNjZW5kZW50cyAoIzEwMDcpCiAgKiBCdWxsZXQtcHJvb2YgYGxpbWl0X3Bvc3RzYCBvcHRpb24gKCMxMDA0KQogICogUmVhZCBpbiBZQU1MIGFzIFVURi04IHRvIGFjY2VwdCBub24tQVNDSUkgY2hhcnMgKCM4MzYpCiAgKiBGaXggdGhlIENMSSBvcHRpb24gYC0tcGx1Z2luc2AgdG8gYWN0dWFsbHkgYWNjZXB0IGRpcnMgYW5kIGZpbGVzICgjOTkzKQogICogQWxsb3cgJ2V4Y2VycHQnIGluIFlBTUwgZnJvbnQgbWF0dGVyIHRvIG92ZXJyaWRlIHRoZSBleHRyYWN0ZWQgZXhjZXJwdCAoIzk0NikKICAqIEZpeCBjYXNjYWRlIHByb2JsZW0gd2l0aCBzaXRlLmJhc2V1cmwsIHNpdGUucG9ydCBhbmQgc2l0ZS5ob3N0LiAoIzkzNSkKICAqIEZpbHRlciBvdXQgZGlyZWN0b3JpZXMgd2l0aCB2YWxpZCBwb3N0IG5hbWVzICgjODc1KQogICogRml4IHN5bWxpbmtlZCBzdGF0aWMgZmlsZXMgbm90IGJlaW5nIGNvcnJlY3RseSBidWlsdCBpbiB1bnNhZmUgbW9kZSAoIzkwOSkKICAqIEZpeCBpbnRlZ3JhdGlvbiB3aXRoIGRpcmVjdG9yeV93YXRjaGVyIDEuNC54ICgjOTE2KQogICogQWNjZXB0aW5nIHN0cmluZ3MgYXMgYXJndW1lbnRzIHRvIGpla3lsbC1pbXBvcnQgY29tbWFuZCAoIzkxMCkKICAqIEZvcmNlIHVzYWdlIG9mIG9sZGVyIGRpcmVjdG9yeV93YXRjaGVyIGdlbSBhcyAxLjUgaXMgYnJva2VuICgjODgzKQogICogRW5zdXJlIGFsbCBQb3N0IGNhdGVnb3JpZXMgYXJlIGRvd25jYXNlICgjODQyLCAjODcyKQogICogRm9yY2UgZW5jb2Rpbmcgb2YgdGhlIHJkaXNjb3VudCBUT0MgdG8gVVRGOCB0byBhdm9pZCBjb252ZXJzaW9uIGVycm9ycyAoIzU1NSkKICAqIFBhdGNoIGZvciBtdWx0aWJ5dGUgVVJJIHByb2JsZW0gd2l0aCBgamVreWxsIHNlcnZlYCAoIzcyMykKICAqIE9yZGVyIHBsdWdpbiBleGVjdXRpb24gYnkgcHJpb3JpdHkgKCM4NjQpCiAgKiBGaXhlZCBQYWdlI2RpciBhbmQgUGFnZSN1cmwgZm9yIGVkZ2UgY2FzZXMgKCM1MzYpCiAgKiBGaXggYnJva2VuIGBwb3N0X3VybGAgd2l0aCBwb3N0cyB3aXRoIGEgdGltZSBpbiB0aGVpciBZQU1MIGZyb250IG1hdHRlciAoIzgzMSkKICAqIExvb2sgZm9yIHBsdWdpbnMgdW5kZXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkgKCM2NTQpCiAgKiBUdW1ibHIgTWlncmF0b3I6IGZpbmRzIGBfcG9zdHNgIGRpciBjb3JyZWN0bHksIGZpeGVzIHRydW5jYXRpb24gb2YgbG9uZyBwb3N0IG5hbWVzICgjNzc1KQogICogRm9yY2UgQ2F0ZWdvcmllcyB0byBiZSBTdHJpbmdzICgjNzY3KQogICogU2FmZSBZQU1MIHBsdWdpbiB0byBwcmV2ZW50IHZ1bG5lcmFiaWxpdHkgKCM3NzcpCiAgKiBBZGQgU1ZHIHN1cHBvcnQgdG8gSmVreWxsL1dFQnJpY2suICgjNDA3LCAjNDA2KQogICogUHJldmVudCBjdXN0b20gZGVzdGluYXRpb24gZnJvbSBjYXVzaW5nIGNvbnRpbnVvdXMgcmVnZW4gb24gd2F0Y2ggKCM1MjgsICM4MjAsICM4NjIpCgojIyMgU2l0ZSBFbmhhbmNlbWVudHMKCiAgKiBSZXNwb25zaWZ5ICgjODYwKQogICogRml4IHNwZWxsaW5nLCBwdW5jdHVhdGlvbiBhbmQgcGhyYXNhbCBlcnJvcnMgKCM5ODkpCiAgKiBVcGRhdGUgcXVpY2tzdGFydCBpbnN0cnVjdGlvbnMgd2l0aCBgbmV3YCBjb21tYW5kICgjOTY2KQogICogQWRkIGRvY3MgZm9yIHBhZ2UuZXhjZXJwdCAoIzk1NikKICAqIEFkZCBkb2NzIGZvciBwYWdlLnBhdGggKCM5NTEpCiAgKiBDbGVhbiB1cCBzaXRlIGRvY3MgdG8gcHJlcGFyZSBmb3IgMS4wIHJlbGVhc2UgKCM5MTgpCiAgKiBCcmluZyBzaXRlIGludG8gbWFzdGVyIGJyYW5jaCB3aXRoIGJldHRlciBwcmV2aWV3L2RlcGxveSAoIzcwOSkKICAqIFJlZGVzaWduZWQgc2l0ZSAoIzU4MykKCiMjIyBEZXZlbG9wbWVudCBGaXhlcwoKICAqIEV4Y2x1ZGUgQ3VjdW1iZXIgMS4yLjQsIHdoaWNoIGNhdXNlcyB0ZXN0cyB0byBmYWlsIGluIDEuOS4yICgjOTM4KQogICogQWRkZWQgImZlYXR1cmVzOmh0bWwiIHJha2UgdGFzayBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBjbGVhbmVkIHVwIEN1Y3VtYmVyIHByb2ZpbGVzICgjODMyKQogICogRXhwbGljaXRseSByZXF1aXJlIEhUVFBTIHJ1YnlnZW1zIHNvdXJjZSBpbiBHZW1maWxlICgjODI2KQogICogQ2hhbmdlZCBSdWJ5IHZlcnNpb24gZm9yIGRldmVsb3BtZW50IHRvIDEuOS4zLXAzNzQgZnJvbSBwMzYyICgjODAxKQogICogSW5jbHVkaW5nIGEgbGluayB0byB0aGUgR2l0SHViIFJ1Ynkgc3R5bGUgZ3VpZGUgaW4gQ09OVFJJQlVUSU5HLm1kICgjODA2KQogICogQWRkZWQgc2NyaXB0L2Jvb3RzdHJhcCAoIzc3NikKICAqIFJ1bm5pbmcgU2ltcGxlY292IHVuZGVyIDIgY29uZGl0aW9uczogRU5WKENPVkVSQUdFKT10cnVlIGFuZCB3aXRoIFJ1YnkgdmVyc2lvbiBvZiBncmVhdGVyIHRoYW4gMS45ICgjNzcxKQogICogU3dpdGNoIHRvIFNpbXBsZWNvdiBmb3IgY292ZXJhZ2UgcmVwb3J0ICgjNzY1KQoKIyMgMC4xMi4xIC8gMjAxMy0wMi0xOQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFVwZGF0ZSBLcmFtZG93biB2ZXJzaW9uIHRvIDAuMTQuMSAoIzc0NCkKICAqIFRlc3QgRW5oYW5jZW1lbnRzCiAgKiBVcGRhdGUgUmFrZSB2ZXJzaW9uIHRvIDEwLjAuMyAoIzc0NCkKICAqIFVwZGF0ZSBTaG91bGRhIHZlcnNpb24gdG8gMy4zLjIgKCM3NDQpCiAgKiBVcGRhdGUgUmVkY2FycGV0IHZlcnNpb24gdG8gMi4yLjIgKCM3NDQpCgojIyAwLjEyLjAgLyAyMDEyLTEyLTIyCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQWRkIGFiaWxpdHkgdG8gZXhwbGljaXRseSBzcGVjaWZ5IGluY2x1ZGVkIGZpbGVzICgjMjYxKQogICogQWRkIGAtLWRlZmF1bHQtbWltZXR5cGVgIG9wdGlvbiAoIzI3OSkKICAqIEFsbG93IHNldHRpbmcgb2YgUmVkQ2xvdGggb3B0aW9ucyAoIzI4NCkKICAqIEFkZCBgcG9zdF91cmxgIExpcXVpZCB0YWcgZm9yIGludGVybmFsIHBvc3QgbGlua2luZyAoIzM2OSkKICAqIEFsbG93IG11bHRpcGxlIHBsdWdpbiBkaXJzIHRvIGJlIHNwZWNpZmllZCAoIzQzOCkKICAqIElubGluZSBUT0MgdG9rZW4gc3VwcG9ydCBmb3IgUkRpc2NvdW50ICgjMzMzKQogICogQWRkIHRoZSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcGFnaW5hdGVkIHVybCBmb3JtYXQgKCMzNDIpCiAgKiBTd2FwIG91dCBhbGJpbm8gZm9yIHB5Z21lbnRzLnJiICgjNTY5KQogICogU3VwcG9ydCBSZWRjYXJwZXQgMiBhbmQgZmVuY2VkIGNvZGUgYmxvY2tzICgjNjE5KQogICogQmV0dGVyIHJlcG9ydGluZyBvZiBMaXF1aWQgZXJyb3JzICgjNjI0KQogICogQnVnIEZpeGVzCiAgKiBBbGxvdyBzb21lIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBoaWdobGlnaHQgbmFtZXMKICAqIFVSTCBlc2NhcGUgY2F0ZWdvcnkgbmFtZXMgaW4gVVJMIGdlbmVyYXRpb24gKCMzNjApCiAgKiBGaXggZXJyb3Igd2l0aCBgbGltaXRfcG9zdHNgICgjNDQyKQogICogUHJvcGVybHkgc2VsZWN0IGRvdGZpbGUgZHVyaW5nIGRpcmVjdG9yeSBzY2FuICgjMzYzLCAjNDMxLCAjMzc3KQogICogQWxsb3cgc2V0dGluZyBvZiBLcmFtZG93biBgc21hcnRfcXVvdGVzYCAoIzQ4MikKICAqIEVuc3VyZSBmcm9udCBtYXR0ZXIgaXMgYXQgc3RhcnQgb2YgZmlsZSAoIzU2MikKCiMjIDAuMTEuMiAvIDIwMTEtMTItMjcKCiAgKiBCdWcgRml4ZXMKICAqIEZpeCBnZW1zcGVjCgojIyAwLjExLjEgLyAyMDExLTEyLTI3CgogICogQnVnIEZpeGVzCiAgKiBGaXggZXh0cmEgYmxhbmsgbGluZSBpbiBoaWdobGlnaHQgYmxvY2tzICgjNDA5KQogICogVXBkYXRlIGRlcGVuZGVuY2llcwoKIyMgMC4xMS4wIC8gMjAxMS0wNy0xMAoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIEFkZCBjb21tYW5kIGxpbmUgaW1wb3J0ZXIgZnVuY3Rpb25hbGl0eSAoIzI1MykKICAqIEFkZCBSZWRjYXJwZXQgTWFya2Rvd24gc3VwcG9ydCAoIzMxOCkKICAqIE1ha2UgbWFya2Rvd24vdGV4dGlsZSBleHRlbnNpb25zIGNvbmZpZ3VyYWJsZSAoIzMxMikKICAqIEFkZCBgbWFya2Rvd25pZnlgIGZpbHRlcgoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFN3aXRjaCB0byBBbGJpbm8gZ2VtCiAgKiBCdW5kbGVyIHN1cHBvcnQKICAqIFVzZSBFbmdsaXNoIGxpYnJhcnkgdG8gYXZvaWQgaG9vcHMgKCMyOTIpCiAgKiBBZGQgUG9zdGVyb3VzIGltcG9ydGVyICgjMjU0KQogICogRml4ZXMgZm9yIFdvcmRwcmVzcyBpbXBvcnRlciAoIzI3NCwgIzI1MiwgIzI3MSkKICAqIEJldHRlciBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIHBvc3QgZGF0ZSAoIzI5MSkKICAqIFByaW50IGZvcm1hdHRlZCBmYXRhbCBleGNlcHRpb25zIHRvIHN0ZG91dCBvbiBidWlsZCBmYWlsdXJlCiAgKiBBZGQgVHVtYmxyIGltcG9ydGVyICgjMzIzKQogICogQWRkIEVua2kgaW1wb3J0ZXIgKCMzMjApCiAgKiBCdWcgRml4ZXMKICAqIFNlY3VyZSBhZGRpdGlvbmFsIHBhdGggZXhwbG9pdHMKCiMjIDAuMTAuMCAvIDIwMTAtMTItMTYKCiAgKiBCdWcgRml4ZXMKICAqIEFkZCBgLS1uby1zZXJ2ZXJgIG9wdGlvbi4KCiMjIDAuOS4wIC8gMjAxMC0xMi0xNQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIFVzZSBPcHRpb25QYXJzZXIncyBgW25vLV1gIGZ1bmN0aW9uYWxpdHkgZm9yIGJldHRlciBib29sZWFuIHBhcnNpbmcuCiAgKiBBZGQgRHJ1cGFsIG1pZ3JhdG9yICgjMjQ1KQogICogQ29tcGxhaW4gYWJvdXQgWUFNTCBhbmQgTGlxdWlkIGVycm9ycyAoIzI0OSkKICAqIFJlbW92ZSBvcnBoYW5lZCBmaWxlcyBkdXJpbmcgcmVnZW5lcmF0aW9uICgjMjQ3KQogICogQWRkIE1hcmxleSBtaWdyYXRvciAoIzI4KQoKIyMgMC44LjAgLyAyMDEwLTExLTIyCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQWRkIHdvcmRwcmVzcy5jb20gaW1wb3J0ZXIgKCMyMDcpCiAgKiBBZGQgYC0tbGltaXQtcG9zdHNgIGNsaSBvcHRpb24gKCMyMTIpCiAgKiBBZGQgYHVyaV9lc2NhcGVgIGZpbHRlciAoIzIzNCkKICAqIEFkZCBgLS1iYXNlLXVybGAgY2xpIG9wdGlvbiAoIzIzNSkKICAqIEltcHJvdmUgTVQgbWlncmF0b3IgKCMyMzgpCiAgKiBBZGQga3JhbWRvd24gc3VwcG9ydCAoIzIzOSkKICAqIEJ1ZyBGaXhlcwogICogRml4ZWQgZmlsZW5hbWUgYmFzZW5hbWUgZ2VuZXJhdGlvbiAoIzIwOCkKICAqIFNldCBtb2RlIHRvIFVURjggb24gU2VxdWVsIGNvbm5lY3Rpb25zICgjMjM3KQogICogUHJldmVudCBgX2luY2x1ZGVzYCBkaXIgZnJvbSBiZWluZyBhIHN5bWxpbmsKCiMjIDAuNy4wIC8gMjAxMC0wOC0yNAoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIEFkZCBzdXBwb3J0IGZvciByZGlzY291bnQgZXh0ZW5zaW9ucyAoIzE3MykKICAqIEJ1ZyBGaXhlcwogICogSGlnaGxpZ2h0IHNob3VsZCBub3QgYmUgYWJsZSB0byByZW5kZXIgbG9jYWwgZmlsZXMKICAqIFRoZSBzaXRlIGNvbmZpZ3VyYXRpb24gbWF5IG5vdCBhbHdheXMgcHJvdmlkZSBhICd0aW1lJyBzZXR0aW5nICgjMTg0KQoKIyMgMC42LjIgLyAyMDEwLTA2LTI1CgogICogQnVnIEZpeGVzCiAgKiBGaXggUmFrZWZpbGUgJ3JlbGVhc2UnIHRhc2sgKHRhZyBwdXNoaW5nIHdhcyBtaXNzaW5nIG9yaWdpbikKICAqIEVuc3VyZSB0aGF0IFJlZENsb3RoIGlzIGxvYWRlZCB3aGVuIHRleHRpbGl6ZSBmaWx0ZXIgaXMgdXNlZCAoIzE4MykKICAqIEV4cGFuZCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBhbmQgcGx1Z2luIHBhdGhzICgjMTgwKQogICogRml4IGBwYWdlLnVybGAgdG8gaW5jbHVkZSBmdWxsIHJlbGF0aXZlIHBhdGggKCMxODEpCgojIyAwLjYuMSAvIDIwMTAtMDYtMjQKCiAgKiBCdWcgRml4ZXMKICAqIEZpeCBNYXJrZG93biBQeWdtZW50cyBwcmVmaXggYW5kIHN1ZmZpeCAoIzE3OCkKCiMjIDAuNi4wIC8gMjAxMC0wNi0yMwoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIFByb3BlciBwbHVnaW4gc3lzdGVtICgjMTksICMxMDApCiAgKiBBZGQgc2FmZSBtb2RlIHNvIHVuc2FmZSBjb252ZXJ0ZXJzL2dlbmVyYXRvcnMgY2FuIGJlIGFkZGVkCiAgKiBNYXJ1a3UgaXMgbm93IHRoZSBvbmx5IHByb2Nlc3NvciBkZXBlbmRlbmN5IGluc3RhbGxlZCBieSBkZWZhdWx0LiBPdGhlciBwcm9jZXNzb3JzIHdpbGwgYmUgbGF6eS1sb2FkZWQgd2hlbiBuZWNlc3NhcnkgKGFuZCBwcm9tcHQgdGhlIHVzZXIgdG8gaW5zdGFsbCB0aGVtIHdoZW4gbmVjZXNzYXJ5KSAoIzU3KQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIEluY2x1c2lvbi9leGNsdXNpb24gb2YgZnV0dXJlIGRhdGVkIHBvc3RzICgjNTkpCiAgKiBHZW5lcmF0aW9uIGZvciBhIHNwZWNpZmljIHRpbWUgKCM1OSkKICAqIEFsbG9jYXRlIGBzaXRlLnRpbWVgIG9uIHJlbmRlciBub3QgcGVyIHNpdGVfcGF5bG9hZCBpbnZvY2F0aW9uICgjNTkpCiAgKiBQYWdlcyBub3cgcHJlc2VudCBpbiB0aGUgc2l0ZSBwYXlsb2FkIGFuZCBjYW4gYmUgdXNlZCB0aHJvdWdoIHRoZSBgc2l0ZS5wYWdlc2AgYW5kIGBzaXRlLmh0bWxfcGFnZXNgIHZhcmlhYmxlcwogICogR2VuZXJhdGUgcGhhc2UgYWRkZWQgdG8gc2l0ZSNwcm9jZXNzIGFuZCBwYWdpbmF0aW9uIGlzIG5vdyBhIGdlbmVyYXRvcgogICogU3dpdGNoIHRvIFJha2VHZW0gZm9yIGJ1aWxkL3Rlc3QgcHJvY2VzcwogICogT25seSByZWdlbmVyYXRlIHN0YXRpYyBmaWxlcyB3aGVuIHRoZXkgaGF2ZSBjaGFuZ2VkICgjMTQyKQogICogQWxsb3cgYXJiaXRyYXJ5IG9wdGlvbnMgdG8gUHlnbWVudHMgKCMzMSkKICAqIEFsbG93IFVSTCB0byBiZSBzZXQgdmlhIGNvbW1hbmQgbGluZSBvcHRpb24gKCMxNDcpCiAgKiBCdWcgRml4ZXMKICAqIFJlbmRlciBoaWdobGlnaHRlZCBjb2RlIGZvciBub24gbWFya2Rvd24vdGV4dGlsZSBwYWdlcyAoIzExNikKICAqIEZpeCBoaWdobGlnaHRpbmcgb24gUnVieSAxLjkgKCM2NSkKICAqIEZpeCBleHRlbnNpb24gbXVuZ2luZyB3aGVuIHByZXR0eSBwZXJtYWxpbmtzIGFyZSBlbmFibGVkICgjNjQpCiAgKiBTdG9wIHNvcnRpbmcgY2F0ZWdvcmllcyAoIzMzKQogICogUHJlc2VydmUgZ2VuZXJhdGVkIGF0dHJpYnV0ZXMgb3ZlciBmcm9udCBtYXR0ZXIgKCMxMTkpCiAgKiBGaXggc291cmNlIGRpcmVjdG9yeSBiaW5kaW5nIHVzaW5nIGBEaXIucHdkYCAoIzc1KQoKIyMgMC41LjcgLyAyMDEwLTAxLTEyCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogQWxsb3cgb3ZlcnJpZGluZyBvZiBwb3N0IGRhdGUgaW4gdGhlIGZyb250IG1hdHRlciAoIzYyLCAjMzgpCiAgKiBCdWcgRml4ZXMKICAqIENhdGVnb3JpZXMgaXNuJ3QgYWx3YXlzIGFuIGFycmF5ICgjNzMpCiAgKiBFbXB0eSB0YWdzIGNhdXNlcyBlcnJvciBpbiByZWFkX3Bvc3RzICgjODQpCiAgKiBGaXggcGFnaW5hdGlvbiB0byBhZGhlcmUgdG8gcmVhZC9yZW5kZXIvd3JpdGUgcGFyYWRpZ20KICAqIFRlc3QgRW5oYW5jZW1lbnQKICAqIEN1Y3VtYmVyIGZlYXR1cmVzIG5vIGxvbmdlciB1c2Ugc2l0ZS5wb3N0cy5maXJzdCB3aGVyZSBhIGJldHRlciBhbHRlcm5hdGl2ZSBpcyBhdmFpbGFibGUKCiMjIDAuNS42IC8gMjAxMC0wMS0wOAoKICAqIEJ1ZyBGaXhlcwogICogUmVxdWlyZSByZWRjbG90aCA+PSA0LjIuMSBpbiB0ZXN0cyAoIzkyKQogICogRG9uJ3QgYnJlYWsgb24gdHJpcGxlIGRhc2hlcyBpbiB5YW1sIGZyb250IG1hdHRlciAoIzkzKQoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIEFsbG93IC5ta2QgYXMgbWFya2Rvd24gZXh0ZW5zaW9uCiAgKiBVc2UgJHN0ZG91dC9lcnIgaW5zdGVhZCBvZiBjb25zdGFudHMgKCM5OSkKICAqIFByb3Blcmx5IHdyYXAgY29kZSBibG9ja3MgKCM5MSkKICAqIEFkZCBqYXZhc2NyaXB0IG1pbWUgdHlwZSBmb3Igd2VicmljayAoIzk4KQoKIyMgMC41LjUgLyAyMDEwLTAxLTA4CgogICogQnVnIEZpeGVzCiAgKiBGaXggcGFnaW5hdGlvbiAlIDAgYnVnICgjNzgpCiAgKiBFbnN1cmUgYWxsIHBvc3RzIGFyZSBwcm9jZXNzZWQgZmlyc3QgKCM3MSkgIyMgTk9URQogICogQWZ0ZXIgdGhpcyBwb2ludCBJIHdpbGwgbm8gbG9uZ2VyIGJlIGdpdmluZyBjcmVkaXQgaW4gdGhlIGhpc3Rvcnk7IHRoYXQgaXMgd2hhdCB0aGUgY29tbWl0IGxvZyBpcyBmb3IuCgojIyAwLjUuNCAvIDIwMDktMDgtMjMKCiAgKiBCdWcgRml4ZXMKICAqIERvIG5vdCBhbGxvdyBzeW1saW5rcyAoc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSkKCiMjIDAuNS4zIC8gMjAwOS0wNy0xNAoKICAqIEJ1ZyBGaXhlcwogICogU29sdmluZyB0aGUgcGVybWFsaW5rIGJ1ZyB3aGVyZSBub24taHRtbCBmaWxlcyB3b3VsZG4ndCB3b3JrIChAamVmZnJ5ZGVncmFuZGUpCgojIyAwLjUuMiAvIDIwMDktMDYtMjQKCiAgKiBFbmhhbmNlbWVudHMKICAqIEFkZGVkIC0tcGFnaW5hdGUgb3B0aW9uIHRvIHRoZSBleGVjdXRhYmxlIGFsb25nIHdpdGggYSBwYWdpbmF0b3Igb2JqZWN0IGZvciB0aGUgcGF5bG9hZCAoQGNhbGF2ZXJhKQogICogVXBncmFkZWQgUmVkQ2xvdGggdG8gNC4yLjEsIHdoaWNoIG1ha2VzIGA8bm90ZXh0aWxlPmAgdGFncyB3b3JrIG9uY2UgYWdhaW4uCiAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgc2V0IGluIGNvbmZpZy55bWwgYXJlIG5vdyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgc2l0ZSBwYXlsb2FkIChAdmlsY2FucykKICAqIFBvc3RzIGNhbiBub3cgaGF2ZSBhbiBlbXB0eSBZQU1MIGZyb250IG1hdHRlciBvciBub25lIGF0IGFsbCAoQCBiYWh1dnJpaGkpCiAgKiBCdWcgRml4ZXMKICAqIEZpeGluZyBSdWJ5IDEuOSBpc3N1ZSB0aGF0IHJlcXVpcmVzIGAjdG9fc2Agb24gdGhlIGVyciBvYmplY3QgKEBDaHJvbm9uYXV0KQogICogRml4ZXMgZm9yIHBhZ2luYXRpb24gYW5kIG9yZGVyaW5nIHBvc3RzIG9uIHRoZSBzYW1lIGRheSAoQHVqaCkKICAqIE1hZGUgcGFnZXMgcmVzcGVjdCBwZXJtYWxpbmtzIHN0eWxlIGFuZCBwZXJtYWxpbmtzIGluIHltbCBmcm9udCBtYXR0ZXIgKEBldWdlbmVib2xzaGFrb3YpCiAgKiBJbmRleC5odG1sIGZpbGUgc2hvdWxkIGFsd2F5cyBoYXZlIGluZGV4Lmh0bWwgcGVybWFsaW5rIChAZXVnZW5lYm9sc2hha292KQogICogQWRkZWQgdHJhaWxpbmcgc2xhc2ggdG8gcHJldHR5IHBlcm1hbGluayBzdHlsZSBzbyBBcGFjaGUgaXMgaGFwcHkgKEBldWdlbmVib2xzaGFrb3YpCiAgKiBCYWQgbWFya2Rvd24gcHJvY2Vzc29yIGluIGNvbmZpZyBmYWlscyBzb29uZXIgYW5kIHdpdGggYmV0dGVyIG1lc3NhZ2UgKEAgZ2Nub3Z1cykKICAqIEFsbG93IENSTEZzIGluIHlhbWwgZnJvbnQgbWF0dGVyIChAanVyZXR0YSkKICAqIEFkZGVkIERhdGUjeG1sc2NoZW1hIGZvciBSdWJ5IHZlcnNpb25zIDwgMS45CgojIyAwLjUuMSAvIDIwMDktMDUtMDYKCiMjIyBNYWpvciBFbmhhbmNlbWVudHMKCiAgKiBOZXh0L3ByZXZpb3VzIHBvc3RzIGluIHNpdGUgcGF5bG9hZCAoQHBhbnR1bGlzLCBAdG9tbykKICAqIFBlcm1hbGluayB0ZW1wbGF0aW5nIHN5c3RlbQogICogTW92ZWQgbW9zdCBvZiB0aGUgUkVBRE1FIG91dCB0byB0aGUgR2l0SHViIHdpa2kKICAqIEV4Y2x1ZGUgb3B0aW9uIGluIGNvbmZpZ3VyYXRpb24gc28gc3BlY2lmaWVkIGZpbGVzIHdvbid0IGJlIGJyb3VnaHQgb3ZlciB3aXRoIGdlbmVyYXRlZCBzaXRlIChAZHVyaXRvbmcpCiAgKiBCdWcgRml4ZXMKICAqIE1ha2luZyBzdXJlIGNvbmZpZy55YW1sIHJlZmVyZW5jZXMgYXJlIGFsbCBnb25lLCB1c2luZyBvbmx5IGNvbmZpZy55bWwKICAqIEZpeGVkIHN5bnRheCBoaWdobGlnaHRpbmcgYnJlYWtpbmcgZm9yIFVURi04IGNvZGUgKEBoZW5yaWspCiAgKiBXb3JrZWQgYXJvdW5kIFJEaXNjb3VudCBidWcgdGhhdCBwcmV2ZW50cyBNYXJrZG93biBmcm9tIGdldHRpbmcgcGFyc2VkIGFmdGVyIGhpZ2hsaWdodCAoQGhlbnJpaykKICAqIENHSSBlc2NhcGVkIHBvc3QgdGl0bGVzIChAQ2hyb25vbmF1dCkKCiMjIDAuNS4wIC8gMjAwOS0wNC0wNwoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIEFiaWxpdHkgdG8gc2V0IHBvc3QgY2F0ZWdvcmllcyB2aWEgWUFNTCAoQHFydXNoKQogICogQWJpbGl0eSB0byBzZXQgcHJldmVudCBhIHBvc3QgZnJvbSBwdWJsaXNoaW5nIHZpYSBZQU1MIChAcXJ1c2gpCiAgKiBBZGQgdGV4dGlsaXplIGZpbHRlciAoQHdpbGxjb2RlZm9yZm9vKQogICogQWRkICdwcmV0dHknIHBlcm1hbGluayBzdHlsZSBmb3Igd29yZHByZXNzLWxpa2UgdXJscyAoQGR5c2luZ2VyKQogICogTWFkZSBpdCBwb3NzaWJsZSB0byBlbnRlciBjYXRlZ29yaWVzIGZyb20gWUFNTCBhcyBhbiBhcnJheSAoQENocm9ub25hdXQpCiAgKiBJZ25vcmUgRW1hY3MgYXV0b3NhdmUgZmlsZXMgKEBDaHJvbm9uYXV0KQogICogQnVnIEZpeGVzCiAgKiBVc2UgYmxvY2sgc3ludGF4IG9mIHBvcGVuNCB0byBlbnN1cmUgdGhhdCBzdWJwcm9jZXNzZXMgYXJlIHByb3Blcmx5IGRpc3Bvc2VkIChAanFyKQogICogQ2xvc2Ugb3BlbjQgc3RyZWFtcyB0byBwcmV2ZW50IHpvbWJpZXMgKEBydG9tYXlrbykKICAqIE9ubHkgcXVlcnkgcmVxdWlyZWQgZmllbGRzIGZyb20gdGhlIFdQIERhdGFiYXNlIChAYXJpZWphbikKICAqIFByZXZlbnQgYF9wb3N0c2AgZnJvbSBiZWluZyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSAoQGJkaW1jaGVmZikKICAqIFJlZmFjdG9ycwogICogRmFjdG9yZWQgdGhlIGZpbHRlcmluZyBjb2RlIGludG8gYSBtZXRob2QgKEBDaHJvbm9uYXV0KQogICogRml4IHRlc3RzIGFuZCBjb252ZXJ0IHRvIFNob3VsZGEgKEBxcnVzaCwgQHRlY2huaWNhbHBpY2tsZXMpCiAgKiBBZGQgQ3VjdW1iZXIgYWNjZXB0YW5jZSB0ZXN0IHN1aXRlIChAcXJ1c2gsIEB0ZWNobmljYWxwaWNrbGVzKQoKIyMgMC40LjEKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBDaGFuZ2VkIGRhdGUgZm9ybWF0IG9uIHdvcmRwcmVzcyBjb252ZXJ0ZXIgKHplcm9wYWRkaW5nKSAoQGR5c2luZ2VyKQogICogQnVnIEZpeGVzCiAgKiBBZGQgSmVreWxsIGJpbmFyeSBhcyBleGVjdXRhYmxlIHRvIGdlbXNwZWMgKEBkeXNpbmdlcikKCiMjIDAuNC4wIC8gMjAwOS0wMi0wMwoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIFN3aXRjaCB0byBKZXdlbGVyIGZvciBwYWNrYWdpbmcgdGFza3MKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBUeXBlIGltcG9ydGVyIChAY29kZXNsaW5nZXIpCiAgKiBgc2l0ZS50b3BpY3NgIGFjY2Vzc29yIChAYmF6KQogICogQWRkIGBhcnJheV90b19zZW50ZW5jZV9zdHJpbmdgIGZpbHRlciAoQG1jaHVuZykKICAqIEFkZCBhIGNvbnZlcnRlciBmb3IgdGV4dHBhdHRlcm4gKEBQZXJmZWN0bHlOb3JtYWwpCiAgKiBBZGQgYSB3b3JraW5nIE1lcGhpc3RvIC8gTXlTUUwgY29udmVydGVyIChAaXZleSkKICAqIEFsbG93aW5nIC5odGFjY2VzcyBmaWxlcyB0byBiZSBjb3BpZWQgb3ZlciBpbnRvIHRoZSBnZW5lcmF0ZWQgc2l0ZSAoQGJyaWFuZG9sbCkKICAqIEFkZCBvcHRpb24gdG8gbm90IHB1dCBmaWxlIGRhdGUgaW4gcGVybWFsaW5rIFVSTCAoQG1yZWlkKQogICogQWRkIGxpbmUgbnVtYmVyIGNhcGFiaWxpdGllcyB0byBoaWdobGlnaHQgYmxvY2tzIChAamNvbikKICAqIEJ1ZyBGaXhlcwogICogRml4IHBlcm1hbGluayBiZWhhdmlvciAoQGNhdmFsbGUpCiAgKiBGaXhlZCBhbiBpc3N1ZSB3aXRoIHB5Z21lbnRzLCBtYXJrZG93biwgYW5kIG5ld2xpbmVzIChAenBpbnRlcikKICAqIEFtcGVyc2FuZHMgbmVlZCB0byBiZSBlc2NhcGVkIChAcHVmdXdvenUsIEBhcCkKICAqIFRlc3QgYW5kIGZpeCB0aGUgc2l0ZS5jYXRlZ29yaWVzIGhhc2ggKEB6em90KQogICogRml4IHNpdGUgcGF5bG9hZCBhdmFpbGFibGUgdG8gZmlsZXMgKEBtYXRyaXg5MTgwKQoKIyMgMC4zLjAgLyAyMDA4LTEyLTI0CgojIyMgTWFqb3IgRW5oYW5jZW1lbnRzCgogICogQWRkZWQgYC0tc2VydmVyYCBvcHRpb24gdG8gc3RhcnQgYSBzaW1wbGUgV0VCcmljayBzZXJ2ZXIgb24gZGVzdGluYXRpb24gZGlyZWN0b3J5IChAam9obnJlaWxseSBhbmQgQG1jaHVuZykKCiMjIyBNaW5vciBFbmhhbmNlbWVudHMKCiAgKiBBZGRlZCBwb3N0IGNhdGVnb3JpZXMgYmFzZWQgb24gZGlyZWN0b3JpZXMgY29udGFpbmluZyBgX3Bvc3RzYCAoQG1yZWlkKQogICogQWRkZWQgcG9zdCB0b3BpY3MgYmFzZWQgb24gZGlyZWN0b3JpZXMgdW5kZXJuZWF0aCBgX3Bvc3RzYAogICogQWRkZWQgbmV3IGRhdGUgZmlsdGVyIHRoYXQgc2hvd3MgdGhlIGZ1bGwgbW9udGggbmFtZSAoQG1yZWlkKQogICogTWVyZ2UgUG9zdCdzIFlBTUwgZnJvbnQgbWF0dGVyIGludG8gaXRzIHRvX2xpcXVpZCBwYXlsb2FkIChAcmVtaSkKICAqIFJlc3RyaWN0IGluY2x1ZGVzIHRvIHJlZ3VsYXIgZmlsZXMgdW5kZXJuZWF0aCBgX2luY2x1ZGVzYAogICogQnVnIEZpeGVzCiAgKiBDaGFuZ2UgWUFNTCBkZWxpbWl0ZXIgbWF0Y2hlciBzbyBhcyB0byBub3QgY2hldyB1cCAybmQgbGV2ZWwgbWFya2Rvd24gaGVhZGVycyAoQG1yZWlkKQogICogRml4IGJ1ZyB0aGF0IG1lYW50IHBhZ2UgZGF0YSAoc3VjaCBhcyB0aGUgZGF0ZSkgd2FzIG5vdCBhdmFpbGFibGUgaW4gdGVtcGxhdGVzIChAbXJlaWQpCiAgKiBQcm9wZXJseSByZWplY3QgZGlyZWN0b3JpZXMgaW4gYF9sYXlvdXRzYAoKIyMgMC4yLjEgLyAyMDA4LTEyLTE1CgogICogTWFqb3IgQ2hhbmdlcwogICogVXNlIE1hcnVrdSAocHVyZSBSdWJ5KSBmb3IgTWFya2Rvd24gYnkgZGVmYXVsdCAoQG1yZWlkKQogICogQWxsb3cgdXNlIG9mIFJEaXNjb3VudCB3aXRoIGAtLXJkaXNjb3VudGAgZmxhZwoKIyMjIE1pbm9yIEVuaGFuY2VtZW50cwoKICAqIERvbid0IGxvYWQgZGlyZWN0b3J5X3dhdGNoZXIgdW5sZXNzIGl0J3MgbmVlZGVkIChAcGpoeWV0dCkKCiMjIDAuMi4wIC8gMjAwOC0xMi0xNAoKICAqIE1ham9yIENoYW5nZXMKICAqIHJlbGF0ZWRfcG9zdHMgaXMgbm93IGZvdW5kIGluIGBzaXRlLnJlbGF0ZWRfcG9zdHNgCgojIyAwLjEuNiAvIDIwMDgtMTItMTMKCiAgKiBNYWpvciBGZWF0dXJlcwogICogSW5jbHVkZSBmaWxlcyBpbiBgX2luY2x1ZGVzYCB3aXRoIGB7JSBpbmNsdWRlIHgudGV4dGlsZSAlfWAKCiMjIDAuMS41IC8gMjAwOC0xMi0xMgoKIyMjIE1ham9yIEVuaGFuY2VtZW50cwoKICAqIENvZGUgaGlnaGxpZ2h0aW5nIHdpdGggUHlnbWVudHMgaWYgYC0tcHlnbWVudHNgIGlzIHNwZWNpZmllZAogICogRGlzYWJsZSB0cnVlIExTSSBieSBkZWZhdWx0LCBlbmFibGUgd2l0aCBgLS1sc2lgCgojIyMgTWlub3IgRW5oYW5jZW1lbnRzCgogICogT3V0cHV0IGluZm9ybWF0aXZlIG1lc3NhZ2UgaWYgUkRpc2NvdW50IGlzIG5vdCBhdmFpbGFibGUgKEBKYWNrRGFuZ2VyKQogICogQnVnIEZpeGVzCiAgKiBQcmV2ZW50IEpla3lsbCBmcm9tIHBpY2tpbmcgdXAgdGhlIG91dHB1dCBkaXJlY3RvcnkgYXMgYSBzb3VyY2UgKEBKYWNrRGFuZ2VyKQogICogU2tpcCBgcmVsYXRlZF9wb3N0c2Agd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBwb3N0IChASmFja0RhbmdlcikKCiMjIDAuMS40IC8gMjAwOC0xMi0wOAoKICAqIEJ1ZyBGaXhlcwogICogREFUQSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IHdpdGggcnVieWdlbXMKCiMjIDAuMS4zIC8gMjAwOC0xMi0wNgoKICAqIE1ham9yIEZlYXR1cmVzCiAgKiBNYXJrZG93biBzdXBwb3J0IChAdmFucGVsdCkKICAqIE1lcGhpc3RvIGFuZCBDU1YgY29udmVydGVycyAoQHZhbnBlbHQpCiAgKiBDb2RlIGhpbGlnaHRpbmcgKEB2YW5wZWx0KQogICogQXV0b2J1aWxkCiAgKiBCdWcgRml4ZXMKICAqIEFjY2VwdCBib3RoIGBcclxuYCBhbmQgYFxuYCBpbiBZQU1MIGhlYWRlciAoQHZhbnBlbHQpCgojIyAwLjEuMiAvIDIwMDgtMTEtMjIKCiAgKiBNYWpvciBGZWF0dXJlcwogICogQWRkIGEgcmVhbCAicmVsYXRlZCBwb3N0cyIgaW1wbGVtZW50YXRpb24gdXNpbmcgQ2xhc3NpZmllcgogICogQ29tbWFuZCBMaW5lIENoYW5nZXMKICAqIEFsbG93IGNsaSB0byBiZSBjYWxsZWQgd2l0aCAwLCAxLCBvciAyIGFyZ3MgaW50dWl0aW5nIGRpciBwYXRocyBpZiB0aGV5IGFyZSBvbWl0dGVkCgojIyAwLjEuMSAvIDIwMDgtMTEtMjIKCiAgKiBNaW5vciBBZGRpdGlvbnMKICAqIFBvc3RzIG5vdyBzdXBwb3J0IGludHJvc3BlY3Rpb25hbCBkYXRhIGUuZy4gYHt7IHBhZ2UudXJsIH19YAoKIyMgMC4xLjAgLyAyMDA4LTExLTA1CgogICogRmlyc3QgcmVsZWFzZQogICogQ29udmVydHMgcG9zdHMgd3JpdHRlbiBpbiBUZXh0aWxlCiAgKiBDb252ZXJ0cyByZWd1bGFyIHNpdGUgcGFnZXMKICAqIFNpbXBsZSBjb3B5IG9mIGJpbmFyeSBmaWxlcwoKIyMgMC4wLjAgLyAyMDA4LTEwLTE5CgogICogQmlydGhkYXkhCg== \ No newline at end of file +## HEAD + +### Minor Enhancements + + * Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` (#4277) + * Add 'sample' Liquid filter Equivalent to Array#sample functionality (#4223) + * Cache parsed include file to save liquid parsing time. (#4120) + * Slightly speed up url sanitization and handle multiples of ///. (#4168) + * Print debug message when a document is skipped from reading (#4180) + * Include tag should accept multiple variables in the include name (#4183) + * Add `-o` option to serve command which opens server URL (#4144) + * Add CodeClimate platform for better code quality. (#4220) + * General improvements for WEBrick via jekyll serve such as SSL & custom headers (#4224, #4228) + * Add a default charset to content-type on webrick. (#4231) + * Switch `PluginManager` to use `require_with_graceful_fail` for better UX (#4233) + * Allow quoted date in front matter defaults (#4184) + * Add a Jekyll doctor warning for URLs that only differ by case (#3171) + * drops: create one base Drop class which can be set as mutable or not (#4285) + * drops: provide `#to_h` to allow for hash introspection (#4281) + * Shim subcommands with indication of gem possibly required so users know how to use them (#4254) + +### Bug Fixes + + * Pass build options into `clean` command (#4177) + * Allow users to use .htm and .xhtml (XHTML5.) (#4160) + * Prevent Shell Injection. (#4200) + * Convertible should make layout data accessible via `layout` instead of `page` (#4205) + * Avoid using `Dir.glob` with absolute path to allow special characters in the path (#4150) + * Handle empty config files (#4052) + * Rename `@options` so that it does not impact Liquid. (#4173) + * utils/drops: update Drop to support `Utils.deep_merge_hashes` (#4289) + * Make sure jekyll/drops/drop is loaded first. (#4292) + * Convertible/Page/Renderer: use payload hash accessor & setter syntax for backwards-compatibility (#4311) + * Drop: fix hash setter precendence (#4312) + * utils: `has_yaml_header?` should accept files with extraneous spaces (#4290) + * Escape html from site.title and page.title in site template (#4307) + +### Development Fixes + + * `jekyll-docs` should be easily release-able (#4152) + * Allow use of Cucumber 2.1 or greater (#4181) + * Modernize Kramdown for Markdown converter. (#4109) + * Change TestDoctorCommand to JekyllUnitTest... (#4263) + * Create namespaced rake tasks in separate `.rake` files under `lib/tasks` (#4282) + * markdown: refactor for greater readability & efficiency (#3771) + * Fix many Rubocop style errors (#4301) + * Fix spelling of "GitHub" in docs and history (#4322) + * Reorganize and cleanup the Gemfile, shorten required depends. (#4318) + +### Site Enhancements + + * Add three plugins to directory (#4163) + * Add upgrading docs from 2.x to 3.x (#4157) + * Add `protect_email` to the plugins index. (#4169) + * Add `jekyll-deploy` to list of third-party plugins (#4179) + * Clarify plugin docs (#4154) + * Add Kickster to deployment methods in documentation (#4190) + * Add DavidBurela's tutorial for Windows to Windows docs page (#4210) + * Change GitHub code block to highlight tag to avoid it overlaps parent div (#4121) + * Update FormKeep link to be something more specific to Jekyll (#4243) + * Remove example Roger Chapman site, as the domain doesn't exist (#4249) + * Added configuration options for `draft_posts` to configuration docs (#4251) + * Fix checklist in `_assets.md` (#4259) + * Add Markdown examples to Pages docs (#4275) + * Add jekyll-paginate-category to list of third-party plugins (#4273) + * Add `jekyll-responsive_image` to list of third-party plugins (#4286) + * Add `jekyll-commonmark` to list of third-party plugins (#4299) + * Add documentation for incremental regeneration (#4293) + * Add note about removal of relative permalink support in upgrading docs (#4303) + * Add Pro Tip to use front matter variable to create clean URLs (#4296) + +## 3.0.1 / 2015-11-17 + +### Bug Fixes + + * Document: only superdirectories of the collection are categories (#4110) + * `Convertible#render_liquid` should use `render!` to cause failure on bad Liquid (#4077) + * Don't generate `.jekyll-metadata` in non-incremental build (#4079) + * Set `highlighter` config val to `kramdown.syntax_highlighter` (#4090) + * Align hooks implementation with documentation (#4104) + * Fix the deprecation warning in the doctor command (#4114) + * Fix case in `:title` and add `:slug` which is downcased (#4100) + +### Development Fixes + + * Fix test warnings when doing rake {test,spec} or script/test (#4078) + +### Site Enhancements + + * Update normalize.css to v3.0.3. (#4085) + * Update Font Awesome to v4.4.0. (#4086) + * Adds a note about installing the jekyll-gist gem to make gist tag work (#4101) + * Align hooks documentation with implementation (#4104) + * Add Jekyll Flickr Plugin to the list of third party plugins (#4111) + * Remove link to now-deleted blog post (#4125) + * Update the liquid syntax in the pagination docs (#4130) + * Add jekyll-language-plugin to plugins.md (#4134) + * Updated to reflect feedback in #4129 (#4137) + * Clarify assets.md based on feedback of #4129 (#4142) + * Re-correct the liquid syntax in the pagination docs (#4140) + +## 3.0.0 / 2015-10-26 + +### Major Enhancements + + * Liquid profiler (i.e. know how fast or slow your templates render) (#3762) + * Incremental regeneration (#3116) + * Add Hooks: a new kind of plugin (#3553) + * Upgrade to Liquid 3.0.0 (#3002) + * `site.posts` is now a Collection instead of an Array (#4055) + * 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) + * Move to Rouge as default highlighter (#3323) + * Mimic GitHub Pages `.html` extension stripping behavior in WEBrick (#3452) + * Always include file extension on output files (#3490) + * Improved permalinks for pages and collections (#3538) + * 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) + * Add a Code of Conduct for the Jekyll project (#3925) + * Added permalink time variables (#3990) + * Add `--incremental` flag to enable incremental regen (disabled by default) (#4059) + +### Minor Enhancements + + * Deprecate access to Document#data properties and Collection#docs methods (#4058) + * Sort static files just once, and call `site_payload` once for all collections (#3204) + * Separate `jekyll docs` and optimize external gem handling (#3241) + * Improve `Site#getConverterImpl` and call it `Site#find_converter_instance` (#3240) + * Use relative path for `path` Liquid variable in Documents for consistency (#2908) + * Generalize `Utils#slugify` for any scripts (#3047) + * Added basic microdata to post template in site template (#3189) + * Store log messages in an array of messages. (#3244) + * Allow collection documents to override `output` property in front matter (#3172) + * Keep file modification times between builds for static files (#3220) + * Only downcase mixed-case categories for the URL (#2571) + * Added per post `excerpt_separator` functionality (#3274) + * Allow collections YAML to end with three dots (#3134) + * Add mode parameter to `slugify` Liquid filter (#2918) + * Perf: `Markdown#matches` should avoid regexp (#3321) + * Perf: Use frozen regular expressions for `Utils#slugify` (#3321) + * Split off Textile support into jekyll-textile-converter (#3319) + * Improve the navigation menu alignment in the site template on small + screens (#3331) + * Show the regeneration time after the initial generation (#3378) + * Site template: Switch default font to Helvetica Neue (#3376) + * Make the `include` tag a teensy bit faster. (#3391) + * Add `pkill -f jekyll` to ways to kill. (#3397) + * Site template: collapsed, variable-driven font declaration (#3360) + * Site template: Don't always show the scrollbar in code blocks (#3419) + * Site template: Remove undefined `text` class from `p` element (#3440) + * Site template: Optimize text rendering for legibility (#3382) + * Add `draft?` method to identify if Post is a Draft & expose to Liquid (#3456) + * Write regeneration metadata even on full rebuild (#3464) + * Perf: Use `String#end_with?("/")` instead of regexp when checking paths (#3516) + * Docs: document 'ordinal' built-in permalink style (#3532) + * Upgrade liquid-c to 3.x (#3531) + * Use consistent syntax for deprecation warning (#3535) + * Added build --destination and --source flags (#3418) + * Site template: remove unused `page.meta` attribute (#3537) + * Improve the error message when sorting null objects (#3520) + * Added liquid-md5 plugin (#3598) + * Documentation: RR replaced with RSpec Mocks (#3600) + * Documentation: Fix subpath. (#3599) + * Create 'tmp' dir for test_tags if it doesn't exist (#3609) + * Extract reading of data from `Site` to reduce responsibilities. (#3545) + * Removed the word 'Jekyll' a few times from the comments (#3617) + * `bin/jekyll`: with no args, exit with exit code 1 (#3619) + * Incremental build if destination file missing (#3614) + * Static files `mtime` liquid should return a `Time` obj (#3596) + * Use `Jekyll::Post`s for both LSI indexing and lookup. (#3629) + * Add `charset=utf-8` for HTML and XML pages in WEBrick (#3649) + * Set log level to debug when verbose flag is set (#3665) + * Added a mention on the Gemfile to complete the instructions (#3671) + * Perf: Cache `Document#to_liquid` and invalidate where necessary (#3693) + * Perf: `Jekyll::Cleaner#existing_files`: Call `keep_file_regex` and + `keep_dirs` only once, not once per iteration (#3696) + * Omit jekyll/jekyll-help from list of resources. (#3698) + * Add basic `jekyll doctor` test to detect fsnotify (OSX) anomalies. (#3704) + * Added talk.jekyllrb.com to "Have questions?" (#3694) + * 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) + * Make the directory for includes configurable (#3782) + * Rename directory configurations to match `*_dir` convention for consistency (#3782) + * Internal: trigger hooks by owner symbol (#3871) + * Update MIME types from mime-db (#3933) + * Add header to site template `_config.yml` for clarity & direction (#3997) + * Site template: add timezone offset to post date frontmatter (#4001) + * Make a constant for the regex to find hidden files (#4032) + * Site template: refactor github & twitter icons into includes (#4049) + * Site template: add background to Kramdown Rouge-ified backtick code blocks (#4053) + +### Bug Fixes + + * `post_url`: fix access deprecation warning & fix deprecation msg (#4060) + * Perform jekyll-paginate deprecation warning correctly. (#3580) + * Make permalink parsing consistent with pages (#3014) + * `time()`pre-filter method should accept a `Date` object (#3299) + * Remove unneeded end tag for `link` in site template (#3236) + * Kramdown: Use `enable_coderay` key instead of `use_coderay` (#3237) + * Unescape `Document` output path (#2924) + * Fix nav items alignment when on multiple rows (#3264) + * Highlight: Only Strip Newlines/Carriage Returns, not Spaces (#3278) + * Find variables in front matter defaults by searching with relative file path. (#2774) + * Allow variables (e.g `:categories`) in YAML front matter permalinks (#3320) + * Handle nil URL placeholders in permalinks (#3325) + * Template: Fix nav items alignment when in "burger" mode (#3329) + * Template: Remove `!important` from nav SCSS introduced in #3329 (#3375) + * The `:title` URL placeholder for collections should be the filename slug. (#3383) + * Trim the generate time diff to just 3 places past the decimal place (#3415) + * The highlight tag should only clip the newlines before and after the *entire* block, not in between (#3401) + * highlight: fix problem with linenos and rouge. (#3436) + * `Site#read_data_file`: read CSV's with proper file encoding (#3455) + * Ignore `.jekyll-metadata` in site template (#3496) + * Template: Point documentation link to the documentation pages (#3502) + * Removed the trailing slash from the example `/blog` baseurl comment (#3485) + * Clear the regenerator cache every time we process (#3592) + * Readd (bring back) minitest-profile (#3628) + * Add WOFF2 font MIME type to Jekyll server MIME types (#3647) + * Be smarter about extracting the extname in `StaticFile` (#3632) + * Process metadata for all dependencies (#3608) + * Show error message if the YAML front matter on a page/post is invalid. (#3643) + * Upgrade redcarpet to 3.2 (Security fix: OSVDB-120415) (#3652) + * Create #mock_expects that goes directly to RSpec Mocks. (#3658) + * Open `.jekyll-metadata` in binary mode to read binary Marshal data (#3713) + * 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) + * Set `future` to `false` in the default config (#3892) + * filters: `where` should compare stringified versions of input & comparator (#3935) + * Read build options for `jekyll clean` command (#3828) + * Fix #3970: Use Gem::Version to compare versions, not `>`. + * Abort if no subcommand. Fixes confusing message. (#3992) + * Whole-post excerpts should match the post content (#4004) + * Change default font weight to 400 to fix bold/strong text issues (#4050) + * Document: Only auto-generate the excerpt if it's not overridden (#4062) + * Utils: `deep_merge_hashes` should also merge `default_proc` (45f69bb) + * Defaults: compare paths in `applies_path?` as `String`s to avoid confusion (7b81f00) + +### Development Fixes + + * Remove loader.rb and "modernize" `script/test`. (#3574) + * Improve the grammar in the documentation (#3233) + * Update the LICENSE text to match the MIT license exactly (#3253) + * Update rake task `site:publish` to fix minor bugs. (#3254) + * Switch to shields.io for the README badges. (#3255) + * Use `FileList` instead of `Dir.glob` in `site:publish` rake task (#3261) + * Fix test script to be platform-independent (#3279) + * Instead of symlinking `/tmp`, create and symlink a local `tmp` in the tests (#3258) + * Fix some spacing (#3312) + * Fix comment typo in `lib/jekyll/frontmatter_defaults.rb` (#3322) + * Move all `regenerate?` checking to `Regenerator` (#3326) + * Factor out a `read_data_file` call to keep things clean (#3380) + * Proof the site with CircleCI. (#3427) + * Update LICENSE to 2015. (#3477) + * Upgrade tests to use Minitest (#3492) + * Remove trailing whitespace (#3497) + * Use `fixture_site` for Document tests (#3511) + * Remove adapters deprecation warning (#3529) + * Minor fixes to `url.rb` to follow GitHub style guide (#3544) + * Minor changes to resolve deprecation warnings (#3547) + * Convert remaining textile test documents to markdown (#3528) + * Migrate the tests to use rspec-mocks (#3552) + * Remove `activesupport` (#3612) + * Added tests for `Jekyll:StaticFile` (#3633) + * 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) + * Add script to vendor mime types (#3933) + * Ignore .bundle dir in SimpleCov (#4033) + +### Site Enhancements + + * Add 'info' labels to certain notes in collections docs (#3601) + * Remove extra spaces, make the last sentence less awkward in permalink docs (#3603) + * Update the permalinks documentation to reflect the updates for 3.0 (#3556) + * Add blog post announcing Jekyll Help (#3523) + * Add Jekyll Talk to Help page on site (#3518) + * Change Ajax pagination resource link to use HTTPS (#3570) + * Fixing the default host on docs (#3229) + * Add `jekyll-thumbnail-filter` to list of third-party plugins (#2790) + * Add link to 'Adding Ajax pagination to Jekyll' to Resources page (#3186) + * Add a Resources link to tutorial on building dynamic navbars (#3185) + * Semantic structure improvements to the post and page layouts (#3251) + * Add new AsciiDoc plugin to list of third-party plugins. (#3277) + * Specify that all transformable collection documents must contain YAML front matter (#3271) + * Assorted accessibility fixes (#3256) + * Update configuration docs to mention `keep_files` for `destination` (#3288, #3296) + * Break when we successfully generate nav link to save CPU cycles. (#3291) + * Update usage docs to mention `keep_files` and a warning about `destination` cleaning (#3295) + * Add logic to automatically generate the `next_section` and `prev_section` navigation items (#3292) + * Some small fixes for the Plugins TOC. (#3306) + * Added versioning comment to configuration file (#3314) + * Add `jekyll-minifier` to list of third-party plugins (#3333) + * Add blog post about the Jekyll meet-up (#3332) + * Use `highlight` Liquid tag instead of the four-space tabs for code (#3336) + * 3.0.0.beta1 release post (#3346) + * Add `twa` to the list of third-party plugins (#3384) + * Remove extra spaces (#3388) + * Fix small grammar errors on a couple pages (#3396) + * Fix typo on Templates docs page (#3420) + * s/three/four for plugin type list (#3424) + * Release jekyllrb.com as a locally-compiled site. (#3426) + * Add a jekyllrb.com/help page which elucidates places from which to get help (#3428) + * Remove extraneous dash on Plugins doc page which caused a formatting error (#3431) + * Fix broken link to Jordan Thornquest's website. (#3438) + * Change the link to an extension (#3457) + * Fix Twitter link on the help page (#3466) + * Fix wording in code snippet highlighting section (#3475) + * Add a `/` to `paginate_path` in the Pagination documentation (#3479) + * Add a link on all the docs pages to "Improve this page". (#3510) + * Add jekyll-auto-image generator to the list of third-party plugins (#3489) + * Replace link to the proposed `picture` element spec (#3530) + * Add frontmatter date formatting information (#3469) + * Improve consistency and clarity of plugins options note (#3546) + * Add permalink warning to pagination docs (#3551) + * Fix grammar in Collections docs API stability warning (#3560) + * Restructure `excerpt_separator` documentation for clarity (#3550) + * Fix accidental line break in collections docs (#3585) + * Add information about the `.jekyll-metadata` file (#3597) + * Document addition of variable parameters to an include (#3581) + * Add `jekyll-files` to the list of third-party plugins. (#3586) + * Define the `install` step in the CI example `.travis.yml` (#3622) + * Expand collections documentation. (#3638) + * Add the "warning" note label to excluding `vendor` in the CI docs page (#3623) + * Upgrade pieces of the Ugrading guide for Jekyll 3 (#3607) + * Showing how to access specific data items (#3468) + * Clarify pagination works from within HTML files (#3467) + * Add note to `excerpt_separator` documentation that it can be set globally (#3667) + * Fix some names on Troubleshooting page (#3683) + * Add `remote_file_content` tag plugin to list of third-party plugins (#3691) + * Update the Redcarpet version on the Configuration page. (#3743) + * Update the link in the welcome post to point to Jekyll Talk (#3745) + * 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) + * Add `jekyll-youtube` to the list of third-party plugins (#3931) + * Add Views Router plugin (#3950) + * Update install docs (Core dependencies, Windows reqs, etc) (#3769) + * Use Jekyll Feed for jekyllrb.com (#3736) + * Add jekyll-umlauts to plugins.md ($3966) + * Troubleshooting: fix broken link, add other mac-specific info (#3968) + * Add a new site for learning purposes (#3917) + * Added documentation for Jekyll environment variables (#3989) + * Fix broken configuration documentation page (#3994) + * Add troubleshooting docs for installing on El Capitan (#3999) + * Add Lazy Tweet Embedding to the list of third-party plugins (#4015) + * Add installation instructions for 2 of 3 options for plugins (#4013) + * Add alternative jekyll gem installation instructions (#4018) + * Fix a few typos and formatting problems. (#4022) + * Fix pretty permalink example (#4029) + * Note that `_config.yml` is not reloaded during regeneration (#4034) + * Apply code block figure syntax to blocks in CONTRIBUTING (#4046) + * Add jekyll-smartify to the list of third-party plugins (#3572) + +## 2.5.3 / 2014-12-22 + +### Bug Fixes + + * When checking a Markdown extname, include position of the `.` (#3147) + * Fix `jsonify` Liquid filter handling of boolean values (#3154) + * Add comma to value of `viewport` meta tag (#3170) + * Set the link type for the RSS feed to `application/rss+xml` (#3176) + * Refactor `#as_liquid` (#3158) + +### Development Fixes + + * Exclude built-in bundles from being added to coverage report (#3180) + +### Site Enhancements + + * Add `@alfredxing` to the `@jekyll/core` team. :tada: (#3218) + * Document the `-q` option for the `build` and `serve` commands (#3149) + * Fix some minor typos/flow fixes in documentation website content (#3165) + * Add `keep_files` to configuration documentation (#3162) + * Repeat warning about cleaning of the `destination` directory (#3161) + * Add jekyll-500px-embed to list of third-party plugins (#3163) + * Simplified platform detection in Gemfile example for Windows (#3177) + * Add the `jekyll-jalali` plugin added to the list of third-party plugins. (#3198) + * Add Table of Contents to Troubleshooting page (#3196) + * Add `inline_highlight` plugin to list of third-party plugins (#3212) + * Add `jekyll-mermaid` plugin to list of third-party plugins (#3222) + +## 2.5.2 / 2014-11-17 + +### Minor Enhancements + + * `post_url` should match `post.name` instead of slugs and dates (#3058) + +### Bug Fixes + + * Fix bundle require for `:jekyll_plugins` (#3119) + * Remove duplicate regexp phrase: `^\A` (#3089) + * Remove duplicate `Conversion error:` message in `Convertible` (#3088) + * Print full conversion error message in `Renderer#convert` (#3090) + +### Site Enhancements + + * Change variable names in Google Analytics script (#3093) + * Mention CSV files in the docs for data files (#3101) + * Add trailing slash to `paginate_path` example. (#3091) + * Get rid of noifniof (`excerpt_separator`) (#3094) + * Sass improvements, around nesting mostly. (#3123) + * Add webmentions.io plugin to the list of third-party plugins (#3127) + * Add Sass mixins and use them. (#2904) + * Slightly compress jekyll-sticker.jpg. (#3133) + * Update gridism and separate out related but custom styles. (#3132) + * Add remote-include plugin to list of third-party plugins (#3136) + +## 2.5.1 / 2014-11-09 + +### Bug Fixes + + * Fix path sanitation bug related to Windows drive names (#3077) + +### Development Fixes + + * Add development time dependencies on minitest and test-unit to gemspec for cygwin (#3064) + * Use Travis's built-in caching. (#3075) + +## 2.5.0 / 2014-11-06 + +### Minor Enhancements + + * Require gems in `:jekyll_plugins` Gemfile group unless `JEKYLL_NO_BUNDLER_REQUIRE` is specified in the environment. (#2865) + * Centralize path sanitation in the `Site` object (#2882) + * Allow placeholders in permalinks (#3031) + * Allow users to specify the log level via `JEKYLL_LOG_LEVEL`. (#3067) + * Fancy Indexing with WEBrick (#3018) + * Allow Enumerables to be used with `where` filter. (#2986) + * Meta descriptions in the site template now use `page.excerpt` if it's available (#2964) + * Change indentation in `head.html` of site template to 2 spaces from 4 (#2973) + * Use a `$content-width` variable instead of a fixed value in the site template CSS (#2972) + * Strip newlines in site template `` description. (#2982) + * Add link to atom feed in `head` of site template files (#2996) + * Performance optimizations (#2994) + * Use `Hash#each_key` instead of `Hash#keys.each` to speed up iteration + over hash keys. (#3017) + * Further minor performance enhancements. (#3022) + * Add 'b' and 's' aliases for build and serve, respectively (#3065) + +### Bug Fixes + + * Fix Rouge's RedCarpet plugin interface integration (#2951) + * Remove `--watch` from the site template blog post since it defaults + to watching in in 2.4.0 (#2922) + * Fix code for media query mixin in site template (#2946) + * Allow post URL's to have `.htm` extensions (#2925) + * `Utils.slugify`: Don't create new objects when gsubbing (#2997) + * The jsonify filter should deep-convert to Liquid when given an Array. (#3032) + * Apply `jsonify` filter to Hashes deeply and effectively (#3063) + * Use `127.0.0.1` as default host instead of `0.0.0.0` (#3053) + * In the case that a Gemfile does not exist, ensure Jekyll doesn't fail on requiring the Gemfile group (#3066) + +### Development Fixes + + * Fix a typo in the doc block for `Jekyll::URL.escape_path` (#3052) + * Add integration test for `jekyll new --blank` in TestUnit (#2913) + * Add unit test for `jekyll new --force` logic (#2929) + * Update outdated comment for `Convertible#transform` (#2957) + * Add Hakiri badge to README. (#2953) + * Add some simple benchmarking tools. (#2993) + +### Site Enhancements + + * `NOKOGIRI_USE_SYSTEM_LIBRARIES=true` **decreases** installation time. (#3040) + * Add FormKeep to resources as Jekyll form backend (#3010) + * Fixing a mistake in the name of the new Liquid tag (#2969) + * Update Font Awesome to v4.2.0. (#2898) + * Fix link to #2895 in 2.4.0 release post. (#2899) + * Add Big Footnotes for Kramdown plugin to list of third-party plugins (#2916) + * Remove warning regarding GHP use of singular types for front matter defaults (#2919) + * Fix quote character typo in site documentation for templates (#2917) + * Point Liquid links to Liquid’s GitHub wiki (#2887) + * Add HTTP Basic Auth (.htaccess) plugin to list of third-party plugins (#2931) + * (Minor) Grammar & `_config.yml` filename fixes (#2911) + * Added `mathml.rb` to the list of third-party plugins. (#2937) + * Add `--force_polling` to the list of configuration options (#2943) + * Escape unicode characters in site CSS (#2906) + * Add note about using the github-pages gem via pages.github.com/versions.json (#2939) + * Update usage documentation to reflect 2.4 auto-enabling of `--watch`. (#2954) + * Add `--skip-initial-build` to configuration docs (#2949) + * Fix a minor typo in Templates docs page (#2959) + * Add a ditaa-ditaa plugin under Other section on the Plugins page (#2967) + * Add `build/serve -V` option to configuration documentation (#2948) + * Add 'Jekyll Twitter Plugin' to list of third-party plugins (#2979) + * Docs: Update normalize.css to v3.0.2. (#2981) + * Fix typo in Continuous Integration documentation (#2984) + * Clarify behavior of `:categories` in permalinks (#3011) + +## 2.4.0 / 2014-09-09 + +### Minor Enhancements + + * Support a new `relative_include` tag (#2870) + * Auto-enable watch on 'serve' (#2858) + * Render Liquid in CoffeeScript files (#2830) + * Array Liquid filters: `push`, `pop`, `unshift`, `shift` (#2895) + * Add `:title` to collection URL template fillers (#2864) + * Add support for CSV files in the `_data` directory (#2761) + * Add the `name` variable to collection permalinks (#2799) + * Add `inspect` liquid filter. (#2867) + * Add a `slugify` Liquid filter (#2880) + +### Bug Fixes + + * Use `Jekyll.sanitized_path` when adding static files to Collections (#2849) + * Fix encoding of `main.scss` in site template (#2771) + * Fix orientation bugs in default site template (#2862) + +### Development Fixes + + * Update simplecov gem to 0.9 (#2748) + * Remove `docs/` dir (#2768) + * add class `<< self` idiom to `New` command (#2817) + * Allow Travis to 'parallelize' our tests (#2859) + * Fix test for Liquid rendering in Sass (#2856) + * Fixing "vertycal" typo in site template's `_base.scss` (#2889) + +### Site Enhancements + + * Document the `name` variable for collection permalinks (#2829) + * Adds info about installing jekyll in current dir (#2839) + * Remove deprecated `jekyll-projectlist` plugin from list of third-party + plugins (#2742) + * Remove tag plugins that are built in to Jekyll (#2751) + * Add `markdown-writer` package for Atom Editor to list of third-party + plugins (#2763) + * Fix typo in site documentation for collections (#2764) + * Fix minor typo on plugins docs page (#2765) + * Replace markdown with HTML in `sass_dir` note on assets page (#2791) + * Fixed "bellow" typo in datafiles docs (#2879) + * Fix code/markdown issue in documentation for variables (#2877) + * Remove Good Include third-party plugin from plugins page (#2881) + * Add some more docs on `include_relative` (#2884) + +## 2.3.0 / 2014-08-10 + +### Minor Enhancements + + * Allow Convertibles to be converted by >= 1 converters (#2704) + * Allow Sass files to be rendered in Liquid, but never place them in layouts. (#2733) + * Add `jekyll help` command (#2707) + * Use `.scss` for `site_template` styles. (#2667) + * Don't require the `scope` key in front matter defaults (#2659) + * No longer set `permalink: pretty` in the `_config.yml` for the site template (#2680) + * Rework site template to utilize Sass (#2687) + * Notify the user when auto-regeneration is disabled. (#2696) + * Allow partial variables in include tag filename argument (#2693) + * Move instances of `Time.parse` into a Utils method (#2682) + * Ignore subfolders in the `_posts` folder (#2705) REVERTS (#2633) + * Front Matter default types should always be pluralized (#2732) + * Read in static files into `collection.files` as `StaticFile`s (#2737) + * Add `sassify` and `scssify` Liquid filters (#2739) + * Replace `classifier` gem with `classifier-reborn` (#2721) + +### Bug Fixes + + * Use only the last extname when multiple converters exist (#2722) + * Call `#to_liquid` before calling `#to_json` in jsonify filter (#2729) + * Use non padded config in `strftime` to avoid parse string twice (#2673) + * Replace deprecated Ruby methods with undeprecated ones (#2664) + * Catch errors when parsing Post `date` front matter value & produce nice error message (#2649) + * Allow static files in Collections (#2615) + * Fixed typo in `Deprecator#gracefully_require` error message (#2694) + * Remove preemptive loading of the 'classifier' gem. (#2697) + * Use case-insensitive checking for the file extensions when loading config files (#2718) + * When Reading Documents, Respect `encoding` Option (#2720) + * Refactor based on jekyll-watch clean-up. (#2716) + * `Document#to_s` should produce just the content of the document (#2731) + +### Development Fixes + + * Only include lib files in the gem (#2671) + * Fix `git diff` command in `proof` script (#2672) + * Make default rake task a multitask so tests run in parallel (#2735) + +### Site Enhancements + + * Use Sass and a Docs Collection (#2651) + * Add `latest_version.txt` file to the site (#2740) + * Be more ambiguous about `page.content`. But more transparent. (#2522) + * Streamlining front matter wording (instead of front-matter/frontmatter) (#2674) + * Add note that source directory cannot be modified in GitHub Pages (#2669) + * Fix links from #2669 to be actual HTML. Whoops. (#2679) + * Add link to `jekyll-slim` in list of third-party plugins (#2689) + * Add Barry Clark's Smashing Magazine tutorial to resources page (#2688) + * Reorganize and update default configuration settings (#2456) + * Fixing indentation in the configuration docs about Redcarpet exts (#2717) + * Use `null` in YAML instead of `nil` in default config list (#2719) + * Fix typo in Continuous Integration docs (#2708) + +## 2.2.0 / 2014-07-29 + +### Minor Enhancements + + * Throw a warning if the specified layout does not exist (#2620) + * Whitelist Pygments options in safe mode (#2642) + +### Bug Fixes + + * Remove unnecessary `Jekyll::Tags::IncludeTag#blank?` method (#2625) + * Categories in the path are ignored (#2633) + +### Development Fixes + + * Refactoring Errors & Requires of Third-Party stuff (#2591) + * Add further tests for categories (#2584) + * Proof site with html-proofer on change (#2605) + * Fix up bug in #2605 which caused proofing the site not to function (#2608) + * Use `bundle exec` in `script/proof` (#2610) + +### Site Enhancements + + * Update Kramdown urls (#2588) + * Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of + third-party plugins (#2596) + * Fix a bunch of broken links in the site (#2601) + * Replace dead links with working links (#2611) + * Add jekyll-hook to deployment methods (#2617) + * Added kramdown-with-pygments plugin to the list of third-party plugins (#2623) + * Update outdated "Extras" page and remove duplicate documentation (#2622) + * Add co2 plugin to list of third-party plugins (#2639) + * Attempt to clarify the way Sass imports happen (#2642) + +## 2.1.1 / 2014-07-01 + +### Bug Fixes + + * Patch read vulnerabilities for data & confirm none for layouts (#2563) + * Update Maruku dependency to allow use of the latest version (#2576) + * Remove conditional assignment from document URL to prevent stale urls (#2575) + +### Site Enhancements + + * Add vertical margin to `highlight` to separate code blocks (#2558) + * Add `html_pages` to Variables docs (#2567) + * Fixed broken link to Permalinks page (#2572) + * Update link to Windows installation guide (#2578) + +## 2.1.0 / 2014-06-28 + +### Minor Enhancements + + * Bump to the latest Liquid version, 2.6.1 (#2495) + * Add support for JSON files in the `_data` directory (#2369) + * Allow subclasses to override `EXCERPT_ATTRIBUTES_FOR_LIQUID` (#2408) + * Add `Jekyll.env` and `jekyll.environment` (the Liquid var) (#2417) + * Use `_config.yaml` or `_config.yml` (`.yml` takes precedence) (#2406) + * Override collection url template (#2418) + * Allow subdirectories in `_data` (#2395) + * Extract Pagination Generator into gem: `jekyll-paginate` (#2455) + * Utilize `date_to_rfc822` filter in site template (#2437) + * Add categories, last build datetime, and generator to site template + feed (#2438) + * Configurable, replaceable Logger-compliant logger (#2444) + * Extract `gist` tag into a separate gem (#2469) + * Add `collection` attribute to `Document#to_liquid` to access the + document's collection label. (#2436) + * Upgrade listen to `2.7.6 <= x < 3.0.0` (#2492) + * Allow configuration of different Twitter and GitHub usernames in site template (#2485) + * Bump Pygments to v0.6.0 (#2504) + * Front matter defaults for documents in collections (#2419) + * Include files with a url which ends in `/` in the `site.html_pages` list (#2524) + * Make `highlight` tag use `language-` prefix in CSS class (#2511) + * Lookup item property via `item#to_liquid` before `#data` or `#[]` in filters (#2493) + * Skip initial build of site on serve with flag (#2477) + * Add support for `hl_lines` in `highlight` tag (#2532) + * Spike out `--watch` flag into a separate gem (#2550) + +### Bug Fixes + + * Liquid `sort` filter should sort even if one of the values is `nil` (#2345) + * Remove padding on `pre code` in the site template CSS (#2383) + * Set `log_level` earlier to silence info level configuration output (#2393) + * Only list pages which have `title` in site template (#2411) + * Accept `Numeric` values for dates, not `Number` values (#2377) + * Prevent code from overflowing container in site template (#2429) + * Encode URLs in UTF-8 when escaping and unescaping (#2420) + * No Layouts or Liquid for Asset Files (#2431) + * Allow front matter defaults to set post categories (#2373) + * Fix command in subcommand deprecation warning (#2457) + * Keep all parent directories of files/dirs in `keep_files` (#2458) + * When using RedCarpet and Rouge without Rouge installed, fixed erroneous + error which stated that redcarpet was missing, not rouge. (#2464) + * Ignore *all* directories and files that merit it on auto-generation (#2459) + * Before copying file, explicitly remove the old one (#2535) + * Merge file system categories with categories from YAML. (#2531) + * Deep merge front matter defaults (#2490) + * Ensure exclude and include arrays are arrays of strings (#2542) + * Allow collections to have dots in their filenames (#2552) + * Collections shouldn't try to read in directories as files (#2552) + * Be quiet very quickly. (#2520) + +### Development Fixes + + * Test Ruby 2.1.2 instead of 2.1.1 (#2374) + * Add test for sorting UTF-8 characters (#2384) + * Use `https` for GitHub links in documentation (#2470) + * Remove coverage reporting with Coveralls (#2494) + * Fix a bit of missing TomDoc to `Jekyll::Commands::Build#build` (#2554) + +### Site Enhancements + + * Set `timezone` to `America/Los_Angeles` (#2394) + * Improve JavaScript in `anchor_links.html` (#2368) + * Remove note on Quickstart page about default markdown converter (#2387) + * Remove broken link in extras.md to a Maruku fork (#2401) + * Update Font Awesome to v4.1.0. (#2410) + * Fix broken link on Installation page to Templates page (#2421) + * Prevent table from extending parent width in permalink style table (#2424) + * Add collections to info about pagination support (#2389) + * Add `jekyll_github_sample` plugin to list of third-party plugins (#2463) + * Clarify documentation around front matter defaults and add details + about defaults for collections. (#2439) + * Add Jekyll Project Version Tag to list of third-party plugins (#2468) + * Use `https` for GitHub links across whole site (#2470) + * Add StickerMule + Jekyll post (#2476) + * Add Jekyll Asset Pipeline Reborn to list of third-party plugins (#2479) + * Add link to jekyll-compress-html to list of third-party plugins (#2514) + * Add Piwigo Gallery to list of third-party plugins (#2526) + * Set `show_drafts` to `false` in default configuration listing (#2536) + * Provide an updated link for Windows installation instructions (#2544) + * Remove `url` from configuration docs (#2547) + * Documentation for Continuous Integration for your Jekyll Site (#2432) + +## 2.0.3 / 2014-05-08 + +### Bug Fixes + + * Properly prefix links in site template with URL or baseurl depending upon + need. (#2319) + * Update gist tag comments and error message to require username (#2326) + * Fix `permalink` setting in site template (#2331) + * Don't fail if any of the path objects are nil (#2325) + * Instantiate all descendants for converters and generators, not just + direct subclasses (#2334) + * Replace all instances of `site.name` with `site.title` in site template (#2324) + * `Jekyll::Filters#time` now accepts UNIX timestamps in string or number form (#2339) + * Use `item_property` for `where` filter so it doesn't break on collections (#2359) + * Rescue errors thrown so `--watch` doesn't fail (#2364) + +### Site Enhancements + + * Add missing "as" to assets docs page (#2337) + * Update docs to reflect new `baseurl` default (#2341) + * Add links to headers who have an ID. (#2342) + * Use symbol instead of HTML number in `upgrading.md` (#2351) + * Fix link to front matter defaults docs (#2353) + * Fix for `History.markdown` in order to fix history page in docs (#2363) + +## 2.0.2 / 2014-05-07 + +### Bug Fixes + + * Correct use of `url` and `baseurl` in the site template. (#2317) + * Default `baseurl` to `""` (#2317) + +### Site Enhancements + + * Correct docs for the `gist` plugin so it always includes the username. (#2314) + * Clarify new (defaults, `where` filter) features in docs (#2316) + +## 2.0.1 / 2014-05-06 + +### Bug Fixes + + * Require `kramdown` gem instead of `maruku` gem + +## 2.0.0 / 2014-05-06 + +### Major Enhancements + * Add "Collections" feature (#2199) + * Add gem-based plugin whitelist to safe mode (#1657) + * Replace the commander command line parser with a more robust + solution for our needs called `mercenary` (#1706) + * Remove support for Ruby 1.8.x (#1780) + * Move to jekyll/jekyll from mojombo/jekyll (#1817) + * Allow custom markdown processors (#1872) + * Provide support for the Rouge syntax highlighter (#1859) + * Provide support for Sass (#1932) + * Provide a 300% improvement when generating sites that use + `Post#next` or `Post#previous` (#1983) + * Provide support for CoffeeScript (#1991) + * Replace Maruku with Kramdown as Default Markdown Processor (#1988) + * Expose `site.static_files` to Liquid (#2075) + * Complete redesign of the template site generated by `jekyll new` (#2050) + * Update Listen from 1.x to 2.x (#2097) + * Front matter defaults (#2205) + * Deprecate `relative_permalinks` configuration option (default to `false`) (#2307) + * Exclude files based on prefix as well as `fnmatch?` (#2303) + +### Minor Enhancements + * Move the EntryFilter class into the Jekyll module to avoid polluting the + global namespace (#1800) + * Add `group_by` Liquid filter create lists of items grouped by a common + property's value (#1788) + * Add support for Maruku's `fenced_code_blocks` option (#1799) + * Update Redcarpet dependency to ~> 3.0 (#1815) + * Automatically sort all pages by name (#1848) + * Better error message when time is not parseable (#1847) + * Allow `include` tag variable arguments to use filters (#1841) + * `post_url` tag should raise `ArgumentError` for invalid name (#1825) + * Bump dependency `mercenary` to `~> 0.2.0` (#1879) + * Bump dependency `safe_yaml` to `~> 1.0` (#1886) + * Allow sorting of content by custom properties (#1849) + * Add `--quiet` flag to silence output during build and serve (#1898) + * Add a `where` filter to filter arrays based on a key/value pair + (#1875) + * Route 404 errors to a custom 404 page in development (#1899) + * Excludes are now relative to the site source (#1916) + * Bring MIME Types file for `jekyll serve` to complete parity with GH Pages + servers (#1993) + * Adding Breakpoint to make new site template more responsive (#2038) + * Default to using the UTF-8 encoding when reading files. (#2031) + * Update Redcarpet dependency to ~> 3.1 (#2044) + * Remove support for Ruby 1.9.2 (#2045) + * Add `.mkdown` as valid Markdown extension (#2048) + * Add `index.xml` to the list of WEBrick directory index files (#2041) + * Make the `layouts` config key relative to CWD or to source (#2058) + * Update Kramdown to `~> 1.3` (#1894) + * Remove unnecessary references to `self` (#2090) + * Update to Mercenary v0.3.x (#2085) + * Ship Sass support as a separate gem (#2098) + * Extract core extensions into a Utils module (#2112) + * Refactor CLI & Commands For Greater Happiness (#2143) + * Provide useful error when Pygments returns `nil` and error out (#2148) + * Add support for unpublished drafts (#2164) + * Add `force_polling` option to the `serve` command (#2165) + * Clean up the `` in the site template (#2186) + * Permit YAML blocks to end with three dots to better conform with the + YAML spec (#2110) + * Use `File.exist?` instead of deprecated `File.exists?` (#2214) + * Require newline after start of YAML Front Matter header (#2211) + * Add the ability for pages to be marked as `published: false` (#1492) + * Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy + looking up of variable values in a Liquid context. (#2253) + * Remove literal lang name from class (#2292) + * Return `utf-8` encoding in header for webrick error page response (#2289) + * Make template site easier to customize (#2268) + * Add two-digit year to permalink template option (#2301) + * Add `site.documents` to Liquid payload (list of all docs) (#2295) + * Take into account missing values in the Liquid sort filter (#2299) + +### Bug Fixes + * Don't allow nil entries when loading posts (#1796) + * Remove the scrollbar that's always displayed in new sites generated + from the site template (#1805) + * Add `#path` to required methods in `Jekyll::Convertible` (#1866) + * Default Maruku fenced code blocks to ON for 2.0.0-dev (#1831) + * Change short opts for host and port for `jekyll docs` to be consistent with + other subcommands (#1877) + * Fix typos (#1910) + * Lock Maruku at 0.7.0 to prevent bugs caused by Maruku 0.7.1 (#1958) + * Fixes full path leak to source directory when using include tag (#1951) + * Don't generate pages that aren't being published (#1931) + * Use `SafeYAML.load` to avoid conflicts with other projects (#1982) + * Relative posts should never fail to build (#1976) + * Remove executable bits of non executable files (#2056) + * `#path` for a draft is now `_drafts` instead of `_posts` (#2042) + * Patch a couple show-stopping security vulnerabilities (#1946) + * Sanitize paths uniformly, in a Windows-friendly way (#2065, #2109) + * Update gem build steps to work correctly on Windows (#2118) + * Remove obsolete `normalize_options` method call from `bin/jekyll` (#2121). + * Remove `+` characters from Pygments lexer names when adding as a CSS + class (#994) + * Remove some code that caused Ruby interpreter warnings (#2178) + * Only strip the drive name if it begins the string (#2175) + * Remove default post with invalid date from site template (#2200) + * Fix `Post#url` and `Page#url` escape (#1568) + * Strip newlines from the `{% highlight %}` block content (#1823) + * Load in `rouge` only when it's been requested as the highlighter (#2189) + * Convert input to string before XML escaping (`xml_escape` liquid filter) (#2244) + * Modify configuration key for Collections and reset properly. (#2238) + * Avoid duplicated output using `highlight` tag (#2264) + * Only use Jekyll.logger for output (#2307) + * Close the file descriptor in `has_yaml_header?` (#2310) + * Add `output` to `Document` liquid output hash (#2309) + +### Development Fixes + * Add a link to the site in the README.md file (#1795) + * Add in History and site changes from `v1-stable` branch (#1836) + * Testing additions on the Excerpt class (#1893) + * Fix the `highlight` tag feature (#1859) + * Test Jekyll under Ruby 2.1.0 (#1900) + * Add script/cibuild for fun and profit (#1912) + * Use `Forwardable` for delegation between `Excerpt` and `Post` + (#1927) + * Rename `read_things` to `read_content` (#1928) + * Add `script/branding` script for ASCII art lovin' (#1936) + * Update the README to reflect the repo move (#1943) + * Add the project vision to the README (#1935) + * Speed up Travis CI builds by using Rebund (#1985) + * Use Yarp as a Gem proxy for Travis CI (#1984) + * Remove Yarp as a Gem proxy for Travis CI (#2004) + * Move the reading of layouts into its own class (#2020) + * Test Sass import (#2009) + * Switch Maruku and Kramdown in lists of Runtime vs. Development dependencies (#2049) + * Clean up the gemspec for the project (#2095) + * Add Japanese translation of README and CONTRIBUTING docs. (#2081) + * Re-align the tables in Cucumber (#2108) + * Trim trailing spaces and convert tabs to spaces (#2122) + * Fix the failing Travis scenarios due to Cucumber issues (#2155) + * Wrap `bundle install` in `travis_retry` to retry when RubyGems fails (#2160) + * Refactor tags and categories (#1639) + * Extract plugin management into its own class (#2197) + * Add missing tests for `Command` (#2216) + * Update `rr` link in CONTRIBUTING doc (#2247) + * Streamline Cucumber execution of `jekyll` subcommands (#2258) + * Refactor `Commands::Serve`. (#2269) + * Refactor `highlight` tag (#2154) + * Update `Util` hash functions with latest from Rails (#2273) + * Workaround for Travis bug (#2290) + +### Site Enhancements + * Document Kramdown's GFM parser option (#1791) + * Move CSS to includes & update normalize.css to v2.1.3 (#1787) + * Minify CSS only in production (#1803) + * Fix broken link to installation of Ruby on Mountain Lion blog post on + Troubleshooting docs page (#1797) + * Fix issues with 1.4.1 release blog post (#1804) + * Add note about deploying to OpenShift (#1812) + * Collect all Windows-related docs onto one page (#1818) + * Fixed typo in datafiles doc page (#1854) + * Clarify how to access `site` in docs (#1864) + * Add closing `` tag to `context.registers[:site]` note (#1867) + * Fix link to @mojombo's site source (#1897) + * Add `paginate: nil` to default configuration in docs (#1896) + * Add link to our License in the site footer (#1889) + * Add a charset note in "Writing Posts" doc page (#1902) + * Disallow selection of path and prompt in bash examples + * Add jekyll-compass to the plugin list (#1923) + * Add note in Posts docs about stripping `

` tags from excerpt (#1933) + * Add additional info about the new exclude behavior (#1938) + * Linkify 'awesome contributors' to point to the contributors graph on + GitHub (#1940) + * Update `docs/sites.md` link to GitHub Training materials (#1949) + * Update `master` with the release info from 1.4.3 (#1947) + * Define docs nav in datafile (#1953) + * Clarify the docs around the naming convention for posts (#1971) + * Add missing `next` and `previous` docs for post layouts and templates (#1970) + * Add note to `Writing posts` page about how to strip html from excerpt (#1962) + * Add `jekyll-humanize` plugin to plugin list (#1998) + * Add `jekyll-font-awesome` plugin to plugin list (#1999) + * Add `sublime-jekyll` to list of Editor plugins (#2001) + * Add `vim-jekyll` to the list of Editor plugins (#2005) + * Fix non-semantic nesting of `p` tags in `news_item` layout (#2013) + * Document destination folder cleaning (#2016) + * Updated instructions for NearlyFreeSpeech.NET installation (#2015) + * Update link to rack-jekyll on "Deployment Methods" page (#2047) + * Fix typo in /docs/configuration (#2073) + * Fix count in docs for `site.static_files` (#2077) + * Update configuration docs to indicate utf-8 is the default for 2.0.0 + and ASCII for 1.9.3 (#2074) + * Add info about unreleased feature to the site (#2061) + * Add whitespace to liquid example in GitHub Pages docs (#2084) + * Clarify the way Sass and CoffeeScript files are read in and output (#2067) + * Add lyche gallery tag plugin link to list of plugins (#2094) + * Add Jekyll Pages Directory plugin to list of plugins (#2096) + * Update Configuration docs page with new markdown extension (#2102) + * Add `jekyll-image-set` to the list of third-party plugins (#2105) + * Losslessly compress images (#2128) + * Update normalize.css to 3.0.0 (#2126) + * Update modernizr to v2.7.1 (#2129) + * Add `jekyll-ordinal` to list of third-party plugins (#2150) + * Add `jekyll_figure` to list of third-party plugins (#2158) + * Clarify the documentation for safe mode (#2163) + * Some HTML tidying (#2130) + * Remove modernizr and use html5shiv.js directly for IE less than v9 (#2131) + * Remove unused images (#2187) + * Use `array_to_sentence_string` filter when outputting news item + categories (#2191) + * Add link to Help repo in primary navigation bar (#2177) + * Switch to using an ico file for the shortcut icon (#2193) + * Use numbers to specify font weights and only bring in font weights used (#2185) + * Add a link to the list of all tz database time zones (#1824) + * Clean-up and improve documentation `feed.xml` (#2192) + * Remove duplicate entry in list of third-party plugins (#2206) + * Reduce the whitespace in the favicon. (#2213) + * Add `jekyll-page-collections` to list of third-party plugins (#2215) + * Add a cross-reference about `post_url` (#2243) + * Add `jekyll-live-tiles` to list of third-party plugins (#2250) + * Fixed broken link to GitHub training material site source (#2257) + * Update link to help repo, now called `jekyll-help` (#2277) + * Fix capitalization of 'Jekyll' on Deployment Methods page (#2291) + * Include plugins by sonnym in list of third-party plugins (#2297) + * Add deprecated articles keeper filter to list of third-party plugins (#2300) + * Simplify and improve our CSS. (#2127) + * Use black text color for the mobile navbar (#2306) + * Use the built in date filter and `site.time` for the copyright year. (#2305) + * Update html5shiv to v3.7.2 (#2304) + * Add 2.0.0 release post (#2298) + * Add docs for custom markdown processors (#2298) + * Add docs for `where` and `group_by` Liquid filters (#2298) + * Remove notes in docs for unreleased features (#2309) + +## 1.5.1 / 2014-03-27 + +### Bug Fixes + + * Only strip the drive name if it begins the string (#2176) + +## 1.5.0 / 2014-03-24 + +### Minor Enhancements + + * Loosen `safe_yaml` dependency to `~> 1.0` (#2167) + * Bump `safe_yaml` dependency to `~> 1.0.0` (#1942) + +### Bug Fixes + + * Fix issue where filesystem traversal restriction broke Windows (#2167) + * Lock `maruku` at `0.7.0` (#2167) + +### Development Fixes + + * Lock `cucumber` at `1.3.11` (#2167) + +## 1.4.3 / 2014-01-13 + +### Bug Fixes + * Patch show-stopping security vulnerabilities (#1944) + +## 1.4.2 / 2013-12-16 + +### Bug Fixes + * Turn on Maruku fenced code blocks by default (#1830) + +## 1.4.1 / 2013-12-09 + +### Bug Fixes + * Don't allow nil entries when loading posts (#1796) + +## 1.4.0 / 2013-12-07 + +### Major Enhancements + * Add support for TOML config files (#1765) + +### Minor Enhancements + * Sort plugins as a way to establish a load order (#1682) + * Update Maruku to 0.7.0 (#1775) + +### Bug Fixes + * Add a space between two words in a Pagination warning message (#1769) + * Upgrade `toml` gem to `v0.1.0` to maintain compat with Ruby 1.8.7 (#1778) + +### Development Fixes + * Remove some whitespace in the code (#1755) + * Remove some duplication in the reading of posts and drafts (#1779) + +### Site Enhancements + * Fixed case of a word in the Jekyll v1.3.0 release post (#1762) + * Fixed the mime type for the favicon (#1772) + +## 1.3.1 / 2013-11-26 + +### Minor Enhancements + * Add a `--prefix` option to passthrough for the importers (#1669) + * Push the paginator plugin lower in the plugin priority order so + other plugins run before it (#1759) + +### Bug Fixes + * Fix the include tag when ran in a loop (#1726) + * Fix errors when using `--watch` on 1.8.7 (#1730) + * Specify where the include is called from if an included file is + missing (#1746) + +### Development Fixes + * Extract `Site#filter_entries` into its own object (#1697) + * Enable Travis' bundle caching (#1734) + * Remove trailing whitespace in some files (#1736) + * Fix a duplicate test name (#1754) + +### Site Enhancements + * Update link to example Rakefile to point to specific commit (#1741) + * Fix drafts docs to indicate that draft time is based on file modification + time, not `Time.now` (#1695) + * Add `jekyll-monthly-archive-plugin` and `jekyll-category-archive-plugin` to + list of third-party plugins (#1693) + * Add `jekyll-asset-path-plugin` to list of third-party plugins (#1670) + * Add `emoji-for-jekyll` to list of third-part plugins (#1708) + * Fix previous section link on plugins page to point to pagination page (#1707) + * Add `org-mode` converter plugin to third-party plugins (#1711) + * Point "Blog migrations" page to http://import.jekyllrb.com (#1732) + * Add docs for `post_url` when posts are in subdirectories (#1718) + * Update the docs to point to `example.com` (#1448) + +## 1.3.0 / 2013-11-04 + +### Major Enhancements + * Add support for adding data as YAML files under a site's `_data` + directory (#1003) + * Allow variables to be used with `include` tags (#1495) + * Allow using gems for plugin management (#1557) + +### Minor Enhancements + * Decrease the specificity in the site template CSS (#1574) + * Add `encoding` configuration option (#1449) + * Provide better error handling for Jekyll's custom Liquid tags + (#1514) + * If an included file causes a Liquid error, add the path to the + include file that caused the error to the error message (#1596) + * If a layout causes a Liquid error, change the error message so that + we know it comes from the layout (#1601) + * Update Kramdown dependency to `~> 1.2` (#1610) + * Update `safe_yaml` dependency to `~> 0.9.7` (#1602) + * Allow layouts to be in subfolders like includes (#1622) + * Switch to listen for site watching while serving (#1589) + * Add a `json` liquid filter to be used in sites (#1651) + * Point people to the migration docs when the `jekyll-import` gem is + missing (#1662) + +### Bug Fixes + * Fix up matching against source and destination when the two + locations are similar (#1556) + * Fix the missing `pathname` require in certain cases (#1255) + * Use `+` instead of `Array#concat` when building `Post` attribute list (#1571) + * Print server address when launching a server (#1586) + * Downgrade to Maruku `~> 0.6.0` in order to avoid changes in rendering (#1598) + * Fix error with failing include tag when variable was file name (#1613) + * Downcase lexers before passing them to pygments (#1615) + * Capitalize the short verbose switch because it conflicts with the + built-in Commander switch (#1660) + * Fix compatibility with 1.8.x (#1665) + * Fix an error with the new file watching code due to library version + incompatibilities (#1687) + +### Development Fixes + * Add coverage reporting with Coveralls (#1539) + * Refactor the Liquid `include` tag (#1490) + * Update launchy dependency to `~> 2.3` (#1608) + * Update rr dependency to `~> 1.1` (#1604) + * Update cucumber dependency to `~> 1.3` (#1607) + * Update coveralls dependency to `~> 0.7.0` (#1606) + * Update rake dependency to `~> 10.1` (#1603) + * Clean up `site.rb` comments to be more concise/uniform (#1616) + * Use the master branch for the build badge in the readme (#1636) + * Refactor Site#render (#1638) + * Remove duplication in command line options (#1637) + * Add tests for all the coderay options (#1543) + * Improve some of the Cucumber test code (#1493) + * Improve comparisons of timestamps by ignoring the seconds (#1582) + +### Site Enhancements + * Fix params for `JekyllImport::WordPress.process` arguments (#1554) + * Add `jekyll-suggested-tweet` to list of third-party plugins (#1555) + * Link to Liquid's docs for tags and filters (#1553) + * Add note about installing Xcode on the Mac in the Installation docs (#1561) + * Simplify/generalize pagination docs (#1577) + * Add documentation for the new data sources feature (#1503) + * Add more information on how to create generators (#1590, #1592) + * Improve the instructions for mimicking GitHub Flavored Markdown + (#1614) + * Add `jekyll-import` warning note of missing dependencies (#1626) + * Fix grammar in the Usage section (#1635) + * Add documentation for the use of gems as plugins (#1656) + * Document the existence of a few additional plugins (#1405) + * Document that the `date_to_string` always returns a two digit day (#1663) + * Fix navigation in the "Working with Drafts" page (#1667) + * Fix an error with the data documentation (#1691) + +## 1.2.1 / 2013-09-14 + +### Minor Enhancements + * Print better messages for detached server. Mute output on detach. (#1518) + * Disable reverse lookup when running `jekyll serve` (#1363) + * Upgrade RedCarpet dependency to `~> 2.3.0` (#1515) + * Upgrade to Liquid `>= 2.5.2, < 2.6` (#1536) + +### Bug Fixes + * Fix file discrepancy in gemspec (#1522) + * Force rendering of Include tag (#1525) + +### Development Fixes + * Add a rake task to generate a new release post (#1404) + * Mute LSI output in tests (#1531) + * Update contributor documentation (#1537) + +### Site Enhancements + * Fix a couple of validation errors on the site (#1511) + * Make navigation menus reusable (#1507) + * Fix link to History page from Release v1.2.0 notes post. + * Fix markup in History file for command line options (#1512) + * Expand 1.2 release post title to 1.2.0 (#1516) + +## 1.2.0 / 2013-09-06 + +### Major Enhancements + * Disable automatically-generated excerpts when `excerpt_separator` is `""`. (#1386) + * Add checking for URL conflicts when running `jekyll doctor` (#1389) + +### Minor Enhancements + * Catch and fix invalid `paginate` values (#1390) + * Remove superfluous `div.container` from the default html template for + `jekyll new` (#1315) + * Add `-D` short-form switch for the drafts option (#1394) + * Update the links in the site template for Twitter and GitHub (#1400) + * Update dummy email address to example.com domain (#1408) + * Update normalize.css to v2.1.2 and minify; add rake task to update + normalize.css with greater ease. (#1430) + * Add the ability to detach the server ran by `jekyll serve` from it's + controlling terminal (#1443) + * Improve permalink generation for URLs with special characters (#944) + * Expose the current Jekyll version to posts and pages via a new + `jekyll.version` variable (#1481) + +### Bug Fixes + * Markdown extension matching matches only exact matches (#1382) + * Fixed NoMethodError when message passed to `Stevenson#message` is nil (#1388) + * Use binary mode when writing file (#1364) + * Fix 'undefined method `encoding` for "mailto"' errors w/ Ruby 1.8 and + Kramdown > 0.14.0 (#1397) + * Do not force the permalink to be a dir if it ends on .html (#963) + * When a Liquid Exception is caught, show the full path rel. to site source (#1415) + * Properly read in the config options when serving the docs locally + (#1444) + * Fixed `--layouts` option for `build` and `serve` commands (#1458) + * Remove kramdown as a runtime dependency since it's optional (#1498) + * Provide proper error handling for invalid file names in the include + tag (#1494) + +### Development Fixes + * Remove redundant argument to + Jekyll::Commands::New#scaffold_post_content (#1356) + * Add new dependencies to the README (#1360) + * Fix link to contributing page in README (#1424) + * Update TomDoc in Pager#initialize to match params (#1441) + * Refactor `Site#cleanup` into `Jekyll::Site::Cleaner` class (#1429) + * Several other small minor refactorings (#1341) + * Ignore `_site` in jekyllrb.com deploy (#1480) + * Add Gem version and dependency badge to README (#1497) + +### Site Enhancements + * Add info about new releases (#1353) + * Update plugin list with jekyll-rss plugin (#1354) + * Update the site list page with Ruby's official site (#1358) + * Add `jekyll-ditaa` to list of third-party plugins (#1370) + * Add `postfiles` to list of third-party plugins (#1373) + * For internal links, use full path including trailing `/` (#1411) + * Use curly apostrophes in the docs (#1419) + * Update the docs for Redcarpet in Jekyll (#1418) + * Add `pluralize` and `reading_time` filters to docs (#1439) + * Fix markup for the Kramdown options (#1445) + * Fix typos in the History file (#1454) + * Add trailing slash to site's post URL (#1462) + * Clarify that `--config` will take multiple files (#1474) + * Fix docs/templates.md private gist example (#1477) + * Use `site.repository` for Jekyll's GitHub URL (#1463) + * Add `jekyll-pageless-redirects` to list of third-party plugins (#1486) + * Clarify that `date_to_xmlschema` returns an ISO 8601 string (#1488) + * Add `jekyll-good-include` to list of third-party plugins (#1491) + * XML escape the blog post title in our feed (#1501) + * Add `jekyll-toc-generator` to list of third-party plugins (#1506) + +## 1.1.2 / 2013-07-25 + +### Bug Fixes + * Require Liquid 2.5.1 (#1349) + +## 1.1.1 / 2013-07-24 + +### Minor Enhancements + * Remove superfluous `table` selector from main.css in `jekyll new` template (#1328) + * Abort with non-zero exit codes (#1338) + +### Bug Fixes + * Fix up the rendering of excerpts (#1339) + +### Site Enhancements + * Add Jekyll Image Tag to the plugins list (#1306) + * Remove erroneous statement that `site.pages` are sorted alphabetically. + * Add info about the `_drafts` directory to the directory structure + docs (#1320) + * Improve the layout of the plugin listing by organizing it into + categories (#1310) + * Add generator-jekyllrb and grunt-jekyll to plugins page (#1330) + * Mention Kramdown as option for markdown parser on Extras page (#1318) + * Update Quick-Start page to include reminder that all requirements must be installed (#1327) + * Change filename in `include` example to an HTML file so as not to indicate that Jekyll + will automatically convert them. (#1303) + * Add an RSS feed for commits to Jekyll (#1343) + +## 1.1.0 / 2013-07-14 + +### Major Enhancements + * Add `docs` subcommand to read Jekyll's docs when offline. (#1046) + * Support passing parameters to templates in `include` tag (#1204) + * Add support for Liquid tags to post excerpts (#1302) + +### Minor Enhancements + * Search the hierarchy of pagination path up to site root to determine template page for + pagination. (#1198) + * Add the ability to generate a new Jekyll site without a template (#1171) + * Use redcarpet as the default markdown engine in newly generated + sites (#1245, #1247) + * Add `redcarpet` as a runtime dependency so `jekyll build` works out-of-the-box for new + sites. (#1247) + * In the generated site, remove files that will be replaced by a + directory (#1118) + * Fail loudly if a user-specified configuration file doesn't exist (#1098) + * Allow for all options for Kramdown HTML Converter (#1201) + +### Bug Fixes + * Fix pagination in subdirectories. (#1198) + * Fix an issue with directories and permalinks that have a plus sign + (+) in them (#1215) + * Provide better error reporting when generating sites (#1253) + * Latest posts first in non-LSI `related_posts` (#1271) + +### Development Fixes + * Merge the theme and layout Cucumber steps into one step (#1151) + * Restrict activesupport dependency to pre-4.0.0 to maintain compatibility with `<= 1.9.2` + * Include/exclude deprecation handling simplification (#1284) + * Convert README to Markdown. (#1267) + * Refactor Jekyll::Site (#1144) + +### Site Enhancements + * Add "News" section for release notes, along with an RSS feed (#1093, #1285, #1286) + * Add "History" page. + * Restructured docs sections to include "Meta" section. + * Add message to "Templates" page that specifies that Python must be installed in order + to use Pygments. (#1182) + * Update link to the official Maruku repo (#1175) + * Add documentation about `paginate_path` to "Templates" page in docs (#1129) + * Give the quick-start guide its own page (#1191) + * Update ProTip on Installation page in docs to point to all the info about Pygments and + the 'highlight' tag. (#1196) + * Run `site/img` through ImageOptim (thanks @qrush!) (#1208) + * Added Jade Converter to `site/docs/plugins` (#1210) + * Fix location of docs pages in Contributing pages (#1214) + * Add ReadInXMinutes plugin to the plugin list (#1222) + * Remove plugins from the plugin list that have equivalents in Jekyll + proper (#1223) + * Add jekyll-assets to the plugin list (#1225) + * Add jekyll-pandoc-mulitple-formats to the plugin list (#1229) + * Remove dead link to "Using Git to maintain your blog" (#1227) + * Tidy up the third-party plugins listing (#1228) + * Update contributor information (#1192) + * Update URL of article about Blogger migration (#1242) + * Specify that RedCarpet is the default for new Jekyll sites on Quickstart page (#1247) + * Added `site.pages` to Variables page in docs (#1251) + * Add Youku and Tudou Embed link on Plugins page. (#1250) + * Add note that `gist` tag supports private gists. (#1248) + * Add `jekyll-timeago` to list of third-party plugins. (#1260) + * Add `jekyll-swfobject` to list of third-party plugins. (#1263) + * Add `jekyll-picture-tag` to list of third-party plugins. (#1280) + * Update the GitHub Pages documentation regarding relative URLs + (#1291) + * Update the S3 deployment documentation (#1294) + * Add suggestion for Xcode CLT install to troubleshooting page in docs (#1296) + * Add 'Working with drafts' page to docs (#1289) + * Add information about time zones to the documentation for a page's + date (#1304) + +## 1.0.3 / 2013-06-07 + +### Minor Enhancements + * Add support to gist tag for private gists. (#1189) + * Fail loudly when Maruku errors out (#1190) + * Move the building of related posts into their own class (#1057) + * Removed trailing spaces in several places throughout the code (#1116) + * Add a `--force` option to `jekyll new` (#1115) + * Convert IDs in the site template to classes (#1170) + +### Bug Fixes + * Fix typo in Stevenson constant "ERROR". (#1166) + * Rename Jekyll::Logger to Jekyll::Stevenson to fix inheritance issue (#1106) + * Exit with a non-zero exit code when dealing with a Liquid error (#1121) + * Make the `exclude` and `include` options backwards compatible with + versions of Jekyll prior to 1.0 (#1114) + * Fix pagination on Windows (#1063) + * Fix the application of Pygments' Generic Output style to Go code + (#1156) + +### Site Enhancements + * Add a Pro Tip to docs about front matter variables being optional (#1147) + * Add changelog to site as History page in /docs/ (#1065) + * Add note to Upgrading page about new config options in 1.0.x (#1146) + * Documentation for `date_to_rfc822` and `uri_escape` (#1142) + * Documentation highlight boxes shouldn't show scrollbars if not necessary (#1123) + * Add link to jekyll-minibundle in the doc's plugins list (#1035) + * Quick patch for importers documentation + * Fix prefix for WordpressDotCom importer in docs (#1107) + * Add jekyll-contentblocks plugin to docs (#1068) + * Make code bits in notes look more natural, more readable (#1089) + * Fix logic for `relative_permalinks` instructions on Upgrading page (#1101) + * Add docs for post excerpt (#1072) + * Add docs for gist tag (#1072) + * Add docs indicating that Pygments does not need to be installed + separately (#1099, #1119) + * Update the migrator docs to be current (#1136) + * Add the Jekyll Gallery Plugin to the plugin list (#1143) + +### Development Fixes + * Use Jekyll.logger instead of Jekyll::Stevenson to log things (#1149) + * Fix pesky Cucumber infinite loop (#1139) + * Do not write posts with timezones in Cucumber tests (#1124) + * Use ISO formatted dates in Cucumber features (#1150) + +## 1.0.2 / 2013-05-12 + +### Major Enhancements + * Add `jekyll doctor` command to check site for any known compatibility problems (#1081) + * Backwards-compatibilize relative permalinks (#1081) + +### Minor Enhancements + * Add a `data-lang=""` attribute to Redcarpet code blocks (#1066) + * Deprecate old config `server_port`, match to `port` if `port` isn't set (#1084) + * Update pygments.rb version to 0.5.0 (#1061) + * Update Kramdown version to 1.0.2 (#1067) + +### Bug Fixes + * Fix issue when categories are numbers (#1078) + * Catching that Redcarpet gem isn't installed (#1059) + +### Site Enhancements + * Add documentation about `relative_permalinks` (#1081) + * Remove pygments-installation instructions, as pygments.rb is bundled with it (#1079) + * Move pages to be Pages for realz (#985) + * Updated links to Liquid documentation (#1073) + +## 1.0.1 / 2013-05-08 + +### Minor Enhancements + * Do not force use of `toc_token` when using `generate_tok` in RDiscount (#1048) + * Add newer `language-` class name prefix to code blocks (#1037) + * Commander error message now preferred over process abort with incorrect args (#1040) + +### Bug Fixes + * Make Redcarpet respect the pygments configuration option (#1053) + * Fix the index build with LSI (#1045) + * Don't print deprecation warning when no arguments are specified. (#1041) + * Add missing `` to site template used by `new` subcommand, fixed typos in code (#1032) + +### Site Enhancements + * Changed https to http in the GitHub Pages link (#1051) + * Remove CSS cruft, fix typos, fix HTML errors (#1028) + * Removing manual install of Pip and Distribute (#1025) + * Updated URL for Markdown references plugin (#1022) + +### Development Fixes + * Markdownify history file (#1027) + * Update links on README to point to new jekyllrb.com (#1018) + +## 1.0.0 / 2013-05-06 + +### Major Enhancements + * Add `jekyll new` subcommand: generate a Jekyll scaffold (#764) + * Refactored Jekyll commands into subcommands: build, serve, and migrate. (#690) + * Removed importers/migrators from main project, migrated to jekyll-import sub-gem (#793) + * Added ability to render drafts in `_drafts` folder via command line (#833) + * Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) (#928) + +### Minor Enhancements + * Site template HTML5-ified (#964) + * Use post's directory path when matching for the `post_url` tag (#998) + * Loosen dependency on Pygments so it's only required when it's needed (#1015) + * Parse strings into Time objects for date-related Liquid filters (#1014) + * Tell the user if there is no subcommand specified (#1008) + * Freak out if the destination of `jekyll new` exists and is non-empty (#981) + * Add `timezone` configuration option for compilation (#957) + * Add deprecation messages for pre-1.0 CLI options (#959) + * Refactor and colorize logging (#959) + * Refactor Markdown parsing (#955) + * Added application/vnd.apple.pkpass to mime.types served by WEBrick (#907) + * Move template site to default markdown renderer (#961) + * Expose new attribute to Liquid via `page`: `page.path` (#951) + * Accept multiple config files from command line (#945) + * Add page variable to liquid custom tags and blocks (#413) + * Add `paginator.previous_page_path` and `paginator.next_page_path` (#942) + * Backwards compatibility for 'auto' (#821, #934) + * Added date_to_rfc822 used on RSS feeds (#892) + * Upgrade version of pygments.rb to 0.4.2 (#927) + * Added short month (e.g. "Sep") to permalink style options for posts (#890) + * Expose site.baseurl to Liquid templates (#869) + * Adds excerpt attribute to posts which contains first paragraph of content (#837) + * Accept custom configuration file via CLI (#863) + * Load in GitHub Pages MIME Types on `jekyll serve` (#847, #871) + * Improve debugability of error message for a malformed highlight tag (#785) + * Allow symlinked files in unsafe mode (#824) + * Add 'gist' Liquid tag to core (#822, #861) + * New format of Jekyll output (#795) + * Reinstate `--limit_posts` and `--future` switches (#788) + * Remove ambiguity from command descriptions (#815) + * Fix SafeYAML Warnings (#807) + * Relaxed Kramdown version to 0.14 (#808) + * Aliased `jekyll server` to `jekyll serve`. (#792) + * Updated gem versions for Kramdown, Rake, Shoulda, Cucumber, and RedCarpet. (#744) + * Refactored Jekyll subcommands into Jekyll::Commands submodule, which now contains them (#768) + * Rescue from import errors in Wordpress.com migrator (#671) + * Massively accelerate LSI performance (#664) + * Truncate post slugs when importing from Tumblr (#496) + * Add glob support to include, exclude option (#743) + * Layout of Page or Post defaults to 'page' or 'post', respectively (#580) + REPEALED by (#977) + * "Keep files" feature (#685) + * Output full path & name for files that don't parse (#745) + * Add source and destination directory protection (#535) + * Better YAML error message (#718) + * Bug Fixes + * Paginate in subdirectories properly (#1016) + * Ensure post and page URLs have a leading slash (#992) + * Catch all exceptions, not just StandardError descendents (#1007) + * Bullet-proof `limit_posts` option (#1004) + * Read in YAML as UTF-8 to accept non-ASCII chars (#836) + * Fix the CLI option `--plugins` to actually accept dirs and files (#993) + * Allow 'excerpt' in YAML front matter to override the extracted excerpt (#946) + * Fix cascade problem with site.baseurl, site.port and site.host. (#935) + * Filter out directories with valid post names (#875) + * Fix symlinked static files not being correctly built in unsafe mode (#909) + * Fix integration with directory_watcher 1.4.x (#916) + * Accepting strings as arguments to jekyll-import command (#910) + * Force usage of older directory_watcher gem as 1.5 is broken (#883) + * Ensure all Post categories are downcase (#842, #872) + * Force encoding of the rdiscount TOC to UTF8 to avoid conversion errors (#555) + * Patch for multibyte URI problem with `jekyll serve` (#723) + * Order plugin execution by priority (#864) + * Fixed Page#dir and Page#url for edge cases (#536) + * Fix broken `post_url` with posts with a time in their YAML front matter (#831) + * Look for plugins under the source directory (#654) + * Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long + post names (#775) + * Force Categories to be Strings (#767) + * Safe YAML plugin to prevent vulnerability (#777) + * Add SVG support to Jekyll/WEBrick. (#407, #406) + * Prevent custom destination from causing continuous regen on watch (#528, #820, #862) + +### Site Enhancements + * Responsify (#860) + * Fix spelling, punctuation and phrasal errors (#989) + * Update quickstart instructions with `new` command (#966) + * Add docs for page.excerpt (#956) + * Add docs for page.path (#951) + * Clean up site docs to prepare for 1.0 release (#918) + * Bring site into master branch with better preview/deploy (#709) + * Redesigned site (#583) + +### Development Fixes + * Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 (#938) + * Added "features:html" rake task for debugging purposes, cleaned up + Cucumber profiles (#832) + * Explicitly require HTTPS rubygems source in Gemfile (#826) + * Changed Ruby version for development to 1.9.3-p374 from p362 (#801) + * Including a link to the GitHub Ruby style guide in CONTRIBUTING.md (#806) + * Added script/bootstrap (#776) + * Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version + of greater than 1.9 (#771) + * Switch to Simplecov for coverage report (#765) + +## 0.12.1 / 2013-02-19 + +### Minor Enhancements + * Update Kramdown version to 0.14.1 (#744) + * Test Enhancements + * Update Rake version to 10.0.3 (#744) + * Update Shoulda version to 3.3.2 (#744) + * Update Redcarpet version to 2.2.2 (#744) + +## 0.12.0 / 2012-12-22 + +### Minor Enhancements + * Add ability to explicitly specify included files (#261) + * Add `--default-mimetype` option (#279) + * Allow setting of RedCloth options (#284) + * Add `post_url` Liquid tag for internal post linking (#369) + * Allow multiple plugin dirs to be specified (#438) + * Inline TOC token support for RDiscount (#333) + * Add the option to specify the paginated url format (#342) + * Swap out albino for pygments.rb (#569) + * Support Redcarpet 2 and fenced code blocks (#619) + * Better reporting of Liquid errors (#624) + * Bug Fixes + * Allow some special characters in highlight names + * URL escape category names in URL generation (#360) + * Fix error with `limit_posts` (#442) + * Properly select dotfile during directory scan (#363, #431, #377) + * Allow setting of Kramdown `smart_quotes` (#482) + * Ensure front matter is at start of file (#562) + +## 0.11.2 / 2011-12-27 + * Bug Fixes + * Fix gemspec + +## 0.11.1 / 2011-12-27 + * Bug Fixes + * Fix extra blank line in highlight blocks (#409) + * Update dependencies + +## 0.11.0 / 2011-07-10 + +### Major Enhancements + * Add command line importer functionality (#253) + * Add Redcarpet Markdown support (#318) + * Make markdown/textile extensions configurable (#312) + * Add `markdownify` filter + +### Minor Enhancements + * Switch to Albino gem + * Bundler support + * Use English library to avoid hoops (#292) + * Add Posterous importer (#254) + * Fixes for Wordpress importer (#274, #252, #271) + * Better error message for invalid post date (#291) + * Print formatted fatal exceptions to stdout on build failure + * Add Tumblr importer (#323) + * Add Enki importer (#320) + * Bug Fixes + * Secure additional path exploits + +## 0.10.0 / 2010-12-16 + * Bug Fixes + * Add `--no-server` option. + +## 0.9.0 / 2010-12-15 + +### Minor Enhancements + * Use OptionParser's `[no-]` functionality for better boolean parsing. + * Add Drupal migrator (#245) + * Complain about YAML and Liquid errors (#249) + * Remove orphaned files during regeneration (#247) + * Add Marley migrator (#28) + +## 0.8.0 / 2010-11-22 + +### Minor Enhancements + * Add wordpress.com importer (#207) + * Add `--limit-posts` cli option (#212) + * Add `uri_escape` filter (#234) + * Add `--base-url` cli option (#235) + * Improve MT migrator (#238) + * Add kramdown support (#239) + * Bug Fixes + * Fixed filename basename generation (#208) + * Set mode to UTF8 on Sequel connections (#237) + * Prevent `_includes` dir from being a symlink + +## 0.7.0 / 2010-08-24 + +### Minor Enhancements + * Add support for rdiscount extensions (#173) + * Bug Fixes + * Highlight should not be able to render local files + * The site configuration may not always provide a 'time' setting (#184) + +## 0.6.2 / 2010-06-25 + * Bug Fixes + * Fix Rakefile 'release' task (tag pushing was missing origin) + * Ensure that RedCloth is loaded when textilize filter is used (#183) + * Expand source, destination, and plugin paths (#180) + * Fix `page.url` to include full relative path (#181) + +## 0.6.1 / 2010-06-24 + * Bug Fixes + * Fix Markdown Pygments prefix and suffix (#178) + +## 0.6.0 / 2010-06-23 + +### Major Enhancements + * Proper plugin system (#19, #100) + * Add safe mode so unsafe converters/generators can be added + * Maruku is now the only processor dependency installed by default. + Other processors will be lazy-loaded when necessary (and prompt the + user to install them when necessary) (#57) + +### Minor Enhancements + * Inclusion/exclusion of future dated posts (#59) + * Generation for a specific time (#59) + * Allocate `site.time` on render not per site_payload invocation (#59) + * Pages now present in the site payload and can be used through the + `site.pages` and `site.html_pages` variables + * Generate phase added to site#process and pagination is now a generator + * Switch to RakeGem for build/test process + * Only regenerate static files when they have changed (#142) + * Allow arbitrary options to Pygments (#31) + * Allow URL to be set via command line option (#147) + * Bug Fixes + * Render highlighted code for non markdown/textile pages (#116) + * Fix highlighting on Ruby 1.9 (#65) + * Fix extension munging when pretty permalinks are enabled (#64) + * Stop sorting categories (#33) + * Preserve generated attributes over front matter (#119) + * Fix source directory binding using `Dir.pwd` (#75) + +## 0.5.7 / 2010-01-12 + +### Minor Enhancements + * Allow overriding of post date in the front matter (#62, #38) + * Bug Fixes + * Categories isn't always an array (#73) + * Empty tags causes error in read_posts (#84) + * Fix pagination to adhere to read/render/write paradigm + * Test Enhancement + * Cucumber features no longer use site.posts.first where a better + alternative is available + +## 0.5.6 / 2010-01-08 + * Bug Fixes + * Require redcloth >= 4.2.1 in tests (#92) + * Don't break on triple dashes in yaml front matter (#93) + +### Minor Enhancements + * Allow .mkd as markdown extension + * Use $stdout/err instead of constants (#99) + * Properly wrap code blocks (#91) + * Add javascript mime type for webrick (#98) + +## 0.5.5 / 2010-01-08 + * Bug Fixes + * Fix pagination % 0 bug (#78) + * Ensure all posts are processed first (#71) + +## NOTE + * After this point I will no longer be giving credit in the history; + that is what the commit log is for. + +## 0.5.4 / 2009-08-23 + * Bug Fixes + * Do not allow symlinks (security vulnerability) + +## 0.5.3 / 2009-07-14 + * Bug Fixes + * Solving the permalink bug where non-html files wouldn't work + (@jeffrydegrande) + +## 0.5.2 / 2009-06-24 + * Enhancements + * Added --paginate option to the executable along with a paginator object + for the payload (@calavera) + * Upgraded RedCloth to 4.2.1, which makes `` tags work once + again. + * Configuration options set in config.yml are now available through the + site payload (@vilcans) + * Posts can now have an empty YAML front matter or none at all + (@ bahuvrihi) + * Bug Fixes + * Fixing Ruby 1.9 issue that requires `#to_s` on the err object + (@Chrononaut) + * Fixes for pagination and ordering posts on the same day (@ujh) + * Made pages respect permalinks style and permalinks in yml front matter + (@eugenebolshakov) + * Index.html file should always have index.html permalink + (@eugenebolshakov) + * Added trailing slash to pretty permalink style so Apache is happy + (@eugenebolshakov) + * Bad markdown processor in config fails sooner and with better message + (@ gcnovus) + * Allow CRLFs in yaml front matter (@juretta) + * Added Date#xmlschema for Ruby versions < 1.9 + +## 0.5.1 / 2009-05-06 + +### Major Enhancements + * Next/previous posts in site payload (@pantulis, @tomo) + * Permalink templating system + * Moved most of the README out to the GitHub wiki + * Exclude option in configuration so specified files won't be brought over + with generated site (@duritong) + * Bug Fixes + * Making sure config.yaml references are all gone, using only config.yml + * Fixed syntax highlighting breaking for UTF-8 code (@henrik) + * Worked around RDiscount bug that prevents Markdown from getting parsed + after highlight (@henrik) + * CGI escaped post titles (@Chrononaut) + +## 0.5.0 / 2009-04-07 + +### Minor Enhancements + * Ability to set post categories via YAML (@qrush) + * Ability to set prevent a post from publishing via YAML (@qrush) + * Add textilize filter (@willcodeforfoo) + * Add 'pretty' permalink style for wordpress-like urls (@dysinger) + * Made it possible to enter categories from YAML as an array (@Chrononaut) + * Ignore Emacs autosave files (@Chrononaut) + * Bug Fixes + * Use block syntax of popen4 to ensure that subprocesses are properly disposed (@jqr) + * Close open4 streams to prevent zombies (@rtomayko) + * Only query required fields from the WP Database (@ariejan) + * Prevent `_posts` from being copied to the destination directory (@bdimcheff) + * Refactors + * Factored the filtering code into a method (@Chrononaut) + * Fix tests and convert to Shoulda (@qrush, @technicalpickles) + * Add Cucumber acceptance test suite (@qrush, @technicalpickles) + +## 0.4.1 + +### Minor Enhancements + * Changed date format on wordpress converter (zeropadding) (@dysinger) + * Bug Fixes + * Add Jekyll binary as executable to gemspec (@dysinger) + +## 0.4.0 / 2009-02-03 + +### Major Enhancements + * Switch to Jeweler for packaging tasks + +### Minor Enhancements + * Type importer (@codeslinger) + * `site.topics` accessor (@baz) + * Add `array_to_sentence_string` filter (@mchung) + * Add a converter for textpattern (@PerfectlyNormal) + * Add a working Mephisto / MySQL converter (@ivey) + * Allowing .htaccess files to be copied over into the generated site (@briandoll) + * Add option to not put file date in permalink URL (@mreid) + * Add line number capabilities to highlight blocks (@jcon) + * Bug Fixes + * Fix permalink behavior (@cavalle) + * Fixed an issue with pygments, markdown, and newlines (@zpinter) + * Ampersands need to be escaped (@pufuwozu, @ap) + * Test and fix the site.categories hash (@zzot) + * Fix site payload available to files (@matrix9180) + +## 0.3.0 / 2008-12-24 + +### Major Enhancements + * Added `--server` option to start a simple WEBrick server on destination + directory (@johnreilly and @mchung) + +### Minor Enhancements + * Added post categories based on directories containing `_posts` (@mreid) + * Added post topics based on directories underneath `_posts` + * Added new date filter that shows the full month name (@mreid) + * Merge Post's YAML front matter into its to_liquid payload (@remi) + * Restrict includes to regular files underneath `_includes` + * Bug Fixes + * Change YAML delimiter matcher so as to not chew up 2nd level markdown + headers (@mreid) + * Fix bug that meant page data (such as the date) was not available in + templates (@mreid) + * Properly reject directories in `_layouts` + +## 0.2.1 / 2008-12-15 + * Major Changes + * Use Maruku (pure Ruby) for Markdown by default (@mreid) + * Allow use of RDiscount with `--rdiscount` flag + +### Minor Enhancements + * Don't load directory_watcher unless it's needed (@pjhyett) + +## 0.2.0 / 2008-12-14 + * Major Changes + * related_posts is now found in `site.related_posts` + +## 0.1.6 / 2008-12-13 + * Major Features + * Include files in `_includes` with `{% include x.textile %}` + +## 0.1.5 / 2008-12-12 + +### Major Enhancements + * Code highlighting with Pygments if `--pygments` is specified + * Disable true LSI by default, enable with `--lsi` + +### Minor Enhancements + * Output informative message if RDiscount is not available (@JackDanger) + * Bug Fixes + * Prevent Jekyll from picking up the output directory as a source (@JackDanger) + * Skip `related_posts` when there is only one post (@JackDanger) + +## 0.1.4 / 2008-12-08 + * Bug Fixes + * DATA does not work properly with rubygems + +## 0.1.3 / 2008-12-06 + * Major Features + * Markdown support (@vanpelt) + * Mephisto and CSV converters (@vanpelt) + * Code hilighting (@vanpelt) + * Autobuild + * Bug Fixes + * Accept both `\r\n` and `\n` in YAML header (@vanpelt) + +## 0.1.2 / 2008-11-22 + * Major Features + * Add a real "related posts" implementation using Classifier + * Command Line Changes + * Allow cli to be called with 0, 1, or 2 args intuiting dir paths + if they are omitted + +## 0.1.1 / 2008-11-22 + * Minor Additions + * Posts now support introspectional data e.g. `{{ page.url }}` + +## 0.1.0 / 2008-11-05 + * First release + * Converts posts written in Textile + * Converts regular site pages + * Simple copy of binary files + +## 0.0.0 / 2008-10-19 + * Birthday! From bfc07a39c6bf1b57e88a470fc6d0334ee628c9c3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 7 Jan 2016 23:22:07 -0800 Subject: [PATCH 0233/4996] Update history to reflect merge of #4330 [ci skip] --- History.markdown | 372 ++++++++++++++++++++++++----------------------- 1 file changed, 188 insertions(+), 184 deletions(-) diff --git a/History.markdown b/History.markdown index a1ad1b896bf..5b9898be7e5 100644 --- a/History.markdown +++ b/History.markdown @@ -68,6 +68,7 @@ * Add documentation for incremental regeneration (#4293) * Add note about removal of relative permalink support in upgrading docs (#4303) * Add Pro Tip to use front matter variable to create clean URLs (#4296) + * Fix grammar in the documentation for posts. (#4330) ## 3.0.1 / 2015-11-17 @@ -144,8 +145,7 @@ * Perf: `Markdown#matches` should avoid regexp (#3321) * Perf: Use frozen regular expressions for `Utils#slugify` (#3321) * Split off Textile support into jekyll-textile-converter (#3319) - * Improve the navigation menu alignment in the site template on small - screens (#3331) + * Improve the navigation menu alignment in the site template on small screens (#3331) * Show the regeneration time after the initial generation (#3378) * Site template: Switch default font to Helvetica Neue (#3376) * Make the `include` tag a teensy bit faster. (#3391) @@ -177,8 +177,7 @@ * Set log level to debug when verbose flag is set (#3665) * Added a mention on the Gemfile to complete the instructions (#3671) * Perf: Cache `Document#to_liquid` and invalidate where necessary (#3693) - * Perf: `Jekyll::Cleaner#existing_files`: Call `keep_file_regex` and - `keep_dirs` only once, not once per iteration (#3696) + * Perf: `Jekyll::Cleaner#existing_files`: Call `keep_file_regex` and `keep_dirs` only once, not once per iteration (#3696) * Omit jekyll/jekyll-help from list of resources. (#3698) * Add basic `jekyll doctor` test to detect fsnotify (OSX) anomalies. (#3704) * Added talk.jekyllrb.com to "Have questions?" (#3694) @@ -460,16 +459,14 @@ * Strip newlines in site template `` description. (#2982) * Add link to atom feed in `head` of site template files (#2996) * Performance optimizations (#2994) - * Use `Hash#each_key` instead of `Hash#keys.each` to speed up iteration - over hash keys. (#3017) + * Use `Hash#each_key` instead of `Hash#keys.each` to speed up iteration over hash keys. (#3017) * Further minor performance enhancements. (#3022) * Add 'b' and 's' aliases for build and serve, respectively (#3065) ### Bug Fixes * Fix Rouge's RedCarpet plugin interface integration (#2951) - * Remove `--watch` from the site template blog post since it defaults - to watching in in 2.4.0 (#2922) + * Remove `--watch` from the site template blog post since it defaults to watching in in 2.4.0 (#2922) * Fix code for media query mixin in site template (#2946) * Allow post URL's to have `.htm` extensions (#2925) * `Utils.slugify`: Don't create new objects when gsubbing (#2997) @@ -547,11 +544,9 @@ * Document the `name` variable for collection permalinks (#2829) * Adds info about installing jekyll in current dir (#2839) - * Remove deprecated `jekyll-projectlist` plugin from list of third-party - plugins (#2742) + * Remove deprecated `jekyll-projectlist` plugin from list of third-party plugins (#2742) * Remove tag plugins that are built in to Jekyll (#2751) - * Add `markdown-writer` package for Atom Editor to list of third-party - plugins (#2763) + * Add `markdown-writer` package for Atom Editor to list of third-party plugins (#2763) * Fix typo in site documentation for collections (#2764) * Fix minor typo on plugins docs page (#2765) * Replace markdown with HTML in `sass_dir` note on assets page (#2791) @@ -639,8 +634,7 @@ ### Site Enhancements * Update Kramdown urls (#2588) - * Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of - third-party plugins (#2596) + * Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of third-party plugins (#2596) * Fix a bunch of broken links in the site (#2601) * Replace dead links with working links (#2611) * Add jekyll-hook to deployment methods (#2617) @@ -677,12 +671,10 @@ * Allow subdirectories in `_data` (#2395) * Extract Pagination Generator into gem: `jekyll-paginate` (#2455) * Utilize `date_to_rfc822` filter in site template (#2437) - * Add categories, last build datetime, and generator to site template - feed (#2438) + * Add categories, last build datetime, and generator to site template feed (#2438) * Configurable, replaceable Logger-compliant logger (#2444) * Extract `gist` tag into a separate gem (#2469) - * Add `collection` attribute to `Document#to_liquid` to access the - document's collection label. (#2436) + * Add `collection` attribute to `Document#to_liquid` to access the document's collection label. (#2436) * Upgrade listen to `2.7.6 <= x < 3.0.0` (#2492) * Allow configuration of different Twitter and GitHub usernames in site template (#2485) * Bump Pygments to v0.6.0 (#2504) @@ -707,8 +699,7 @@ * Allow front matter defaults to set post categories (#2373) * Fix command in subcommand deprecation warning (#2457) * Keep all parent directories of files/dirs in `keep_files` (#2458) - * When using RedCarpet and Rouge without Rouge installed, fixed erroneous - error which stated that redcarpet was missing, not rouge. (#2464) + * When using RedCarpet and Rouge without Rouge installed, fixed erroneous error which stated that redcarpet was missing, not rouge. (#2464) * Ignore *all* directories and files that merit it on auto-generation (#2459) * Before copying file, explicitly remove the old one (#2535) * Merge file system categories with categories from YAML. (#2531) @@ -737,8 +728,7 @@ * Prevent table from extending parent width in permalink style table (#2424) * Add collections to info about pagination support (#2389) * Add `jekyll_github_sample` plugin to list of third-party plugins (#2463) - * Clarify documentation around front matter defaults and add details - about defaults for collections. (#2439) + * Clarify documentation around front matter defaults and add details about defaults for collections. (#2439) * Add Jekyll Project Version Tag to list of third-party plugins (#2468) * Use `https` for GitHub links across whole site (#2470) * Add StickerMule + Jekyll post (#2476) @@ -754,13 +744,11 @@ ### Bug Fixes - * Properly prefix links in site template with URL or baseurl depending upon - need. (#2319) + * Properly prefix links in site template with URL or baseurl depending upon need. (#2319) * Update gist tag comments and error message to require username (#2326) * Fix `permalink` setting in site template (#2331) * Don't fail if any of the path objects are nil (#2325) - * Instantiate all descendants for converters and generators, not just - direct subclasses (#2334) + * Instantiate all descendants for converters and generators, not just direct subclasses (#2334) * Replace all instances of `site.name` with `site.title` in site template (#2324) * `Jekyll::Filters#time` now accepts UNIX timestamps in string or number form (#2339) * Use `item_property` for `where` filter so it doesn't break on collections (#2359) @@ -796,17 +784,16 @@ ## 2.0.0 / 2014-05-06 ### Major Enhancements + * Add "Collections" feature (#2199) * Add gem-based plugin whitelist to safe mode (#1657) - * Replace the commander command line parser with a more robust - solution for our needs called `mercenary` (#1706) + * Replace the commander command line parser with a more robust solution for our needs called `mercenary` (#1706) * Remove support for Ruby 1.8.x (#1780) * Move to jekyll/jekyll from mojombo/jekyll (#1817) * Allow custom markdown processors (#1872) * Provide support for the Rouge syntax highlighter (#1859) * Provide support for Sass (#1932) - * Provide a 300% improvement when generating sites that use - `Post#next` or `Post#previous` (#1983) + * Provide a 300% improvement when generating sites that use `Post#next` or `Post#previous` (#1983) * Provide support for CoffeeScript (#1991) * Replace Maruku with Kramdown as Default Markdown Processor (#1988) * Expose `site.static_files` to Liquid (#2075) @@ -817,10 +804,9 @@ * Exclude files based on prefix as well as `fnmatch?` (#2303) ### Minor Enhancements - * Move the EntryFilter class into the Jekyll module to avoid polluting the - global namespace (#1800) - * Add `group_by` Liquid filter create lists of items grouped by a common - property's value (#1788) + + * Move the EntryFilter class into the Jekyll module to avoid polluting the global namespace (#1800) + * Add `group_by` Liquid filter create lists of items grouped by a common property's value (#1788) * Add support for Maruku's `fenced_code_blocks` option (#1799) * Update Redcarpet dependency to ~> 3.0 (#1815) * Automatically sort all pages by name (#1848) @@ -831,12 +817,10 @@ * Bump dependency `safe_yaml` to `~> 1.0` (#1886) * Allow sorting of content by custom properties (#1849) * Add `--quiet` flag to silence output during build and serve (#1898) - * Add a `where` filter to filter arrays based on a key/value pair - (#1875) + * Add a `where` filter to filter arrays based on a key/value pair (#1875) * Route 404 errors to a custom 404 page in development (#1899) * Excludes are now relative to the site source (#1916) - * Bring MIME Types file for `jekyll serve` to complete parity with GH Pages - servers (#1993) + * Bring MIME Types file for `jekyll serve` to complete parity with GH Pages servers (#1993) * Adding Breakpoint to make new site template more responsive (#2038) * Default to using the UTF-8 encoding when reading files. (#2031) * Update Redcarpet dependency to ~> 3.1 (#2044) @@ -854,13 +838,11 @@ * Add support for unpublished drafts (#2164) * Add `force_polling` option to the `serve` command (#2165) * Clean up the `` in the site template (#2186) - * Permit YAML blocks to end with three dots to better conform with the - YAML spec (#2110) + * Permit YAML blocks to end with three dots to better conform with the YAML spec (#2110) * Use `File.exist?` instead of deprecated `File.exists?` (#2214) * Require newline after start of YAML Front Matter header (#2211) * Add the ability for pages to be marked as `published: false` (#1492) - * Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy - looking up of variable values in a Liquid context. (#2253) + * Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy looking up of variable values in a Liquid context. (#2253) * Remove literal lang name from class (#2292) * Return `utf-8` encoding in header for webrick error page response (#2289) * Make template site easier to customize (#2268) @@ -869,13 +851,12 @@ * Take into account missing values in the Liquid sort filter (#2299) ### Bug Fixes + * Don't allow nil entries when loading posts (#1796) - * Remove the scrollbar that's always displayed in new sites generated - from the site template (#1805) + * Remove the scrollbar that's always displayed in new sites generated from the site template (#1805) * Add `#path` to required methods in `Jekyll::Convertible` (#1866) * Default Maruku fenced code blocks to ON for 2.0.0-dev (#1831) - * Change short opts for host and port for `jekyll docs` to be consistent with - other subcommands (#1877) + * Change short opts for host and port for `jekyll docs` to be consistent with other subcommands (#1877) * Fix typos (#1910) * Lock Maruku at 0.7.0 to prevent bugs caused by Maruku 0.7.1 (#1958) * Fixes full path leak to source directory when using include tag (#1951) @@ -888,8 +869,7 @@ * Sanitize paths uniformly, in a Windows-friendly way (#2065, #2109) * Update gem build steps to work correctly on Windows (#2118) * Remove obsolete `normalize_options` method call from `bin/jekyll` (#2121). - * Remove `+` characters from Pygments lexer names when adding as a CSS - class (#994) + * Remove `+` characters from Pygments lexer names when adding as a CSS class (#994) * Remove some code that caused Ruby interpreter warnings (#2178) * Only strip the drive name if it begins the string (#2175) * Remove default post with invalid date from site template (#2200) @@ -904,14 +884,14 @@ * Add `output` to `Document` liquid output hash (#2309) ### Development Fixes + * Add a link to the site in the README.md file (#1795) * Add in History and site changes from `v1-stable` branch (#1836) * Testing additions on the Excerpt class (#1893) * Fix the `highlight` tag feature (#1859) * Test Jekyll under Ruby 2.1.0 (#1900) * Add script/cibuild for fun and profit (#1912) - * Use `Forwardable` for delegation between `Excerpt` and `Post` - (#1927) + * Use `Forwardable` for delegation between `Excerpt` and `Post` (#1927) * Rename `read_things` to `read_content` (#1928) * Add `script/branding` script for ASCII art lovin' (#1936) * Update the README to reflect the repo move (#1943) @@ -939,11 +919,11 @@ * Workaround for Travis bug (#2290) ### Site Enhancements + * Document Kramdown's GFM parser option (#1791) * Move CSS to includes & update normalize.css to v2.1.3 (#1787) * Minify CSS only in production (#1803) - * Fix broken link to installation of Ruby on Mountain Lion blog post on - Troubleshooting docs page (#1797) + * Fix broken link to installation of Ruby on Mountain Lion blog post on Troubleshooting docs page (#1797) * Fix issues with 1.4.1 release blog post (#1804) * Add note about deploying to OpenShift (#1812) * Collect all Windows-related docs onto one page (#1818) @@ -958,8 +938,7 @@ * Add jekyll-compass to the plugin list (#1923) * Add note in Posts docs about stripping `

` tags from excerpt (#1933) * Add additional info about the new exclude behavior (#1938) - * Linkify 'awesome contributors' to point to the contributors graph on - GitHub (#1940) + * Linkify 'awesome contributors' to point to the contributors graph on GitHub (#1940) * Update `docs/sites.md` link to GitHub Training materials (#1949) * Update `master` with the release info from 1.4.3 (#1947) * Define docs nav in datafile (#1953) @@ -976,8 +955,7 @@ * Update link to rack-jekyll on "Deployment Methods" page (#2047) * Fix typo in /docs/configuration (#2073) * Fix count in docs for `site.static_files` (#2077) - * Update configuration docs to indicate utf-8 is the default for 2.0.0 - and ASCII for 1.9.3 (#2074) + * Update configuration docs to indicate utf-8 is the default for 2.0.0 and ASCII for 1.9.3 (#2074) * Add info about unreleased feature to the site (#2061) * Add whitespace to liquid example in GitHub Pages docs (#2084) * Clarify the way Sass and CoffeeScript files are read in and output (#2067) @@ -994,8 +972,7 @@ * Some HTML tidying (#2130) * Remove modernizr and use html5shiv.js directly for IE less than v9 (#2131) * Remove unused images (#2187) - * Use `array_to_sentence_string` filter when outputting news item - categories (#2191) + * Use `array_to_sentence_string` filter when outputting news item categories (#2191) * Add link to Help repo in primary navigation bar (#2177) * Switch to using an ico file for the shortcut icon (#2193) * Use numbers to specify font weights and only bring in font weights used (#2185) @@ -1045,64 +1022,72 @@ ## 1.4.3 / 2014-01-13 ### Bug Fixes + * Patch show-stopping security vulnerabilities (#1944) ## 1.4.2 / 2013-12-16 ### Bug Fixes + * Turn on Maruku fenced code blocks by default (#1830) ## 1.4.1 / 2013-12-09 ### Bug Fixes + * Don't allow nil entries when loading posts (#1796) ## 1.4.0 / 2013-12-07 ### Major Enhancements + * Add support for TOML config files (#1765) ### Minor Enhancements + * Sort plugins as a way to establish a load order (#1682) * Update Maruku to 0.7.0 (#1775) ### Bug Fixes + * Add a space between two words in a Pagination warning message (#1769) * Upgrade `toml` gem to `v0.1.0` to maintain compat with Ruby 1.8.7 (#1778) ### Development Fixes + * Remove some whitespace in the code (#1755) * Remove some duplication in the reading of posts and drafts (#1779) ### Site Enhancements + * Fixed case of a word in the Jekyll v1.3.0 release post (#1762) * Fixed the mime type for the favicon (#1772) ## 1.3.1 / 2013-11-26 ### Minor Enhancements + * Add a `--prefix` option to passthrough for the importers (#1669) - * Push the paginator plugin lower in the plugin priority order so - other plugins run before it (#1759) + * Push the paginator plugin lower in the plugin priority order so other plugins run before it (#1759) ### Bug Fixes + * Fix the include tag when ran in a loop (#1726) * Fix errors when using `--watch` on 1.8.7 (#1730) - * Specify where the include is called from if an included file is - missing (#1746) + * Specify where the include is called from if an included file is missing (#1746) ### Development Fixes + * Extract `Site#filter_entries` into its own object (#1697) * Enable Travis' bundle caching (#1734) * Remove trailing whitespace in some files (#1736) * Fix a duplicate test name (#1754) ### Site Enhancements + * Update link to example Rakefile to point to specific commit (#1741) - * Fix drafts docs to indicate that draft time is based on file modification - time, not `Time.now` (#1695) - * Add `jekyll-monthly-archive-plugin` and `jekyll-category-archive-plugin` to - list of third-party plugins (#1693) + * Fix drafts docs to indicate that draft time is based on file modification time, not `Time.now` (#1695) + * Add `jekyll-monthly-archive-plugin` and `jekyll-category-archive-plugin` to list of third-party plugins (#1693) * Add `jekyll-asset-path-plugin` to list of third-party plugins (#1670) * Add `emoji-for-jekyll` to list of third-part plugins (#1708) * Fix previous section link on plugins page to point to pagination page (#1707) @@ -1114,44 +1099,40 @@ ## 1.3.0 / 2013-11-04 ### Major Enhancements - * Add support for adding data as YAML files under a site's `_data` - directory (#1003) + + * Add support for adding data as YAML files under a site's `_data` directory (#1003) * Allow variables to be used with `include` tags (#1495) * Allow using gems for plugin management (#1557) ### Minor Enhancements + * Decrease the specificity in the site template CSS (#1574) * Add `encoding` configuration option (#1449) - * Provide better error handling for Jekyll's custom Liquid tags - (#1514) - * If an included file causes a Liquid error, add the path to the - include file that caused the error to the error message (#1596) - * If a layout causes a Liquid error, change the error message so that - we know it comes from the layout (#1601) + * Provide better error handling for Jekyll's custom Liquid tags (#1514) + * If an included file causes a Liquid error, add the path to the include file that caused the error to the error message (#1596) + * If a layout causes a Liquid error, change the error message so that we know it comes from the layout (#1601) * Update Kramdown dependency to `~> 1.2` (#1610) * Update `safe_yaml` dependency to `~> 0.9.7` (#1602) * Allow layouts to be in subfolders like includes (#1622) * Switch to listen for site watching while serving (#1589) * Add a `json` liquid filter to be used in sites (#1651) - * Point people to the migration docs when the `jekyll-import` gem is - missing (#1662) + * Point people to the migration docs when the `jekyll-import` gem is missing (#1662) ### Bug Fixes - * Fix up matching against source and destination when the two - locations are similar (#1556) + + * Fix up matching against source and destination when the two locations are similar (#1556) * Fix the missing `pathname` require in certain cases (#1255) * Use `+` instead of `Array#concat` when building `Post` attribute list (#1571) * Print server address when launching a server (#1586) * Downgrade to Maruku `~> 0.6.0` in order to avoid changes in rendering (#1598) * Fix error with failing include tag when variable was file name (#1613) * Downcase lexers before passing them to pygments (#1615) - * Capitalize the short verbose switch because it conflicts with the - built-in Commander switch (#1660) + * Capitalize the short verbose switch because it conflicts with the built-in Commander switch (#1660) * Fix compatibility with 1.8.x (#1665) - * Fix an error with the new file watching code due to library version - incompatibilities (#1687) + * Fix an error with the new file watching code due to library version incompatibilities (#1687) ### Development Fixes + * Add coverage reporting with Coveralls (#1539) * Refactor the Liquid `include` tag (#1490) * Update launchy dependency to `~> 2.3` (#1608) @@ -1168,6 +1149,7 @@ * Improve comparisons of timestamps by ignoring the seconds (#1582) ### Site Enhancements + * Fix params for `JekyllImport::WordPress.process` arguments (#1554) * Add `jekyll-suggested-tweet` to list of third-party plugins (#1555) * Link to Liquid's docs for tags and filters (#1553) @@ -1175,8 +1157,7 @@ * Simplify/generalize pagination docs (#1577) * Add documentation for the new data sources feature (#1503) * Add more information on how to create generators (#1590, #1592) - * Improve the instructions for mimicking GitHub Flavored Markdown - (#1614) + * Improve the instructions for mimicking GitHub Flavored Markdown (#1614) * Add `jekyll-import` warning note of missing dependencies (#1626) * Fix grammar in the Usage section (#1635) * Add documentation for the use of gems as plugins (#1656) @@ -1188,21 +1169,25 @@ ## 1.2.1 / 2013-09-14 ### Minor Enhancements + * Print better messages for detached server. Mute output on detach. (#1518) * Disable reverse lookup when running `jekyll serve` (#1363) * Upgrade RedCarpet dependency to `~> 2.3.0` (#1515) * Upgrade to Liquid `>= 2.5.2, < 2.6` (#1536) ### Bug Fixes + * Fix file discrepancy in gemspec (#1522) * Force rendering of Include tag (#1525) ### Development Fixes + * Add a rake task to generate a new release post (#1404) * Mute LSI output in tests (#1531) * Update contributor documentation (#1537) ### Site Enhancements + * Fix a couple of validation errors on the site (#1511) * Make navigation menus reusable (#1507) * Fix link to History page from Release v1.2.0 notes post. @@ -1212,42 +1197,38 @@ ## 1.2.0 / 2013-09-06 ### Major Enhancements + * Disable automatically-generated excerpts when `excerpt_separator` is `""`. (#1386) * Add checking for URL conflicts when running `jekyll doctor` (#1389) ### Minor Enhancements + * Catch and fix invalid `paginate` values (#1390) - * Remove superfluous `div.container` from the default html template for - `jekyll new` (#1315) + * Remove superfluous `div.container` from the default html template for `jekyll new` (#1315) * Add `-D` short-form switch for the drafts option (#1394) * Update the links in the site template for Twitter and GitHub (#1400) * Update dummy email address to example.com domain (#1408) - * Update normalize.css to v2.1.2 and minify; add rake task to update - normalize.css with greater ease. (#1430) - * Add the ability to detach the server ran by `jekyll serve` from it's - controlling terminal (#1443) + * Update normalize.css to v2.1.2 and minify; add rake task to update normalize.css with greater ease. (#1430) + * Add the ability to detach the server ran by `jekyll serve` from it's controlling terminal (#1443) * Improve permalink generation for URLs with special characters (#944) - * Expose the current Jekyll version to posts and pages via a new - `jekyll.version` variable (#1481) + * Expose the current Jekyll version to posts and pages via a new `jekyll.version` variable (#1481) ### Bug Fixes + * Markdown extension matching matches only exact matches (#1382) * Fixed NoMethodError when message passed to `Stevenson#message` is nil (#1388) * Use binary mode when writing file (#1364) - * Fix 'undefined method `encoding` for "mailto"' errors w/ Ruby 1.8 and - Kramdown > 0.14.0 (#1397) + * Fix 'undefined method `encoding` for "mailto"' errors w/ Ruby 1.8 and Kramdown > 0.14.0 (#1397) * Do not force the permalink to be a dir if it ends on .html (#963) * When a Liquid Exception is caught, show the full path rel. to site source (#1415) - * Properly read in the config options when serving the docs locally - (#1444) + * Properly read in the config options when serving the docs locally (#1444) * Fixed `--layouts` option for `build` and `serve` commands (#1458) * Remove kramdown as a runtime dependency since it's optional (#1498) - * Provide proper error handling for invalid file names in the include - tag (#1494) + * Provide proper error handling for invalid file names in the include tag (#1494) ### Development Fixes - * Remove redundant argument to - Jekyll::Commands::New#scaffold_post_content (#1356) + + * Remove redundant argument to Jekyll::Commands::New#scaffold_post_content (#1356) * Add new dependencies to the README (#1360) * Fix link to contributing page in README (#1424) * Update TomDoc in Pager#initialize to match params (#1441) @@ -1257,6 +1238,7 @@ * Add Gem version and dependency badge to README (#1497) ### Site Enhancements + * Add info about new releases (#1353) * Update plugin list with jekyll-rss plugin (#1354) * Update the site list page with Ruby's official site (#1358) @@ -1281,59 +1263,59 @@ ## 1.1.2 / 2013-07-25 ### Bug Fixes + * Require Liquid 2.5.1 (#1349) ## 1.1.1 / 2013-07-24 ### Minor Enhancements + * Remove superfluous `table` selector from main.css in `jekyll new` template (#1328) * Abort with non-zero exit codes (#1338) ### Bug Fixes + * Fix up the rendering of excerpts (#1339) ### Site Enhancements + * Add Jekyll Image Tag to the plugins list (#1306) * Remove erroneous statement that `site.pages` are sorted alphabetically. - * Add info about the `_drafts` directory to the directory structure - docs (#1320) - * Improve the layout of the plugin listing by organizing it into - categories (#1310) + * Add info about the `_drafts` directory to the directory structure docs (#1320) + * Improve the layout of the plugin listing by organizing it into categories (#1310) * Add generator-jekyllrb and grunt-jekyll to plugins page (#1330) * Mention Kramdown as option for markdown parser on Extras page (#1318) * Update Quick-Start page to include reminder that all requirements must be installed (#1327) - * Change filename in `include` example to an HTML file so as not to indicate that Jekyll - will automatically convert them. (#1303) + * Change filename in `include` example to an HTML file so as not to indicate that Jekyll will automatically convert them. (#1303) * Add an RSS feed for commits to Jekyll (#1343) ## 1.1.0 / 2013-07-14 ### Major Enhancements + * Add `docs` subcommand to read Jekyll's docs when offline. (#1046) * Support passing parameters to templates in `include` tag (#1204) * Add support for Liquid tags to post excerpts (#1302) ### Minor Enhancements - * Search the hierarchy of pagination path up to site root to determine template page for - pagination. (#1198) + + * Search the hierarchy of pagination path up to site root to determine template page for pagination. (#1198) * Add the ability to generate a new Jekyll site without a template (#1171) - * Use redcarpet as the default markdown engine in newly generated - sites (#1245, #1247) - * Add `redcarpet` as a runtime dependency so `jekyll build` works out-of-the-box for new - sites. (#1247) - * In the generated site, remove files that will be replaced by a - directory (#1118) + * Use redcarpet as the default markdown engine in newly generated sites (#1245, #1247) + * Add `redcarpet` as a runtime dependency so `jekyll build` works out-of-the-box for new sites. (#1247) + * In the generated site, remove files that will be replaced by a directory (#1118) * Fail loudly if a user-specified configuration file doesn't exist (#1098) * Allow for all options for Kramdown HTML Converter (#1201) ### Bug Fixes + * Fix pagination in subdirectories. (#1198) - * Fix an issue with directories and permalinks that have a plus sign - (+) in them (#1215) + * Fix an issue with directories and permalinks that have a plus sign (+) in them (#1215) * Provide better error reporting when generating sites (#1253) * Latest posts first in non-LSI `related_posts` (#1271) ### Development Fixes + * Merge the theme and layout Cucumber steps into one step (#1151) * Restrict activesupport dependency to pre-4.0.0 to maintain compatibility with `<= 1.9.2` * Include/exclude deprecation handling simplification (#1284) @@ -1341,22 +1323,20 @@ * Refactor Jekyll::Site (#1144) ### Site Enhancements + * Add "News" section for release notes, along with an RSS feed (#1093, #1285, #1286) * Add "History" page. * Restructured docs sections to include "Meta" section. - * Add message to "Templates" page that specifies that Python must be installed in order - to use Pygments. (#1182) + * Add message to "Templates" page that specifies that Python must be installed in order to use Pygments. (#1182) * Update link to the official Maruku repo (#1175) * Add documentation about `paginate_path` to "Templates" page in docs (#1129) * Give the quick-start guide its own page (#1191) - * Update ProTip on Installation page in docs to point to all the info about Pygments and - the 'highlight' tag. (#1196) + * Update ProTip on Installation page in docs to point to all the info about Pygments and the 'highlight' tag. (#1196) * Run `site/img` through ImageOptim (thanks @qrush!) (#1208) * Added Jade Converter to `site/docs/plugins` (#1210) * Fix location of docs pages in Contributing pages (#1214) * Add ReadInXMinutes plugin to the plugin list (#1222) - * Remove plugins from the plugin list that have equivalents in Jekyll - proper (#1223) + * Remove plugins from the plugin list that have equivalents in Jekyll proper (#1223) * Add jekyll-assets to the plugin list (#1225) * Add jekyll-pandoc-mulitple-formats to the plugin list (#1229) * Remove dead link to "Using Git to maintain your blog" (#1227) @@ -1370,17 +1350,16 @@ * Add `jekyll-timeago` to list of third-party plugins. (#1260) * Add `jekyll-swfobject` to list of third-party plugins. (#1263) * Add `jekyll-picture-tag` to list of third-party plugins. (#1280) - * Update the GitHub Pages documentation regarding relative URLs - (#1291) + * Update the GitHub Pages documentation regarding relative URLs (#1291) * Update the S3 deployment documentation (#1294) * Add suggestion for Xcode CLT install to troubleshooting page in docs (#1296) * Add 'Working with drafts' page to docs (#1289) - * Add information about time zones to the documentation for a page's - date (#1304) + * Add information about time zones to the documentation for a page's date (#1304) ## 1.0.3 / 2013-06-07 ### Minor Enhancements + * Add support to gist tag for private gists. (#1189) * Fail loudly when Maruku errors out (#1190) * Move the building of related posts into their own class (#1057) @@ -1389,16 +1368,16 @@ * Convert IDs in the site template to classes (#1170) ### Bug Fixes + * Fix typo in Stevenson constant "ERROR". (#1166) * Rename Jekyll::Logger to Jekyll::Stevenson to fix inheritance issue (#1106) * Exit with a non-zero exit code when dealing with a Liquid error (#1121) - * Make the `exclude` and `include` options backwards compatible with - versions of Jekyll prior to 1.0 (#1114) + * Make the `exclude` and `include` options backwards compatible with versions of Jekyll prior to 1.0 (#1114) * Fix pagination on Windows (#1063) - * Fix the application of Pygments' Generic Output style to Go code - (#1156) + * Fix the application of Pygments' Generic Output style to Go code (#1156) ### Site Enhancements + * Add a Pro Tip to docs about front matter variables being optional (#1147) * Add changelog to site as History page in /docs/ (#1065) * Add note to Upgrading page about new config options in 1.0.x (#1146) @@ -1412,12 +1391,12 @@ * Fix logic for `relative_permalinks` instructions on Upgrading page (#1101) * Add docs for post excerpt (#1072) * Add docs for gist tag (#1072) - * Add docs indicating that Pygments does not need to be installed - separately (#1099, #1119) + * Add docs indicating that Pygments does not need to be installed separately (#1099, #1119) * Update the migrator docs to be current (#1136) * Add the Jekyll Gallery Plugin to the plugin list (#1143) ### Development Fixes + * Use Jekyll.logger instead of Jekyll::Stevenson to log things (#1149) * Fix pesky Cucumber infinite loop (#1139) * Do not write posts with timezones in Cucumber tests (#1124) @@ -1426,20 +1405,24 @@ ## 1.0.2 / 2013-05-12 ### Major Enhancements + * Add `jekyll doctor` command to check site for any known compatibility problems (#1081) * Backwards-compatibilize relative permalinks (#1081) ### Minor Enhancements + * Add a `data-lang=""` attribute to Redcarpet code blocks (#1066) * Deprecate old config `server_port`, match to `port` if `port` isn't set (#1084) * Update pygments.rb version to 0.5.0 (#1061) * Update Kramdown version to 1.0.2 (#1067) ### Bug Fixes + * Fix issue when categories are numbers (#1078) * Catching that Redcarpet gem isn't installed (#1059) ### Site Enhancements + * Add documentation about `relative_permalinks` (#1081) * Remove pygments-installation instructions, as pygments.rb is bundled with it (#1079) * Move pages to be Pages for realz (#985) @@ -1448,29 +1431,34 @@ ## 1.0.1 / 2013-05-08 ### Minor Enhancements + * Do not force use of `toc_token` when using `generate_tok` in RDiscount (#1048) * Add newer `language-` class name prefix to code blocks (#1037) * Commander error message now preferred over process abort with incorrect args (#1040) ### Bug Fixes + * Make Redcarpet respect the pygments configuration option (#1053) * Fix the index build with LSI (#1045) * Don't print deprecation warning when no arguments are specified. (#1041) * Add missing `` to site template used by `new` subcommand, fixed typos in code (#1032) ### Site Enhancements + * Changed https to http in the GitHub Pages link (#1051) * Remove CSS cruft, fix typos, fix HTML errors (#1028) * Removing manual install of Pip and Distribute (#1025) * Updated URL for Markdown references plugin (#1022) ### Development Fixes + * Markdownify history file (#1027) * Update links on README to point to new jekyllrb.com (#1018) ## 1.0.0 / 2013-05-06 ### Major Enhancements + * Add `jekyll new` subcommand: generate a Jekyll scaffold (#764) * Refactored Jekyll commands into subcommands: build, serve, and migrate. (#690) * Removed importers/migrators from main project, migrated to jekyll-import sub-gem (#793) @@ -1478,6 +1466,7 @@ * Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) (#928) ### Minor Enhancements + * Site template HTML5-ified (#964) * Use post's directory path when matching for the `post_url` tag (#998) * Loosen dependency on Pygments so it's only required when it's needed (#1015) @@ -1517,8 +1506,7 @@ * Massively accelerate LSI performance (#664) * Truncate post slugs when importing from Tumblr (#496) * Add glob support to include, exclude option (#743) - * Layout of Page or Post defaults to 'page' or 'post', respectively (#580) - REPEALED by (#977) + * Layout of Page or Post defaults to 'page' or 'post', respectively (#580) REPEALED by (#977) * "Keep files" feature (#685) * Output full path & name for files that don't parse (#745) * Add source and destination directory protection (#535) @@ -1544,14 +1532,14 @@ * Fixed Page#dir and Page#url for edge cases (#536) * Fix broken `post_url` with posts with a time in their YAML front matter (#831) * Look for plugins under the source directory (#654) - * Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long - post names (#775) + * Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long post names (#775) * Force Categories to be Strings (#767) * Safe YAML plugin to prevent vulnerability (#777) * Add SVG support to Jekyll/WEBrick. (#407, #406) * Prevent custom destination from causing continuous regen on watch (#528, #820, #862) ### Site Enhancements + * Responsify (#860) * Fix spelling, punctuation and phrasal errors (#989) * Update quickstart instructions with `new` command (#966) @@ -1562,20 +1550,20 @@ * Redesigned site (#583) ### Development Fixes + * Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 (#938) - * Added "features:html" rake task for debugging purposes, cleaned up - Cucumber profiles (#832) + * Added "features:html" rake task for debugging purposes, cleaned up Cucumber profiles (#832) * Explicitly require HTTPS rubygems source in Gemfile (#826) * Changed Ruby version for development to 1.9.3-p374 from p362 (#801) * Including a link to the GitHub Ruby style guide in CONTRIBUTING.md (#806) * Added script/bootstrap (#776) - * Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version - of greater than 1.9 (#771) + * Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version of greater than 1.9 (#771) * Switch to Simplecov for coverage report (#765) ## 0.12.1 / 2013-02-19 ### Minor Enhancements + * Update Kramdown version to 0.14.1 (#744) * Test Enhancements * Update Rake version to 10.0.3 (#744) @@ -1585,6 +1573,7 @@ ## 0.12.0 / 2012-12-22 ### Minor Enhancements + * Add ability to explicitly specify included files (#261) * Add `--default-mimetype` option (#279) * Allow setting of RedCloth options (#284) @@ -1604,10 +1593,12 @@ * Ensure front matter is at start of file (#562) ## 0.11.2 / 2011-12-27 + * Bug Fixes * Fix gemspec ## 0.11.1 / 2011-12-27 + * Bug Fixes * Fix extra blank line in highlight blocks (#409) * Update dependencies @@ -1615,12 +1606,14 @@ ## 0.11.0 / 2011-07-10 ### Major Enhancements + * Add command line importer functionality (#253) * Add Redcarpet Markdown support (#318) * Make markdown/textile extensions configurable (#312) * Add `markdownify` filter ### Minor Enhancements + * Switch to Albino gem * Bundler support * Use English library to avoid hoops (#292) @@ -1634,12 +1627,14 @@ * Secure additional path exploits ## 0.10.0 / 2010-12-16 + * Bug Fixes * Add `--no-server` option. ## 0.9.0 / 2010-12-15 ### Minor Enhancements + * Use OptionParser's `[no-]` functionality for better boolean parsing. * Add Drupal migrator (#245) * Complain about YAML and Liquid errors (#249) @@ -1649,6 +1644,7 @@ ## 0.8.0 / 2010-11-22 ### Minor Enhancements + * Add wordpress.com importer (#207) * Add `--limit-posts` cli option (#212) * Add `uri_escape` filter (#234) @@ -1663,12 +1659,14 @@ ## 0.7.0 / 2010-08-24 ### Minor Enhancements + * Add support for rdiscount extensions (#173) * Bug Fixes * Highlight should not be able to render local files * The site configuration may not always provide a 'time' setting (#184) ## 0.6.2 / 2010-06-25 + * Bug Fixes * Fix Rakefile 'release' task (tag pushing was missing origin) * Ensure that RedCloth is loaded when textilize filter is used (#183) @@ -1676,24 +1674,24 @@ * Fix `page.url` to include full relative path (#181) ## 0.6.1 / 2010-06-24 + * Bug Fixes * Fix Markdown Pygments prefix and suffix (#178) ## 0.6.0 / 2010-06-23 ### Major Enhancements + * Proper plugin system (#19, #100) * Add safe mode so unsafe converters/generators can be added - * Maruku is now the only processor dependency installed by default. - Other processors will be lazy-loaded when necessary (and prompt the - user to install them when necessary) (#57) + * Maruku is now the only processor dependency installed by default. Other processors will be lazy-loaded when necessary (and prompt the user to install them when necessary) (#57) ### Minor Enhancements + * Inclusion/exclusion of future dated posts (#59) * Generation for a specific time (#59) * Allocate `site.time` on render not per site_payload invocation (#59) - * Pages now present in the site payload and can be used through the - `site.pages` and `site.html_pages` variables + * Pages now present in the site payload and can be used through the `site.pages` and `site.html_pages` variables * Generate phase added to site#process and pagination is now a generator * Switch to RakeGem for build/test process * Only regenerate static files when they have changed (#142) @@ -1710,87 +1708,80 @@ ## 0.5.7 / 2010-01-12 ### Minor Enhancements + * Allow overriding of post date in the front matter (#62, #38) * Bug Fixes * Categories isn't always an array (#73) * Empty tags causes error in read_posts (#84) * Fix pagination to adhere to read/render/write paradigm * Test Enhancement - * Cucumber features no longer use site.posts.first where a better - alternative is available + * Cucumber features no longer use site.posts.first where a better alternative is available ## 0.5.6 / 2010-01-08 + * Bug Fixes * Require redcloth >= 4.2.1 in tests (#92) * Don't break on triple dashes in yaml front matter (#93) ### Minor Enhancements + * Allow .mkd as markdown extension * Use $stdout/err instead of constants (#99) * Properly wrap code blocks (#91) * Add javascript mime type for webrick (#98) ## 0.5.5 / 2010-01-08 + * Bug Fixes * Fix pagination % 0 bug (#78) - * Ensure all posts are processed first (#71) - -## NOTE - * After this point I will no longer be giving credit in the history; - that is what the commit log is for. + * Ensure all posts are processed first (#71) ## NOTE + * After this point I will no longer be giving credit in the history; that is what the commit log is for. ## 0.5.4 / 2009-08-23 + * Bug Fixes * Do not allow symlinks (security vulnerability) ## 0.5.3 / 2009-07-14 + * Bug Fixes - * Solving the permalink bug where non-html files wouldn't work - (@jeffrydegrande) + * Solving the permalink bug where non-html files wouldn't work (@jeffrydegrande) ## 0.5.2 / 2009-06-24 + * Enhancements - * Added --paginate option to the executable along with a paginator object - for the payload (@calavera) - * Upgraded RedCloth to 4.2.1, which makes `` tags work once - again. - * Configuration options set in config.yml are now available through the - site payload (@vilcans) - * Posts can now have an empty YAML front matter or none at all - (@ bahuvrihi) + * Added --paginate option to the executable along with a paginator object for the payload (@calavera) + * Upgraded RedCloth to 4.2.1, which makes `` tags work once again. + * Configuration options set in config.yml are now available through the site payload (@vilcans) + * Posts can now have an empty YAML front matter or none at all (@ bahuvrihi) * Bug Fixes - * Fixing Ruby 1.9 issue that requires `#to_s` on the err object - (@Chrononaut) + * Fixing Ruby 1.9 issue that requires `#to_s` on the err object (@Chrononaut) * Fixes for pagination and ordering posts on the same day (@ujh) - * Made pages respect permalinks style and permalinks in yml front matter - (@eugenebolshakov) - * Index.html file should always have index.html permalink - (@eugenebolshakov) - * Added trailing slash to pretty permalink style so Apache is happy - (@eugenebolshakov) - * Bad markdown processor in config fails sooner and with better message - (@ gcnovus) + * Made pages respect permalinks style and permalinks in yml front matter (@eugenebolshakov) + * Index.html file should always have index.html permalink (@eugenebolshakov) + * Added trailing slash to pretty permalink style so Apache is happy (@eugenebolshakov) + * Bad markdown processor in config fails sooner and with better message (@ gcnovus) * Allow CRLFs in yaml front matter (@juretta) * Added Date#xmlschema for Ruby versions < 1.9 ## 0.5.1 / 2009-05-06 ### Major Enhancements + * Next/previous posts in site payload (@pantulis, @tomo) * Permalink templating system * Moved most of the README out to the GitHub wiki - * Exclude option in configuration so specified files won't be brought over - with generated site (@duritong) + * Exclude option in configuration so specified files won't be brought over with generated site (@duritong) * Bug Fixes * Making sure config.yaml references are all gone, using only config.yml * Fixed syntax highlighting breaking for UTF-8 code (@henrik) - * Worked around RDiscount bug that prevents Markdown from getting parsed - after highlight (@henrik) + * Worked around RDiscount bug that prevents Markdown from getting parsed after highlight (@henrik) * CGI escaped post titles (@Chrononaut) ## 0.5.0 / 2009-04-07 ### Minor Enhancements + * Ability to set post categories via YAML (@qrush) * Ability to set prevent a post from publishing via YAML (@qrush) * Add textilize filter (@willcodeforfoo) @@ -1810,6 +1801,7 @@ ## 0.4.1 ### Minor Enhancements + * Changed date format on wordpress converter (zeropadding) (@dysinger) * Bug Fixes * Add Jekyll binary as executable to gemspec (@dysinger) @@ -1817,9 +1809,11 @@ ## 0.4.0 / 2009-02-03 ### Major Enhancements + * Switch to Jeweler for packaging tasks ### Minor Enhancements + * Type importer (@codeslinger) * `site.topics` accessor (@baz) * Add `array_to_sentence_string` filter (@mchung) @@ -1838,55 +1832,62 @@ ## 0.3.0 / 2008-12-24 ### Major Enhancements - * Added `--server` option to start a simple WEBrick server on destination - directory (@johnreilly and @mchung) + + * Added `--server` option to start a simple WEBrick server on destination directory (@johnreilly and @mchung) ### Minor Enhancements + * Added post categories based on directories containing `_posts` (@mreid) * Added post topics based on directories underneath `_posts` * Added new date filter that shows the full month name (@mreid) * Merge Post's YAML front matter into its to_liquid payload (@remi) * Restrict includes to regular files underneath `_includes` * Bug Fixes - * Change YAML delimiter matcher so as to not chew up 2nd level markdown - headers (@mreid) - * Fix bug that meant page data (such as the date) was not available in - templates (@mreid) + * Change YAML delimiter matcher so as to not chew up 2nd level markdown headers (@mreid) + * Fix bug that meant page data (such as the date) was not available in templates (@mreid) * Properly reject directories in `_layouts` ## 0.2.1 / 2008-12-15 + * Major Changes * Use Maruku (pure Ruby) for Markdown by default (@mreid) * Allow use of RDiscount with `--rdiscount` flag ### Minor Enhancements + * Don't load directory_watcher unless it's needed (@pjhyett) ## 0.2.0 / 2008-12-14 + * Major Changes * related_posts is now found in `site.related_posts` ## 0.1.6 / 2008-12-13 + * Major Features * Include files in `_includes` with `{% include x.textile %}` ## 0.1.5 / 2008-12-12 ### Major Enhancements + * Code highlighting with Pygments if `--pygments` is specified * Disable true LSI by default, enable with `--lsi` ### Minor Enhancements + * Output informative message if RDiscount is not available (@JackDanger) * Bug Fixes * Prevent Jekyll from picking up the output directory as a source (@JackDanger) * Skip `related_posts` when there is only one post (@JackDanger) ## 0.1.4 / 2008-12-08 + * Bug Fixes * DATA does not work properly with rubygems ## 0.1.3 / 2008-12-06 + * Major Features * Markdown support (@vanpelt) * Mephisto and CSV converters (@vanpelt) @@ -1896,21 +1897,24 @@ * Accept both `\r\n` and `\n` in YAML header (@vanpelt) ## 0.1.2 / 2008-11-22 + * Major Features * Add a real "related posts" implementation using Classifier * Command Line Changes - * Allow cli to be called with 0, 1, or 2 args intuiting dir paths - if they are omitted + * Allow cli to be called with 0, 1, or 2 args intuiting dir paths if they are omitted ## 0.1.1 / 2008-11-22 + * Minor Additions * Posts now support introspectional data e.g. `{{ page.url }}` ## 0.1.0 / 2008-11-05 + * First release * Converts posts written in Textile * Converts regular site pages * Simple copy of binary files ## 0.0.0 / 2008-10-19 + * Birthday! From 6996fed26c7a02cfbb387fe43177466a8a7a89b1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 7 Jan 2016 23:24:29 -0800 Subject: [PATCH 0234/4996] Update history to reflect merge of #4330 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5b9898be7e5..d5dad194d33 100644 --- a/History.markdown +++ b/History.markdown @@ -69,6 +69,7 @@ * Add note about removal of relative permalink support in upgrading docs (#4303) * Add Pro Tip to use front matter variable to create clean URLs (#4296) * Fix grammar in the documentation for posts. (#4330) + * Fix grammar in the documentation for posts. (#4330) ## 3.0.1 / 2015-11-17 From bd325acc85efeebff4ee890affbfb91e6d2c4d2c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 7 Jan 2016 23:26:03 -0800 Subject: [PATCH 0235/4996] Remove duplicate reference for #4330 from History. [ci skip] --- History.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/History.markdown b/History.markdown index d5dad194d33..5b9898be7e5 100644 --- a/History.markdown +++ b/History.markdown @@ -69,7 +69,6 @@ * Add note about removal of relative permalink support in upgrading docs (#4303) * Add Pro Tip to use front matter variable to create clean URLs (#4296) * Fix grammar in the documentation for posts. (#4330) - * Fix grammar in the documentation for posts. (#4330) ## 3.0.1 / 2015-11-17 From ddf640e6bdeb0ae457faf50eacabab74f5c92183 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Fri, 8 Jan 2016 17:10:36 -0800 Subject: [PATCH 0236/4996] Test all the things --- lib/jekyll/converters/smartypants.rb | 4 ++-- test/test_filters.rb | 29 +++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/converters/smartypants.rb b/lib/jekyll/converters/smartypants.rb index 7af9d297e9a..d1bc81039a1 100644 --- a/lib/jekyll/converters/smartypants.rb +++ b/lib/jekyll/converters/smartypants.rb @@ -1,8 +1,8 @@ class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown def initialize(source, options) super - @block_parsers = [] - @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :escaped_chars] + @block_parsers = [:block_html] + @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :span_html] end end diff --git a/test/test_filters.rb b/test/test_filters.rb index 63e5267280d..d2d281c3978 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -31,9 +31,32 @@ def initialize(opts = {}) assert_equal "

something really simple

\n", @filter.markdownify("something **really** simple") end - should "smartify with simple string" do - assert_equal "SmartyPants is *not* Markdown", @filter.smartify("SmartyPants is *not* Markdown") - assert_equal "“This filter’s test…”", @filter.smartify(%q{"This filter's test..."}) + context "smartify filter" do + should "convert quotes and typographic characters" do + assert_equal "SmartyPants is *not* Markdown", @filter.smartify("SmartyPants is *not* Markdown") + assert_equal "“This filter’s test…”", @filter.smartify(%q{"This filter's test..."}) + end + + should "escapes special characters when configured to do so" do + kramdown = JekyllFilter.new({:kramdown => {:entity_output => :symbolic}}) + assert_equal "“This filter’s test…”", kramdown.smartify(%q{"This filter's test..."}) + end + + should "convert HTML entities to unicode characters" do + assert_equal "’", @filter.smartify("’") + assert_equal "“", @filter.smartify("“") + end + + should "allow raw HTML passthrough" do + assert_equal "Span HTML is not escaped", @filter.smartify("Span HTML is not escaped") + assert_equal "
Block HTML is not escaped
", @filter.smartify("
Block HTML is not escaped
") + end + + should "escape special characters" do + assert_equal "3 < 4", @filter.smartify("3 < 4") + assert_equal "5 > 4", @filter.smartify("5 > 4") + assert_equal "This & that", @filter.smartify("This & that") + end end should "sassify with simple string" do From 390503b2c7320f14e9e5bbb0f221e641f06a585d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 9 Jan 2016 16:19:43 -0800 Subject: [PATCH 0237/4996] Update history to reflect merge of #4323 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5b9898be7e5..5bdda7c605c 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ * drops: create one base Drop class which can be set as mutable or not (#4285) * drops: provide `#to_h` to allow for hash introspection (#4281) * Shim subcommands with indication of gem possibly required so users know how to use them (#4254) + * Add smartify Liquid filter for SmartyPants (#4323) ### Bug Fixes From 428e4fe3b5c47c4afe45734e666d1c45cd8f936f Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sat, 9 Jan 2016 16:46:27 -0800 Subject: [PATCH 0238/4996] Add documentation for smartify Liquid filter --- site/_docs/templates.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index fd42b6b1625..0ebd35f8731 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -186,6 +186,17 @@ common tasks easier.

+ + +

Smartify

+

Convert "quotes" into “smart quotes.”

+ + +

+ {% raw %}{{ page.title | smartify }}{% endraw %} +

+ +

Converting Sass/SCSS

From e558d0b983acf6447981256cdd242a2e2c9c868b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 9 Jan 2016 16:58:09 -0800 Subject: [PATCH 0239/4996] Update history to reflect merge of #4333 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5bdda7c605c..03ba1bd5b6a 100644 --- a/History.markdown +++ b/History.markdown @@ -70,6 +70,7 @@ * Add note about removal of relative permalink support in upgrading docs (#4303) * Add Pro Tip to use front matter variable to create clean URLs (#4296) * Fix grammar in the documentation for posts. (#4330) + * Add documentation for smartify Liquid filter (#4333) ## 3.0.1 / 2015-11-17 From bb4f5910c969843f67385088be72055aeeba8c90 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 9 Jan 2016 18:04:13 -0800 Subject: [PATCH 0240/4996] document: don't cache @output_ext Fixes race issue. Will introduce perf issues, though... --- lib/jekyll/document.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index c3fff329e17..911cb4e6750 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -89,7 +89,7 @@ def relative_path # # Returns the output extension def output_ext - @output_ext ||= Jekyll::Renderer.new(site, self).output_ext + Jekyll::Renderer.new(site, self).output_ext end # The base filename of the document, without the file extname. From 92ba22f8fe30dc9bbe53585f60586c77e7cc3e14 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 9 Jan 2016 18:11:48 -0800 Subject: [PATCH 0241/4996] Update history to reflect merge of #4314 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 03ba1bd5b6a..738185c5878 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Drop: fix hash setter precendence (#4312) * utils: `has_yaml_header?` should accept files with extraneous spaces (#4290) * Escape html from site.title and page.title in site template (#4307) + * Allow custom file extensions if defined in `permalink` YAML front matter (#4314) ### Development Fixes From a8fa52a81630c288bb47cc875b19384ccf3c5dab Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 9 Jan 2016 21:56:28 -0600 Subject: [PATCH 0242/4996] Use newer Rubies. --- .travis.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 560fbb3df86..7afed906ca6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,10 @@ language: ruby cache: bundler sudo: false rvm: -- 2.2 -- 2.1 -- 2.0 +- 2.2.4 +- 2.1.8 +- 2.3.0 +- 2.0.0-p648 - ruby-head - jruby-9.0.3.0 matrix: From 070f07d971b7f83f60990610b3c1855ca07e37ce Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 9 Jan 2016 22:01:07 -0600 Subject: [PATCH 0243/4996] Test a theory and switch to Trusty beta. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 7afed906ca6..957cd3e094e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ bundler_args: --without doc:util:site:benchmark:development +dist: trusty language: ruby cache: bundler sudo: false From 36a42e5c7154ffa959d7b01197e294761baa9665 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 9 Jan 2016 22:08:00 -0600 Subject: [PATCH 0244/4996] Revert the experimental changes. They didn't work. --- .travis.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 957cd3e094e..560fbb3df86 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,11 @@ bundler_args: --without doc:util:site:benchmark:development -dist: trusty language: ruby cache: bundler sudo: false rvm: -- 2.2.4 -- 2.1.8 -- 2.3.0 -- 2.0.0-p648 +- 2.2 +- 2.1 +- 2.0 - ruby-head - jruby-9.0.3.0 matrix: From 9d98aca86a4b8bc2db48e6a37b3e76fb3a2b3833 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 00:27:58 -0600 Subject: [PATCH 0245/4996] Revert "Reorganize and cleanup the Gemfile, shorten required depends." --- .travis.yml | 1 - Gemfile | 96 +++++++++++++++++++++++++---------------------------- 2 files changed, 46 insertions(+), 51 deletions(-) diff --git a/.travis.yml b/.travis.yml index 560fbb3df86..58980f41c2f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,3 @@ -bundler_args: --without doc:util:site:benchmark:development language: ruby cache: bundler sudo: false diff --git a/Gemfile b/Gemfile index c694a089886..b253e8bf543 100644 --- a/Gemfile +++ b/Gemfile @@ -1,62 +1,58 @@ -source "https://rubygems.org" -gemspec :name => :jekyll +source 'https://rubygems.org' +gemspec name: 'jekyll' -gem "rake", "~> 10.1" +gem 'rake', '~> 10.1' group :development do - unless ENV["CI"] - gem "pry", :require => false - gem "rubocop", { - :github => "bbatsov/rubocop", - :branch => :master, :require => false - } - end -end - -group( :doc) { gem "rdoc", "~> 4.2" } # `--without doc` -group(:util) { gem "launchy", "~> 2.3" } # `--without util` -group(:site) { gem "html-proofer" } # `--without site` - -# `--without benchmark` -group :benchmark do - gem "rbtrace" - gem "ruby-prof" - gem "benchmark-ips" - gem "stackprof" + gem 'rdoc', '~> 4.2' + gem 'launchy', '~> 2.3' + gem 'toml', '~> 0.1.0' + gem "rubocop" + gem 'pry' end group :test do - gem "redgreen", "~> 1.2" - gem "shoulda", "~> 3.5" - gem "cucumber", "~> 2.1" - gem "simplecov", "~> 0.9" - gem "jekyll_test_plugin" - gem "jekyll_test_plugin_malicious" - gem "minitest-reporters" - gem "minitest-profile" - gem "rspec-mocks" - gem "minitest" - gem "nokogiri" + gem 'redgreen', '~> 1.2' + gem 'shoulda', '~> 3.5' + gem 'cucumber', '~> 2.1' + gem 'simplecov', '~> 0.9' + gem 'jekyll_test_plugin' + gem 'jekyll_test_plugin_malicious' + gem 'minitest-reporters' + gem 'minitest-profile' + gem 'rspec-mocks' + gem 'minitest' + gem 'nokogiri' if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") - gem "test-unit" + gem 'test-unit' end -end -group :optional_jekyll_dependencies do - gem "toml", "~> 0.1.0" - gem "jekyll-paginate", "~> 1.0" - gem "jekyll-coffeescript", "~> 1.0" - gem "jekyll-feed", "~> 0.1.3" - gem "jekyll-redirect-from", "~> 0.9.1" - gem "jekyll-gist", "~> 1.0" - gem "mime-types", "~> 3.0" - gem "kramdown", "~> 1.9" + if ENV['PROOF'] + gem 'html-proofer', '~> 2.0' + end +end - platform :ruby, :mswin, :mingw do - gem "rdiscount", "~> 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" +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-coffeescript', '~> 1.0' +gem 'jekyll-feed', '~> 0.1.3' +gem 'jekyll-redirect-from', '~> 0.9.1' +gem 'jekyll-gist', '~> 1.0' +gem 'mime-types', '~> 3.0' +gem 'kramdown', '~> 1.9' + +platform :ruby, :mswin, :mingw do + gem 'rdiscount', '~> 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 From c3e6c04af517884d1a31ee67f981f9f3fa24fb46 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 10:32:29 -0600 Subject: [PATCH 0246/4996] Ignore site/**/* on CodeClimate. --- .codeclimate.yml | 1 + .rubocop.yml | 39 ++++++++++++++++++++------------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index 27b8728d48d..9a8cac63009 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -17,6 +17,7 @@ exclude_paths: - COPYING - LICENSE +- site/**/* - test/**/* - vendor/**/* - features/**/* diff --git a/.rubocop.yml b/.rubocop.yml index aa9f765f279..31c2df3d4a8 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -53,26 +53,27 @@ Style/SingleLineMethods: { Enabled: false } AllCops: TargetRubyVersion: 2.0 Include: - - lib/**/*.rb + - lib/**/*.rb Exclude: - - .rubocop.yml - - .codeclimate.yml - - .travis.yml - - .gitignore - - .rspec + - .rubocop.yml + - .codeclimate.yml + - .travis.yml + - .gitignore + - .rspec - - Gemfile.lock - - CHANGELOG.md - - readme.md - - README.md - - Readme.md - - ReadMe.md - - COPYING - - LICENSE + - Gemfile.lock + - CHANGELOG.md + - readme.md + - README.md + - Readme.md + - ReadMe.md + - COPYING + - LICENSE - - test/**/* - - vendor/**/* - - features/**/* - - script/**/* - - spec/**/* + - site/**/* + - test/**/* + - vendor/**/* + - features/**/* + - script/**/* + - spec/**/* From 88b970f5dca089d2db207706217d2749cd43c798 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 10:45:52 -0600 Subject: [PATCH 0247/4996] Expand the file extensions we ignore. --- .codeclimate.yml | 11 ++++++----- .rubocop.yml | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index 9a8cac63009..6e860b7523b 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -9,11 +9,12 @@ exclude_paths: - .rspec - Gemfile.lock -- CHANGELOG.md -- readme.md -- README.md -- Readme.md -- ReadMe.md +- CHANGELOG.{md,markdown,txt,textile} +- CONTRIBUTING.{md,markdown,txt,textile} +- readme.{md,markdown,txt,textile} +- README.{md,markdown,txt,textile} +- Readme.{md,markdown,txt,textile} +- ReadMe.{md,markdown,txt,textile} - COPYING - LICENSE diff --git a/.rubocop.yml b/.rubocop.yml index 31c2df3d4a8..1f0ffeb231d 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -63,11 +63,12 @@ AllCops: - .rspec - Gemfile.lock - - CHANGELOG.md - - readme.md - - README.md - - Readme.md - - ReadMe.md + - CHANGELOG.{md,markdown,txt,textile} + - CONTRIBUTING.{md,markdown,txt,textile} + - readme.{md,markdown,txt,textile} + - README.{md,markdown,txt,textile} + - Readme.{md,markdown,txt,textile} + - ReadMe.{md,markdown,txt,textile} - COPYING - LICENSE From dc6858504a927513dc2baef5899e812c4d921c2c Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 11:02:47 -0600 Subject: [PATCH 0248/4996] Make .travis.yml a bit more readable. --- .travis.yml | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index 58980f41c2f..0fa982a1ca9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,41 +1,46 @@ -language: ruby cache: bundler +script: script/cibuild +before_script: bundle update +language: ruby sudo: false + rvm: - 2.2 - 2.1 - 2.0 -- ruby-head - jruby-9.0.3.0 +- ruby-head + matrix: fast_finish: true allow_failures: - - rvm: ruby-head - rvm: jruby-9.0.3.0 + - rvm: ruby-head exclude: - - rvm: jruby-9.0.3.0 - env: TEST_SUITE=cucumber + - rvm: jruby-9.0.3.0 + env: TEST_SUITE=cucumber + env: matrix: - - TEST_SUITE=test - - TEST_SUITE=cucumber + - TEST_SUITE=test + - TEST_SUITE=cucumber + branches: only: - - master -before_script: bundle update -script: script/cibuild + - master + notifications: irc: - on_success: change - on_failure: change - channels: - - irc.freenode.org#jekyll - template: - - "%{repository}#%{build_number} (%{branch}) %{message} %{build_url}" + template: "%{repository}#%{build_number} (%{branch}) %{message} %{build_url}" + channels: irc.freenode.org#jekyll + email: recipients: - jordon@envygeeks.io - on_success: never - on_failure: always + slack: - secure: dNdKk6nahNURIUbO3ULhA09/vTEQjK0fNbgjVjeYPEvROHgQBP1cIP3AJy8aWs8rl5Yyow4YGEilNRzKPz18AsFptVXofpwyqcBxaCfmHP809NX5PHBaadydveLm+TNVao2XeLXSWu+HUNAYO1AanCUbJSEyJTju347xCBGzESU= + secure: "\ + dNdKk6nahNURIUbO3ULhA09/vTEQjK0fNbgjVjeYPEvROHgQBP1cIP3AJy8aWs8rl5Yyow4Y\ + GEilNRzKPz18AsFptVXofpwyqcBxaCfmHP809NX5PHBaadydveLm+TNVao2XeLXSWu+HUNAY\ + O1AanCUbJSEyJTju347xCBGzESU=\ + " From 86ed09ffddb182c5be3551e5032d21974c606c72 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 11:04:53 -0600 Subject: [PATCH 0249/4996] Enable CodeClimate coverage. --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0fa982a1ca9..7777656d6bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,3 +44,12 @@ notifications: GEilNRzKPz18AsFptVXofpwyqcBxaCfmHP809NX5PHBaadydveLm+TNVao2XeLXSWu+HUNAY\ O1AanCUbJSEyJTju347xCBGzESU=\ " + +addons: + code_climate: + repo_token: + secure: "\ + mAuvDu+nrzB8dOaLqsublDGt423mGRyZYM3vsrXh4Tf1sT+L1PxsRzU4gLmcV27HtX2Oq9\ + DA4vsRURfABU0fIhwYkQuZqEcA3d8TL36BZcGEshG6MQ2AmnYsmFiTcxqV5bmlElHEqQuT\ + 5SUFXLafgZPBnL0qDwujQcHukID41sE=\ + " From 8669077daf769099ff6c6c9b31676424f0564732 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 11:07:00 -0600 Subject: [PATCH 0250/4996] Add coverage badge. --- README.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/README.markdown b/README.markdown index d8c621d1910..9ee529f357d 100644 --- a/README.markdown +++ b/README.markdown @@ -3,6 +3,7 @@ [![Gem Version](https://img.shields.io/gem/v/jekyll.svg)](https://rubygems.org/gems/jekyll) [![Build Status](https://img.shields.io/travis/jekyll/jekyll/master.svg)](https://travis-ci.org/jekyll/jekyll) [![Code Climate](https://img.shields.io/codeclimate/github/jekyll/jekyll.svg)](https://codeclimate.com/github/jekyll/jekyll) +[![Test Coverage](https://codeclimate.com/github/jekyll/jekyll/badges/coverage.svg)](https://codeclimate.com/github/jekyll/jekyll/coverage) [![Dependency Status](https://gemnasium.com/jekyll/jekyll.svg)](https://gemnasium.com/jekyll/jekyll) [![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)](https://hakiri.io/github/jekyll/jekyll/master) From 8337da89780e51dd0ae35a48324593d6f8c26426 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 11:13:14 -0600 Subject: [PATCH 0251/4996] Remove script/rebund. --- script/rebund | 140 -------------------------------------------------- 1 file changed, 140 deletions(-) delete mode 100755 script/rebund diff --git a/script/rebund b/script/rebund deleted file mode 100755 index d2ff79016cb..00000000000 --- a/script/rebund +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env bash -# -# rebund(1) -# -# Author: Julien Letessier -# Homepage: https://github.com/mezis/rebund -# License: -# -# Copyright (c) 2014 HouseTrip Ltd -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -# Configuration -: ${REBUND_CREDENTIALS:=user:secret} -: ${REBUND_ENDPOINT=http://keyfile-production.herokuapp.com} -: ${REBUND_TARBALL:=bundle.tbz} -: ${REBUND_BUNDLE_DIR:=vendor/bundle} - - - -log() { - echo "rebund: $*" > /dev/stderr -} - -die() { - echo "fatal: $*" > /dev/stderr - exit 1 -} - -success() { - log "$*" - exit 0 -} - -on_error() { - die 'unknown error.' -} - -get_ruby_version() { - bundle exec ruby --version -} - -get_gemfile() { - bundle exec sh -c 'echo $BUNDLE_GEMFILE' -} - -calculate_hash() { - (get_ruby_version ; cat $(get_gemfile)) | openssl sha256 | sed -e 's/.* //' -} - -build_tarball() { - test -e $REBUND_BUNDLE_DIR || die "cannot find bundle directory in ${REBUND_BUNDLE_DIR}" - test -e $REBUND_TARBALL && success 'bundle already uploaded' - tar jcf $REBUND_TARBALL $REBUND_BUNDLE_DIR -} - -upload_tarball() { - curl --fail \ - -F filedata=@${REBUND_TARBALL} \ - --digest --user $REBUND_CREDENTIALS \ - ${REBUND_ENDPOINT}/$(calculate_hash) \ - || success "could not upload bundle" -} - -expand_tarball() { - test -e $REBUND_TARBALL || success "no tarball" - tar jxf $REBUND_TARBALL -} - -download_tarball() { - curl --fail \ - --location \ - -o ${REBUND_TARBALL} \ - --digest --user $REBUND_CREDENTIALS \ - ${REBUND_ENDPOINT}/$(calculate_hash) \ - || success "could not download bundle" -} - -rebund_upload() { - build_tarball - upload_tarball -} - -rebund_download() { - download_tarball - expand_tarball -} - -rebund_usage() { - success "usage: $0 [-v] [upload|download]" -} - -# cath errors -trap on_error ERR - -# inherit the ERR trap in subprocesses -set -E - -while test $# -gt 0 ; do - case $1 in - -v) - set -x - ;; - upload) - rebund_upload - exit 0 - ;; - download) - rebund_download - exit 0 - ;; - *) - rebund_usage - exit 1 - ;; - esac - shift -done - -rebund_usage From 55423e344ea8249366ae94312a6815510f78cbcc Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 11:18:46 -0600 Subject: [PATCH 0252/4996] Add CodeClimate to the testing stuff. --- Gemfile | 1 + test/helper.rb | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index b253e8bf543..04bd73bdb66 100644 --- a/Gemfile +++ b/Gemfile @@ -17,6 +17,7 @@ group :test do gem 'simplecov', '~> 0.9' gem 'jekyll_test_plugin' gem 'jekyll_test_plugin_malicious' + gem "codeclimate-test-reporter" gem 'minitest-reporters' gem 'minitest-profile' gem 'rspec-mocks' diff --git a/test/helper.rb b/test/helper.rb index 281f68715f6..32363369e7e 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -2,11 +2,14 @@ def jruby? defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' end -unless ENV['TRAVIS'] - require File.expand_path('../simplecov_custom_profile', __FILE__) - SimpleCov.start('gem') do - add_filter "/vendor/bundle" +if ENV["CI"] + require "codeclimate-test-reporter" + CodeClimate::TestReporter.start +else + require File.expand_path("../simplecov_custom_profile", __FILE__) + SimpleCov.start "gem" do add_filter "/vendor/gem" + add_filter "/vendor/bundle" add_filter ".bundle" end end From 1aae802ea2d35c6cf1348a990e0cbfa62c681a49 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Jan 2016 11:10:10 -0800 Subject: [PATCH 0253/4996] Update history to reflect merge of #4341 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 738185c5878..3259f842034 100644 --- a/History.markdown +++ b/History.markdown @@ -48,6 +48,7 @@ * Fix many Rubocop style errors (#4301) * Fix spelling of "GitHub" in docs and history (#4322) * Reorganize and cleanup the Gemfile, shorten required depends. (#4318) + * Remove script/rebund. (#4341) ### Site Enhancements From b96b0a80eac061a61dbb24939d6db94c44489e4c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Jan 2016 11:11:19 -0800 Subject: [PATCH 0254/4996] Update history to reflect merge of #4340 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3259f842034..5ed950eaf73 100644 --- a/History.markdown +++ b/History.markdown @@ -49,6 +49,7 @@ * Fix spelling of "GitHub" in docs and history (#4322) * Reorganize and cleanup the Gemfile, shorten required depends. (#4318) * Remove script/rebund. (#4341) + * Implement codeclimate platform (#4340) ### Site Enhancements From 70f741b86fafba6c35faf354d268b63e10d5e037 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 9 Jan 2016 05:28:06 -0600 Subject: [PATCH 0255/4996] Remove ObectSpace dumping and start using inherited, it's faster. --- lib/jekyll/generator.rb | 3 +-- lib/jekyll/plugin.rb | 43 +++++++++++++++++++++++++++++------------ lib/jekyll/site.rb | 22 +++++++++------------ 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/lib/jekyll/generator.rb b/lib/jekyll/generator.rb index 57973a74eb9..bf7c0f19aba 100644 --- a/lib/jekyll/generator.rb +++ b/lib/jekyll/generator.rb @@ -1,4 +1,3 @@ module Jekyll - class Generator < Plugin - end + Generator = Class.new(Plugin) end diff --git a/lib/jekyll/plugin.rb b/lib/jekyll/plugin.rb index 0207314c8af..e2a95168b9c 100644 --- a/lib/jekyll/plugin.rb +++ b/lib/jekyll/plugin.rb @@ -1,20 +1,39 @@ module Jekyll class Plugin - PRIORITIES = { :lowest => -100, - :low => -10, - :normal => 0, - :high => 10, - :highest => 100 } + PRIORITIES = { + :low => -10, + :highest => 100, + :lowest => -100, + :normal => 0, + :high => 10 + } - # Fetch all the subclasses of this class and its subclasses' subclasses. # - # Returns an array of descendant classes. - def self.descendants - descendants = [] - ObjectSpace.each_object(singleton_class) do |k| - descendants.unshift k unless k == self + + def self.inherited(const) + return catch_inheritance(const) do |const_| + catch_inheritance(const_) + end + end + + # + + def self.catch_inheritance(const) + const.define_singleton_method :inherited do |const_| + (@children ||= Set.new).add const_ + if block_given? + yield const_ + end end - descendants + end + + # + + def self.descendants + @children ||= Set.new + out = @children.map(&:descendants) + out << self unless superclass == Plugin + Set.new(out).flatten end # Get or set the priority of this plugin. When called without an diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index fcd4bf778c8..465e154e892 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -263,25 +263,21 @@ def site_payload end # Get the implementation class for the given Converter. - # - # klass - The Class of the Converter to fetch. - # # Returns the Converter instance implementing the given Converter. + # klass - The Class of the Converter to fetch. + def find_converter_instance(klass) - converters.find { |c| c.class == klass } || proc { raise "No converter for #{klass}" }.call + converters.find { |klass_| klass_.instance_of?(klass) } || \ + raise("No Converters found for #{klass}") end + # klass - class or module containing the subclasses. + # Returns array of instances of subclasses of parameter. # Create array of instances of the subclasses of the class or module - # passed in as argument. - # - # klass - class or module containing the subclasses which should be - # instantiated - # - # Returns array of instances of subclasses of parameter + # passed in as argument. + def instantiate_subclasses(klass) - klass.descendants.select do |c| - !safe || c.safe - end.sort.map do |c| + klass.descendants.select { |c| !safe || c.safe }.sort.map do |c| c.new(config) end end From 3c9f159fb8937641541caa27e65b95251e0aa2be Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 14:28:28 -0600 Subject: [PATCH 0256/4996] Move Cucumber to using RSpec-Expections and furthering JRuby support. * Removes posix-spawn in favor of Open3#popen3 * Encapsulates all the paths into a single easy class. * Moves to %r{} to avoid ambiguious warnings per-Cucumber suggestion. * Starts passing around Pathname to make some actions faster. * Clean's up some methods to make them easier to read. * AUTOMATIC: Add "#" between each method. --- .travis.yml | 4 - Gemfile | 1 + features/step_definitions/jekyll_steps.rb | 281 +++++++++++----------- features/support/env.rb | 151 +++++++----- 4 files changed, 239 insertions(+), 198 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7777656d6bd..4bba7a8dca9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,10 +16,6 @@ matrix: allow_failures: - rvm: jruby-9.0.3.0 - rvm: ruby-head - exclude: - - rvm: jruby-9.0.3.0 - env: TEST_SUITE=cucumber - env: matrix: - TEST_SUITE=test diff --git a/Gemfile b/Gemfile index 04bd73bdb66..2c0d7e8a598 100644 --- a/Gemfile +++ b/Gemfile @@ -11,6 +11,7 @@ group :development do end group :test do + gem 'rspec-expectations' gem 'redgreen', '~> 1.2' gem 'shoulda', '~> 3.5' gem 'cucumber', '~> 2.1' diff --git a/features/step_definitions/jekyll_steps.rb b/features/step_definitions/jekyll_steps.rb index c9ae0567b2f..64213ea4e27 100644 --- a/features/step_definitions/jekyll_steps.rb +++ b/features/step_definitions/jekyll_steps.rb @@ -1,131 +1,115 @@ -def file_content_from_hash(input_hash) - matter_hash = input_hash.reject { |k, v| k == "content" } - matter = matter_hash.map { |k, v| "#{k}: #{v}\n" }.join.chomp - - content = if input_hash['input'] && input_hash['filter'] - "{{ #{input_hash['input']} | #{input_hash['filter']} }}" - else - input_hash['content'] - end - - <<-EOF ---- -#{matter} ---- -#{content} -EOF -end - Before do - FileUtils.mkdir_p(TEST_DIR) unless File.exist?(TEST_DIR) - Dir.chdir(TEST_DIR) + FileUtils.mkdir_p(Paths.test_dir) unless Paths.test_dir.directory? + Dir.chdir(Paths.test_dir) end +# + After do - FileUtils.rm_rf(TEST_DIR) if File.exist?(TEST_DIR) - FileUtils.rm(JEKYLL_COMMAND_OUTPUT_FILE) if File.exist?(JEKYLL_COMMAND_OUTPUT_FILE) - FileUtils.rm(JEKYLL_COMMAND_STATUS_FILE) if File.exist?(JEKYLL_COMMAND_STATUS_FILE) - Dir.chdir(File.dirname(TEST_DIR)) + Paths.test_dir.rmtree if Paths.test_dir.exist? + Paths.output_file.delete if Paths.output_file.exist? + Paths.status_file.delete if Paths.status_file.exist? + Dir.chdir(Paths.test_dir.parent) end -World do - MinitestWorld.new +# + +Given %r{^I have a blank site in "(.*)"$} do |path| + if !File.exist?(path) + then FileUtils.mkdir_p(path) + end end -Given /^I have a blank site in "(.*)"$/ do |path| - FileUtils.mkdir_p(path) unless File.exist?(path) +# + +Given %r{^I do not have a "(.*)" directory$} do |path| + Paths.test_dir.join(path).directory? end -Given /^I do not have a "(.*)" directory$/ do |path| - File.directory?("#{TEST_DIR}/#{path}") +# + +Given %r{^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$} do |file, key, value, text| + File.write(file, Jekyll::Utils.strip_heredoc(<<-DATA)) + --- + #{key || 'layout'}: #{value || 'nil'} + --- + + #{text} + DATA end -# Like "I have a foo file" but gives a yaml front matter so jekyll actually processes it -Given /^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$/ do |file, key, value, text| - File.open(file, 'w') do |f| - f.write <<-EOF ---- -#{key || 'layout'}: #{value || 'nil'} ---- -#{text} -EOF - end +# + +Given %r{^I have an? "(.*)" file that contains "(.*)"$} do |file, text| + File.write(file, text) end -Given /^I have an? "(.*)" file that contains "(.*)"$/ do |file, text| - File.open(file, 'w') do |f| - f.write(text) - end +# + +Given %r{^I have an? (.*) (layout|theme) that contains "(.*)"$} do |name, type, text| + folder = type == "layout" ? "_layouts" : "_theme" + + destination_file = Pathname.new(File.join(folder, "#{name}.html")) + FileUtils.mkdir_p(destination_file.parent) unless destination_file.parent.directory? + File.write(destination_file, text) end -Given /^I have an? (.*) (layout|theme) that contains "(.*)"$/ do |name, type, text| - folder = if type == 'layout' - '_layouts' - else - '_theme' - end - destination_file = File.join(folder, name + '.html') - destination_path = File.dirname(destination_file) - unless File.exist?(destination_path) - FileUtils.mkdir_p(destination_path) - end - File.open(destination_file, 'w') do |f| - f.write(text) - end +# + +Given %r{^I have an? "(.*)" file with content:$} do |file, text| + File.write(file, text) end -Given /^I have an? "(.*)" file with content:$/ do |file, text| - File.open(file, 'w') do |f| - f.write(text) +# + +Given %r{^I have an? (.*) directory$} do |dir| + if !File.directory?(dir) + then FileUtils.mkdir_p(dir) end end -Given /^I have an? (.*) directory$/ do |dir| - FileUtils.mkdir_p(dir) -end +# -Given /^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$/ do |status, direction, folder, table| +Given %r{^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$} do |status, direction, folder, table| table.hashes.each do |input_hash| - title = slug(input_hash['title']) - ext = input_hash['type'] || 'markdown' + title = slug(input_hash["title"]) + ext = input_hash["type"] || "markdown" + filename = filename = "#{title}.#{ext}" if %w(draft page).include?(status) before, after = location(folder, direction) + dest_folder = "_drafts" if status == "draft" + dest_folder = "_posts" if status == "post" + dest_folder = "" if status == "page" - case status - when "draft" - dest_folder = '_drafts' - filename = "#{title}.#{ext}" - when "page" - dest_folder = '' - filename = "#{title}.#{ext}" - when "post" + if status == "post" parsed_date = Time.xmlschema(input_hash['date']) rescue Time.parse(input_hash['date']) - dest_folder = '_posts' filename = "#{parsed_date.strftime('%Y-%m-%d')}-#{title}.#{ext}" end path = File.join(before, dest_folder, after, filename) - File.open(path, 'w') do |f| - f.write file_content_from_hash(input_hash) - end + File.write(path, file_content_from_hash(input_hash)) end end -Given /^I have a configuration file with "(.*)" set to "(.*)"$/ do |key, value| - File.open('_config.yml', 'w') do |f| - f.write("#{key}: #{value}\n") - end +# + +Given %r{^I have a configuration file with "(.*)" set to "(.*)"$} do |key, value| + File.write("_config.yml", "#{key}: #{value}\n") end -Given /^I have a configuration file with:$/ do |table| - File.open('_config.yml', 'w') do |f| +# + +Given %r{^I have a configuration file with:$} do |table| + File.open("_config.yml", "w") do |f| table.hashes.each do |row| f.write("#{row["key"]}: #{row["value"]}\n") end end end -Given /^I have a configuration file with "([^\"]*)" set to:$/ do |key, table| - File.open('_config.yml', 'w') do |f| +# + +Given %r{^I have a configuration file with "([^\"]*)" set to:$} do |key, table| + File.open("_config.yml", "w") do |f| f.write("#{key}:\n") table.hashes.each do |row| f.write("- #{row["value"]}\n") @@ -133,102 +117,123 @@ def file_content_from_hash(input_hash) end end -Given /^I have fixture collections$/ do - FileUtils.cp_r File.join(JEKYLL_SOURCE_DIR, "test", "source", "_methods"), source_dir +# + +Given %r{^I have fixture collections$} do + FileUtils.cp_r Paths.source_dir.join("test", "source", "_methods"), source_dir end -Given /^I wait (\d+) second(s?)$/ do |time, plural| +# + +Given %r{^I wait (\d+) second(s?)$} do |time, plural| sleep(time.to_f) end -################## -# -# Changing stuff # -################## -When /^I run jekyll(.*)$/ do |args| - status = run_jekyll(args) - if args.include?("--verbose") || ENV['DEBUG'] +When %r{^I run jekyll(.*)$} do |args| + run_jekyll(args) + if args.include?("--verbose") || ENV["DEBUG"] $stderr.puts "\n#{jekyll_run_output}\n" end end -When /^I run bundle(.*)$/ do |args| - status = run_bundle(args) +# + +When %r{^I run bundle(.*)$} do |args| + run_bundle(args) if args.include?("--verbose") || ENV['DEBUG'] $stderr.puts "\n#{jekyll_run_output}\n" end end -When /^I change "(.*)" to contain "(.*)"$/ do |file, text| - File.open(file, 'a') do |f| +# + +When %r{^I change "(.*)" to contain "(.*)"$} do |file, text| + File.open(file, "a") do |f| f.write(text) end end -When /^I delete the file "(.*)"$/ do |file| +# + +When %r{^I delete the file "(.*)"$} do |file| File.delete(file) end -################## -# -# Checking stuff # -################## -Then /^the (.*) directory should +exist$/ do |dir| - assert File.directory?(dir), "The directory \"#{dir}\" does not exist" +Then %r{^the (.*) directory should +exist$} do |dir| + expect(Pathname.new(dir)).to exist end -Then /^the (.*) directory should not exist$/ do |dir| - assert !File.directory?(dir), "The directory \"#{dir}\" exists" +# + +Then %r{^the (.*) directory should not exist$} do |dir| + expect(Pathname.new(dir)).not_to exist end -Then /^I should see "(.*)" in "(.*)"$/ do |text, file| - assert_match Regexp.new(text, Regexp::MULTILINE), file_contents(file) +# +Then %r{^I should see "(.*)" in "(.*)"$} do |text, file| + regexp = Regexp.new(text, Regexp::MULTILINE) + expect(file_contents(file)).to match regexp end -Then /^I should see exactly "(.*)" in "(.*)"$/ do |text, file| - assert_equal text, file_contents(file).strip +# + +Then %r{^I should see exactly "(.*)" in "(.*)"$} do |text, file| + expect(file_contents(file).strip).to eq text end -Then /^I should not see "(.*)" in "(.*)"$/ do |text, file| - refute_match Regexp.new(text, Regexp::MULTILINE), file_contents(file) +# + +Then %r{^I should not see "(.*)" in "(.*)"$} do |text, file| + regexp = Regexp.new(text, Regexp::MULTILINE) + expect(file_contents(file)).not_to match regexp end -Then /^I should see escaped "(.*)" in "(.*)"$/ do |text, file| - assert_match Regexp.new(Regexp.escape(text)), file_contents(file) +# + +Then %r{^I should see escaped "(.*)" in "(.*)"$} do |text, file| + regexp = Regexp.new(Regexp.escape(text)) + expect(file_contents(file)).to match regexp end -Then /^the "(.*)" file should +exist$/ do |file| - file_does_exist = File.file?(file) - unless file_does_exist - all_steps_to_path(file).each do |dir| - STDERR.puts "" - STDERR.puts "Dir #{dir}:" - STDERR.puts Dir["#{dir}/**/*"] - end - end - assert file_does_exist, "The file \"#{file}\" does not exist.\n" +# + +Then %r{^the "(.*)" file should +exist$} do |file| + expect(Pathname.new(file)).to exist end -Then /^the "(.*)" file should not exist$/ do |file| - assert !File.exist?(file), "The file \"#{file}\" exists" +# + +Then %r{^the "(.*)" file should not exist$} do |file| + expect(Pathname.new(file)).to_not exist end -Then /^I should see today's time in "(.*)"$/ do |file| - assert_match Regexp.new(seconds_agnostic_time(Time.now)), file_contents(file) +# + +Then %r{^I should see today's time in "(.*)"$} do |file| + seconds = seconds_agnostic_time(Time.now) + expect(file_contents(file)).to match Regexp.new(seconds) end -Then /^I should see today's date in "(.*)"$/ do |file| - assert_match Regexp.new(Date.today.to_s), file_contents(file) +# + +Then %r{^I should see today's date in "(.*)"$} do |file| + regexp = Regexp.new(Date.today.to_s) + expect(file_contents(file)).to match regexp end -Then /^I should see "(.*)" in the build output$/ do |text| - assert_match Regexp.new(text), jekyll_run_output +# + +Then %r{^I should see "(.*)" in the build output$} do |text| + regexp = Regexp.new(text) + expect(jekyll_run_output).to match regexp end -Then /^I should get a non-zero exit(?:\-| )status$/ do - assert jekyll_run_status > 0 +# + +Then %r{^I should get a non-zero exit(?:\-| )status$} do + expect(jekyll_run_status.to_i).to be > 0 end diff --git a/features/support/env.rb b/features/support/env.rb index 76a3e70702e..62892612fbb 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -1,116 +1,155 @@ -require 'fileutils' -require 'posix-spawn' -require 'minitest/spec' -require 'time' +require "fileutils" +require "jekyll/utils" +require "open3" +require "time" + +class Paths + SOURCE_DIR = Pathname.new(File.expand_path("../..", __dir__)) + def self.test_dir; source_dir.join("tmp", "jekyll"); end + def self.output_file; test_dir.join("jekyll_output.txt"); end + def self.status_file; test_dir.join("jekyll_status.txt"); end + def self.jekyll_bin; source_dir.join("bin", "jekyll"); end + def self.source_dir; SOURCE_DIR; end +end + +# -class MinitestWorld - extend Minitest::Assertions - attr_accessor :assertions +def file_content_from_hash(input_hash) + matter_hash = input_hash.reject { |k, v| k == "content" } + matter = matter_hash.map do |k, v| "#{k}: #{v}\n" + end - def initialize - self.assertions = 0 + matter = matter.join.chomp + content = \ + if !input_hash['input'] || !input_hash['filter'] + then input_hash['content'] + else "{{ #{input_hash['input']} | " \ + "#{input_hash['filter']} }}" end + + Jekyll::Utils.strip_heredoc(<<-EOF) + --- + #{matter.gsub( + /\n/, "\n " + )} + --- + #{content} + EOF end -JEKYLL_SOURCE_DIR = File.dirname(File.dirname(File.dirname(__FILE__))) -TEST_DIR = File.expand_path(File.join('..', '..', 'tmp', 'jekyll'), File.dirname(__FILE__)) -JEKYLL_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'jekyll')) -JEKYLL_COMMAND_OUTPUT_FILE = File.join(File.dirname(TEST_DIR), 'jekyll_output.txt') -JEKYLL_COMMAND_STATUS_FILE = File.join(File.dirname(TEST_DIR), 'jekyll_status.txt') +# def source_dir(*files) - File.join(TEST_DIR, *files) + return Paths.test_dir(*files) end +# + def all_steps_to_path(path) - source = Pathname.new(source_dir('_site')).expand_path - dest = Pathname.new(path).expand_path + source = source_dir + dest = Pathname.new(path).expand_path paths = [] + dest.ascend do |f| - break if f.eql? source + break if f == source paths.unshift f.to_s end - paths -end -def jekyll_output_file - JEKYLL_COMMAND_OUTPUT_FILE + paths end -def jekyll_status_file - JEKYLL_COMMAND_STATUS_FILE -end +# def jekyll_run_output - File.read(jekyll_output_file) if File.file?(jekyll_output_file) + if Paths.output_file.file? + then return Paths.output_file.read + end end +# + def jekyll_run_status - (File.read(jekyll_status_file) rescue 0).to_i + if Paths.status_file.file? + then return Paths.status_file.read + end end +# + def run_bundle(args) - run_in_shell('bundle', *args.strip.split(' ')) + run_in_shell("bundle", *args.strip.split(' ')) end +# + def run_jekyll(args) - child = run_in_shell(JEKYLL_PATH, *args.strip.split(' '), "--trace") - child.status.exitstatus == 0 + args = args.strip.split(" ") # Shellwords? + process = run_in_shell(Paths.jekyll_bin.to_s, *args, "--trace") + process.exitstatus == 0 end -# ----------------------------------------------------------------------------- -# XXX: POSIX::Spawn::Child does not write output when the exit status is > 0 -# for example when doing [:out, :err] => [file, "w"] it will skip -# writing the file entirely, we sould switch to Open. -# ----------------------------------------------------------------------------- +# def run_in_shell(*args) - spawned = POSIX::Spawn::Child.new(*args) - status = spawned.status.exitstatus - File.write(JEKYLL_COMMAND_STATUS_FILE, status) - File.open(JEKYLL_COMMAND_OUTPUT_FILE, "w+") do |file| - status == 0 ? file.write(spawned.out) : file.write(spawned.err) + i, o, e, p = Open3.popen3(*args) + out = o.read.strip + err = e.read.strip + + [i, o, e].each do |m| + m.close end - spawned + File.write(Paths.status_file, p.value.exitstatus) + File.write(Paths.output_file, out) if p.value.exitstatus == 0 + File.write(Paths.output_file, err) if p.value.exitstatus != 0 + p.value end -def slug(title) - if title - title.downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, '-') - else - Time.now.strftime("%s%9N") # nanoseconds since the Epoch +# + +def slug(title = nil) + if !title + then Time.now.strftime("%s%9N") # nanoseconds since the Epoch + else title.downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, '-') end end +# + def location(folder, direction) if folder - before = folder if direction == "in" - after = folder if direction == "under" + before = folder if direction == "in" + after = folder if direction == "under" end - [before || '.', after || '.'] + + [before || '.', + after || '.'] end +# + def file_contents(path) - File.open(path) do |file| - file.readlines.join # avoid differences with \n and \r\n line endings - end + return Pathname.new(path).read end +# + def seconds_agnostic_datetime(datetime = Time.now) date, time, zone = datetime.to_s.split(" ") time = seconds_agnostic_time(time) + [ Regexp.escape(date), "#{time}:\\d{2}", Regexp.escape(zone) - ].join("\\ ") + ] \ + .join("\\ ") end +# + def seconds_agnostic_time(time) - if time.is_a? Time - time = time.strftime("%H:%M:%S") - end + time = time.strftime("%H:%M:%S") if time.is_a?(Time) hour, minutes, _ = time.split(":") "#{hour}:#{minutes}" end From 1d385004805542cd6756c9793321e88289f48885 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Jan 2016 12:42:01 -0800 Subject: [PATCH 0257/4996] Update history to reflect merge of #4342 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5ed950eaf73..6eb6233cbc0 100644 --- a/History.markdown +++ b/History.markdown @@ -50,6 +50,7 @@ * Reorganize and cleanup the Gemfile, shorten required depends. (#4318) * Remove script/rebund. (#4341) * Implement codeclimate platform (#4340) + * Remove ObectSpace dumping and start using inherited, it's faster. (#4342) ### Site Enhancements From 9fee9d3d3b83077dfe2d26aec2d99bfae30f5990 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 10:30:21 -0600 Subject: [PATCH 0258/4996] Add script/travis so all people can play with Travis-CI images. --- script/travis | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100755 script/travis diff --git a/script/travis b/script/travis new file mode 100755 index 00000000000..826ffa767ca --- /dev/null +++ b/script/travis @@ -0,0 +1,36 @@ +#!/bin/sh +# Usage: script/travis [ruby-version [file]] +# Example: script/travis 2.0 test/failing_test.rb +# Example: script/travis 2.3.0 +set -e + +mkdir -p vendor/docker +docker rm -fv docker-travis > /dev/null 2>&1 || true +docker run --volume=$(pwd):/home/travis/builds/jekyll/jekyll \ + --workdir=/home/travis/builds/jekyll/jekyll \ + --volume=$(pwd)/vendor/docker:/home/travis/builds/jekyll/jekyll/vendor/bundle \ + --user=travis --name=docker-travis -dit quay.io/travisci/travis-ruby \ + bash > /dev/null + +status=0 +if [ $# -eq 2 ]; then + docker exec -it docker-travis bash -ilc " \ + rvm use --install --binary --fuzzy $1 + bundle install --path vendor/bundle -j 256 + script/test $2 + " || status=$? + +elif [ $# -eq 1 ]; then + docker exec -it docker-travis bash -ilc " \ + rvm use --install --binary --fuzzy $1 + bundle install --path vendor/bundle -j 256 + bundle exec rake + " || status=$? + +else + docker exec -it docker-travis \ + bash -il || status=$? +fi + +docker rm -fv docker-travis > /dev/null +exit $status From e8883750813331c83a29ce4348075e905fc2f9f8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Jan 2016 12:49:31 -0800 Subject: [PATCH 0259/4996] Update history to reflect merge of #4338 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6eb6233cbc0..6ad35f61cac 100644 --- a/History.markdown +++ b/History.markdown @@ -51,6 +51,7 @@ * Remove script/rebund. (#4341) * Implement codeclimate platform (#4340) * Remove ObectSpace dumping and start using inherited, it's faster. (#4342) + * Add script/travis so all people can play with Travis-CI images. (#4338) ### Site Enhancements From e19258801389642ae5f355f97d50810ab97471a1 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 10 Jan 2016 14:54:45 -0600 Subject: [PATCH 0260/4996] Cleanup .jrubyrc * Remove invoked dynamic, it slows down Ruby. * Remove ObjectSpace which slows down JRuby, we use inheritance now. * Remove the compat version 9K is Ruby2 by default. --- .jrubyrc | 3 --- 1 file changed, 3 deletions(-) diff --git a/.jrubyrc b/.jrubyrc index c4f93701522..39aa437d81f 100644 --- a/.jrubyrc +++ b/.jrubyrc @@ -1,6 +1,3 @@ backtrace.mask=true -compile.invokedynamic=true -objectspace.enabled=true backtrace.color=true -compat.version=2.2 backtrace.style=mri From 6048dcdba2e7bc650c317eaa7ddd52ce9590c5a3 Mon Sep 17 00:00:00 2001 From: Alex J Best Date: Sun, 10 Jan 2016 22:01:46 +0000 Subject: [PATCH 0261/4996] Fixed broken link to blog on using mathjax with jekyll --- site/_docs/extras.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/extras.md b/site/_docs/extras.md index b8b8bb72649..24bcafa148a 100644 --- a/site/_docs/extras.md +++ b/site/_docs/extras.md @@ -15,7 +15,7 @@ Kramdown comes with optional support for LaTeX to PNG rendering via [MathJax](ht {% endhighlight %} -For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/blog/opinion/2014/02/16/Mathjax-with-jekyll.html). +For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/opinion/2014/02/16/Mathjax-with-jekyll/). ## Alternative Markdown Processors From d58e38c1a7b6830003fd64250d2d0897091fc8c6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Jan 2016 19:55:45 -0800 Subject: [PATCH 0262/4996] Update history to reflect merge of #4344 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6ad35f61cac..176c2d8d953 100644 --- a/History.markdown +++ b/History.markdown @@ -76,6 +76,7 @@ * Add Pro Tip to use front matter variable to create clean URLs (#4296) * Fix grammar in the documentation for posts. (#4330) * Add documentation for smartify Liquid filter (#4333) + * Fixed broken link to blog on using mathjax with jekyll (#4344) ## 3.0.1 / 2015-11-17 From 2f36e09db57fa727f8dea70d61b3300e2547a7bc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Jan 2016 19:55:59 -0800 Subject: [PATCH 0263/4996] Update history to reflect merge of #4344 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 176c2d8d953..2411714ba1b 100644 --- a/History.markdown +++ b/History.markdown @@ -77,6 +77,7 @@ * Fix grammar in the documentation for posts. (#4330) * Add documentation for smartify Liquid filter (#4333) * Fixed broken link to blog on using mathjax with jekyll (#4344) + * Fixed broken link to blog on using mathjax with jekyll (#4344) ## 3.0.1 / 2015-11-17 From 00b9f9dd620d3ce75fdeefe98e3e7fe4ddca32a3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 10 Jan 2016 19:57:02 -0800 Subject: [PATCH 0264/4996] Revert "Update history to reflect merge of #4344 [ci skip]" This reverts commit 2f36e09db57fa727f8dea70d61b3300e2547a7bc. --- History.markdown | 1 - 1 file changed, 1 deletion(-) diff --git a/History.markdown b/History.markdown index 2411714ba1b..176c2d8d953 100644 --- a/History.markdown +++ b/History.markdown @@ -77,7 +77,6 @@ * Fix grammar in the documentation for posts. (#4330) * Add documentation for smartify Liquid filter (#4333) * Fixed broken link to blog on using mathjax with jekyll (#4344) - * Fixed broken link to blog on using mathjax with jekyll (#4344) ## 3.0.1 / 2015-11-17 From 597021a81334f9b0fbd49c449e094e226cbbadd9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 11 Jan 2016 08:56:49 -0800 Subject: [PATCH 0265/4996] Update history to reflect merge of #4343 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 176c2d8d953..7318a05fa08 100644 --- a/History.markdown +++ b/History.markdown @@ -52,6 +52,7 @@ * Implement codeclimate platform (#4340) * Remove ObectSpace dumping and start using inherited, it's faster. (#4342) * Add script/travis so all people can play with Travis-CI images. (#4338) + * Move Cucumber to using RSpec-Expections and furthering JRuby support. (#4343) ### Site Enhancements From c5b8b3315f4cddda41f008cfe82ab3c03ac48fd3 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Mon, 11 Jan 2016 14:55:34 -0600 Subject: [PATCH 0266/4996] Rearrange Cucumber and add some flair. * Move step_definitions/jekyll.rb to just step_definitions.rb * Rename the formatter to Jekyll::Cucumber::Formatter, it's Jekyll's. * Add some flair; switch to checks! * Rename env.rb to helpers.rb --- .../jekyll_steps.rb => step_definitions.rb} | 0 .../support/{overview.rb => formatter.rb} | 130 +++++++++++------- features/support/{env.rb => helpers.rb} | 0 script/cucumber | 11 +- 4 files changed, 84 insertions(+), 57 deletions(-) rename features/{step_definitions/jekyll_steps.rb => step_definitions.rb} (100%) rename features/support/{overview.rb => formatter.rb} (56%) rename features/support/{env.rb => helpers.rb} (100%) diff --git a/features/step_definitions/jekyll_steps.rb b/features/step_definitions.rb similarity index 100% rename from features/step_definitions/jekyll_steps.rb rename to features/step_definitions.rb diff --git a/features/support/overview.rb b/features/support/formatter.rb similarity index 56% rename from features/support/overview.rb rename to features/support/formatter.rb index 9045eafbf5a..f399a3ce16c 100644 --- a/features/support/overview.rb +++ b/features/support/formatter.rb @@ -3,142 +3,176 @@ require 'cucumber/formatter/console' require 'cucumber/formatter/io' -module Features - module Support - # The formatter used for --format pretty (the default formatter). - # - # This formatter prints features to plain text - exactly how they were parsed, - # just prettier. That means with proper indentation and alignment of table columns. - # - # If the output is STDOUT (and not a file), there are bright colours to watch too. - # - class Overview +module Jekyll + module Cucumber + class Formatter + attr_accessor :indent, :runtime + include ::Cucumber::Formatter::Console + include ::Cucumber::Formatter::Io include FileUtils - include Cucumber::Formatter::Console - include Cucumber::Formatter::Io - attr_writer :indent - attr_reader :runtime + + CHARS = { + :failed => "\u2718".red, + :pending => "\u203D".yellow, + :undefined => "\u2718".red, + :passed => "\u2714".green, + :skipped => "\u203D".blue + } + + # def initialize(runtime, path_or_io, options) - @runtime, @io, @options = runtime, ensure_io(path_or_io), options - @exceptions = [] - @indent = 0 + @runtime = runtime + @snippets_input = [] + @io = ensure_io(path_or_io) @prefixes = options[:prefixes] || {} @delayed_messages = [] - @snippets_input = [] + @options = options + @exceptions = [] + @indent = 0 end + # + def before_features(features) print_profile_information end + # + def after_features(features) @io.puts print_summary(features) end + # + def before_feature(feature) @exceptions = [] @indent = 0 end - def comment_line(comment_line) - end + # - def after_tags(tags) - end + def tag_name(tag_name); end + def comment_line(comment_line); end + def after_feature_element(feature_element); end + def after_tags(tags); end - def tag_name(tag_name) - end + # def before_feature_element(feature_element) @indent = 2 @scenario_indent = 2 end - def after_feature_element(feature_element) - end + # def before_background(background) - @indent = 2 @scenario_indent = 2 @in_background = true + @indent = 2 end + # + def after_background(background) @in_background = nil end - def background_name(keyword, name, file_colon_line, source_indent) - print_feature_element_name(keyword, name, file_colon_line, source_indent) + # + + def background_name(keyword, name, source_line, indend) + print_feature_element_name( + keyword, name, source_line, indend + ) end - def scenario_name(keyword, name, file_colon_line, source_indent) - print_feature_element_name(keyword, name, file_colon_line, source_indent) + # + + def scenario_name(keyword, name, source_line, indent) + print_feature_element_name( + keyword, name, source_line, indent + ) end + # + def before_step(step) @current_step = step end - def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line) + # + + def before_step_result(keyword, step_match, multiline_arg, status, exception, \ + source_indent, background, file_colon_line) + @hide_this_step = false if exception if @exceptions.include?(exception) @hide_this_step = true return end + @exceptions << exception end + if status != :failed && @in_background ^ background @hide_this_step = true return end + @status = status end - CHARS = { - :failed => "x".red, - :pending => "?".yellow, - :undefined => "x".red, - :passed => ".".green, - :skipped => "-".blue - } + # def step_name(keyword, step_match, status, source_indent, background, file_colon_line) @io.print CHARS[status] + @io.print " " end + # + def exception(exception, status) return if @hide_this_step + @io.puts print_exception(exception, status, @indent) @io.flush end + # + def after_test_step(test_step, result) - collect_snippet_data(test_step, result) + collect_snippet_data( + test_step, result + ) end - private + # - def print_feature_element_name(keyword, name, file_colon_line, source_indent) + private + def print_feature_element_name(keyword, name, source_line, indent) @io.puts - names = name.empty? ? [name] : name.split("\n") - line = " #{keyword}: #{names[0]}" - if @options[:source] - line_comment = "#{file_colon_line}" - @io.print(line_comment) - end + + names = name.empty? ? [name] : name.each_line.to_a + line = " #{keyword}: #{names[0]}" + + @io.print(source_line) if @options[:source] @io.print(line) @io.print " " @io.flush end + # + def cell_prefix(status) @prefixes[status] end + # + def print_summary(features) @io.puts print_stats(features, @options) diff --git a/features/support/env.rb b/features/support/helpers.rb similarity index 100% rename from features/support/env.rb rename to features/support/helpers.rb diff --git a/script/cucumber b/script/cucumber index 13508c84ee2..0f0ef0f7da1 100755 --- a/script/cucumber +++ b/script/cucumber @@ -1,11 +1,4 @@ #!/usr/bin/env bash -if ruby --version | grep -q "jruby" -then - echo "Move along, we are not testing features on JRuby right now." - exit 0 -else - time ruby -S bundle exec cucumber \ - -f Features::Support::Overview \ - "$@" -fi +time ruby -S bundle exec cucumber \ + -f Jekyll::Cucumber::Formatter "$@" From a32c77fb87f6b2bf64e52e0070b69d7f77339bc6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 11 Jan 2016 13:10:43 -0800 Subject: [PATCH 0267/4996] Update history to reflect merge of #4347 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7318a05fa08..ab1d5139c67 100644 --- a/History.markdown +++ b/History.markdown @@ -53,6 +53,7 @@ * Remove ObectSpace dumping and start using inherited, it's faster. (#4342) * Add script/travis so all people can play with Travis-CI images. (#4338) * Move Cucumber to using RSpec-Expections and furthering JRuby support. (#4343) + * Rearrange Cucumber and add some flair. (#4347) ### Site Enhancements From da6618c6fc85254556ec965d260a48d22f78208c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 11 Jan 2016 13:36:41 -0800 Subject: [PATCH 0268/4996] site: fix :hour, :minute, :second permalink keys to refer to date front matter value Fixes #4336 --- site/_docs/permalinks.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/site/_docs/permalinks.md b/site/_docs/permalinks.md index 5aa0449aac5..9ccf27060c5 100644 --- a/site/_docs/permalinks.md +++ b/site/_docs/permalinks.md @@ -79,7 +79,7 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti

- Hour of the day, 24-hour clock, zero-padded from the Post’s filename. (00..23) + Hour of the day, 24-hour clock, zero-padded from the post’s date front matter. (00..23)

@@ -89,7 +89,7 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti

- Minute of the hour from the Post’s filename. (00..59) + Minute of the hour from the post’s date front matter. (00..59)

@@ -99,7 +99,8 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti

- Second of the minute from the Post’s filename. (00..60) + Second of the minute from the post’s date front matter. (00..59) +

From 03582c32ed39524081b843736f69dc2b538e7a24 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 11 Jan 2016 13:37:22 -0800 Subject: [PATCH 0269/4996] site: update generated history per automatic fixes to History.markdown --- site/_docs/history.md | 372 +++++++++++++++++++++--------------------- 1 file changed, 187 insertions(+), 185 deletions(-) diff --git a/site/_docs/history.md b/site/_docs/history.md index a99932fb88f..a12653f2c1c 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -87,8 +87,7 @@ permalink: "/docs/history/" - Perf: `Markdown#matches` should avoid regexp ([#3321]({{ site.repository }}/issues/3321)) - Perf: Use frozen regular expressions for `Utils#slugify` ([#3321]({{ site.repository }}/issues/3321)) - Split off Textile support into jekyll-textile-converter ([#3319]({{ site.repository }}/issues/3319)) -- Improve the navigation menu alignment in the site template on small - screens ([#3331]({{ site.repository }}/issues/3331)) +- Improve the navigation menu alignment in the site template on small screens ([#3331]({{ site.repository }}/issues/3331)) - Show the regeneration time after the initial generation ([#3378]({{ site.repository }}/issues/3378)) - Site template: Switch default font to Helvetica Neue ([#3376]({{ site.repository }}/issues/3376)) - Make the `include` tag a teensy bit faster. ([#3391]({{ site.repository }}/issues/3391)) @@ -120,8 +119,7 @@ permalink: "/docs/history/" - Set log level to debug when verbose flag is set ([#3665]({{ site.repository }}/issues/3665)) - Added a mention on the Gemfile to complete the instructions ([#3671]({{ site.repository }}/issues/3671)) - Perf: Cache `Document#to_liquid` and invalidate where necessary ([#3693]({{ site.repository }}/issues/3693)) -- Perf: `Jekyll::Cleaner#existing_files`: Call `keep_file_regex` and - `keep_dirs` only once, not once per iteration ([#3696]({{ site.repository }}/issues/3696)) +- Perf: `Jekyll::Cleaner#existing_files`: Call `keep_file_regex` and `keep_dirs` only once, not once per iteration ([#3696]({{ site.repository }}/issues/3696)) - Omit jekyll/jekyll-help from list of resources. ([#3698]({{ site.repository }}/issues/3698)) - Add basic `jekyll doctor` test to detect fsnotify (OSX) anomalies. ([#3704]({{ site.repository }}/issues/3704)) - Added talk.jekyllrb.com to "Have questions?" ([#3694]({{ site.repository }}/issues/3694)) @@ -423,8 +421,7 @@ permalink: "/docs/history/" - Strip newlines in site template `` description. ([#2982]({{ site.repository }}/issues/2982)) - Add link to atom feed in `head` of site template files ([#2996]({{ site.repository }}/issues/2996)) - Performance optimizations ([#2994]({{ site.repository }}/issues/2994)) -- Use `Hash#each_key` instead of `Hash#keys.each` to speed up iteration - over hash keys. ([#3017]({{ site.repository }}/issues/3017)) +- Use `Hash#each_key` instead of `Hash#keys.each` to speed up iteration over hash keys. ([#3017]({{ site.repository }}/issues/3017)) - Further minor performance enhancements. ([#3022]({{ site.repository }}/issues/3022)) - Add 'b' and 's' aliases for build and serve, respectively ([#3065]({{ site.repository }}/issues/3065)) @@ -432,8 +429,7 @@ permalink: "/docs/history/" {: #bug-fixes-v2-5-0} - Fix Rouge's RedCarpet plugin interface integration ([#2951]({{ site.repository }}/issues/2951)) -- Remove `--watch` from the site template blog post since it defaults - to watching in in 2.4.0 ([#2922]({{ site.repository }}/issues/2922)) +- Remove `--watch` from the site template blog post since it defaults to watching in in 2.4.0 ([#2922]({{ site.repository }}/issues/2922)) - Fix code for media query mixin in site template ([#2946]({{ site.repository }}/issues/2946)) - Allow post URL's to have `.htm` extensions ([#2925]({{ site.repository }}/issues/2925)) - `Utils.slugify`: Don't create new objects when gsubbing ([#2997]({{ site.repository }}/issues/2997)) @@ -519,11 +515,9 @@ permalink: "/docs/history/" - Document the `name` variable for collection permalinks ([#2829]({{ site.repository }}/issues/2829)) - Adds info about installing jekyll in current dir ([#2839]({{ site.repository }}/issues/2839)) -- Remove deprecated `jekyll-projectlist` plugin from list of third-party - plugins ([#2742]({{ site.repository }}/issues/2742)) +- Remove deprecated `jekyll-projectlist` plugin from list of third-party plugins ([#2742]({{ site.repository }}/issues/2742)) - Remove tag plugins that are built in to Jekyll ([#2751]({{ site.repository }}/issues/2751)) -- Add `markdown-writer` package for Atom Editor to list of third-party - plugins ([#2763]({{ site.repository }}/issues/2763)) +- Add `markdown-writer` package for Atom Editor to list of third-party plugins ([#2763]({{ site.repository }}/issues/2763)) - Fix typo in site documentation for collections ([#2764]({{ site.repository }}/issues/2764)) - Fix minor typo on plugins docs page ([#2765]({{ site.repository }}/issues/2765)) - Replace markdown with HTML in `sass_dir` note on assets page ([#2791]({{ site.repository }}/issues/2791)) @@ -623,8 +617,7 @@ permalink: "/docs/history/" {: #site-enhancements-v2-2-0} - Update Kramdown urls ([#2588]({{ site.repository }}/issues/2588)) -- Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of - third-party plugins ([#2596]({{ site.repository }}/issues/2596)) +- Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of third-party plugins ([#2596]({{ site.repository }}/issues/2596)) - Fix a bunch of broken links in the site ([#2601]({{ site.repository }}/issues/2601)) - Replace dead links with working links ([#2611]({{ site.repository }}/issues/2611)) - Add jekyll-hook to deployment methods ([#2617]({{ site.repository }}/issues/2617)) @@ -668,12 +661,10 @@ permalink: "/docs/history/" - Allow subdirectories in `_data` ([#2395]({{ site.repository }}/issues/2395)) - Extract Pagination Generator into gem: `jekyll-paginate` ([#2455]({{ site.repository }}/issues/2455)) - Utilize `date_to_rfc822` filter in site template ([#2437]({{ site.repository }}/issues/2437)) -- Add categories, last build datetime, and generator to site template - feed ([#2438]({{ site.repository }}/issues/2438)) +- Add categories, last build datetime, and generator to site template feed ([#2438]({{ site.repository }}/issues/2438)) - Configurable, replaceable Logger-compliant logger ([#2444]({{ site.repository }}/issues/2444)) - Extract `gist` tag into a separate gem ([#2469]({{ site.repository }}/issues/2469)) -- Add `collection` attribute to `Document#to_liquid` to access the - document's collection label. ([#2436]({{ site.repository }}/issues/2436)) +- Add `collection` attribute to `Document#to_liquid` to access the document's collection label. ([#2436]({{ site.repository }}/issues/2436)) - Upgrade listen to `2.7.6 <= x < 3.0.0` ([#2492]({{ site.repository }}/issues/2492)) - Allow configuration of different Twitter and GitHub usernames in site template ([#2485]({{ site.repository }}/issues/2485)) - Bump Pygments to v0.6.0 ([#2504]({{ site.repository }}/issues/2504)) @@ -699,8 +690,7 @@ permalink: "/docs/history/" - Allow front matter defaults to set post categories ([#2373]({{ site.repository }}/issues/2373)) - Fix command in subcommand deprecation warning ([#2457]({{ site.repository }}/issues/2457)) - Keep all parent directories of files/dirs in `keep_files` ([#2458]({{ site.repository }}/issues/2458)) -- When using RedCarpet and Rouge without Rouge installed, fixed erroneous - error which stated that redcarpet was missing, not rouge. ([#2464]({{ site.repository }}/issues/2464)) +- When using RedCarpet and Rouge without Rouge installed, fixed erroneous error which stated that redcarpet was missing, not rouge. ([#2464]({{ site.repository }}/issues/2464)) - Ignore *all* directories and files that merit it on auto-generation ([#2459]({{ site.repository }}/issues/2459)) - Before copying file, explicitly remove the old one ([#2535]({{ site.repository }}/issues/2535)) - Merge file system categories with categories from YAML. ([#2531]({{ site.repository }}/issues/2531)) @@ -731,8 +721,7 @@ permalink: "/docs/history/" - Prevent table from extending parent width in permalink style table ([#2424]({{ site.repository }}/issues/2424)) - Add collections to info about pagination support ([#2389]({{ site.repository }}/issues/2389)) - Add `jekyll_github_sample` plugin to list of third-party plugins ([#2463]({{ site.repository }}/issues/2463)) -- Clarify documentation around front matter defaults and add details - about defaults for collections. ([#2439]({{ site.repository }}/issues/2439)) +- Clarify documentation around front matter defaults and add details about defaults for collections. ([#2439]({{ site.repository }}/issues/2439)) - Add Jekyll Project Version Tag to list of third-party plugins ([#2468]({{ site.repository }}/issues/2468)) - Use `https` for GitHub links across whole site ([#2470]({{ site.repository }}/issues/2470)) - Add StickerMule + Jekyll post ([#2476]({{ site.repository }}/issues/2476)) @@ -751,13 +740,11 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v2-0-3} -- Properly prefix links in site template with URL or baseurl depending upon - need. ([#2319]({{ site.repository }}/issues/2319)) +- Properly prefix links in site template with URL or baseurl depending upon need. ([#2319]({{ site.repository }}/issues/2319)) - Update gist tag comments and error message to require username ([#2326]({{ site.repository }}/issues/2326)) - Fix `permalink` setting in site template ([#2331]({{ site.repository }}/issues/2331)) - Don't fail if any of the path objects are nil ([#2325]({{ site.repository }}/issues/2325)) -- Instantiate all descendants for converters and generators, not just - direct subclasses ([#2334]({{ site.repository }}/issues/2334)) +- Instantiate all descendants for converters and generators, not just direct subclasses ([#2334]({{ site.repository }}/issues/2334)) - Replace all instances of `site.name` with `site.title` in site template ([#2324]({{ site.repository }}/issues/2324)) - `Jekyll::Filters#time` now accepts UNIX timestamps in string or number form ([#2339]({{ site.repository }}/issues/2339)) - Use `item_property` for `where` filter so it doesn't break on collections ([#2359]({{ site.repository }}/issues/2359)) @@ -804,17 +791,16 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v2-0-0} + - Add "Collections" feature ([#2199]({{ site.repository }}/issues/2199)) - Add gem-based plugin whitelist to safe mode ([#1657]({{ site.repository }}/issues/1657)) -- Replace the commander command line parser with a more robust - solution for our needs called `mercenary` ([#1706]({{ site.repository }}/issues/1706)) +- Replace the commander command line parser with a more robust solution for our needs called `mercenary` ([#1706]({{ site.repository }}/issues/1706)) - Remove support for Ruby 1.8.x ([#1780]({{ site.repository }}/issues/1780)) - Move to jekyll/jekyll from mojombo/jekyll ([#1817]({{ site.repository }}/issues/1817)) - Allow custom markdown processors ([#1872]({{ site.repository }}/issues/1872)) - Provide support for the Rouge syntax highlighter ([#1859]({{ site.repository }}/issues/1859)) - Provide support for Sass ([#1932]({{ site.repository }}/issues/1932)) -- Provide a 300% improvement when generating sites that use - `Post#next` or `Post#previous` ([#1983]({{ site.repository }}/issues/1983)) +- Provide a 300% improvement when generating sites that use `Post#next` or `Post#previous` ([#1983]({{ site.repository }}/issues/1983)) - Provide support for CoffeeScript ([#1991]({{ site.repository }}/issues/1991)) - Replace Maruku with Kramdown as Default Markdown Processor ([#1988]({{ site.repository }}/issues/1988)) - Expose `site.static_files` to Liquid ([#2075]({{ site.repository }}/issues/2075)) @@ -826,10 +812,9 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v2-0-0} -- Move the EntryFilter class into the Jekyll module to avoid polluting the - global namespace ([#1800]({{ site.repository }}/issues/1800)) -- Add `group_by` Liquid filter create lists of items grouped by a common - property's value ([#1788]({{ site.repository }}/issues/1788)) + +- Move the EntryFilter class into the Jekyll module to avoid polluting the global namespace ([#1800]({{ site.repository }}/issues/1800)) +- Add `group_by` Liquid filter create lists of items grouped by a common property's value ([#1788]({{ site.repository }}/issues/1788)) - Add support for Maruku's `fenced_code_blocks` option ([#1799]({{ site.repository }}/issues/1799)) - Update Redcarpet dependency to ~> 3.0 ([#1815]({{ site.repository }}/issues/1815)) - Automatically sort all pages by name ([#1848]({{ site.repository }}/issues/1848)) @@ -840,12 +825,10 @@ permalink: "/docs/history/" - Bump dependency `safe_yaml` to `~> 1.0` ([#1886]({{ site.repository }}/issues/1886)) - Allow sorting of content by custom properties ([#1849]({{ site.repository }}/issues/1849)) - Add `--quiet` flag to silence output during build and serve ([#1898]({{ site.repository }}/issues/1898)) -- Add a `where` filter to filter arrays based on a key/value pair - ([#1875]({{ site.repository }}/issues/1875)) +- Add a `where` filter to filter arrays based on a key/value pair ([#1875]({{ site.repository }}/issues/1875)) - Route 404 errors to a custom 404 page in development ([#1899]({{ site.repository }}/issues/1899)) - Excludes are now relative to the site source ([#1916]({{ site.repository }}/issues/1916)) -- Bring MIME Types file for `jekyll serve` to complete parity with GH Pages - servers ([#1993]({{ site.repository }}/issues/1993)) +- Bring MIME Types file for `jekyll serve` to complete parity with GH Pages servers ([#1993]({{ site.repository }}/issues/1993)) - Adding Breakpoint to make new site template more responsive ([#2038]({{ site.repository }}/issues/2038)) - Default to using the UTF-8 encoding when reading files. ([#2031]({{ site.repository }}/issues/2031)) - Update Redcarpet dependency to ~> 3.1 ([#2044]({{ site.repository }}/issues/2044)) @@ -863,13 +846,11 @@ permalink: "/docs/history/" - Add support for unpublished drafts ([#2164]({{ site.repository }}/issues/2164)) - Add `force_polling` option to the `serve` command ([#2165]({{ site.repository }}/issues/2165)) - Clean up the `` in the site template ([#2186]({{ site.repository }}/issues/2186)) -- Permit YAML blocks to end with three dots to better conform with the - YAML spec ([#2110]({{ site.repository }}/issues/2110)) +- Permit YAML blocks to end with three dots to better conform with the YAML spec ([#2110]({{ site.repository }}/issues/2110)) - Use `File.exist?` instead of deprecated `File.exists?` ([#2214]({{ site.repository }}/issues/2214)) - Require newline after start of YAML Front Matter header ([#2211]({{ site.repository }}/issues/2211)) - Add the ability for pages to be marked as `published: false` ([#1492]({{ site.repository }}/issues/1492)) -- Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy - looking up of variable values in a Liquid context. ([#2253]({{ site.repository }}/issues/2253)) +- Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy looking up of variable values in a Liquid context. ([#2253]({{ site.repository }}/issues/2253)) - Remove literal lang name from class ([#2292]({{ site.repository }}/issues/2292)) - Return `utf-8` encoding in header for webrick error page response ([#2289]({{ site.repository }}/issues/2289)) - Make template site easier to customize ([#2268]({{ site.repository }}/issues/2268)) @@ -879,13 +860,12 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v2-0-0} + - Don't allow nil entries when loading posts ([#1796]({{ site.repository }}/issues/1796)) -- Remove the scrollbar that's always displayed in new sites generated - from the site template ([#1805]({{ site.repository }}/issues/1805)) +- Remove the scrollbar that's always displayed in new sites generated from the site template ([#1805]({{ site.repository }}/issues/1805)) - Add `#path` to required methods in `Jekyll::Convertible` ([#1866]({{ site.repository }}/issues/1866)) - Default Maruku fenced code blocks to ON for 2.0.0-dev ([#1831]({{ site.repository }}/issues/1831)) -- Change short opts for host and port for `jekyll docs` to be consistent with - other subcommands ([#1877]({{ site.repository }}/issues/1877)) +- Change short opts for host and port for `jekyll docs` to be consistent with other subcommands ([#1877]({{ site.repository }}/issues/1877)) - Fix typos ([#1910]({{ site.repository }}/issues/1910)) - Lock Maruku at 0.7.0 to prevent bugs caused by Maruku 0.7.1 ([#1958]({{ site.repository }}/issues/1958)) - Fixes full path leak to source directory when using include tag ([#1951]({{ site.repository }}/issues/1951)) @@ -898,8 +878,7 @@ permalink: "/docs/history/" - Sanitize paths uniformly, in a Windows-friendly way ([#2065]({{ site.repository }}/issues/2065), [#2109]({{ site.repository }}/issues/2109)) - Update gem build steps to work correctly on Windows ([#2118]({{ site.repository }}/issues/2118)) - Remove obsolete `normalize_options` method call from `bin/jekyll` ([#2121]({{ site.repository }}/issues/2121)). -- Remove `+` characters from Pygments lexer names when adding as a CSS - class ([#994]({{ site.repository }}/issues/994)) +- Remove `+` characters from Pygments lexer names when adding as a CSS class ([#994]({{ site.repository }}/issues/994)) - Remove some code that caused Ruby interpreter warnings ([#2178]({{ site.repository }}/issues/2178)) - Only strip the drive name if it begins the string ([#2175]({{ site.repository }}/issues/2175)) - Remove default post with invalid date from site template ([#2200]({{ site.repository }}/issues/2200)) @@ -915,14 +894,14 @@ permalink: "/docs/history/" ### Development Fixes {: #development-fixes-v2-0-0} + - Add a link to the site in the README.md file ([#1795]({{ site.repository }}/issues/1795)) - Add in History and site changes from `v1-stable` branch ([#1836]({{ site.repository }}/issues/1836)) - Testing additions on the Excerpt class ([#1893]({{ site.repository }}/issues/1893)) - Fix the `highlight` tag feature ([#1859]({{ site.repository }}/issues/1859)) - Test Jekyll under Ruby 2.1.0 ([#1900]({{ site.repository }}/issues/1900)) - Add script/cibuild for fun and profit ([#1912]({{ site.repository }}/issues/1912)) -- Use `Forwardable` for delegation between `Excerpt` and `Post` - ([#1927]({{ site.repository }}/issues/1927)) +- Use `Forwardable` for delegation between `Excerpt` and `Post` ([#1927]({{ site.repository }}/issues/1927)) - Rename `read_things` to `read_content` ([#1928]({{ site.repository }}/issues/1928)) - Add `script/branding` script for ASCII art lovin' ([#1936]({{ site.repository }}/issues/1936)) - Update the README to reflect the repo move ([#1943]({{ site.repository }}/issues/1943)) @@ -951,11 +930,11 @@ permalink: "/docs/history/" ### Site Enhancements {: #site-enhancements-v2-0-0} + - Document Kramdown's GFM parser option ([#1791]({{ site.repository }}/issues/1791)) - Move CSS to includes & update normalize.css to v2.1.3 ([#1787]({{ site.repository }}/issues/1787)) - Minify CSS only in production ([#1803]({{ site.repository }}/issues/1803)) -- Fix broken link to installation of Ruby on Mountain Lion blog post on - Troubleshooting docs page ([#1797]({{ site.repository }}/issues/1797)) +- Fix broken link to installation of Ruby on Mountain Lion blog post on Troubleshooting docs page ([#1797]({{ site.repository }}/issues/1797)) - Fix issues with 1.4.1 release blog post ([#1804]({{ site.repository }}/issues/1804)) - Add note about deploying to OpenShift ([#1812]({{ site.repository }}/issues/1812)) - Collect all Windows-related docs onto one page ([#1818]({{ site.repository }}/issues/1818)) @@ -970,8 +949,7 @@ permalink: "/docs/history/" - Add jekyll-compass to the plugin list ([#1923]({{ site.repository }}/issues/1923)) - Add note in Posts docs about stripping `

` tags from excerpt ([#1933]({{ site.repository }}/issues/1933)) - Add additional info about the new exclude behavior ([#1938]({{ site.repository }}/issues/1938)) -- Linkify 'awesome contributors' to point to the contributors graph on - GitHub ([#1940]({{ site.repository }}/issues/1940)) +- Linkify 'awesome contributors' to point to the contributors graph on GitHub ([#1940]({{ site.repository }}/issues/1940)) - Update `docs/sites.md` link to GitHub Training materials ([#1949]({{ site.repository }}/issues/1949)) - Update `master` with the release info from 1.4.3 ([#1947]({{ site.repository }}/issues/1947)) - Define docs nav in datafile ([#1953]({{ site.repository }}/issues/1953)) @@ -988,8 +966,7 @@ permalink: "/docs/history/" - Update link to rack-jekyll on "Deployment Methods" page ([#2047]({{ site.repository }}/issues/2047)) - Fix typo in /docs/configuration ([#2073]({{ site.repository }}/issues/2073)) - Fix count in docs for `site.static_files` ([#2077]({{ site.repository }}/issues/2077)) -- Update configuration docs to indicate utf-8 is the default for 2.0.0 - and ASCII for 1.9.3 ([#2074]({{ site.repository }}/issues/2074)) +- Update configuration docs to indicate utf-8 is the default for 2.0.0 and ASCII for 1.9.3 ([#2074]({{ site.repository }}/issues/2074)) - Add info about unreleased feature to the site ([#2061]({{ site.repository }}/issues/2061)) - Add whitespace to liquid example in GitHub Pages docs ([#2084]({{ site.repository }}/issues/2084)) - Clarify the way Sass and CoffeeScript files are read in and output ([#2067]({{ site.repository }}/issues/2067)) @@ -1006,8 +983,7 @@ permalink: "/docs/history/" - Some HTML tidying ([#2130]({{ site.repository }}/issues/2130)) - Remove modernizr and use html5shiv.js directly for IE less than v9 ([#2131]({{ site.repository }}/issues/2131)) - Remove unused images ([#2187]({{ site.repository }}/issues/2187)) -- Use `array_to_sentence_string` filter when outputting news item - categories ([#2191]({{ site.repository }}/issues/2191)) +- Use `array_to_sentence_string` filter when outputting news item categories ([#2191]({{ site.repository }}/issues/2191)) - Add link to Help repo in primary navigation bar ([#2177]({{ site.repository }}/issues/2177)) - Switch to using an ico file for the shortcut icon ([#2193]({{ site.repository }}/issues/2193)) - Use numbers to specify font weights and only bring in font weights used ([#2185]({{ site.repository }}/issues/2185)) @@ -1068,6 +1044,7 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v1-4-3} + - Patch show-stopping security vulnerabilities ([#1944]({{ site.repository }}/issues/1944)) @@ -1076,6 +1053,7 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v1-4-2} + - Turn on Maruku fenced code blocks by default ([#1830]({{ site.repository }}/issues/1830)) @@ -1084,6 +1062,7 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v1-4-1} + - Don't allow nil entries when loading posts ([#1796]({{ site.repository }}/issues/1796)) @@ -1092,25 +1071,30 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v1-4-0} + - Add support for TOML config files ([#1765]({{ site.repository }}/issues/1765)) ### Minor Enhancements {: #minor-enhancements-v1-4-0} + - Sort plugins as a way to establish a load order ([#1682]({{ site.repository }}/issues/1682)) - Update Maruku to 0.7.0 ([#1775]({{ site.repository }}/issues/1775)) ### Bug Fixes {: #bug-fixes-v1-4-0} + - Add a space between two words in a Pagination warning message ([#1769]({{ site.repository }}/issues/1769)) - Upgrade `toml` gem to `v0.1.0` to maintain compat with Ruby 1.8.7 ([#1778]({{ site.repository }}/issues/1778)) ### Development Fixes {: #development-fixes-v1-4-0} + - Remove some whitespace in the code ([#1755]({{ site.repository }}/issues/1755)) - Remove some duplication in the reading of posts and drafts ([#1779]({{ site.repository }}/issues/1779)) ### Site Enhancements {: #site-enhancements-v1-4-0} + - Fixed case of a word in the Jekyll v1.3.0 release post ([#1762]({{ site.repository }}/issues/1762)) - Fixed the mime type for the favicon ([#1772]({{ site.repository }}/issues/1772)) @@ -1120,19 +1104,20 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v1-3-1} + - Add a `--prefix` option to passthrough for the importers ([#1669]({{ site.repository }}/issues/1669)) -- Push the paginator plugin lower in the plugin priority order so - other plugins run before it ([#1759]({{ site.repository }}/issues/1759)) +- Push the paginator plugin lower in the plugin priority order so other plugins run before it ([#1759]({{ site.repository }}/issues/1759)) ### Bug Fixes {: #bug-fixes-v1-3-1} + - Fix the include tag when ran in a loop ([#1726]({{ site.repository }}/issues/1726)) - Fix errors when using `--watch` on 1.8.7 ([#1730]({{ site.repository }}/issues/1730)) -- Specify where the include is called from if an included file is - missing ([#1746]({{ site.repository }}/issues/1746)) +- Specify where the include is called from if an included file is missing ([#1746]({{ site.repository }}/issues/1746)) ### Development Fixes {: #development-fixes-v1-3-1} + - Extract `Site#filter_entries` into its own object ([#1697]({{ site.repository }}/issues/1697)) - Enable Travis' bundle caching ([#1734]({{ site.repository }}/issues/1734)) - Remove trailing whitespace in some files ([#1736]({{ site.repository }}/issues/1736)) @@ -1140,11 +1125,10 @@ permalink: "/docs/history/" ### Site Enhancements {: #site-enhancements-v1-3-1} + - Update link to example Rakefile to point to specific commit ([#1741]({{ site.repository }}/issues/1741)) -- Fix drafts docs to indicate that draft time is based on file modification - time, not `Time.now` ([#1695]({{ site.repository }}/issues/1695)) -- Add `jekyll-monthly-archive-plugin` and `jekyll-category-archive-plugin` to - list of third-party plugins ([#1693]({{ site.repository }}/issues/1693)) +- Fix drafts docs to indicate that draft time is based on file modification time, not `Time.now` ([#1695]({{ site.repository }}/issues/1695)) +- Add `jekyll-monthly-archive-plugin` and `jekyll-category-archive-plugin` to list of third-party plugins ([#1693]({{ site.repository }}/issues/1693)) - Add `jekyll-asset-path-plugin` to list of third-party plugins ([#1670]({{ site.repository }}/issues/1670)) - Add `emoji-for-jekyll` to list of third-part plugins ([#1708]({{ site.repository }}/issues/1708)) - Fix previous section link on plugins page to point to pagination page ([#1707]({{ site.repository }}/issues/1707)) @@ -1159,47 +1143,43 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v1-3-0} -- Add support for adding data as YAML files under a site's `_data` - directory ([#1003]({{ site.repository }}/issues/1003)) + +- Add support for adding data as YAML files under a site's `_data` directory ([#1003]({{ site.repository }}/issues/1003)) - Allow variables to be used with `include` tags ([#1495]({{ site.repository }}/issues/1495)) - Allow using gems for plugin management ([#1557]({{ site.repository }}/issues/1557)) ### Minor Enhancements {: #minor-enhancements-v1-3-0} + - Decrease the specificity in the site template CSS ([#1574]({{ site.repository }}/issues/1574)) - Add `encoding` configuration option ([#1449]({{ site.repository }}/issues/1449)) -- Provide better error handling for Jekyll's custom Liquid tags - ([#1514]({{ site.repository }}/issues/1514)) -- If an included file causes a Liquid error, add the path to the - include file that caused the error to the error message ([#1596]({{ site.repository }}/issues/1596)) -- If a layout causes a Liquid error, change the error message so that - we know it comes from the layout ([#1601]({{ site.repository }}/issues/1601)) +- Provide better error handling for Jekyll's custom Liquid tags ([#1514]({{ site.repository }}/issues/1514)) +- If an included file causes a Liquid error, add the path to the include file that caused the error to the error message ([#1596]({{ site.repository }}/issues/1596)) +- If a layout causes a Liquid error, change the error message so that we know it comes from the layout ([#1601]({{ site.repository }}/issues/1601)) - Update Kramdown dependency to `~> 1.2` ([#1610]({{ site.repository }}/issues/1610)) - Update `safe_yaml` dependency to `~> 0.9.7` ([#1602]({{ site.repository }}/issues/1602)) - Allow layouts to be in subfolders like includes ([#1622]({{ site.repository }}/issues/1622)) - Switch to listen for site watching while serving ([#1589]({{ site.repository }}/issues/1589)) - Add a `json` liquid filter to be used in sites ([#1651]({{ site.repository }}/issues/1651)) -- Point people to the migration docs when the `jekyll-import` gem is - missing ([#1662]({{ site.repository }}/issues/1662)) +- Point people to the migration docs when the `jekyll-import` gem is missing ([#1662]({{ site.repository }}/issues/1662)) ### Bug Fixes {: #bug-fixes-v1-3-0} -- Fix up matching against source and destination when the two - locations are similar ([#1556]({{ site.repository }}/issues/1556)) + +- Fix up matching against source and destination when the two locations are similar ([#1556]({{ site.repository }}/issues/1556)) - Fix the missing `pathname` require in certain cases ([#1255]({{ site.repository }}/issues/1255)) - Use `+` instead of `Array#concat` when building `Post` attribute list ([#1571]({{ site.repository }}/issues/1571)) - Print server address when launching a server ([#1586]({{ site.repository }}/issues/1586)) - Downgrade to Maruku `~> 0.6.0` in order to avoid changes in rendering ([#1598]({{ site.repository }}/issues/1598)) - Fix error with failing include tag when variable was file name ([#1613]({{ site.repository }}/issues/1613)) - Downcase lexers before passing them to pygments ([#1615]({{ site.repository }}/issues/1615)) -- Capitalize the short verbose switch because it conflicts with the - built-in Commander switch ([#1660]({{ site.repository }}/issues/1660)) +- Capitalize the short verbose switch because it conflicts with the built-in Commander switch ([#1660]({{ site.repository }}/issues/1660)) - Fix compatibility with 1.8.x ([#1665]({{ site.repository }}/issues/1665)) -- Fix an error with the new file watching code due to library version - incompatibilities ([#1687]({{ site.repository }}/issues/1687)) +- Fix an error with the new file watching code due to library version incompatibilities ([#1687]({{ site.repository }}/issues/1687)) ### Development Fixes {: #development-fixes-v1-3-0} + - Add coverage reporting with Coveralls ([#1539]({{ site.repository }}/issues/1539)) - Refactor the Liquid `include` tag ([#1490]({{ site.repository }}/issues/1490)) - Update launchy dependency to `~> 2.3` ([#1608]({{ site.repository }}/issues/1608)) @@ -1217,6 +1197,7 @@ permalink: "/docs/history/" ### Site Enhancements {: #site-enhancements-v1-3-0} + - Fix params for `JekyllImport::WordPress.process` arguments ([#1554]({{ site.repository }}/issues/1554)) - Add `jekyll-suggested-tweet` to list of third-party plugins ([#1555]({{ site.repository }}/issues/1555)) - Link to Liquid's docs for tags and filters ([#1553]({{ site.repository }}/issues/1553)) @@ -1224,8 +1205,7 @@ permalink: "/docs/history/" - Simplify/generalize pagination docs ([#1577]({{ site.repository }}/issues/1577)) - Add documentation for the new data sources feature ([#1503]({{ site.repository }}/issues/1503)) - Add more information on how to create generators ([#1590]({{ site.repository }}/issues/1590), [#1592]({{ site.repository }}/issues/1592)) -- Improve the instructions for mimicking GitHub Flavored Markdown - ([#1614]({{ site.repository }}/issues/1614)) +- Improve the instructions for mimicking GitHub Flavored Markdown ([#1614]({{ site.repository }}/issues/1614)) - Add `jekyll-import` warning note of missing dependencies ([#1626]({{ site.repository }}/issues/1626)) - Fix grammar in the Usage section ([#1635]({{ site.repository }}/issues/1635)) - Add documentation for the use of gems as plugins ([#1656]({{ site.repository }}/issues/1656)) @@ -1240,6 +1220,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v1-2-1} + - Print better messages for detached server. Mute output on detach. ([#1518]({{ site.repository }}/issues/1518)) - Disable reverse lookup when running `jekyll serve` ([#1363]({{ site.repository }}/issues/1363)) - Upgrade RedCarpet dependency to `~> 2.3.0` ([#1515]({{ site.repository }}/issues/1515)) @@ -1247,17 +1228,20 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v1-2-1} + - Fix file discrepancy in gemspec ([#1522]({{ site.repository }}/issues/1522)) - Force rendering of Include tag ([#1525]({{ site.repository }}/issues/1525)) ### Development Fixes {: #development-fixes-v1-2-1} + - Add a rake task to generate a new release post ([#1404]({{ site.repository }}/issues/1404)) - Mute LSI output in tests ([#1531]({{ site.repository }}/issues/1531)) - Update contributor documentation ([#1537]({{ site.repository }}/issues/1537)) ### Site Enhancements {: #site-enhancements-v1-2-1} + - Fix a couple of validation errors on the site ([#1511]({{ site.repository }}/issues/1511)) - Make navigation menus reusable ([#1507]({{ site.repository }}/issues/1507)) - Fix link to History page from Release v1.2.0 notes post. @@ -1270,45 +1254,41 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v1-2-0} + - Disable automatically-generated excerpts when `excerpt_separator` is `""`. ([#1386]({{ site.repository }}/issues/1386)) - Add checking for URL conflicts when running `jekyll doctor` ([#1389]({{ site.repository }}/issues/1389)) ### Minor Enhancements {: #minor-enhancements-v1-2-0} + - Catch and fix invalid `paginate` values ([#1390]({{ site.repository }}/issues/1390)) -- Remove superfluous `div.container` from the default html template for - `jekyll new` ([#1315]({{ site.repository }}/issues/1315)) +- Remove superfluous `div.container` from the default html template for `jekyll new` ([#1315]({{ site.repository }}/issues/1315)) - Add `-D` short-form switch for the drafts option ([#1394]({{ site.repository }}/issues/1394)) - Update the links in the site template for Twitter and GitHub ([#1400]({{ site.repository }}/issues/1400)) - Update dummy email address to example.com domain ([#1408]({{ site.repository }}/issues/1408)) -- Update normalize.css to v2.1.2 and minify; add rake task to update - normalize.css with greater ease. ([#1430]({{ site.repository }}/issues/1430)) -- Add the ability to detach the server ran by `jekyll serve` from it's - controlling terminal ([#1443]({{ site.repository }}/issues/1443)) +- Update normalize.css to v2.1.2 and minify; add rake task to update normalize.css with greater ease. ([#1430]({{ site.repository }}/issues/1430)) +- Add the ability to detach the server ran by `jekyll serve` from it's controlling terminal ([#1443]({{ site.repository }}/issues/1443)) - Improve permalink generation for URLs with special characters ([#944]({{ site.repository }}/issues/944)) -- Expose the current Jekyll version to posts and pages via a new - `jekyll.version` variable ([#1481]({{ site.repository }}/issues/1481)) +- Expose the current Jekyll version to posts and pages via a new `jekyll.version` variable ([#1481]({{ site.repository }}/issues/1481)) ### Bug Fixes {: #bug-fixes-v1-2-0} + - Markdown extension matching matches only exact matches ([#1382]({{ site.repository }}/issues/1382)) - Fixed NoMethodError when message passed to `Stevenson#message` is nil ([#1388]({{ site.repository }}/issues/1388)) - Use binary mode when writing file ([#1364]({{ site.repository }}/issues/1364)) -- Fix 'undefined method `encoding` for "mailto"' errors w/ Ruby 1.8 and - Kramdown > 0.14.0 ([#1397]({{ site.repository }}/issues/1397)) +- Fix 'undefined method `encoding` for "mailto"' errors w/ Ruby 1.8 and Kramdown > 0.14.0 ([#1397]({{ site.repository }}/issues/1397)) - Do not force the permalink to be a dir if it ends on .html ([#963]({{ site.repository }}/issues/963)) - When a Liquid Exception is caught, show the full path rel. to site source ([#1415]({{ site.repository }}/issues/1415)) -- Properly read in the config options when serving the docs locally - ([#1444]({{ site.repository }}/issues/1444)) +- Properly read in the config options when serving the docs locally ([#1444]({{ site.repository }}/issues/1444)) - Fixed `--layouts` option for `build` and `serve` commands ([#1458]({{ site.repository }}/issues/1458)) - Remove kramdown as a runtime dependency since it's optional ([#1498]({{ site.repository }}/issues/1498)) -- Provide proper error handling for invalid file names in the include - tag ([#1494]({{ site.repository }}/issues/1494)) +- Provide proper error handling for invalid file names in the include tag ([#1494]({{ site.repository }}/issues/1494)) ### Development Fixes {: #development-fixes-v1-2-0} -- Remove redundant argument to - Jekyll::Commands::New#scaffold_post_content ([#1356]({{ site.repository }}/issues/1356)) + +- Remove redundant argument to Jekyll::Commands::New#scaffold_post_content ([#1356]({{ site.repository }}/issues/1356)) - Add new dependencies to the README ([#1360]({{ site.repository }}/issues/1360)) - Fix link to contributing page in README ([#1424]({{ site.repository }}/issues/1424)) - Update TomDoc in Pager#initialize to match params ([#1441]({{ site.repository }}/issues/1441)) @@ -1319,6 +1299,7 @@ permalink: "/docs/history/" ### Site Enhancements {: #site-enhancements-v1-2-0} + - Add info about new releases ([#1353]({{ site.repository }}/issues/1353)) - Update plugin list with jekyll-rss plugin ([#1354]({{ site.repository }}/issues/1354)) - Update the site list page with Ruby's official site ([#1358]({{ site.repository }}/issues/1358)) @@ -1346,6 +1327,7 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v1-1-2} + - Require Liquid 2.5.1 ([#1349]({{ site.repository }}/issues/1349)) @@ -1354,26 +1336,26 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v1-1-1} + - Remove superfluous `table` selector from main.css in `jekyll new` template ([#1328]({{ site.repository }}/issues/1328)) - Abort with non-zero exit codes ([#1338]({{ site.repository }}/issues/1338)) ### Bug Fixes {: #bug-fixes-v1-1-1} + - Fix up the rendering of excerpts ([#1339]({{ site.repository }}/issues/1339)) ### Site Enhancements {: #site-enhancements-v1-1-1} + - Add Jekyll Image Tag to the plugins list ([#1306]({{ site.repository }}/issues/1306)) - Remove erroneous statement that `site.pages` are sorted alphabetically. -- Add info about the `_drafts` directory to the directory structure - docs ([#1320]({{ site.repository }}/issues/1320)) -- Improve the layout of the plugin listing by organizing it into - categories ([#1310]({{ site.repository }}/issues/1310)) +- Add info about the `_drafts` directory to the directory structure docs ([#1320]({{ site.repository }}/issues/1320)) +- Improve the layout of the plugin listing by organizing it into categories ([#1310]({{ site.repository }}/issues/1310)) - Add generator-jekyllrb and grunt-jekyll to plugins page ([#1330]({{ site.repository }}/issues/1330)) - Mention Kramdown as option for markdown parser on Extras page ([#1318]({{ site.repository }}/issues/1318)) - Update Quick-Start page to include reminder that all requirements must be installed ([#1327]({{ site.repository }}/issues/1327)) -- Change filename in `include` example to an HTML file so as not to indicate that Jekyll - will automatically convert them. ([#1303]({{ site.repository }}/issues/1303)) +- Change filename in `include` example to an HTML file so as not to indicate that Jekyll will automatically convert them. ([#1303]({{ site.repository }}/issues/1303)) - Add an RSS feed for commits to Jekyll ([#1343]({{ site.repository }}/issues/1343)) @@ -1382,34 +1364,33 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v1-1-0} + - Add `docs` subcommand to read Jekyll's docs when offline. ([#1046]({{ site.repository }}/issues/1046)) - Support passing parameters to templates in `include` tag ([#1204]({{ site.repository }}/issues/1204)) - Add support for Liquid tags to post excerpts ([#1302]({{ site.repository }}/issues/1302)) ### Minor Enhancements {: #minor-enhancements-v1-1-0} -- Search the hierarchy of pagination path up to site root to determine template page for - pagination. ([#1198]({{ site.repository }}/issues/1198)) + +- Search the hierarchy of pagination path up to site root to determine template page for pagination. ([#1198]({{ site.repository }}/issues/1198)) - Add the ability to generate a new Jekyll site without a template ([#1171]({{ site.repository }}/issues/1171)) -- Use redcarpet as the default markdown engine in newly generated - sites ([#1245]({{ site.repository }}/issues/1245), [#1247]({{ site.repository }}/issues/1247)) -- Add `redcarpet` as a runtime dependency so `jekyll build` works out-of-the-box for new - sites. ([#1247]({{ site.repository }}/issues/1247)) -- In the generated site, remove files that will be replaced by a - directory ([#1118]({{ site.repository }}/issues/1118)) +- Use redcarpet as the default markdown engine in newly generated sites ([#1245]({{ site.repository }}/issues/1245), [#1247]({{ site.repository }}/issues/1247)) +- Add `redcarpet` as a runtime dependency so `jekyll build` works out-of-the-box for new sites. ([#1247]({{ site.repository }}/issues/1247)) +- In the generated site, remove files that will be replaced by a directory ([#1118]({{ site.repository }}/issues/1118)) - Fail loudly if a user-specified configuration file doesn't exist ([#1098]({{ site.repository }}/issues/1098)) - Allow for all options for Kramdown HTML Converter ([#1201]({{ site.repository }}/issues/1201)) ### Bug Fixes {: #bug-fixes-v1-1-0} + - Fix pagination in subdirectories. ([#1198]({{ site.repository }}/issues/1198)) -- Fix an issue with directories and permalinks that have a plus sign - (+) in them ([#1215]({{ site.repository }}/issues/1215)) +- Fix an issue with directories and permalinks that have a plus sign (+) in them ([#1215]({{ site.repository }}/issues/1215)) - Provide better error reporting when generating sites ([#1253]({{ site.repository }}/issues/1253)) - Latest posts first in non-LSI `related_posts` ([#1271]({{ site.repository }}/issues/1271)) ### Development Fixes {: #development-fixes-v1-1-0} + - Merge the theme and layout Cucumber steps into one step ([#1151]({{ site.repository }}/issues/1151)) - Restrict activesupport dependency to pre-4.0.0 to maintain compatibility with `<= 1.9.2` - Include/exclude deprecation handling simplification ([#1284]({{ site.repository }}/issues/1284)) @@ -1418,22 +1399,20 @@ permalink: "/docs/history/" ### Site Enhancements {: #site-enhancements-v1-1-0} + - Add "News" section for release notes, along with an RSS feed ([#1093]({{ site.repository }}/issues/1093), [#1285]({{ site.repository }}/issues/1285), [#1286]({{ site.repository }}/issues/1286)) - Add "History" page. - Restructured docs sections to include "Meta" section. -- Add message to "Templates" page that specifies that Python must be installed in order - to use Pygments. ([#1182]({{ site.repository }}/issues/1182)) +- Add message to "Templates" page that specifies that Python must be installed in order to use Pygments. ([#1182]({{ site.repository }}/issues/1182)) - Update link to the official Maruku repo ([#1175]({{ site.repository }}/issues/1175)) - Add documentation about `paginate_path` to "Templates" page in docs ([#1129]({{ site.repository }}/issues/1129)) - Give the quick-start guide its own page ([#1191]({{ site.repository }}/issues/1191)) -- Update ProTip on Installation page in docs to point to all the info about Pygments and - the 'highlight' tag. ([#1196]({{ site.repository }}/issues/1196)) +- Update ProTip on Installation page in docs to point to all the info about Pygments and the 'highlight' tag. ([#1196]({{ site.repository }}/issues/1196)) - Run `site/img` through ImageOptim (thanks [@qrush](https://github.com/qrush)!) ([#1208]({{ site.repository }}/issues/1208)) - Added Jade Converter to `site/docs/plugins` ([#1210]({{ site.repository }}/issues/1210)) - Fix location of docs pages in Contributing pages ([#1214]({{ site.repository }}/issues/1214)) - Add ReadInXMinutes plugin to the plugin list ([#1222]({{ site.repository }}/issues/1222)) -- Remove plugins from the plugin list that have equivalents in Jekyll - proper ([#1223]({{ site.repository }}/issues/1223)) +- Remove plugins from the plugin list that have equivalents in Jekyll proper ([#1223]({{ site.repository }}/issues/1223)) - Add jekyll-assets to the plugin list ([#1225]({{ site.repository }}/issues/1225)) - Add jekyll-pandoc-mulitple-formats to the plugin list ([#1229]({{ site.repository }}/issues/1229)) - Remove dead link to "Using Git to maintain your blog" ([#1227]({{ site.repository }}/issues/1227)) @@ -1447,13 +1426,11 @@ permalink: "/docs/history/" - Add `jekyll-timeago` to list of third-party plugins. ([#1260]({{ site.repository }}/issues/1260)) - Add `jekyll-swfobject` to list of third-party plugins. ([#1263]({{ site.repository }}/issues/1263)) - Add `jekyll-picture-tag` to list of third-party plugins. ([#1280]({{ site.repository }}/issues/1280)) -- Update the GitHub Pages documentation regarding relative URLs - ([#1291]({{ site.repository }}/issues/1291)) +- Update the GitHub Pages documentation regarding relative URLs ([#1291]({{ site.repository }}/issues/1291)) - Update the S3 deployment documentation ([#1294]({{ site.repository }}/issues/1294)) - Add suggestion for Xcode CLT install to troubleshooting page in docs ([#1296]({{ site.repository }}/issues/1296)) - Add 'Working with drafts' page to docs ([#1289]({{ site.repository }}/issues/1289)) -- Add information about time zones to the documentation for a page's - date ([#1304]({{ site.repository }}/issues/1304)) +- Add information about time zones to the documentation for a page's date ([#1304]({{ site.repository }}/issues/1304)) ## 1.0.3 / 2013-06-07 @@ -1461,6 +1438,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v1-0-3} + - Add support to gist tag for private gists. ([#1189]({{ site.repository }}/issues/1189)) - Fail loudly when Maruku errors out ([#1190]({{ site.repository }}/issues/1190)) - Move the building of related posts into their own class ([#1057]({{ site.repository }}/issues/1057)) @@ -1470,17 +1448,17 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v1-0-3} + - Fix typo in Stevenson constant "ERROR". ([#1166]({{ site.repository }}/issues/1166)) - Rename Jekyll::Logger to Jekyll::Stevenson to fix inheritance issue ([#1106]({{ site.repository }}/issues/1106)) - Exit with a non-zero exit code when dealing with a Liquid error ([#1121]({{ site.repository }}/issues/1121)) -- Make the `exclude` and `include` options backwards compatible with - versions of Jekyll prior to 1.0 ([#1114]({{ site.repository }}/issues/1114)) +- Make the `exclude` and `include` options backwards compatible with versions of Jekyll prior to 1.0 ([#1114]({{ site.repository }}/issues/1114)) - Fix pagination on Windows ([#1063]({{ site.repository }}/issues/1063)) -- Fix the application of Pygments' Generic Output style to Go code - ([#1156]({{ site.repository }}/issues/1156)) +- Fix the application of Pygments' Generic Output style to Go code ([#1156]({{ site.repository }}/issues/1156)) ### Site Enhancements {: #site-enhancements-v1-0-3} + - Add a Pro Tip to docs about front matter variables being optional ([#1147]({{ site.repository }}/issues/1147)) - Add changelog to site as History page in /docs/ ([#1065]({{ site.repository }}/issues/1065)) - Add note to Upgrading page about new config options in 1.0.x ([#1146]({{ site.repository }}/issues/1146)) @@ -1494,13 +1472,13 @@ permalink: "/docs/history/" - Fix logic for `relative_permalinks` instructions on Upgrading page ([#1101]({{ site.repository }}/issues/1101)) - Add docs for post excerpt ([#1072]({{ site.repository }}/issues/1072)) - Add docs for gist tag ([#1072]({{ site.repository }}/issues/1072)) -- Add docs indicating that Pygments does not need to be installed - separately ([#1099]({{ site.repository }}/issues/1099), [#1119]({{ site.repository }}/issues/1119)) +- Add docs indicating that Pygments does not need to be installed separately ([#1099]({{ site.repository }}/issues/1099), [#1119]({{ site.repository }}/issues/1119)) - Update the migrator docs to be current ([#1136]({{ site.repository }}/issues/1136)) - Add the Jekyll Gallery Plugin to the plugin list ([#1143]({{ site.repository }}/issues/1143)) ### Development Fixes {: #development-fixes-v1-0-3} + - Use Jekyll.logger instead of Jekyll::Stevenson to log things ([#1149]({{ site.repository }}/issues/1149)) - Fix pesky Cucumber infinite loop ([#1139]({{ site.repository }}/issues/1139)) - Do not write posts with timezones in Cucumber tests ([#1124]({{ site.repository }}/issues/1124)) @@ -1512,11 +1490,13 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v1-0-2} + - Add `jekyll doctor` command to check site for any known compatibility problems ([#1081]({{ site.repository }}/issues/1081)) - Backwards-compatibilize relative permalinks ([#1081]({{ site.repository }}/issues/1081)) ### Minor Enhancements {: #minor-enhancements-v1-0-2} + - Add a `data-lang=""` attribute to Redcarpet code blocks ([#1066]({{ site.repository }}/issues/1066)) - Deprecate old config `server_port`, match to `port` if `port` isn't set ([#1084]({{ site.repository }}/issues/1084)) - Update pygments.rb version to 0.5.0 ([#1061]({{ site.repository }}/issues/1061)) @@ -1524,11 +1504,13 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v1-0-2} + - Fix issue when categories are numbers ([#1078]({{ site.repository }}/issues/1078)) - Catching that Redcarpet gem isn't installed ([#1059]({{ site.repository }}/issues/1059)) ### Site Enhancements {: #site-enhancements-v1-0-2} + - Add documentation about `relative_permalinks` ([#1081]({{ site.repository }}/issues/1081)) - Remove pygments-installation instructions, as pygments.rb is bundled with it ([#1079]({{ site.repository }}/issues/1079)) - Move pages to be Pages for realz ([#985]({{ site.repository }}/issues/985)) @@ -1540,12 +1522,14 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v1-0-1} + - Do not force use of `toc_token` when using `generate_tok` in RDiscount ([#1048]({{ site.repository }}/issues/1048)) - Add newer `language-` class name prefix to code blocks ([#1037]({{ site.repository }}/issues/1037)) - Commander error message now preferred over process abort with incorrect args ([#1040]({{ site.repository }}/issues/1040)) ### Bug Fixes {: #bug-fixes-v1-0-1} + - Make Redcarpet respect the pygments configuration option ([#1053]({{ site.repository }}/issues/1053)) - Fix the index build with LSI ([#1045]({{ site.repository }}/issues/1045)) - Don't print deprecation warning when no arguments are specified. ([#1041]({{ site.repository }}/issues/1041)) @@ -1553,6 +1537,7 @@ permalink: "/docs/history/" ### Site Enhancements {: #site-enhancements-v1-0-1} + - Changed https to http in the GitHub Pages link ([#1051]({{ site.repository }}/issues/1051)) - Remove CSS cruft, fix typos, fix HTML errors ([#1028]({{ site.repository }}/issues/1028)) - Removing manual install of Pip and Distribute ([#1025]({{ site.repository }}/issues/1025)) @@ -1560,6 +1545,7 @@ permalink: "/docs/history/" ### Development Fixes {: #development-fixes-v1-0-1} + - Markdownify history file ([#1027]({{ site.repository }}/issues/1027)) - Update links on README to point to new jekyllrb.com ([#1018]({{ site.repository }}/issues/1018)) @@ -1569,6 +1555,7 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v1-0-0} + - Add `jekyll new` subcommand: generate a Jekyll scaffold ([#764]({{ site.repository }}/issues/764)) - Refactored Jekyll commands into subcommands: build, serve, and migrate. ([#690]({{ site.repository }}/issues/690)) - Removed importers/migrators from main project, migrated to jekyll-import sub-gem ([#793]({{ site.repository }}/issues/793)) @@ -1577,6 +1564,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v1-0-0} + - Site template HTML5-ified ([#964]({{ site.repository }}/issues/964)) - Use post's directory path when matching for the `post_url` tag ([#998]({{ site.repository }}/issues/998)) - Loosen dependency on Pygments so it's only required when it's needed ([#1015]({{ site.repository }}/issues/1015)) @@ -1616,8 +1604,7 @@ permalink: "/docs/history/" - Massively accelerate LSI performance ([#664]({{ site.repository }}/issues/664)) - Truncate post slugs when importing from Tumblr ([#496]({{ site.repository }}/issues/496)) - Add glob support to include, exclude option ([#743]({{ site.repository }}/issues/743)) -- Layout of Page or Post defaults to 'page' or 'post', respectively ([#580]({{ site.repository }}/issues/580)) - REPEALED by ([#977]({{ site.repository }}/issues/977)) +- Layout of Page or Post defaults to 'page' or 'post', respectively ([#580]({{ site.repository }}/issues/580)) REPEALED by ([#977]({{ site.repository }}/issues/977)) - "Keep files" feature ([#685]({{ site.repository }}/issues/685)) - Output full path & name for files that don't parse ([#745]({{ site.repository }}/issues/745)) - Add source and destination directory protection ([#535]({{ site.repository }}/issues/535)) @@ -1643,8 +1630,7 @@ permalink: "/docs/history/" - Fixed Page#dir and Page#url for edge cases ([#536]({{ site.repository }}/issues/536)) - Fix broken `post_url` with posts with a time in their YAML front matter ([#831]({{ site.repository }}/issues/831)) - Look for plugins under the source directory ([#654]({{ site.repository }}/issues/654)) -- Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long - post names ([#775]({{ site.repository }}/issues/775)) +- Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long post names ([#775]({{ site.repository }}/issues/775)) - Force Categories to be Strings ([#767]({{ site.repository }}/issues/767)) - Safe YAML plugin to prevent vulnerability ([#777]({{ site.repository }}/issues/777)) - Add SVG support to Jekyll/WEBrick. ([#407]({{ site.repository }}/issues/407), [#406]({{ site.repository }}/issues/406)) @@ -1652,6 +1638,7 @@ permalink: "/docs/history/" ### Site Enhancements {: #site-enhancements-v1-0-0} + - Responsify ([#860]({{ site.repository }}/issues/860)) - Fix spelling, punctuation and phrasal errors ([#989]({{ site.repository }}/issues/989)) - Update quickstart instructions with `new` command ([#966]({{ site.repository }}/issues/966)) @@ -1663,15 +1650,14 @@ permalink: "/docs/history/" ### Development Fixes {: #development-fixes-v1-0-0} + - Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 ([#938]({{ site.repository }}/issues/938)) -- Added "features:html" rake task for debugging purposes, cleaned up - Cucumber profiles ([#832]({{ site.repository }}/issues/832)) +- Added "features:html" rake task for debugging purposes, cleaned up Cucumber profiles ([#832]({{ site.repository }}/issues/832)) - Explicitly require HTTPS rubygems source in Gemfile ([#826]({{ site.repository }}/issues/826)) - Changed Ruby version for development to 1.9.3-p374 from p362 ([#801]({{ site.repository }}/issues/801)) - Including a link to the GitHub Ruby style guide in CONTRIBUTING.md ([#806]({{ site.repository }}/issues/806)) - Added script/bootstrap ([#776]({{ site.repository }}/issues/776)) -- Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version - of greater than 1.9 ([#771]({{ site.repository }}/issues/771)) +- Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version of greater than 1.9 ([#771]({{ site.repository }}/issues/771)) - Switch to Simplecov for coverage report ([#765]({{ site.repository }}/issues/765)) @@ -1680,6 +1666,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v0-12-1} + - Update Kramdown version to 0.14.1 ([#744]({{ site.repository }}/issues/744)) - Test Enhancements - Update Rake version to 10.0.3 ([#744]({{ site.repository }}/issues/744)) @@ -1692,6 +1679,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v0-12-0} + - Add ability to explicitly specify included files ([#261]({{ site.repository }}/issues/261)) - Add `--default-mimetype` option ([#279]({{ site.repository }}/issues/279)) - Allow setting of RedCloth options ([#284]({{ site.repository }}/issues/284)) @@ -1713,12 +1701,14 @@ permalink: "/docs/history/" ## 0.11.2 / 2011-12-27 {: #v0-11-2} + - Bug Fixes - Fix gemspec ## 0.11.1 / 2011-12-27 {: #v0-11-1} + - Bug Fixes - Fix extra blank line in highlight blocks ([#409]({{ site.repository }}/issues/409)) - Update dependencies @@ -1729,6 +1719,7 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v0-11-0} + - Add command line importer functionality ([#253]({{ site.repository }}/issues/253)) - Add Redcarpet Markdown support ([#318]({{ site.repository }}/issues/318)) - Make markdown/textile extensions configurable ([#312]({{ site.repository }}/issues/312)) @@ -1736,6 +1727,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v0-11-0} + - Switch to Albino gem - Bundler support - Use English library to avoid hoops ([#292]({{ site.repository }}/issues/292)) @@ -1751,6 +1743,7 @@ permalink: "/docs/history/" ## 0.10.0 / 2010-12-16 {: #v0-10-0} + - Bug Fixes - Add `--no-server` option. @@ -1760,6 +1753,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v0-9-0} + - Use OptionParser's `[no-]` functionality for better boolean parsing. - Add Drupal migrator ([#245]({{ site.repository }}/issues/245)) - Complain about YAML and Liquid errors ([#249]({{ site.repository }}/issues/249)) @@ -1772,6 +1766,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v0-8-0} + - Add wordpress.com importer ([#207]({{ site.repository }}/issues/207)) - Add `--limit-posts` cli option ([#212]({{ site.repository }}/issues/212)) - Add `uri_escape` filter ([#234]({{ site.repository }}/issues/234)) @@ -1789,6 +1784,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v0-7-0} + - Add support for rdiscount extensions ([#173]({{ site.repository }}/issues/173)) - Bug Fixes - Highlight should not be able to render local files @@ -1797,6 +1793,7 @@ permalink: "/docs/history/" ## 0.6.2 / 2010-06-25 {: #v0-6-2} + - Bug Fixes - Fix Rakefile 'release' task (tag pushing was missing origin) - Ensure that RedCloth is loaded when textilize filter is used ([#183]({{ site.repository }}/issues/183)) @@ -1806,6 +1803,7 @@ permalink: "/docs/history/" ## 0.6.1 / 2010-06-24 {: #v0-6-1} + - Bug Fixes - Fix Markdown Pygments prefix and suffix ([#178]({{ site.repository }}/issues/178)) @@ -1815,19 +1813,18 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v0-6-0} + - Proper plugin system ([#19]({{ site.repository }}/issues/19), [#100]({{ site.repository }}/issues/100)) - Add safe mode so unsafe converters/generators can be added -- Maruku is now the only processor dependency installed by default. - Other processors will be lazy-loaded when necessary (and prompt the - user to install them when necessary) ([#57]({{ site.repository }}/issues/57)) +- Maruku is now the only processor dependency installed by default. Other processors will be lazy-loaded when necessary (and prompt the user to install them when necessary) ([#57]({{ site.repository }}/issues/57)) ### Minor Enhancements {: #minor-enhancements-v0-6-0} + - Inclusion/exclusion of future dated posts ([#59]({{ site.repository }}/issues/59)) - Generation for a specific time ([#59]({{ site.repository }}/issues/59)) - Allocate `site.time` on render not per site_payload invocation ([#59]({{ site.repository }}/issues/59)) -- Pages now present in the site payload and can be used through the - `site.pages` and `site.html_pages` variables +- Pages now present in the site payload and can be used through the `site.pages` and `site.html_pages` variables - Generate phase added to site#process and pagination is now a generator - Switch to RakeGem for build/test process - Only regenerate static files when they have changed ([#142]({{ site.repository }}/issues/142)) @@ -1847,24 +1844,26 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v0-5-7} + - Allow overriding of post date in the front matter ([#62]({{ site.repository }}/issues/62), [#38]({{ site.repository }}/issues/38)) - Bug Fixes - Categories isn't always an array ([#73]({{ site.repository }}/issues/73)) - Empty tags causes error in read_posts ([#84]({{ site.repository }}/issues/84)) - Fix pagination to adhere to read/render/write paradigm - Test Enhancement -- Cucumber features no longer use site.posts.first where a better - alternative is available +- Cucumber features no longer use site.posts.first where a better alternative is available ## 0.5.6 / 2010-01-08 {: #v0-5-6} + - Bug Fixes - Require redcloth >= 4.2.1 in tests ([#92]({{ site.repository }}/issues/92)) - Don't break on triple dashes in yaml front matter ([#93]({{ site.repository }}/issues/93)) ### Minor Enhancements {: #minor-enhancements-v0-5-6} + - Allow .mkd as markdown extension - Use $stdout/err instead of constants ([#99]({{ site.repository }}/issues/99)) - Properly wrap code blocks ([#91]({{ site.repository }}/issues/91)) @@ -1873,52 +1872,42 @@ permalink: "/docs/history/" ## 0.5.5 / 2010-01-08 {: #v0-5-5} + - Bug Fixes - Fix pagination % 0 bug ([#78]({{ site.repository }}/issues/78)) -- Ensure all posts are processed first ([#71]({{ site.repository }}/issues/71)) - - -## NOTE -- After this point I will no longer be giving credit in the history; - that is what the commit log is for. +- Ensure all posts are processed first ([#71]({{ site.repository }}/issues/71)) ## NOTE +- After this point I will no longer be giving credit in the history; that is what the commit log is for. ## 0.5.4 / 2009-08-23 {: #v0-5-4} + - Bug Fixes - Do not allow symlinks (security vulnerability) ## 0.5.3 / 2009-07-14 {: #v0-5-3} + - Bug Fixes -- Solving the permalink bug where non-html files wouldn't work - ([@jeffrydegrande](https://github.com/jeffrydegrande)) +- Solving the permalink bug where non-html files wouldn't work ([@jeffrydegrande](https://github.com/jeffrydegrande)) ## 0.5.2 / 2009-06-24 {: #v0-5-2} + - Enhancements -- Added --paginate option to the executable along with a paginator object - for the payload ([@calavera](https://github.com/calavera)) -- Upgraded RedCloth to 4.2.1, which makes `` tags work once - again. -- Configuration options set in config.yml are now available through the - site payload ([@vilcans](https://github.com/vilcans)) -- Posts can now have an empty YAML front matter or none at all - (@ bahuvrihi) +- Added --paginate option to the executable along with a paginator object for the payload ([@calavera](https://github.com/calavera)) +- Upgraded RedCloth to 4.2.1, which makes `` tags work once again. +- Configuration options set in config.yml are now available through the site payload ([@vilcans](https://github.com/vilcans)) +- Posts can now have an empty YAML front matter or none at all (@ bahuvrihi) - Bug Fixes -- Fixing Ruby 1.9 issue that requires `#to_s` on the err object - ([@Chrononaut](https://github.com/Chrononaut)) +- Fixing Ruby 1.9 issue that requires `#to_s` on the err object ([@Chrononaut](https://github.com/Chrononaut)) - Fixes for pagination and ordering posts on the same day ([@ujh](https://github.com/ujh)) -- Made pages respect permalinks style and permalinks in yml front matter - ([@eugenebolshakov](https://github.com/eugenebolshakov)) -- Index.html file should always have index.html permalink - ([@eugenebolshakov](https://github.com/eugenebolshakov)) -- Added trailing slash to pretty permalink style so Apache is happy - ([@eugenebolshakov](https://github.com/eugenebolshakov)) -- Bad markdown processor in config fails sooner and with better message - (@ gcnovus) +- Made pages respect permalinks style and permalinks in yml front matter ([@eugenebolshakov](https://github.com/eugenebolshakov)) +- Index.html file should always have index.html permalink ([@eugenebolshakov](https://github.com/eugenebolshakov)) +- Added trailing slash to pretty permalink style so Apache is happy ([@eugenebolshakov](https://github.com/eugenebolshakov)) +- Bad markdown processor in config fails sooner and with better message (@ gcnovus) - Allow CRLFs in yaml front matter ([@juretta](https://github.com/juretta)) - Added Date#xmlschema for Ruby versions < 1.9 @@ -1928,16 +1917,15 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v0-5-1} + - Next/previous posts in site payload ([@pantulis](https://github.com/pantulis), [@tomo](https://github.com/tomo)) - Permalink templating system - Moved most of the README out to the GitHub wiki -- Exclude option in configuration so specified files won't be brought over - with generated site ([@duritong](https://github.com/duritong)) +- Exclude option in configuration so specified files won't be brought over with generated site ([@duritong](https://github.com/duritong)) - Bug Fixes - Making sure config.yaml references are all gone, using only config.yml - Fixed syntax highlighting breaking for UTF-8 code ([@henrik](https://github.com/henrik)) -- Worked around RDiscount bug that prevents Markdown from getting parsed - after highlight ([@henrik](https://github.com/henrik)) +- Worked around RDiscount bug that prevents Markdown from getting parsed after highlight ([@henrik](https://github.com/henrik)) - CGI escaped post titles ([@Chrononaut](https://github.com/Chrononaut)) @@ -1946,6 +1934,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v0-5-0} + - Ability to set post categories via YAML ([@qrush](https://github.com/qrush)) - Ability to set prevent a post from publishing via YAML ([@qrush](https://github.com/qrush)) - Add textilize filter ([@willcodeforfoo](https://github.com/willcodeforfoo)) @@ -1967,6 +1956,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v--} + - Changed date format on wordpress converter (zeropadding) ([@dysinger](https://github.com/dysinger)) - Bug Fixes - Add Jekyll binary as executable to gemspec ([@dysinger](https://github.com/dysinger)) @@ -1977,10 +1967,12 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v0-4-0} + - Switch to Jeweler for packaging tasks ### Minor Enhancements {: #minor-enhancements-v0-4-0} + - Type importer ([@codeslinger](https://github.com/codeslinger)) - `site.topics` accessor ([@baz](https://github.com/baz)) - Add `array_to_sentence_string` filter ([@mchung](https://github.com/mchung)) @@ -2002,43 +1994,46 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v0-3-0} -- Added `--server` option to start a simple WEBrick server on destination - directory ([@johnreilly](https://github.com/johnreilly) and [@mchung](https://github.com/mchung)) + +- Added `--server` option to start a simple WEBrick server on destination directory ([@johnreilly](https://github.com/johnreilly) and [@mchung](https://github.com/mchung)) ### Minor Enhancements {: #minor-enhancements-v0-3-0} + - Added post categories based on directories containing `_posts` ([@mreid](https://github.com/mreid)) - Added post topics based on directories underneath `_posts` - Added new date filter that shows the full month name ([@mreid](https://github.com/mreid)) - Merge Post's YAML front matter into its to_liquid payload ([@remi](https://github.com/remi)) - Restrict includes to regular files underneath `_includes` - Bug Fixes -- Change YAML delimiter matcher so as to not chew up 2nd level markdown - headers ([@mreid](https://github.com/mreid)) -- Fix bug that meant page data (such as the date) was not available in - templates ([@mreid](https://github.com/mreid)) +- Change YAML delimiter matcher so as to not chew up 2nd level markdown headers ([@mreid](https://github.com/mreid)) +- Fix bug that meant page data (such as the date) was not available in templates ([@mreid](https://github.com/mreid)) - Properly reject directories in `_layouts` ## 0.2.1 / 2008-12-15 {: #v0-2-1} + - Major Changes - Use Maruku (pure Ruby) for Markdown by default ([@mreid](https://github.com/mreid)) - Allow use of RDiscount with `--rdiscount` flag ### Minor Enhancements {: #minor-enhancements-v0-2-1} + - Don't load directory_watcher unless it's needed ([@pjhyett](https://github.com/pjhyett)) ## 0.2.0 / 2008-12-14 {: #v0-2-0} + - Major Changes - related_posts is now found in `site.related_posts` ## 0.1.6 / 2008-12-13 {: #v0-1-6} + - Major Features - Include files in `_includes` with {% raw %}`{% include x.textile %}`{% endraw %} @@ -2048,11 +2043,13 @@ permalink: "/docs/history/" ### Major Enhancements {: #major-enhancements-v0-1-5} + - Code highlighting with Pygments if `--pygments` is specified - Disable true LSI by default, enable with `--lsi` ### Minor Enhancements {: #minor-enhancements-v0-1-5} + - Output informative message if RDiscount is not available ([@JackDanger](https://github.com/JackDanger)) - Bug Fixes - Prevent Jekyll from picking up the output directory as a source ([@JackDanger](https://github.com/JackDanger)) @@ -2061,12 +2058,14 @@ permalink: "/docs/history/" ## 0.1.4 / 2008-12-08 {: #v0-1-4} + - Bug Fixes - DATA does not work properly with rubygems ## 0.1.3 / 2008-12-06 {: #v0-1-3} + - Major Features - Markdown support ([@vanpelt](https://github.com/vanpelt)) - Mephisto and CSV converters ([@vanpelt](https://github.com/vanpelt)) @@ -2078,21 +2077,23 @@ permalink: "/docs/history/" ## 0.1.2 / 2008-11-22 {: #v0-1-2} + - Major Features - Add a real "related posts" implementation using Classifier - Command Line Changes -- Allow cli to be called with 0, 1, or 2 args intuiting dir paths - if they are omitted +- Allow cli to be called with 0, 1, or 2 args intuiting dir paths if they are omitted ## 0.1.1 / 2008-11-22 {: #v0-1-1} + - Minor Additions - Posts now support introspectional data e.g. {% raw %}`{{ page.url }}`{% endraw %} ## 0.1.0 / 2008-11-05 {: #v0-1-0} + - First release - Converts posts written in Textile - Converts regular site pages @@ -2101,4 +2102,5 @@ permalink: "/docs/history/" ## 0.0.0 / 2008-10-19 {: #v0-0-0} + - Birthday! From 1583b26627d948e68c32269a66dd528eda798a72 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Mon, 11 Jan 2016 16:45:50 -0600 Subject: [PATCH 0270/4996] Update jekyll-feed. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 2c0d7e8a598..0abe7065947 100644 --- a/Gemfile +++ b/Gemfile @@ -45,7 +45,7 @@ end gem 'jekyll-paginate', '~> 1.0' gem 'jekyll-coffeescript', '~> 1.0' -gem 'jekyll-feed', '~> 0.1.3' +gem 'jekyll-feed', '~> 0.4.0' gem 'jekyll-redirect-from', '~> 0.9.1' gem 'jekyll-gist', '~> 1.0' gem 'mime-types', '~> 3.0' From ba017ebb97f3eb328fdbc7dcf6e771039cf31cca Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 11 Jan 2016 22:32:04 -0800 Subject: [PATCH 0271/4996] Remove old Fixme note --- test/helper.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index 32363369e7e..936638d230f 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -35,9 +35,6 @@ def jruby? include Jekyll -# FIXME: If we really need this we lost the game. -# STDERR.reopen(test(?e, '/dev/null') ? '/dev/null' : 'NUL:') - # Report with color. Minitest::Reporters.use! [ Minitest::Reporters::DefaultReporter.new( From 4595aab85583d68ef3abf728695c32ca5bf81541 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 12 Jan 2016 01:00:42 -0600 Subject: [PATCH 0272/4996] Update history.makrdown to reflect the merger of #4349. --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ab1d5139c67..8fb5a685270 100644 --- a/History.markdown +++ b/History.markdown @@ -54,6 +54,7 @@ * Add script/travis so all people can play with Travis-CI images. (#4338) * Move Cucumber to using RSpec-Expections and furthering JRuby support. (#4343) * Rearrange Cucumber and add some flair. (#4347) + * Remove old FIXME (#4349) ### Site Enhancements From 712c16a7f10484ad9be92d612f36cbb43ec419d9 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 12 Jan 2016 06:54:45 -0600 Subject: [PATCH 0273/4996] Try to cleanup the Gemfile... again. The problem last time was that we removed Pry and Pry brings in CodeRay, we were testing legacy stuff and didn't have CodeRay in our dependencies, which resulted in those tests failing. This also quietly announces the intention to move to RSpec by moving the old test dependencies to ":test_legacy" and is slightly less agressive in it's organization than before. --- .travis.yml | 5 ++- Gemfile | 100 +++++++++++++++++++++++++++++--------------------- script/travis | 8 +++- 3 files changed, 68 insertions(+), 45 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4bba7a8dca9..fafd57c396b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ -cache: bundler -script: script/cibuild +bundler_args: --without benchmark:site:development before_script: bundle update +script: script/cibuild +cache: bundler language: ruby sudo: false diff --git a/Gemfile b/Gemfile index 0abe7065947..16470f69c0e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,60 +1,78 @@ -source 'https://rubygems.org' -gemspec name: 'jekyll' +source "https://rubygems.org" +gemspec :name => "jekyll" -gem 'rake', '~> 10.1' +gem "rake", "~> 10.1" group :development do - gem 'rdoc', '~> 4.2' - gem 'launchy', '~> 2.3' - gem 'toml', '~> 0.1.0' gem "rubocop" - gem 'pry' + gem "launchy", "~> 2.3" + gem "pry" end +# + group :test do - gem 'rspec-expectations' - gem 'redgreen', '~> 1.2' - gem 'shoulda', '~> 3.5' - gem 'cucumber', '~> 2.1' - gem 'simplecov', '~> 0.9' - gem 'jekyll_test_plugin' - gem 'jekyll_test_plugin_malicious' + gem "cucumber" + gem "jekyll_test_plugin" + gem "jekyll_test_plugin_malicious" gem "codeclimate-test-reporter" - gem 'minitest-reporters' - gem 'minitest-profile' - gem 'rspec-mocks' - gem 'minitest' - gem 'nokogiri' + gem "rspec-mocks" + gem "nokogiri" + gem "rspec" +end + +# +group :test_legacy do if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") gem 'test-unit' end - if ENV['PROOF'] - gem 'html-proofer', '~> 2.0' - end + gem "redgreen" + gem "simplecov" + gem "minitest-reporters" + gem "minitest-profile" + gem "minitest" + gem "shoulda" end +# + group :benchmark do - if ENV['BENCHMARK'] - gem 'ruby-prof' - gem 'rbtrace' - gem 'stackprof' - gem 'benchmark-ips' + if ENV["BENCHMARK"] + gem "ruby-prof" + gem "benchmark-ips" + gem "stackprof" + gem "rbtrace" + end +end + +# + +group :jekyll_optional_dependencies do + gem "toml", "~> 0.1.0" + gem "coderay", "~> 1.1.0" + gem "jekyll-gist", "~> 1.0" + gem "jekyll-feed", "~> 0.1.3" + gem "jekyll-coffeescript", "~> 1.0" + gem "jekyll-redirect-from", "~> 0.9.1" + gem "jekyll-paginate", "~> 1.0" + gem "mime-types", "~> 3.0" + gem "kramdown", "~> 1.9" + gem "rdoc", "~> 4.2" + + platform :ruby, :mswin, :mingw do + gem "rdiscount", "~> 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 end -gem 'jekyll-paginate', '~> 1.0' -gem 'jekyll-coffeescript', '~> 1.0' -gem 'jekyll-feed', '~> 0.4.0' -gem 'jekyll-redirect-from', '~> 0.9.1' -gem 'jekyll-gist', '~> 1.0' -gem 'mime-types', '~> 3.0' -gem 'kramdown', '~> 1.9' - -platform :ruby, :mswin, :mingw do - gem 'rdiscount', '~> 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' +# + +group :site do + if ENV["PROOF"] + gem "html-proofer", "~> 2.0" + end end diff --git a/script/travis b/script/travis index 826ffa767ca..4d62fa9ba78 100755 --- a/script/travis +++ b/script/travis @@ -16,14 +16,18 @@ status=0 if [ $# -eq 2 ]; then docker exec -it docker-travis bash -ilc " \ rvm use --install --binary --fuzzy $1 - bundle install --path vendor/bundle -j 256 + bundle install --path vendor/bundle -j 12 \\ + --without benchmark:site:development + bundle clean script/test $2 " || status=$? elif [ $# -eq 1 ]; then docker exec -it docker-travis bash -ilc " \ rvm use --install --binary --fuzzy $1 - bundle install --path vendor/bundle -j 256 + bundle install --path vendor/bundle -j 12 \\ + --without benchmark:site:development + bundle clean bundle exec rake " || status=$? From 5555db8c7294069b080750ae45ef2fa078404da6 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 12 Jan 2016 06:59:09 -0600 Subject: [PATCH 0274/4996] Start using Rubocop from Github, it supports our config. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 16470f69c0e..8e2d51eeafa 100644 --- a/Gemfile +++ b/Gemfile @@ -3,8 +3,8 @@ gemspec :name => "jekyll" gem "rake", "~> 10.1" group :development do - gem "rubocop" gem "launchy", "~> 2.3" + gem "rubocop", :branch => :master, :github => "bbatsov/rubocop" gem "pry" end From 4048b8e2a735565de2f515f55036c859415a06ae Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 12 Jan 2016 08:28:10 -0800 Subject: [PATCH 0275/4996] Update history to reflect merge of #4350 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8fb5a685270..14e016a299d 100644 --- a/History.markdown +++ b/History.markdown @@ -55,6 +55,7 @@ * Move Cucumber to using RSpec-Expections and furthering JRuby support. (#4343) * Rearrange Cucumber and add some flair. (#4347) * Remove old FIXME (#4349) + * Clean up the Gemfile (and keep all the necessary dependencies) (#4350) ### Site Enhancements From 54b63958069765c18782fec3e325658b2c9ca80f Mon Sep 17 00:00:00 2001 From: musoke Date: Fri, 15 Jan 2016 12:12:29 +1300 Subject: [PATCH 0276/4996] Correct typo in ### Precdence The Precedence section referred to the "last example" where it should have referred to the "second to last." --- site/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index a12b2e265d3..f4327d3597c 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -506,7 +506,7 @@ In this example the `layout` is set to `default` inside the [collection](../coll Jekyll will apply all of the configuration settings you specify in the `defaults` section of your `_config.yml` file. However, you can choose to override settings from other scope/values pair by specifying a more specific path for the scope. -You can see that in the last example above. First, we set the default layout to `my-site`. Then, using a more specific path, we set the default layout for files in the `projects/` path to `project`. This can be done with any value that you would set in the page or post front matter. +You can see that in the second to last example above. First, we set the default layout to `my-site`. Then, using a more specific path, we set the default layout for files in the `projects/` path to `project`. This can be done with any value that you would set in the page or post front matter. Finally, if you set defaults in the site configuration by adding a `defaults` section to your `_config.yml` file, you can override those settings in a post or page file. All you need to do is specify the settings in the post or page front matter. For example: From 9368e261cc7eb4bf5d23b7f15371e132b5c7c1be Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 14 Jan 2016 16:36:11 -0800 Subject: [PATCH 0277/4996] Update history to reflect merge of #4355 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 14e016a299d..e818595532a 100644 --- a/History.markdown +++ b/History.markdown @@ -81,6 +81,7 @@ * Fix grammar in the documentation for posts. (#4330) * Add documentation for smartify Liquid filter (#4333) * Fixed broken link to blog on using mathjax with jekyll (#4344) + * Documentation: correct reference in Precedence section of Configuration docs (#4355) ## 3.0.1 / 2015-11-17 From f8a63157d797d16716266f46dd29e0def64a0000 Mon Sep 17 00:00:00 2001 From: Pedro Euko Date: Mon, 28 Sep 2015 13:58:50 -0300 Subject: [PATCH 0278/4996] Empty permalink now shows an error --- lib/jekyll/convertible.rb | 13 +++++++++++++ test/fixtures/empty_permalink.erb | 4 ++++ test/test_convertible.rb | 9 +++++++++ 3 files changed, 26 insertions(+) create mode 100644 test/fixtures/empty_permalink.erb diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 746f4bd1529..5406f13de7e 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -61,6 +61,10 @@ def read_yaml(base, name, opts = {}) Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" end + unless valid_permalink?(self.data['permalink']) + Jekyll.logger.error "Error:", "Invalid permalink in #{File.join(base, name)}" + end + self.data end @@ -266,6 +270,15 @@ def do_layout(payload, layouts) Jekyll::Hooks.trigger hook_owner, :post_render, self end + # Check data permalink + # + # permalink - the data permalink + # + # Returns true if the permalink is valid, false if otherwise + def valid_permalink?(permalink) + permalink.nil? || permalink.length > 0 + end + # Write the generated page file to the destination directory. # # dest - The String path to the destination dir. diff --git a/test/fixtures/empty_permalink.erb b/test/fixtures/empty_permalink.erb new file mode 100644 index 00000000000..6dabf63b805 --- /dev/null +++ b/test/fixtures/empty_permalink.erb @@ -0,0 +1,4 @@ +--- +permalink: '' +--- +Empty Permalink diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 09c697374db..840fa323bd4 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -49,5 +49,14 @@ class TestConvertible < JekyllUnitTest assert_match(/invalid byte sequence in UTF-8/, out) assert_match(/#{File.join(@base, name)}/, out) end + + should "parse the front-matter but show an error if permalink is empty" do + name = 'empty_permalink.erb' + out = capture_stderr do + @convertible.read_yaml(@base, name) + end + assert_match(/Invalid permalink/, out) + assert_match(/#{File.join(@base, name)}/, out) + end end end From 568174222382479fe7d63eee86632086d16daefa Mon Sep 17 00:00:00 2001 From: Pedro Euko Date: Fri, 15 Jan 2016 14:04:16 -0200 Subject: [PATCH 0279/4996] Check if permalink key was given --- lib/jekyll/convertible.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 5406f13de7e..23d338a3181 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -61,7 +61,7 @@ def read_yaml(base, name, opts = {}) Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" end - unless valid_permalink?(self.data['permalink']) + if self.data['permalink'] && empty_permalink?(self.data['permalink']) Jekyll.logger.error "Error:", "Invalid permalink in #{File.join(base, name)}" end @@ -275,8 +275,8 @@ def do_layout(payload, layouts) # permalink - the data permalink # # Returns true if the permalink is valid, false if otherwise - def valid_permalink?(permalink) - permalink.nil? || permalink.length > 0 + def empty_permalink?(permalink) + permalink.length == 0 end # Write the generated page file to the destination directory. From 156e093b5cca3b534c1bb7b3ad0493e8dbbdcc14 Mon Sep 17 00:00:00 2001 From: Pedro Euko Date: Fri, 15 Jan 2016 14:34:39 -0200 Subject: [PATCH 0280/4996] Ensure no errors when there is no permalink --- test/test_convertible.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 840fa323bd4..0c5acf1a9ba 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -58,5 +58,12 @@ class TestConvertible < JekyllUnitTest assert_match(/Invalid permalink/, out) assert_match(/#{File.join(@base, name)}/, out) end + + should "parse the front-matter correctly whitout permalink" do + out = capture_stderr do + @convertible.read_yaml(@base, 'front_matter.erb') + end + refute_match(/Invalid permalink/, out) + end end end From 3e81331af1beca5e99786f39ff3cdc73b3e017b7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 10:00:45 -0800 Subject: [PATCH 0281/4996] Utils: don't require mime/types --- lib/jekyll/utils.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 635b5d107d9..b6a05ff8cf6 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -1,5 +1,3 @@ -require 'mime/types' - module Jekyll module Utils extend self From 22931f42b87e94d88216c3e08aba3d32dd91d43a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 10:00:56 -0800 Subject: [PATCH 0282/4996] Drop: require 'json' for #inspect call --- lib/jekyll/drops/drop.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index a8342c14b44..b13db5ef43e 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -133,6 +133,7 @@ def to_h # # Returns a pretty generation of the hash representation of the Drop. def inspect + require 'json' JSON.pretty_generate to_h end From 5d79c55b2cee0aa19ca57ad331333edba9db47b7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 10:52:18 -0800 Subject: [PATCH 0283/4996] Fix deep_merge_hashes! handling of drops and hashes --- lib/jekyll/drops/drop.rb | 26 ++++++++++++++++++++++++++ lib/jekyll/utils.rb | 16 +++++++++------- test/test_utils.rb | 4 ++-- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index b13db5ef43e..35f0df26e81 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -127,6 +127,7 @@ def to_h result[key] = self[key] end end + alias_method :to_hash, :to_h # Inspect the drop's keys and values through a JSON representation # of its keys and values. @@ -145,6 +146,31 @@ def inspect def each_key(&block) keys.each(&block) end + + def merge(other, &block) + self.dup.tap do |me| + if block.nil? + me.merge!(other) + else + me.merge!(other, block) + end + end + end + + def merge!(other) + other.each_key do |key| + if block_given? + self[key] = yield key, self[key], other[key] + else + if Utils.mergable?(self[key]) && Utils.mergable?(other[key]) + self[key] = Utils.deep_merge_hashes(self[key], other[key]) + next + end + + self[key] = other[key] unless other[key].nil? + end + end + end end end end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index b6a05ff8cf6..9ffff548e6f 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -31,14 +31,12 @@ def deep_merge_hashes(master_hash, other_hash) # # Thanks to whoever made it. def deep_merge_hashes!(target, overwrite) - overwrite.each_key do |key| - if (overwrite[key].is_a?(Hash) || overwrite[key].is_a?(Drops::Drop)) && - (target[key].is_a?(Hash) || target[key].is_a?(Drops::Drop)) - target[key] = Utils.deep_merge_hashes(target[key], overwrite[key]) - next + target.merge!(overwrite) do |key, old_val, new_val| + if new_val.nil? + old_val + else + mergable?(old_val) && mergable?(new_val) ? deep_merge_hashes(old_val, new_val) : new_val end - - target[key] = overwrite[key] end if target.respond_to?(:default_proc) && overwrite.respond_to?(:default_proc) && target.default_proc.nil? @@ -48,6 +46,10 @@ def deep_merge_hashes!(target, overwrite) target end + def mergable?(value) + value.is_a?(Hash) || value.is_a?(Drops::Drop) + end + # Read array from the supplied hash favouring the singular key # and then the plural key, and handling any nil entries. # diff --git a/test/test_utils.rb b/test/test_utils.rb index 49844038229..d3720127098 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -13,7 +13,7 @@ class TestUtils < JekyllUnitTest merged = Utils.deep_merge_hashes(data, @site.site_payload) assert merged.is_a? Hash assert merged["site"].is_a? Drops::SiteDrop - assert_equal data["page"], {} + assert_equal data["page"], merged["page"] end should "merge a hash into a drop" do @@ -22,7 +22,7 @@ class TestUtils < JekyllUnitTest merged = Utils.deep_merge_hashes(@site.site_payload, data) assert merged.is_a? Drops::UnifiedPayloadDrop assert merged["site"].is_a? Drops::SiteDrop - assert_equal data["page"], {} + assert_equal data["page"], merged["page"] end end From 207fcbdef7ad7b0b72c48a806ba5af27525b13ca Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 11:23:09 -0800 Subject: [PATCH 0284/4996] Add byebug for debugging purposes. --- .gitignore | 27 ++++++++++++++------------- Gemfile | 1 + 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 6441a147fd9..1d62ecc3876 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,22 @@ -Gemfile.lock -test/dest *.gem -pkg/ *.swp *~ -_site/ -.bundle/ .DS_Store +.analysis +.bundle/ +.byebug_history +.jekyll-metadata +.ruby-gemset +.ruby-version +.sass-cache +/test/source/file_name.txt +/vendor +Gemfile.lock +_site/ bbin/ +coverage gh-pages/ +pkg/ site/_site/ -coverage -.ruby-version -.ruby-gemset -.sass-cache +test/dest tmp/* -.jekyll-metadata -/vendor -/test/source/file_name.txt -.analysis diff --git a/Gemfile b/Gemfile index 8e2d51eeafa..9e4796e60ee 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,7 @@ group :test do gem "rspec-mocks" gem "nokogiri" gem "rspec" + gem "byebug" end # From 0587a3bb57ba7d39e8f064e618163cf5c73d8cfc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 11:30:02 -0800 Subject: [PATCH 0285/4996] Fix some debug logging. - excluded? should now only print when it is excluded - requiring is now properly aligned --- lib/jekyll/entry_filter.rb | 2 +- lib/jekyll/external.rb | 2 +- site/_config.yml | 4 ++++ test/test_kramdown.rb | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index e42701875df..6d42c067c55 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -47,7 +47,7 @@ def backup?(entry) def excluded?(entry) excluded = glob_include?(site.exclude, relative_to_source(entry)) - Jekyll.logger.debug "EntryFilter:", "excluded?(#{relative_to_source(entry)}) ==> #{excluded}" + Jekyll.logger.debug "EntryFilter:", "excluded #{relative_to_source(entry)}" if excluded excluded end diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index 2996d24b635..69b8d1eb391 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -39,7 +39,7 @@ def require_if_present(names, &block) def require_with_graceful_fail(names) Array(names).each do |name| begin - Jekyll.logger.debug("Requiring #{name}") + Jekyll.logger.debug "Requiring:", "#{name}" require name rescue LoadError => e Jekyll.logger.error "Dependency Error:", <<-MSG diff --git a/site/_config.yml b/site/_config.yml index c065f9f7015..fc3f3484797 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -22,3 +22,7 @@ url: http://jekyllrb.com gems: - jekyll-feed - jekyll-redirect-from + +exclude: + - README.md + - CNAME diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index 21ba5764ab1..d1668d2b31d 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -90,7 +90,7 @@ class TestKramdown < JekyllUnitTest MARKDOWN selector = "div.highlighter-coderay>div.CodeRay>div.code>pre" - refute result.css(selector).empty? + refute result.css(selector).empty?, "pre tag should exist" end end From ea9cac5214bb0bff25159421c72c2189caca31d1 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 15 Jan 2016 14:15:28 -0600 Subject: [PATCH 0286/4996] Add a nasty hack to reduce persistence until RSpec. --- test/test_kramdown.rb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index 21ba5764ab1..5836d369e55 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -37,6 +37,7 @@ class TestKramdown < JekyllUnitTest should "support custom types" do override = { + "highlighter" => nil, 'kramdown' => { 'smart_quotes' => 'lsaquo,rsaquo,laquo,raquo' } @@ -61,7 +62,14 @@ class TestKramdown < JekyllUnitTest context "when a custom highlighter is chosen" do should "use the chosen highlighter if it's available" do - override = { "markdown" => "kramdown", "kramdown" => { "syntax_highlighter" => :coderay }} + override = { + "highlighter" => nil, + "markdown" => "kramdown", + "kramdown" => { + "syntax_highlighter" => :coderay + } + } + markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) ~~~ruby @@ -77,11 +85,12 @@ class TestKramdown < JekyllUnitTest override = { "markdown" => "kramdown", "kramdown" => { - "syntax_highlighter" => nil, - "enable_coderay" => true - } + "enable_coderay" => true, + } } + @config.delete("highlighter") + @config["kramdown"].delete("syntax_highlighter") markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) ~~~ruby @@ -97,6 +106,7 @@ class TestKramdown < JekyllUnitTest should "move coderay to syntax_highlighter_opts" do original = Kramdown::Document.method(:new) markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, { + "higlighter" => nil, "markdown" => "kramdown", "kramdown" => { "syntax_highlighter" => "coderay", From 04e1768807b80f65c605cdb900ec6f7fa6ab1f45 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Jan 2016 15:06:56 -0800 Subject: [PATCH 0287/4996] Update history to reflect merge of #4359 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e818595532a..cd35e99ac9f 100644 --- a/History.markdown +++ b/History.markdown @@ -36,6 +36,7 @@ * utils: `has_yaml_header?` should accept files with extraneous spaces (#4290) * Escape html from site.title and page.title in site template (#4307) * Allow custom file extensions if defined in `permalink` YAML front matter (#4314) + * Fix deep_merge_hashes! handling of drops and hashes (#4359) ### Development Fixes From 948dcf27141744095e78a3e702b896a39134aa91 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 15:51:32 -0800 Subject: [PATCH 0288/4996] Convertible: consolidate empty check into Convertible#read --- lib/jekyll/convertible.rb | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 23d338a3181..8edc4bfa788 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -61,8 +61,8 @@ def read_yaml(base, name, opts = {}) Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" end - if self.data['permalink'] && empty_permalink?(self.data['permalink']) - Jekyll.logger.error "Error:", "Invalid permalink in #{File.join(base, name)}" + if self.data['permalink'] && self.data['permalink'].size == 0 + Jekyll.logger.abort_with "Fatal:", "Invalid permalink in #{File.join(base, name)}" end self.data @@ -270,15 +270,6 @@ def do_layout(payload, layouts) Jekyll::Hooks.trigger hook_owner, :post_render, self end - # Check data permalink - # - # permalink - the data permalink - # - # Returns true if the permalink is valid, false if otherwise - def empty_permalink?(permalink) - permalink.length == 0 - end - # Write the generated page file to the destination directory. # # dest - The String path to the destination dir. From 89db3c63842ed4d2a4b8101e71fbc32efa34310d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 15:52:54 -0800 Subject: [PATCH 0289/4996] Convertible: separate data validation out of #read --- lib/jekyll/convertible.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 8edc4bfa788..7f3702d3846 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -56,16 +56,23 @@ def read_yaml(base, name, opts = {}) end self.data ||= {} + + validate_data! + validate_permalink! + self.data + end + + def validate_data! unless self.data.is_a?(Hash) Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" end - + end + + def validate_permalink! if self.data['permalink'] && self.data['permalink'].size == 0 Jekyll.logger.abort_with "Fatal:", "Invalid permalink in #{File.join(base, name)}" end - - self.data end # Transform the contents based on the content type. From 06fa14c11ace8970b7fb7aad4159ffc1382d20d1 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 16:11:08 -0800 Subject: [PATCH 0290/4996] Restructure data validation so that permalink check raises an error. --- lib/jekyll/convertible.rb | 24 +++++++++++++----------- lib/jekyll/errors.rb | 6 ++++-- test/test_convertible.rb | 4 +--- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 7f3702d3846..a8e1d0a4444 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -42,6 +42,8 @@ def merged_file_read_opts(opts) # # Returns nothing. def read_yaml(base, name, opts = {}) + filename = File.join(base, name) + begin self.content = File.read(site.in_source_dir(base, name), merged_file_read_opts(opts)) @@ -50,28 +52,28 @@ def read_yaml(base, name, opts = {}) self.data = SafeYAML.load(Regexp.last_match(1)) end rescue SyntaxError => e - Jekyll.logger.warn "YAML Exception reading #{File.join(base, name)}: #{e.message}" + Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" rescue Exception => e - Jekyll.logger.warn "Error reading file #{File.join(base, name)}: #{e.message}" + Jekyll.logger.warn "Error reading file #{filename}: #{e.message}" end self.data ||= {} - - validate_data! - validate_permalink! + + validate_data! filename + validate_permalink! filename self.data end - - def validate_data! + + def validate_data!(filename) unless self.data.is_a?(Hash) - Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" + raise Errors::InvalidYAMLFrontMatterError, "Invalid YAML front matter in #{filename}" end end - - def validate_permalink! + + def validate_permalink!(filename) if self.data['permalink'] && self.data['permalink'].size == 0 - Jekyll.logger.abort_with "Fatal:", "Invalid permalink in #{File.join(base, name)}" + raise Errors::InvalidPermalinkError, "Invalid permalink in #{filename}" end end diff --git a/lib/jekyll/errors.rb b/lib/jekyll/errors.rb index 2b0dbc0c39a..36b2643d3dc 100644 --- a/lib/jekyll/errors.rb +++ b/lib/jekyll/errors.rb @@ -2,7 +2,9 @@ module Jekyll module Errors FatalException = Class.new(::RuntimeError) - MissingDependencyException = Class.new(FatalException) - DropMutationException = Class.new(FatalException) + DropMutationException = Class.new(FatalException) + InvalidPermalinkError = Class.new(FatalException) + InvalidYAMLFrontMatterError = Class.new(FatalException) + MissingDependencyException = Class.new(FatalException) end end diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 0c5acf1a9ba..524ecdf45e8 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -52,11 +52,9 @@ class TestConvertible < JekyllUnitTest should "parse the front-matter but show an error if permalink is empty" do name = 'empty_permalink.erb' - out = capture_stderr do + assert_raises(Errors::InvalidPermalinkError) do @convertible.read_yaml(@base, name) end - assert_match(/Invalid permalink/, out) - assert_match(/#{File.join(@base, name)}/, out) end should "parse the front-matter correctly whitout permalink" do From d9aef14063686452ba8c5221f2b300d3103f5642 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Jan 2016 16:19:23 -0800 Subject: [PATCH 0291/4996] Update history to reflect merge of #4361 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cd35e99ac9f..6eb36653eff 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * drops: provide `#to_h` to allow for hash introspection (#4281) * Shim subcommands with indication of gem possibly required so users know how to use them (#4254) * Add smartify Liquid filter for SmartyPants (#4323) + * Raise error on empty permalink (#4361) ### Bug Fixes From c678640553b71971434bceabe7bf0514921b3cbd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 16:25:58 -0800 Subject: [PATCH 0292/4996] Release :gem: v3.1.0.pre.rc1 --- lib/jekyll/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 2d2bf2c6a06..66eebc1c051 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.0.pre.beta1' + VERSION = '3.1.0.pre.rc1' end From 281f75182e63998d1fb823aee4f9562aa1f6fded Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 16:26:08 -0800 Subject: [PATCH 0293/4996] Release :gem: 3.1.0.pre.rc1 From b3b4abe80a8ed8731bf301f0f907968f4df7eda6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 16 Jan 2016 12:09:13 -0800 Subject: [PATCH 0294/4996] Add @jmcglone's guide to github-pages doc page Nearly every day, when I get the report of visitors to jekyllrb.com, I see jmcglone's excellent guide. Reading through it today makes me think it is one of the finest if not _the_ finest guide to getting started with Git, GitHub, and Jekyll in order to publish successfully and happily on GitHub Pages. @jmcglone, mind if I add this to our GitHub Pages doc page? --- site/_docs/github-pages.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/site/_docs/github-pages.md b/site/_docs/github-pages.md index e19cdb2d24e..03d83b35bf2 100644 --- a/site/_docs/github-pages.md +++ b/site/_docs/github-pages.md @@ -10,6 +10,11 @@ organizations, and repositories, that are freely hosted on GitHub's powered by Jekyll behind the scenes, so in addition to supporting regular HTML content, they’re also a great way to host your Jekyll-powered website for free. +Never built a website with GitHub Pages before? [See this marvelous guide by +Jonathan McGlone to get you up and running](http://jmcglone.com/guides/github-pages/). +This guide will teach you what you need to know about Git, GitHub, and Jekyll to +create your very own website on GitHub Pages. + ## Deploying Jekyll to GitHub Pages GitHub Pages work by looking at certain branches of repositories on GitHub. From 9c6f33024f19446d37beff7c0cb9c88624603bff Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 16 Jan 2016 12:21:07 -0800 Subject: [PATCH 0295/4996] Restructure the resources page a bit --- site/_docs/resources.md | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/site/_docs/resources.md b/site/_docs/resources.md index b414c90de0b..2ba5f25eeb5 100644 --- a/site/_docs/resources.md +++ b/site/_docs/resources.md @@ -6,41 +6,33 @@ permalink: /docs/resources/ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, extensions, examples, and other resources that can be very helpful. Below is a collection of links to some of the most popular Jekyll resources. -### Jekyll tips & tricks, and examples - -- [Tips for working with GitHub Pages Integration](https://gist.github.com/2890453) - - Code example reuse, and keeping documentation up to date. - -- [Use FormKeep as a backend for forms (contact forms, hiring forms, etc.)](https://formkeep.com/guides/how-to-make-a-contact-form-in-jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=contact-form-jekyll) -- [Use Simple Form to integrate a simple contact - form](http://getsimpleform.com/) -- [JekyllBootstrap.com](http://jekyllbootstrap.com) - - Provides detailed explanations, examples, and helper-code to make - getting started with Jekyll easier. - -### Tutorials - -#### Integrating Jekyll with Git +### Useful Guides +- [“Creating and Hosting a Personal Site on GitHub”](http://jmcglone.com/guides/github-pages/) +- [‘Build A Blog With Jekyll And GitHub Pages’ on Smashing Magazine](http://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) +- Publishing to GitHub Pages? [Check out our documentation page for just that purpose](/docs/github-pages/). - [Blogging with Git, Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) +- [Tips for working with GitHub Pages Integration](https://gist.github.com/jedschneider/2890453) -#### Other hacks +### Integrations +- [Use FormKeep as a backend for forms (contact forms, hiring forms, etc.)](https://formkeep.com/guides/how-to-make-a-contact-form-in-jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=contact-form-jekyll) +- [Use Simple Form to add a simple contact form](http://getsimpleform.com/) +- [Jekyll Bootstrap](http://jekyllbootstrap.com), 0 to Blog in 3 minutes. Provides detailed explanations, examples, and helper-code to make getting started with Jekyll easier. - [Integrating Twitter with Jekyll](http://www.justkez.com/integrating-twitter-with-jekyll/) > “Having migrated Justkez.com to be based on Jekyll, I was pondering how I might include my recent twitterings on the front page of the site. In the WordPress world, this would have been done via a plugin which may or may not have hung the loading of the page, might have employed caching, but would certainly have had some overheads. … Not in Jekyll.” + +### Other commentary + - [‘My Jekyll Fork’, by Mike West](http://mikewest.org/2009/11/my-jekyll-fork) + > “Jekyll is a well-architected throwback to a time before WordPress, when men were men, and HTML was static. I like the ideas it espouses, and have made a few improvements to it’s core. Here, I’ll point out some highlights of my fork in the hopes that they see usage beyond this site.” + - [‘About this Website’, by Carter Allen](http://cartera.me/2010/08/12/about-this-website/) + > “Jekyll is everything that I ever wanted in a blogging engine. Really. It isn’t perfect, but what’s excellent about it is that if there’s something wrong, I know exactly how it works and how to fix it. It runs on the your machine only, and is essentially an added”build" step between you and the browser. I coded this entire site in TextMate using standard HTML5 and CSS3, and then at the end I added just a few little variables to the markup. Presto-chango, my site is built and I am at peace with the world.” -- [‘Build A Blog With Jekyll And GitHub Pages’, by Barry Clark](http://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) - > “I recently migrated my blog from WordPress to Jekyll, a fantastic website generator that’s designed for building minimal, static blogs to be hosted on GitHub Pages. The simplicity of Jekyll’s theming layer and writing workflow is fantastic; however, setting up my website took a lot longer than expected. In this article we'll walk through: the quickest way to set up a Jekyll powered blog, how to avoid common problems with using Jekyll, how to import your content from Wordpress, and more.” -- [Generating a Tag Cloud in Jekyll](http://www.justkez.com/generating-a-tag-cloud-in-jekyll/) -A guide to implementing a tag cloud and per-tag content pages using Jekyll. +- [Generating a Tag Cloud in Jekyll](http://www.justkez.com/generating-a-tag-cloud-in-jekyll/) – A guide to implementing a tag cloud and per-tag content pages using Jekyll. - A way to [extend Jekyll](https://github.com/rfelix/jekyll_ext) without forking and modifying the Jekyll gem codebase and some [portable Jekyll extensions](https://wiki.github.com/rfelix/jekyll_ext/extensions) that can be reused and shared. - - [Using your Rails layouts in Jekyll](http://numbers.brighterplanet.com/2010/08/09/sharing-rails-views-with-jekyll) - - [Adding Ajax pagination to Jekyll](https://eduardoboucas.com/blog/2014/11/10/adding-ajax-pagination-to-jekyll.html) From 4482f80d3496a55e54f42ee75a55dcad215f6c31 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 18 Jan 2016 07:48:11 -0800 Subject: [PATCH 0296/4996] Update history to reflect merge of #4364 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6eb36653eff..ba8e9a81e46 100644 --- a/History.markdown +++ b/History.markdown @@ -84,6 +84,7 @@ * Add documentation for smartify Liquid filter (#4333) * Fixed broken link to blog on using mathjax with jekyll (#4344) * Documentation: correct reference in Precedence section of Configuration docs (#4355) + * Add @jmcglone's guide to github-pages doc page (#4364) ## 3.0.1 / 2015-11-17 From 9676b775de2ff78ae5331537083ae3c9d31f138c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 08:47:35 -0800 Subject: [PATCH 0297/4996] Want the readme and CNAME. --- site/_config.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/site/_config.yml b/site/_config.yml index fc3f3484797..c065f9f7015 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -22,7 +22,3 @@ url: http://jekyllrb.com gems: - jekyll-feed - jekyll-redirect-from - -exclude: - - README.md - - CNAME From d343da61eb8ac5ca776842d1c4c9f2810f443ea9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 11:41:05 -0800 Subject: [PATCH 0298/4996] Page: pipe through Renderer instead of using Convertible --- lib/jekyll/convertible.rb | 8 +------- lib/jekyll/page.rb | 6 ++++++ lib/jekyll/renderer.rb | 2 +- lib/jekyll/site.rb | 3 ++- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index a8e1d0a4444..383bb024dc0 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -97,13 +97,7 @@ def transform # Returns the String extension for the output file. # e.g. ".html" for an HTML output file. def output_ext - if converters.all? { |c| c.is_a?(Jekyll::Converters::Identity) } - ext - else - converters.map do |c| - c.output_ext(ext) unless c.is_a?(Jekyll::Converters::Identity) - end.compact.last - end + Jekyll::Renderer.new(site, self).output_ext end # Determine which converter to use based on this convertible's diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index a3519f57f53..0a93aa08ec8 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -7,6 +7,8 @@ class Page attr_accessor :name, :ext, :basename attr_accessor :data, :content, :output + alias_method :extname, :ext + # Attributes for Liquid templates ATTRIBUTES_FOR_LIQUID = %w( content @@ -160,5 +162,9 @@ def html? def index? basename == 'index' end + + def trigger_hooks(hook_name, *args) + Jekyll::Hooks.trigger :pages, hook_name, self, *args + end end end diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index e6a41aead3c..5a788c8174d 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -38,7 +38,7 @@ def run payload["page"] = document.to_liquid - if document.collection.label == 'posts' && document.is_a?(Document) + if document.is_a?(Document) && document.collection.label == 'posts' payload['site']['related_posts'] = document.related_posts end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 465e154e892..15698b99d22 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -176,7 +176,8 @@ def render pages.flatten.each do |page| if regenerator.regenerate?(page) - page.render(layouts, payload) + page.output = Jekyll::Renderer.new(self, page, payload).run + page.trigger_hooks(:post_render) end end From 7d81c00b29f7e317566c0e79f7539ab04231befc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 11:41:47 -0800 Subject: [PATCH 0299/4996] Renderer: use Convertible's way of picking the last Converter's output extension --- lib/jekyll/renderer.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 5a788c8174d..b4afa03cc71 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -25,10 +25,20 @@ def output_ext @output_ext ||= if document.permalink File.extname(document.permalink) else - converters.first.output_ext(document.extname) + if output_exts.size == 1 + output_exts.last + else + output_exts[-2] + end end end + def output_exts + @output_exts ||= converters.map do |c| + c.output_ext(document.extname) + end.compact + end + ###################### ## DAT RENDER THO ###################### From dd15e3c368f20e84206892efebc413d1cfd48843 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 11:42:34 -0800 Subject: [PATCH 0300/4996] features: write EXIT STATUS to output so it all prints when we get an exit status we aren't expecting --- features/step_definitions.rb | 9 +++++++-- features/support/helpers.rb | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 64213ea4e27..d369593513f 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -228,8 +228,13 @@ # Then %r{^I should see "(.*)" in the build output$} do |text| - regexp = Regexp.new(text) - expect(jekyll_run_output).to match regexp + expect(jekyll_run_output).to match Regexp.new(text) +end + +# + +Then %r{^I should get a zero exit(?:\-| )status$} do + step %(I should see "EXIT STATUS: 0" in the build output) end # diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 62892612fbb..83010b9e97d 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -100,8 +100,13 @@ def run_in_shell(*args) end File.write(Paths.status_file, p.value.exitstatus) - File.write(Paths.output_file, out) if p.value.exitstatus == 0 - File.write(Paths.output_file, err) if p.value.exitstatus != 0 + File.open(Paths.output_file, "wb") do |f| + f.puts args.join(" ") + f.puts out + f.puts err + f.puts "EXIT STATUS: #{p.value.exitstatus}" + end + p.value end From 2adb70a247d61a16292551ab306af0e6426cd91b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 11:42:59 -0800 Subject: [PATCH 0301/4996] features: writing a configuration file should append if it's already there --- features/step_definitions.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index d369593513f..7c9281f55d7 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -93,7 +93,13 @@ # Given %r{^I have a configuration file with "(.*)" set to "(.*)"$} do |key, value| - File.write("_config.yml", "#{key}: #{value}\n") + config = if source_dir.join("_config.yml").exist? + SafeYAML.load_file(source_dir.join("_config.yml")) + else + {} + end + config[key] = value + File.write("_config.yml", YAML.dump(config)) end # From e9c5c45651d7f0755b88ada09ad228818d9fdd9b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 11:43:21 -0800 Subject: [PATCH 0302/4996] features: look for lack of "EXIT STATUS: 0" for non-zero exit status --- features/step_definitions.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 7c9281f55d7..71a92aea15a 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -246,5 +246,5 @@ # Then %r{^I should get a non-zero exit(?:\-| )status$} do - expect(jekyll_run_status.to_i).to be > 0 + expect(jekyll_run_status.to_i).not_to match(%r{EXIT STATUS: 0}) end From 9a6f4e08b7d073d5636e73b9b8c3c7fb2395e027 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 11:44:00 -0800 Subject: [PATCH 0303/4996] features/permalinks: add a permalink feature for non-html extension name for pages Fixes https://github.com/mpc-hc/mpc-hc.org/pull/58#issuecomment-172594526 --- features/permalinks.feature | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/features/permalinks.feature b/features/permalinks.feature index 74f2e409f7b..5e1db21d5a7 100644 --- a/features/permalinks.feature +++ b/features/permalinks.feature @@ -120,3 +120,13 @@ Feature: Fancy permalinks When I run jekyll build Then the _site directory should exist And I should see "Totally awesome" in "_site/2009/03/27/Custom_Schema/index.html" + + Scenario: Use a non-HTML file extension in the permalink + Given I have a _posts directory + And I have an "_posts/2016-01-18-i-am-php.md" page with permalink "/2016/i-am-php.php" that contains "I am PHP" + And I have a "i-am-also-php.md" page with permalink "/i-am-also-php.php" that contains "I am also PHP" + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And I should see "I am PHP" in "_site/2016/i-am-php.php" + And I should see "I am also PHP" in "_site/i-am-also-php.php" From 736a800f0ed0dafc5e6ae1944bf1cea1efc1191d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 11:52:31 -0800 Subject: [PATCH 0304/4996] features: validate the exit status of 0 for successful calls --- features/collections.feature | 33 ++++++++---- features/create_sites.feature | 48 ++++++++++++------ features/drafts.feature | 12 +++-- features/embed_filters.feature | 24 ++++++--- features/frontmatter_defaults.feature | 18 ++++--- features/hooks.feature | 27 ++++++---- features/include_tag.feature | 21 +++++--- features/incremental_rebuild.feature | 24 ++++++--- features/markdown.feature | 6 ++- features/permalinks.feature | 36 +++++++++----- features/plugins.feature | 9 ++-- features/post_data.feature | 72 ++++++++++++++++++--------- features/post_excerpts.feature | 9 ++-- features/rendering.feature | 15 ++++-- features/site_configuration.feature | 42 ++++++++++------ features/site_data.feature | 33 ++++++++---- 16 files changed, 286 insertions(+), 143 deletions(-) diff --git a/features/collections.feature b/features/collections.feature index 1fcc7ccea57..888bd1c2ddc 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -8,7 +8,8 @@ Feature: Collections And I have fixture collections And I have a configuration file with "collections" set to "['methods']" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Collections:

Use Jekyll.configuration to build a full configuration for use w/Jekyll.

\n\n

Whatever: foo.bar

\n

Signs are nice

\n

Jekyll.sanitized_path is used to make sure your path is in your source.

\n

Run your generators! default

\n

Page without title.

\n

Run your generators! default

" in "_site/index.html" And the "_site/methods/configuration.html" file should not exist @@ -24,7 +25,8 @@ Feature: Collections foo: bar """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Collections: output => true" in "_site/index.html" And I should see "label => methods" in "_site/index.html" And I should see "Methods metadata: bar" in "_site/collection_metadata.html" @@ -41,7 +43,8 @@ Feature: Collections permalink: /:collection/:path/ """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "

Whatever: foo.bar

" in "_site/methods/configuration/index.html" Scenario: Rendered document in a layout @@ -56,7 +59,8 @@ Feature: Collections foo: bar """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Collections: output => true" in "_site/index.html" And I should see "label => methods" in "_site/index.html" And I should see "foo => bar" in "_site/index.html" @@ -72,7 +76,8 @@ Feature: Collections - methods """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Collections: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" Scenario: Collections specified as an hash @@ -84,7 +89,8 @@ Feature: Collections - methods """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Collections: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" Scenario: All the documents @@ -96,7 +102,8 @@ Feature: Collections - methods """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "All documents: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" Scenario: Documents have an output attribute, which is the converted HTML @@ -108,7 +115,8 @@ Feature: Collections - methods """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "First document's output:

Use Jekyll.configuration to build a full configuration for use w/Jekyll.

\n\n

Whatever: foo.bar

" in "_site/index.html" Scenario: Filter documents by where @@ -120,7 +128,8 @@ Feature: Collections - methods """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Item count: 2" in "_site/index.html" Scenario: Sort by title @@ -132,7 +141,8 @@ Feature: Collections - methods """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "1. of 7:

Page without title.

" in "_site/index.html" Scenario: Sort by relative_path @@ -144,5 +154,6 @@ Feature: Collections - methods """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Collections: Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, , Site#generate," in "_site/index.html" diff --git a/features/create_sites.feature b/features/create_sites.feature index 898115c2344..031fa434cfe 100644 --- a/features/create_sites.feature +++ b/features/create_sites.feature @@ -13,7 +13,8 @@ Feature: Create sites Scenario: Basic site Given I have an "index.html" file that contains "Basic Site" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Basic Site" in "_site/index.html" Scenario: Basic site with a post @@ -22,7 +23,8 @@ Feature: Create sites | title | date | content | | Hackers | 2009-03-27 | My First Exploit | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "My First Exploit" in "_site/2009/03/27/hackers.html" Scenario: Basic site with layout and a page @@ -30,7 +32,8 @@ Feature: Create sites And I have an "index.html" page with layout "default" that contains "Basic Site with Layout" And I have a default layout that contains "Page Layout: {{ content }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Page Layout: Basic Site with Layout" in "_site/index.html" Scenario: Basic site with layout and a post @@ -41,7 +44,8 @@ Feature: Create sites | Wargames | 2009-03-27 | default | The only winning move is not to play. | And I have a default layout that contains "Post Layout: {{ content }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post Layout:

The only winning move is not to play.

" in "_site/2009/03/27/wargames.html" Scenario: Basic site with layout inside a subfolder and a post @@ -52,7 +56,8 @@ Feature: Create sites | Wargames | 2009-03-27 | post/simple | The only winning move is not to play. | And I have a post/simple layout that contains "Post Layout: {{ content }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post Layout:

The only winning move is not to play.

" in "_site/2009/03/27/wargames.html" Scenario: Basic site with layouts, pages, posts and files @@ -75,7 +80,8 @@ Feature: Create sites | entry3 | 2009-05-27 | post | content for entry3. | | entry4 | 2009-06-27 | post | content for entry4. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Page : Site contains 2 pages and 4 posts" in "_site/index.html" And I should see "No replacement \{\{ site.posts.size \}\}" in "_site/about.html" And I should see "" in "_site/another_file" @@ -90,7 +96,8 @@ Feature: Create sites And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}" And I have an "_includes/about.textile" file that contains "Generated by Jekyll" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html" Scenario: Basic site with subdir include tag @@ -99,7 +106,8 @@ Feature: Create sites And I have an info directory And I have an "info/index.html" page that contains "Basic Site with subdir include tag: {% include about.textile %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Basic Site with subdir include tag: Generated by Jekyll" in "_site/info/index.html" Scenario: Basic site with nested include tag @@ -108,7 +116,8 @@ Feature: Create sites And I have an "_includes/jekyll.textile" file that contains "Jekyll" And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html" Scenario: Basic site with internal post linking @@ -120,19 +129,22 @@ Feature: Create sites | entry1 | 2007-12-31 | post | content for entry1. | | entry2 | 2008-01-01 | post | content for entry2. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "URL: /2008/01/01/entry2/" in "_site/index.html" Scenario: Basic site with whitelisted dotfile Given I have an ".htaccess" file that contains "SomeDirective" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "SomeDirective" in "_site/.htaccess" Scenario: File was replaced by a directory Given I have a "test" file that contains "some stuff" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist When I delete the file "test" Given I have a test directory And I have a "test/index.html" file that contains "some other stuff" @@ -146,13 +158,15 @@ Feature: Create sites And I have a "secret.html" page with published "false" that contains "Unpublished page" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the "_site/index.html" file should exist And the "_site/public.html" file should exist But the "_site/secret.html" file should not exist When I run jekyll build --unpublished - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the "_site/index.html" file should exist And the "_site/public.html" file should exist And the "_site/secret.html" file should exist @@ -164,9 +178,11 @@ Feature: Create sites | entry1 | 2020-12-31 | post | content for entry1. | | entry2 | 2007-12-31 | post | content for entry2. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "content for entry2" in "_site/2007/12/31/entry2.html" And the "_site/2020/12/31/entry1.html" file should not exist When I run jekyll build --future - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the "_site/2020/12/31/entry1.html" file should exist diff --git a/features/drafts.feature b/features/drafts.feature index 5d7982ecfc4..5a7f49f39d2 100644 --- a/features/drafts.feature +++ b/features/drafts.feature @@ -10,7 +10,8 @@ Feature: Draft Posts | title | date | layout | content | | Recipe | 2009-03-27 | default | Not baked yet. | When I run jekyll build --drafts - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Not baked yet." in "_site/recipe.html" Scenario: Don't preview a draft @@ -21,7 +22,8 @@ Feature: Draft Posts | title | date | layout | content | | Recipe | 2009-03-27 | default | Not baked yet. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the "_site/recipe.html" file should not exist Scenario: Don't preview a draft that is not published @@ -32,7 +34,8 @@ Feature: Draft Posts | title | date | layout | published | content | | Recipe | 2009-03-27 | default | false | Not baked yet. | When I run jekyll build --drafts - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the "_site/recipe.html" file should not exist Scenario: Use page.path variable @@ -42,5 +45,6 @@ Feature: Draft Posts | title | date | layout | content | | Recipe | 2009-03-27 | simple | Post path: {{ page.path }} | When I run jekyll build --drafts - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post path: _drafts/recipe.markdown" in "_site/recipe.html" diff --git a/features/embed_filters.feature b/features/embed_filters.feature index d6f99fc7655..0f2d0adabd7 100644 --- a/features/embed_filters.feature +++ b/features/embed_filters.feature @@ -11,7 +11,8 @@ Feature: Embed filters | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. | And I have a default layout that contains "{{ site.time | date_to_xmlschema }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see today's date in "_site/2009/03/27/star-wars.html" Scenario: Escape text for XML @@ -22,7 +23,8 @@ Feature: Embed filters | Star & Wars | 2009-03-27 | default | These aren't the droids you're looking for. | And I have a default layout that contains "{{ page.title | xml_escape }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Star & Wars" in "_site/2009/03/27/star-wars.html" Scenario: Calculate number of words @@ -33,7 +35,8 @@ Feature: Embed filters | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. | And I have a default layout that contains "{{ content | number_of_words }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "7" in "_site/2009/03/27/star-wars.html" Scenario: Convert an array into a sentence @@ -44,7 +47,8 @@ Feature: Embed filters | Star Wars | 2009-03-27 | default | [scifi, movies, force] | These aren't the droids you're looking for. | And I have a default layout that contains "{{ page.tags | array_to_sentence_string }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "scifi, movies, and force" in "_site/2009/03/27/star-wars.html" Scenario: Markdownify a given string @@ -55,7 +59,8 @@ Feature: Embed filters | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. | And I have a default layout that contains "By {{ '_Obi-wan_' | markdownify }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "By

Obi-wan

" in "_site/2009/03/27/star-wars.html" Scenario: Sort by an arbitrary variable @@ -68,7 +73,8 @@ Feature: Embed filters | Page-2 | default | 6 | Something | And I have a default layout that contains "{{ site.pages | sort:'value' | map:'title' | join:', ' }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see exactly "Page-2, Page-1" in "_site/page-1.html" And I should see exactly "Page-2, Page-1" in "_site/page-2.html" @@ -85,7 +91,8 @@ Feature: Embed filters | default | Jump | And I have a default layout that contains "{% assign sorted_pages = site.pages | sort: 'title' %}The rule of {{ sorted_pages.size }}: {% for p in sorted_pages %}{{ p.content | strip_html | strip_newlines }}, {% endfor %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see exactly "The rule of 3: Jump, Fly, Run," in "_site/bird.html" Scenario: Sort pages by the title ordering pages without title last @@ -101,5 +108,6 @@ Feature: Embed filters | default | Jump | And I have a default layout that contains "{% assign sorted_pages = site.pages | sort: 'title', 'last' %}The rule of {{ sorted_pages.size }}: {% for p in sorted_pages %}{{ p.content | strip_html | strip_newlines }}, {% endfor %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see exactly "The rule of 3: Fly, Run, Jump," in "_site/bird.html" diff --git a/features/frontmatter_defaults.feature b/features/frontmatter_defaults.feature index a9a64ae2818..31aee377b40 100644 --- a/features/frontmatter_defaults.feature +++ b/features/frontmatter_defaults.feature @@ -12,7 +12,8 @@ Feature: frontmatter defaults And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {layout: "pretty"}}]" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "THIS IS THE LAYOUT:

just some post

" in "_site/2013/09/11/default-layout.html" And I should see "THIS IS THE LAYOUT: just some page" in "_site/index.html" @@ -24,7 +25,8 @@ Feature: frontmatter defaults And I have an "index.html" page that contains "just {{page.custom}} by {{page.author}}" And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {custom: "some special data", author: "Ben"}}]" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "

some special data

\n
Ben
" in "_site/2013/09/11/default-data.html" And I should see "just some special data by Ben" in "_site/index.html" @@ -48,7 +50,8 @@ Feature: frontmatter defaults And I have a configuration file with "defaults" set to "[{scope: {path: "special"}, values: {layout: "subfolder", description: "the special section"}}, {scope: {path: ""}, values: {layout: "root", description: "the webpage"}}]" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "root:

info on the webpage

" in "_site/2013/10/14/about.html" And I should see "subfolder:

info on the special section

" in "_site/special/2013/10/14/about.html" And I should see "root: Overview for the webpage" in "_site/index.html" @@ -71,7 +74,8 @@ Feature: frontmatter defaults And I have a configuration file with "defaults" set to "[{scope: {path: "special"}, values: {layout: "main"}}, {scope: {path: "special/_posts"}, values: {layout: "main"}}, {scope: {path: "_posts"}, values: {layout: "main"}}]" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "main:

content of site/2013/10/14/about.html

" in "_site/2013/10/14/about.html" And I should see "main:

content of site/special/2013/10/14/about1.html

" in "_site/special/2013/10/14/about1.html" And I should see "main:

content of site/special/2013/10/14/about2.html

" in "_site/special/2013/10/14/about2.html" @@ -132,7 +136,8 @@ Feature: frontmatter defaults myval: "Test" """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Value: Test" in "_site/slides/slide1.html" Scenario: Override frontmatter defaults inside a collection @@ -159,7 +164,8 @@ Feature: frontmatter defaults myval: "Test" """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Value: Override" in "_site/slides/slide2.html" Scenario: Deep merge frontmatter defaults diff --git a/features/hooks.feature b/features/hooks.feature index 5252d562160..48b2884e37a 100644 --- a/features/hooks.feature +++ b/features/hooks.feature @@ -24,7 +24,8 @@ Feature: Hooks end """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "mytinypage" in "_site/foo.html" Scenario: Modify the payload before rendering the site @@ -37,7 +38,8 @@ Feature: Hooks end """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "myparam!" in "_site/index.html" Scenario: Modify the site contents after reading @@ -51,7 +53,8 @@ Feature: Hooks end """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the "_site/page1.html" file should not exist And I should see "page2" in "_site/page2.html" @@ -67,7 +70,8 @@ Feature: Hooks """ And I have a "page1.html" page that contains "page1" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "page1" in "_site/firstpage.html" Scenario: Alter a page right after it is initialized @@ -81,7 +85,8 @@ Feature: Hooks """ And I have a "page1.html" page that contains "page1" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "page1" in "_site/renamed.html" Scenario: Alter the payload for one page but not another @@ -138,7 +143,8 @@ Feature: Hooks | title | date | layout | content | | entry1 | 2015-03-14 | nil | {{ page.harold }} | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "pbagrag sbe ragel1." in "_site/2015/03/14/entry1.html" Scenario: Alter the payload for certain posts @@ -268,7 +274,8 @@ Feature: Hooks {{ site.memes.first.text }} """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "all your base are belong to us" in "_site/index.html" Scenario: Update a document after rendering it, but before writing it to disk @@ -294,7 +301,8 @@ Feature: Hooks {{ page.text }} """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "

all your base are belong to us" in "_site/memes/doc1.html" Scenario: Perform an action after every document is written @@ -322,5 +330,6 @@ Feature: Hooks {{ page.text }} """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Wrote document 0" in "_site/document-build.log" diff --git a/features/include_tag.feature b/features/include_tag.feature index 83ae379f8a0..c8ebf717aa6 100644 --- a/features/include_tag.feature +++ b/features/include_tag.feature @@ -19,7 +19,8 @@ Feature: Include tags | Parameter syntax | 2013-04-12 | html | {% include params.html param1_or_2="value" %} | | Pass a variable | 2013-06-22 | html | {% assign var = 'some text' %}{% include params.html local=var title=page.title %} | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "

My awesome blog header: myparam
" in "_site/2013/03/21/include-files.html" And I should not see "myparam" in "_site/2013/03/21/ignore-params-if-unused.html" And I should see "
  • date = today
  • " in "_site/2013/03/21/list-multiple-parameters.html" @@ -44,7 +45,8 @@ Feature: Include tags | 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 build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "a snippet that works with parameters" in "_site/index.html" Scenario: Include a variable file in a loop @@ -53,7 +55,8 @@ Feature: Include tags And I have an "_includes/two.html" file that contains "two" And I have an "index.html" page with files "[one.html, two.html]" that contains "{% for file in page.files %}{% include {{file}} %} {% endfor %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "one two" in "_site/index.html" Scenario: Include a file with variables and filters @@ -64,7 +67,8 @@ Feature: Include tags | include_file | one | And I have an "index.html" page that contains "{% include {{ site.include_file | append: '.html' }} %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "one included" in "_site/index.html" Scenario: Include a file with partial variables @@ -75,7 +79,8 @@ Feature: Include tags | include_file | one | And I have an "index.html" page that contains "{% include {{ site.include_file }}.html %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "one included" in "_site/index.html" Scenario: Include a file and rebuild when include content is changed @@ -83,7 +88,8 @@ Feature: Include tags And I have an "_includes/one.html" file that contains "include" And I have an "index.html" page that contains "{% include one.html %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "include" in "_site/index.html" When I wait 1 second Then I have an "_includes/one.html" file that contains "include content changed" @@ -95,5 +101,6 @@ Feature: Include tags And I have an "_includes/header-en.html" file that contains "include" And I have an "index.html" page that contains "{% assign name = 'header' %}{% assign locale = 'en' %}{% include {{name}}-{{locale}}.html %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "include" in "_site/index.html" diff --git a/features/incremental_rebuild.feature b/features/incremental_rebuild.feature index fb95e0c5421..128f5800456 100644 --- a/features/incremental_rebuild.feature +++ b/features/incremental_rebuild.feature @@ -11,10 +11,12 @@ Feature: Incremental rebuild | Wargames | 2009-03-27 | default | The only winning move is not to play. | And I have a default layout that contains "Post Layout: {{ content }}" When I run jekyll build -I - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post Layout:

    The only winning move is not to play.

    " in "_site/2009/03/27/wargames.html" When I run jekyll build -I - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post Layout:

    The only winning move is not to play.

    " in "_site/2009/03/27/wargames.html" Scenario: Generate a metadata file @@ -25,12 +27,14 @@ Feature: Incremental rebuild Scenario: Rebuild when content is changed Given I have an "index.html" file that contains "Basic Site" When I run jekyll build -I - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Basic Site" in "_site/index.html" When I wait 1 second Then I have an "index.html" file that contains "Bacon Site" When I run jekyll build -I - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Bacon Site" in "_site/index.html" Scenario: Rebuild when layout is changed @@ -38,12 +42,14 @@ Feature: Incremental rebuild And I have an "index.html" page with layout "default" that contains "Basic Site with Layout" And I have a default layout that contains "Page Layout: {{ content }}" When I run jekyll build -I - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Page Layout: Basic Site with Layout" in "_site/index.html" When I wait 1 second Then I have a default layout that contains "Page Layout Changed: {{ content }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Page Layout Changed: Basic Site with Layout" in "_site/index.html" Scenario: Rebuild when an include is changed @@ -51,10 +57,12 @@ Feature: Incremental rebuild And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}" And I have an "_includes/about.textile" file that contains "Generated by Jekyll" When I run jekyll build -I - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html" When I wait 1 second Then I have an "_includes/about.textile" file that contains "Regenerated by Jekyll" When I run jekyll build -I - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Basic Site with include tag: Regenerated by Jekyll" in "_site/index.html" diff --git a/features/markdown.feature b/features/markdown.feature index c0eeb25d3f4..3649a6d1013 100644 --- a/features/markdown.feature +++ b/features/markdown.feature @@ -11,7 +11,8 @@ Feature: Markdown | title | date | content | type | | Hackers | 2009-03-27 | # My Title | markdown | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Index" in "_site/index.html" And I should see "

    My Title

    " in "_site/2009/03/27/hackers.html" And I should see "

    My Title

    " in "_site/index.html" @@ -27,6 +28,7 @@ Feature: Markdown | title | date | content | type | | Hackers | 2009-03-27 | # My Title | markdown | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Index" in "_site/index.html" And I should see "

    My Title

    " in "_site/index.html" diff --git a/features/permalinks.feature b/features/permalinks.feature index 5e1db21d5a7..ca0482fce90 100644 --- a/features/permalinks.feature +++ b/features/permalinks.feature @@ -10,7 +10,8 @@ Feature: Fancy permalinks | None Permalink Schema | 2009-03-27 | Totally nothing. | And I have a configuration file with "permalink" set to "none" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally nothing." in "_site/none-permalink-schema.html" Scenario: Use pretty permalink schema @@ -20,7 +21,8 @@ Feature: Fancy permalinks | Pretty Permalink Schema | 2009-03-27 | Totally wordpress. | And I have a configuration file with "permalink" set to "pretty" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally wordpress." in "_site/2009/03/27/pretty-permalink-schema/index.html" Scenario: Use pretty permalink schema for pages @@ -29,7 +31,8 @@ Feature: Fancy permalinks And I have an "sitemap.xml" page that contains "Totally uhm, sitemap" And I have a configuration file with "permalink" set to "pretty" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally index" in "_site/index.html" And I should see "Totally awesome" in "_site/awesome/index.html" And I should see "Totally uhm, sitemap" in "_site/sitemap.xml" @@ -41,7 +44,8 @@ Feature: Fancy permalinks | Custom Permalink Schema | stuff | 2009-03-27 | Totally custom. | And I have a configuration file with "permalink" set to "/blog/:year/:month/:day/:title/" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally custom." in "_site/blog/2009/03/27/custom-permalink-schema/index.html" Scenario: Use custom permalink schema with category @@ -51,7 +55,8 @@ Feature: Fancy permalinks | Custom Permalink Schema | stuff | 2009-03-27 | Totally custom. | And I have a configuration file with "permalink" set to "/:categories/:title.html" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally custom." in "_site/stuff/custom-permalink-schema.html" Scenario: Use custom permalink schema with squished date @@ -61,7 +66,8 @@ Feature: Fancy permalinks | Custom Permalink Schema | stuff | 2009-03-27 | Totally custom. | And I have a configuration file with "permalink" set to "/:month-:day-:year/:title.html" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally custom." in "_site/03-27-2009/custom-permalink-schema.html" Scenario: Use custom permalink schema with date and time @@ -74,7 +80,8 @@ Feature: Fancy permalinks | permalink | "/:year:month:day:hour:minute:second.html" | | timezone | UTC | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally custom." in "_site/20090327223107.html" Scenario: Use per-post permalink @@ -83,7 +90,8 @@ Feature: Fancy permalinks | title | date | permalink | content | | Some post | 2013-04-14 | /custom/posts/1/ | bla bla | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the _site/custom/posts/1 directory should exist And I should see "bla bla" in "_site/custom/posts/1/index.html" @@ -93,7 +101,8 @@ Feature: Fancy permalinks | title | date | permalink | content | | Some post | 2013-04-14 | /custom/posts/some.html | bla bla | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the _site/custom/posts directory should exist And I should see "bla bla" in "_site/custom/posts/some.html" @@ -102,7 +111,8 @@ Feature: Fancy permalinks And I have an "_posts/2009-03-27-Pretty-Permalink-Schema.md" page that contains "Totally wordpress" And I have a configuration file with "permalink" set to "pretty" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally wordpress." in "_site/2009/03/27/Pretty-Permalink-Schema/index.html" Scenario: Use custom permalink schema with cased file name @@ -110,7 +120,8 @@ Feature: Fancy permalinks And I have an "_posts/2009-03-27-Custom-Schema.md" page with title "Custom Schema" that contains "Totally awesome" And I have a configuration file with "permalink" set to "/:year/:month/:day/:slug/" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally awesome" in "_site/2009/03/27/custom-schema/index.html" Scenario: Use pretty permalink schema with title containing underscore @@ -118,7 +129,8 @@ Feature: Fancy permalinks And I have an "_posts/2009-03-27-Custom_Schema.md" page with title "Custom Schema" that contains "Totally awesome" And I have a configuration file with "permalink" set to "pretty" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Totally awesome" in "_site/2009/03/27/Custom_Schema/index.html" Scenario: Use a non-HTML file extension in the permalink diff --git a/features/plugins.feature b/features/plugins.feature index a36c6c82d1a..be01a4a918e 100644 --- a/features/plugins.feature +++ b/features/plugins.feature @@ -6,7 +6,8 @@ Feature: Configuring and using plugins Given I have an "index.html" file that contains "Whatever" And I have a configuration file with "gems" set to "[jekyll_test_plugin]" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Whatever" in "_site/index.html" And I should see "this is a test" in "_site/test.txt" @@ -17,7 +18,8 @@ Feature: Configuring and using plugins | gems | [jekyll_test_plugin] | | whitelist | [] | When I run jekyll build --safe - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Whatever" in "_site/index.html" And the "_site/test.txt" file should not exist @@ -28,7 +30,8 @@ Feature: Configuring and using plugins | gems | [jekyll_test_plugin, jekyll_test_plugin_malicious] | | whitelist | [jekyll_test_plugin] | When I run jekyll build --safe - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Whatever" in "_site/index.html" And the "_site/test.txt" file should exist And I should see "this is a test" in "_site/test.txt" diff --git a/features/post_data.feature b/features/post_data.feature index 2792a829f93..3b4f3cf7ead 100644 --- a/features/post_data.feature +++ b/features/post_data.feature @@ -11,7 +11,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post title: {{ page.title }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post title: Star Wars" in "_site/2009/03/27/star-wars.html" Scenario: Use post.url variable @@ -22,7 +23,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post url: {{ page.url }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post url: /2009/03/27/star-wars.html" in "_site/2009/03/27/star-wars.html" Scenario: Use post.date variable @@ -33,7 +35,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post date: {{ page.date | date_to_string }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post date: 27 Mar 2009" in "_site/2009/03/27/star-wars.html" Scenario: Use post.id variable @@ -44,7 +47,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post id: {{ page.id }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post id: /2009/03/27/star-wars" in "_site/2009/03/27/star-wars.html" Scenario: Use post.content variable @@ -55,7 +59,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post content: {{ content }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post content:

    Luke, I am your father.

    " in "_site/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in a folder @@ -67,7 +72,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in a folder and has category in YAML @@ -79,7 +85,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | film | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post category: movies" in "_site/movies/film/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in a folder and has categories in YAML @@ -91,7 +98,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | [film, scifi] | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post category: movies" in "_site/movies/film/scifi/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in a folder and duplicated category is in YAML @@ -103,7 +111,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | movies | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html" Scenario: Use post.tags variable @@ -114,7 +123,8 @@ Feature: Post data | Star Wars | 2009-05-18 | simple | twist | Luke, I am your father. | And I have a simple layout that contains "Post tags: {{ page.tags }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post tags: twist" in "_site/2009/05/18/star-wars.html" Scenario: Use post.categories variable when categories are in folders @@ -127,7 +137,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html" Scenario: Use post.categories variable when categories are in folders with mixed case @@ -140,7 +151,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post categories: scifi and Movies" in "_site/scifi/movies/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in YAML @@ -151,7 +163,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | movies | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in YAML and is mixed-case @@ -162,7 +175,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Movies | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post category: Movies" in "_site/movies/2009/03/27/star-wars.html" Scenario: Use post.categories variable when categories are in YAML @@ -173,7 +187,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | ['scifi', 'movies'] | Luke, I am your father. | And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html" Scenario: Use post.categories variable when categories are in YAML and are duplicated @@ -184,7 +199,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | ['movies', 'movies'] | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html" Scenario: Superdirectories of _posts applied to post.categories @@ -193,7 +209,8 @@ Feature: Post data And I have a _layouts directory And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html" Scenario: Subdirectories of _posts not applied to post.categories @@ -202,7 +219,8 @@ Feature: Post data And I have a _layouts directory And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html" Scenario: Use post.categories variable when categories are in YAML with mixed case @@ -214,7 +232,8 @@ Feature: Post data | Star Trek | 2013-03-17 | simple | ['SciFi', 'movies'] | Jean Luc, I am your father. | And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post categories: scifi and Movies" in "_site/scifi/movies/2009/03/27/star-wars.html" And I should see "Post categories: SciFi and movies" in "_site/scifi/movies/2013/03/17/star-trek.html" @@ -224,7 +243,8 @@ Feature: Post data | title | type | date | content | | my-post | html | 2013-04-12 | Source path: {{ page.path }} | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Source path: _posts/2013-04-12-my-post.html" in "_site/
    /2013/04/12/my-post.html" Examples: @@ -239,7 +259,8 @@ Feature: Post data | title | date | path | content | | override | 2013-04-12 | override-path.html | Non-custom path: {{ page.path }} | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Non-custom path: _posts/2013-04-12-override.markdown" in "_site/2013/04/12/override.html" Scenario: Disable a post from being published @@ -249,7 +270,8 @@ Feature: Post data | title | date | layout | published | content | | Star Wars | 2009-03-27 | simple | false | Luke, I am your father. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the "_site/2009/03/27/star-wars.html" file should not exist And I should see "Published!" in "_site/index.html" @@ -261,7 +283,8 @@ Feature: Post data | Star Wars | 2009-03-27 | simple | Darth Vader | Luke, I am your father. | And I have a simple layout that contains "Post author: {{ page.author }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Post author: Darth Vader" in "_site/2009/03/27/star-wars.html" Scenario: Previous and next posts title @@ -274,6 +297,7 @@ Feature: Post data | Terminator | 2009-05-27 | ordered | Arnold | Sayonara, baby | And I have a ordered layout that contains "Previous post: {{ page.previous.title }} and next post: {{ page.next.title }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "next post: Some like it hot" in "_site/2009/03/27/star-wars.html" And I should see "Previous post: Some like it hot" in "_site/2009/05/27/terminator.html" diff --git a/features/post_excerpts.feature b/features/post_excerpts.feature index c66c527bb6c..7344000c2b2 100644 --- a/features/post_excerpts.feature +++ b/features/post_excerpts.feature @@ -12,7 +12,8 @@ Feature: Post excerpts | title | date | layout | content | | entry1 | 2007-12-31 | post | content for entry1. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see exactly "

    content for entry1.

    " in "_site/index.html" Scenario: An excerpt from a post with a layout @@ -24,7 +25,8 @@ Feature: Post excerpts | title | date | layout | content | | entry1 | 2007-12-31 | post | content for entry1. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the _site/2007 directory should exist And the _site/2007/12 directory should exist And the _site/2007/12/31 directory should exist @@ -41,7 +43,8 @@ Feature: Post excerpts | title | date | layout | content | | entry1 | 2007-12-31 | post | content for entry1. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the _site/2007 directory should exist And the _site/2007/12 directory should exist And the _site/2007/12/31 directory should exist diff --git a/features/rendering.feature b/features/rendering.feature index 01507cb0b1c..5031ef06d8d 100644 --- a/features/rendering.feature +++ b/features/rendering.feature @@ -16,7 +16,8 @@ Feature: Rendering Given I have a "index.html" page with layout "simple" that contains "Hi there, Jekyll {{ jekyll.environment }}!" And I have a simple layout that contains "{{ content }}Ahoy, indeed!" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Hi there, Jekyll development!\nAhoy, indeed" in "_site/index.html" Scenario: Don't place asset files in layout @@ -25,7 +26,8 @@ Feature: Rendering And I have a configuration file with "gems" set to "[jekyll-coffeescript]" And I have a simple layout that contains "{{ content }}Ahoy, indeed!" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should not see "Ahoy, indeed!" in "_site/index.css" And I should not see "Ahoy, indeed!" in "_site/index.js" @@ -33,18 +35,21 @@ Feature: Rendering Given I have an "index.scss" page that contains ".foo-bar { color:{{site.color}}; }" And I have a configuration file with "color" set to "red" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see ".foo-bar {\n color: red; }" in "_site/index.css" Scenario: Not render liquid in CoffeeScript without explicitly including jekyll-coffeescript Given I have an "index.coffee" page with animal "cicada" that contains "hey='for {{page.animal}}'" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the "_site/index.js" file should not exist Scenario: Render liquid in CoffeeScript with jekyll-coffeescript enabled Given I have an "index.coffee" page with animal "cicada" that contains "hey='for {{page.animal}}'" And I have a configuration file with "gems" set to "[jekyll-coffeescript]" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "hey = 'for cicada';" in "_site/index.js" diff --git a/features/site_configuration.feature b/features/site_configuration.feature index 379cea4f214..5c495356a61 100644 --- a/features/site_configuration.feature +++ b/features/site_configuration.feature @@ -8,7 +8,8 @@ Feature: Site configuration And I have an "_sourcedir/index.html" file that contains "Changing source directory" And I have a configuration file with "source" set to "_sourcedir" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Changing source directory" in "_site/index.html" Scenario: Change destination directory @@ -66,27 +67,31 @@ Feature: Site configuration Given I have an "index.markdown" page that contains "[Google](http://google.com)" And I have a configuration file with "markdown" set to "rdiscount" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Google" in "_site/index.html" Scenario: Use Kramdown for markup Given I have an "index.markdown" page that contains "[Google](http://google.com)" And I have a configuration file with "markdown" set to "kramdown" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Google" in "_site/index.html" Scenario: Use Redcarpet for markup Given I have an "index.markdown" page that contains "[Google](http://google.com)" And I have a configuration file with "markdown" set to "redcarpet" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Google" in "_site/index.html" Scenario: Highlight code with pygments Given I have an "index.html" page that contains "{% highlight ruby %} puts 'Hello world!' {% endhighlight %}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Hello world!" in "_site/index.html" And I should see "class=\"highlight\"" in "_site/index.html" @@ -94,7 +99,8 @@ Feature: Site configuration Given I have an "index.html" page that contains "{% highlight ruby %} puts 'Hello world!' {% endhighlight %}" And I have a configuration file with "highlighter" set to "rouge" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Hello world!" in "_site/index.html" And I should see "class=\"highlight\"" in "_site/index.html" @@ -122,7 +128,8 @@ Feature: Site configuration | entry1 | 2007-12-31 | post | content for entry1. | | entry2 | 2020-01-31 | post | content for entry2. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Page Layout: 1 on 2010-01-01" in "_site/index.html" And I should see "Post Layout:

    content for entry1.

    " in "_site/2007/12/31/entry1.html" And the "_site/2020/01/31/entry2.html" file should not exist @@ -142,7 +149,8 @@ Feature: Site configuration | entry1 | 2007-12-31 | post | content for entry1. | | entry2 | 2020-01-31 | post | content for entry2. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html" And I should see "Post Layout:

    content for entry1.

    " in "_site/2007/12/31/entry1.html" And I should see "Post Layout:

    content for entry2.

    " in "_site/2020/01/31/entry2.html" @@ -161,7 +169,8 @@ Feature: Site configuration | entry1 | 2013-04-09 23:22 -0400 | post | content for entry1. | | entry2 | 2013-04-10 03:14 -0400 | post | content for entry2. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Page Layout: 2" in "_site/index.html" And I should see "Post Layout:

    content for entry1.

    \n built at 2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html" And I should see "Post Layout:

    content for entry2.

    \n built at 2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html" @@ -180,7 +189,8 @@ Feature: Site configuration | entry1 | 2013-04-09 23:22 +0400 | post | content for entry1. | | entry2 | 2013-04-10 03:14 +0400 | post | content for entry2. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Page Layout: 2" in "_site/index.html" And the "_site/2013/04/09/entry1.html" file should exist And the "_site/2013/04/09/entry2.html" file should exist @@ -198,7 +208,8 @@ Feature: Site configuration | Oranges | 2009-04-01 | An article about oranges | | Bananas | 2009-04-05 | An article about bananas | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And the "_site/2009/04/05/bananas.html" file should exist And the "_site/2009/04/01/oranges.html" file should exist And the "_site/2009/03/27/apples.html" file should not exist @@ -211,7 +222,8 @@ Feature: Site configuration | .gitignore | | .foo | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see ".DS_Store" in "_site/.gitignore" And the "_site/.htaccess" file should not exist @@ -231,7 +243,8 @@ Feature: Site configuration | entry1 | 2007-12-31 | post | content for entry1. | | entry2 | 2020-01-31 | post | content for entry2. | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html" And I should see "Post Layout:

    content for entry1.

    " in "_site/2007/12/31/entry1.html" And I should see "Post Layout:

    content for entry2.

    " in "_site/2020/01/31/entry2.html" @@ -240,6 +253,7 @@ Feature: Site configuration Given I have an "index.html" page with layout "page" that contains "FOO" And I have a "_config.yml" file that contains "layouts: '../../../../../../../../../../../../../../usr/include'" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "FOO" in "_site/index.html" And I should not see " " in "_site/index.html" diff --git a/features/site_data.feature b/features/site_data.feature index a7fadf34d17..e3c99a64154 100644 --- a/features/site_data.feature +++ b/features/site_data.feature @@ -6,14 +6,16 @@ Feature: Site data Scenario: Use page variable in a page Given I have an "contact.html" page with title "Contact" that contains "{{ page.title }}: email@example.com" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Contact: email@example.com" in "_site/contact.html" Scenario Outline: Use page.path variable in a page Given I have a
    directory And I have a "" page that contains "Source path: {{ page.path }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Source path: " in "_site/" Examples: @@ -25,13 +27,15 @@ Feature: Site data Scenario: Override page.path Given I have an "override.html" page with path "custom-override.html" that contains "Custom path: {{ page.path }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Custom path: custom-override.html" in "_site/override.html" Scenario: Use site.time variable Given I have an "index.html" page that contains "{{ site.time }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see today's time in "_site/index.html" Scenario: Use site.posts variable for latest post @@ -43,7 +47,8 @@ Feature: Site data | Second Post | 2009-03-26 | My Second Post | | Third Post | 2009-03-27 | My Third Post | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Third Post: /2009/03/27/third-post.html" in "_site/index.html" Scenario: Use site.posts variable in a loop @@ -55,7 +60,8 @@ Feature: Site data | Second Post | 2009-03-26 | My Second Post | | Third Post | 2009-03-27 | My Third Post | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Third Post Second Post First Post" in "_site/index.html" Scenario: Use site.categories.code variable @@ -66,7 +72,8 @@ Feature: Site data | Awesome Hack | 2009-03-26 | code | puts 'Hello World' | | Delicious Beer | 2009-03-26 | food | 1) Yuengling | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Awesome Hack" in "_site/index.html" Scenario: Use site.tags variable @@ -76,7 +83,8 @@ Feature: Site data | title | date | tag | content | | Delicious Beer | 2009-03-26 | beer | 1) Yuengling | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Yuengling" in "_site/index.html" Scenario: Order Posts by name when on the same date @@ -90,18 +98,21 @@ Feature: Site data | C | 2009-03-26 | C | | last | 2009-04-26 | last | When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "last:C, C:B,last B:A,C A:first,B first:,A" in "_site/index.html" Scenario: Use configuration date in site payload Given I have an "index.html" page that contains "{{ site.url }}" And I have a configuration file with "url" set to "http://example.com" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "http://example.com" in "_site/index.html" Scenario: Access Jekyll version via jekyll.version Given I have an "index.html" page that contains "{{ jekyll.version }}" When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "\d+\.\d+\.\d+" in "_site/index.html" From ae3a71ed0d82809b6e27cb50b01fa4815cdd0344 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 11:53:07 -0800 Subject: [PATCH 0305/4996] features: config writing should decode value from string to ruby --- features/step_definitions.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 71a92aea15a..151009a618d 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -98,7 +98,7 @@ else {} end - config[key] = value + config[key] = YAML.load(value) File.write("_config.yml", YAML.dump(config)) end From 0a6f289ba5e7e59421194b4de36ec36ca6399574 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 11:53:16 -0800 Subject: [PATCH 0306/4996] page: write? should always be true --- lib/jekyll/page.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 0a93aa08ec8..fde456513d8 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -166,5 +166,9 @@ def index? def trigger_hooks(hook_name, *args) Jekyll::Hooks.trigger :pages, hook_name, self, *args end + + def write? + true + end end end From 66dc083ad05c3b383fbb7a6d0a408957fccf46b0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 12:47:36 -0800 Subject: [PATCH 0307/4996] Renderer: set paginator --- lib/jekyll/renderer.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index b4afa03cc71..539c4de8e42 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -48,10 +48,18 @@ def run payload["page"] = document.to_liquid + if document.respond_to? :pager + payload["paginator"] = document.pager.to_liquid + end + if document.is_a?(Document) && document.collection.label == 'posts' payload['site']['related_posts'] = document.related_posts end + # render and transform content (this becomes the final content of the object) + payload['highlighter_prefix'] = converters.first.highlighter_prefix + payload['highlighter_suffix'] = converters.first.highlighter_suffix + Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path document.trigger_hooks(:pre_render, payload) @@ -60,10 +68,6 @@ def run :registers => { :site => site, :page => payload['page'] } } - # render and transform content (this becomes the final content of the object) - payload['highlighter_prefix'] = converters.first.highlighter_prefix - payload['highlighter_suffix'] = converters.first.highlighter_suffix - output = document.content if document.render_with_liquid? From e5d8bdee8fe570d1f6a055fec852af9e39ef6cc7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 12:47:48 -0800 Subject: [PATCH 0308/4996] Page: freeze true in write? --- lib/jekyll/page.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index fde456513d8..3760410be3d 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -168,7 +168,7 @@ def trigger_hooks(hook_name, *args) end def write? - true + true.freeze end end end From 1d369aada31e64ad4ffff2ac2ac71c86b117d9dd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 12:48:12 -0800 Subject: [PATCH 0309/4996] features: some under-the-hood enhancements --- features/step_definitions.rb | 6 ++---- features/support/helpers.rb | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 151009a618d..a6790a15c94 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -105,10 +105,8 @@ # Given %r{^I have a configuration file with:$} do |table| - File.open("_config.yml", "w") do |f| - table.hashes.each do |row| - f.write("#{row["key"]}: #{row["value"]}\n") - end + table.hashes.each do |row| + step %(I have a configuration file with "#{row["key"]}" set to "#{row["value"]}") end end diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 83010b9e97d..d65695cedab 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -2,6 +2,7 @@ require "jekyll/utils" require "open3" require "time" +require "safe_yaml/load" class Paths SOURCE_DIR = Pathname.new(File.expand_path("../..", __dir__)) From cc6e49a3890d7a723c217578055a6f6d607b3a7a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 13:41:41 -0800 Subject: [PATCH 0310/4996] features/embed_filters: reformat a little --- features/embed_filters.feature | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/features/embed_filters.feature b/features/embed_filters.feature index 0f2d0adabd7..e3802fe55da 100644 --- a/features/embed_filters.feature +++ b/features/embed_filters.feature @@ -80,15 +80,13 @@ Feature: Embed filters Scenario: Sort pages by the title Given I have a _layouts directory + And I have the following pages: + | title | layout | content | + | Dog | default | Run | + | Bird | default | Fly | And I have the following page: - | title | layout | content | - | Dog | default | Run | - And I have the following page: - | title | layout | content | - | Bird | default | Fly | - And I have the following page: - | layout | content | - | default | Jump | + | layout | content | + | default | Jump | And I have a default layout that contains "{% assign sorted_pages = site.pages | sort: 'title' %}The rule of {{ sorted_pages.size }}: {% for p in sorted_pages %}{{ p.content | strip_html | strip_newlines }}, {% endfor %}" When I run jekyll build Then I should get a zero exit status @@ -97,15 +95,13 @@ Feature: Embed filters Scenario: Sort pages by the title ordering pages without title last Given I have a _layouts directory + And I have the following pages: + | title | layout | content | + | Dog | default | Run | + | Bird | default | Fly | And I have the following page: - | title | layout | content | - | Dog | default | Run | - And I have the following page: - | title | layout | content | - | Bird | default | Fly | - And I have the following page: - | layout | content | - | default | Jump | + | layout | content | + | default | Jump | And I have a default layout that contains "{% assign sorted_pages = site.pages | sort: 'title', 'last' %}The rule of {{ sorted_pages.size }}: {% for p in sorted_pages %}{{ p.content | strip_html | strip_newlines }}, {% endfor %}" When I run jekyll build Then I should get a zero exit status From 2554281188dd8ab9cb6864dfd27ef209400cc0a8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 13:41:49 -0800 Subject: [PATCH 0311/4996] document#merge_data!: reformat --- lib/jekyll/document.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 911cb4e6750..2911c4aa04b 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -59,7 +59,10 @@ def merge_data!(other) end Utils.deep_merge_hashes!(data, other) if data.key?('date') && !data['date'].is_a?(Time) - data['date'] = Utils.parse_date(data['date'].to_s, "Document '#{relative_path}' does not have a valid date in the YAML front matter.") + data['date'] = Utils.parse_date( + data['date'].to_s, + "Document '#{relative_path}' does not have a valid date in the YAML front matter." + ) end data end From 5cf5ce979f41ab0e8534171e315392d1f8b90cff Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 13:42:03 -0800 Subject: [PATCH 0312/4996] test: add assert_exist and refute_exist --- test/helper.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/helper.rb b/test/helper.rb index 936638d230f..78b1f78b375 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -42,6 +42,22 @@ def jruby? ) ] +module Minitest::Assertions + def assert_exist(filename, msg = nil) + msg = message(msg) { + "Expected '#{filename}' to exist" + } + assert File.exist?(filename), msg + end + + def refute_exist(filename, msg = nil) + msg = message(msg) { + "Expected '#{filename}' not to exist" + } + refute File.exist?(filename), msg + end +end + class JekyllUnitTest < Minitest::Test include ::RSpec::Mocks::ExampleMethods From 2de5bacb418441a508f42101e2c83b3179269970 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 13:45:17 -0800 Subject: [PATCH 0313/4996] pages' permalink' extnames must be respected MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts a bit of the work @willnorris had made to support extensionless permalinks. Using the ‘permalink’ front matter will no longer work as it must allow non-html extensions to be written. --- test/source/+/foo.md | 2 +- test/source/deal.with.dots.html | 1 - test/test_page.rb | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/test/source/+/foo.md b/test/source/+/foo.md index 30f9535f3a9..bd2d1482285 100644 --- a/test/source/+/foo.md +++ b/test/source/+/foo.md @@ -1,7 +1,7 @@ --- layout: default title : Page inside + -permalink: /+/plus+in+url +permalink: /+/plus+in+url.html --- Line 1 {{ page.title }} diff --git a/test/source/deal.with.dots.html b/test/source/deal.with.dots.html index 6c87d806207..fb3d473460f 100644 --- a/test/source/deal.with.dots.html +++ b/test/source/deal.with.dots.html @@ -1,6 +1,5 @@ --- title: Deal with dots -permalink: /deal.with.dots --- Let's test if jekyll deals properly with dots. diff --git a/test/test_page.rb b/test/test_page.rb index 904f5bd5d78..938f2fc8871 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -69,7 +69,6 @@ def do_render(page) @dest_file = dest_dir("deal.with.dots.html") assert_equal "deal.with.dots", @page.basename - assert_equal "/deal.with.dots", @page.url assert_equal @dest_file, @page.destination(dest_dir) end From 275d56a0fed0ce6340e9b984b551da07867a2ef4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 13:45:36 -0800 Subject: [PATCH 0314/4996] test: use {assert,refute}_exist everywhere --- test/test_cleaner.rb | 18 +++++++++--------- test/test_coffeescript.rb | 2 +- test/test_generated_site.rb | 23 +++++++++++++++-------- test/test_new_command.rb | 8 ++++---- test/test_page.rb | 30 +++++++++++++++--------------- test/test_regenerator.rb | 2 +- test/test_site.rb | 26 +++++++++++++------------- 7 files changed, 58 insertions(+), 51 deletions(-) diff --git a/test/test_cleaner.rb b/test/test_cleaner.rb index 819dbf5cd21..43d99503a51 100644 --- a/test/test_cleaner.rb +++ b/test/test_cleaner.rb @@ -21,19 +21,19 @@ class TestCleaner < JekyllUnitTest end should "keep the parent directory" do - assert File.exist?(dest_dir('to_keep')) + assert_exist dest_dir('to_keep') end should "keep the child directory" do - assert File.exist?(dest_dir('to_keep/child_dir')) + assert_exist dest_dir('to_keep', 'child_dir') end should "keep the file in the directory in keep_files" do - assert File.exist?(File.join(dest_dir('to_keep/child_dir'), 'index.html')) + assert_exist dest_dir('to_keep', 'child_dir', 'index.html') end should "delete the file in the directory not in keep_files" do - assert !File.exist?(File.join(dest_dir('to_keep'), 'index.html')) + refute_exist dest_dir('to_keep', 'index.html') end end @@ -41,8 +41,8 @@ class TestCleaner < JekyllUnitTest setup do clear_dest - FileUtils.mkdir_p(source_dir('no_files_inside/child_dir')) - FileUtils.touch(File.join(source_dir('no_files_inside/child_dir'), 'index.html')) + FileUtils.mkdir_p(source_dir('no_files_inside', 'child_dir')) + FileUtils.touch(source_dir('no_files_inside', 'child_dir', 'index.html')) @site = fixture_site @site.process @@ -57,15 +57,15 @@ class TestCleaner < JekyllUnitTest end should "keep the parent directory" do - assert File.exist?(dest_dir('no_files_inside')) + assert_exist dest_dir('no_files_inside') end should "keep the child directory" do - assert File.exist?(dest_dir('no_files_inside/child_dir')) + assert_exist dest_dir('no_files_inside', 'child_dir') end should "keep the file" do - assert File.exist?(File.join(dest_dir('no_files_inside/child_dir'), 'index.html')) + assert_exist source_dir('no_files_inside', 'child_dir', 'index.html') end end end diff --git a/test/test_coffeescript.rb b/test/test_coffeescript.rb index 68e19a52ae5..09c9b0a87a0 100644 --- a/test/test_coffeescript.rb +++ b/test/test_coffeescript.rb @@ -37,7 +37,7 @@ class TestCoffeeScript < JekyllUnitTest end should "write a JS file in place" do - assert File.exist?(@test_coffeescript_file), "Can't find the converted CoffeeScript file in the dest_dir." + assert_exist @test_coffeescript_file, "Can't find the converted CoffeeScript file in the dest_dir." end should "produce JS" do diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 39a8b3d9669..400ec4d784a 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -31,17 +31,17 @@ class TestGeneratedSite < JekyllUnitTest end should "hide unpublished page" do - assert !File.exist?(dest_dir('/unpublished.html')) + refute_exist dest_dir('/unpublished.html') end should "not copy _posts directory" do - assert !File.exist?(dest_dir('_posts')) + refute_exist dest_dir('_posts') end should "process other static files and generate correct permalinks" do - assert File.exist?(dest_dir('/about/index.html')), "about/index.html should exist" - assert File.exist?(dest_dir('/contacts.html')), "contacts.html should exist" - assert File.exist?(dest_dir('/dynamic_file.php')), "dynamic_file.php should exist" + assert_exist dest_dir('about', 'index.html'), "about/index.html should exist" + assert_exist dest_dir('contacts.html'), "contacts.html should exist" + assert_exist dest_dir('dynamic_file.php'), "dynamic_file.php should exist" end should "print a nice list of static files" do @@ -72,15 +72,22 @@ class TestGeneratedSite < JekyllUnitTest should "ensure limit posts is 0 or more" do assert_raises ArgumentError do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => -1}) - + config = Jekyll::Configuration::DEFAULTS.merge({ + 'source' => source_dir, + 'destination' => dest_dir, + 'limit_posts' => -1 + }) @site = fixture_site(config) end end should "acceptable limit post is 0" do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => 0}) + config = Jekyll::Configuration::DEFAULTS.merge({ + 'source' => source_dir, + 'destination' => dest_dir, + 'limit_posts' => 0 + }) assert Site.new(config), "Couldn't create a site with the given limit_posts." end diff --git a/test/test_new_command.rb b/test/test_new_command.rb index 33bd1044262..f0d2a389f99 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -24,9 +24,9 @@ def site_template end should 'create a new directory' do - assert !File.exist?(@full_path) + refute_exist @full_path Jekyll::Commands::New.process(@args) - assert File.exist?(@full_path) + assert_exist @full_path end should 'display a success message' do @@ -96,9 +96,9 @@ def site_template end should 'create a new directory' do - assert !File.exist?(@site_name_with_spaces) + refute_exist @site_name_with_spaces capture_stdout { Jekyll::Commands::New.process(@multiple_args) } - assert File.exist?(@site_name_with_spaces) + assert_exist @site_name_with_spaces end end diff --git a/test/test_page.rb b/test/test_page.rb index 938f2fc8871..2728b4e3337 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -213,7 +213,7 @@ def do_render(page) do_render(page) page.write(dest_dir) - assert !File.exist?(unexpected) + refute_exist unexpected end end @@ -238,7 +238,7 @@ def do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'contacts.html')) + assert_exist dest_dir('contacts.html') end should "write even when the folder name is plus and permalink has +" do @@ -246,8 +246,8 @@ def do_render(page) do_render(page) page.write(dest_dir) - assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, '+', 'plus+in+url.html')) + assert File.directory?(dest_dir), "#{dest_dir} should be a directory" + assert_exist dest_dir('+', 'plus+in+url.html') end should "write even when permalink has '%# +'" do @@ -256,7 +256,7 @@ def do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, '+', '%# +.html')) + assert_exist dest_dir('+', '%# +.html') end should "write properly without html extension" do @@ -266,7 +266,7 @@ def do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'contacts', 'index.html')) + assert_exist dest_dir('contacts', 'index.html') end should "support .htm extension and respects that" do @@ -276,7 +276,7 @@ def do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'contacts', 'index.htm')) + assert_exist dest_dir('contacts', 'index.htm') end should "support .xhtml extension and respects that" do @@ -286,7 +286,7 @@ def do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'contacts', 'index.xhtml')) + assert_exist dest_dir('contacts', 'index.xhtml') end should "write properly with extension different from html" do @@ -295,10 +295,10 @@ def do_render(page) do_render(page) page.write(dest_dir) - assert_equal("/sitemap.xml", page.url) - assert_nil(page.url[/\.html$/]) + assert_equal "/sitemap.xml", page.url + assert_nil page.url[/\.html$/] assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir,'sitemap.xml')) + assert_exist dest_dir('sitemap.xml') end should "write dotfiles properly" do @@ -307,7 +307,7 @@ def do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, '.htaccess')) + assert_exist dest_dir('.htaccess') end context "in a directory hierarchy" do @@ -317,7 +317,7 @@ def do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'contacts', 'index.html')) + assert_exist dest_dir('contacts', 'index.html') end should "write properly" do @@ -326,7 +326,7 @@ def do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'contacts', 'bar.html')) + assert_exist dest_dir('contacts', 'bar.html') end should "write properly without html extension" do @@ -336,7 +336,7 @@ def do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert File.exist?(File.join(dest_dir, 'contacts', 'bar', 'index.html')) + assert_exist dest_dir('contacts', 'bar', 'index.html') end end end diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index c9dfb5730c3..1ed212110d5 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -112,7 +112,7 @@ class TestRegenerator < JekyllUnitTest assert_equal 1, @regenerator.metadata.size path = @regenerator.metadata.keys[0] - assert File.exist?(@layout_path) + assert_exist @layout_path @regenerator.add_dependency(path, @layout_path) File.rename(@layout_path, @layout_path + ".tmp") diff --git a/test/test_site.rb b/test/test_site.rb index 970084cf165..e0883b49f90 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -275,25 +275,25 @@ def generate(site) should 'remove orphaned files in destination' do @site.process - assert !File.exist?(dest_dir('obsolete.html')) - assert !File.exist?(dest_dir('qux')) - assert !File.exist?(dest_dir('quux')) - assert File.exist?(dest_dir('.git')) - assert File.exist?(dest_dir('.git/HEAD')) + refute_exist dest_dir('obsolete.html') + refute_exist dest_dir('qux') + refute_exist dest_dir('quux') + assert_exist dest_dir('.git') + assert_exist dest_dir('.git', 'HEAD') end should 'remove orphaned files in destination - keep_files .svn' do config = site_configuration('keep_files' => %w{.svn}) @site = Site.new(config) @site.process - assert !File.exist?(dest_dir('.htpasswd')) - assert !File.exist?(dest_dir('obsolete.html')) - assert !File.exist?(dest_dir('qux')) - assert !File.exist?(dest_dir('quux')) - assert !File.exist?(dest_dir('.git')) - assert !File.exist?(dest_dir('.git/HEAD')) - assert File.exist?(dest_dir('.svn')) - assert File.exist?(dest_dir('.svn/HEAD')) + refute_exist dest_dir('.htpasswd') + refute_exist dest_dir('obsolete.html') + refute_exist dest_dir('qux') + refute_exist dest_dir('quux') + refute_exist dest_dir('.git') + refute_exist dest_dir('.git', 'HEAD') + assert_exist dest_dir('.svn') + assert_exist dest_dir('.svn', 'HEAD') end end From a351a70b030f2be33cbca4b97bb323fada9dda99 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 14:08:53 -0800 Subject: [PATCH 0315/4996] test: Slight refactor to doublecheck destination. --- test/test_generated_site.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 400ec4d784a..301cd8f8fea 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -38,10 +38,15 @@ class TestGeneratedSite < JekyllUnitTest refute_exist dest_dir('_posts') end + should "process a page with a folder permalink properly" do + about = @site.pages.find {|page| page.name == 'about.html' } + assert_equal dest_dir('about', 'index.html'), about.destination(dest_dir) + assert_exist dest_dir('about', 'index.html') + end + should "process other static files and generate correct permalinks" do - assert_exist dest_dir('about', 'index.html'), "about/index.html should exist" - assert_exist dest_dir('contacts.html'), "contacts.html should exist" - assert_exist dest_dir('dynamic_file.php'), "dynamic_file.php should exist" + assert_exist dest_dir('contacts.html') + assert_exist dest_dir('dynamic_file.php') end should "print a nice list of static files" do From 4de1873b56c936842c8fac550cfadd9a7e355e6f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 14:09:14 -0800 Subject: [PATCH 0316/4996] Renderer: #output_ext should check to make sure the output extension of the permalink isn't empty --- lib/jekyll/renderer.rb | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 539c4de8e42..c7b6042b538 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -22,21 +22,7 @@ def converters # # Returns the output extname including the leading period. def output_ext - @output_ext ||= if document.permalink - File.extname(document.permalink) - else - if output_exts.size == 1 - output_exts.last - else - output_exts[-2] - end - end - end - - def output_exts - @output_exts ||= converters.map do |c| - c.output_ext(document.extname) - end.compact + @output_ext ||= (permalink_ext || converter_output_ext) end ###################### @@ -178,5 +164,28 @@ def place_in_layouts(content, payload, info) output end + + private + + def permalink_ext + if document.permalink + permalink_ext = File.extname(document.permalink) + permalink_ext unless permalink_ext.empty? + end + end + + def converter_output_ext + if output_exts.size == 1 + output_exts.last + else + output_exts[-2] + end + end + + def output_exts + @output_exts ||= converters.map do |c| + c.output_ext(document.extname) + end.compact + end end end From 2d5feab2ae45a6597a11887210f40086a59513f1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 18 Jan 2016 15:00:47 -0800 Subject: [PATCH 0317/4996] Update history to reflect merge of #4373 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ba8e9a81e46..5bd8a10e186 100644 --- a/History.markdown +++ b/History.markdown @@ -38,6 +38,7 @@ * Escape html from site.title and page.title in site template (#4307) * Allow custom file extensions if defined in `permalink` YAML front matter (#4314) * Fix deep_merge_hashes! handling of drops and hashes (#4359) + * Page should respect output extension of its permalink (#4373) ### Development Fixes From e75d703806574db362cbe19ee0db185b0cf4174a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 15:33:58 -0800 Subject: [PATCH 0318/4996] Page#write? shouldn't freeze 'true' --- lib/jekyll/page.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 3760410be3d..fde456513d8 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -168,7 +168,7 @@ def trigger_hooks(hook_name, *args) end def write? - true.freeze + true end end end From d27f1d95d56662935bfd5b00b0a63a4c02369547 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 15:34:50 -0800 Subject: [PATCH 0319/4996] features: #run_command should prefix command with $ --- features/support/helpers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/support/helpers.rb b/features/support/helpers.rb index d65695cedab..b8334cfd619 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -102,7 +102,7 @@ def run_in_shell(*args) File.write(Paths.status_file, p.value.exitstatus) File.open(Paths.output_file, "wb") do |f| - f.puts args.join(" ") + f.puts "$ " << args.join(" ") f.puts out f.puts err f.puts "EXIT STATUS: #{p.value.exitstatus}" From be0e951bb09b8935af94c508b8b48a354c5f3ea6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 15:35:11 -0800 Subject: [PATCH 0320/4996] features: Reorganize step definitions to reduce duplication --- features/step_definitions.rb | 64 +++++++++++++++++------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index a6790a15c94..2e47e369aab 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -167,72 +167,68 @@ # -Then %r{^the (.*) directory should +exist$} do |dir| - expect(Pathname.new(dir)).to exist -end - -# - -Then %r{^the (.*) directory should not exist$} do |dir| - expect(Pathname.new(dir)).not_to exist +Then %r{^the (.*) directory should +(not )?exist$} do |dir, negative| + if negative.nil? + expect(Pathname.new(dir)).to exist + else + expect(Pathname.new(dir)).to_not exist + end end # -Then %r{^I should see "(.*)" in "(.*)"$} do |text, file| +Then %r{^I should (not )?see "(.*)" in "(.*)"$} do |negative, text, file| + step %(the "#{file}" file should exist) regexp = Regexp.new(text, Regexp::MULTILINE) - expect(file_contents(file)).to match regexp + if negative.nil? || negative.empty? + expect(file_contents(file)).to match regexp + else + expect(file_contents(file)).not_to match regexp + end end # Then %r{^I should see exactly "(.*)" in "(.*)"$} do |text, file| + step %(the "#{file}" file should exist) expect(file_contents(file).strip).to eq text end # -Then %r{^I should not see "(.*)" in "(.*)"$} do |text, file| - regexp = Regexp.new(text, Regexp::MULTILINE) - expect(file_contents(file)).not_to match regexp -end - -# - Then %r{^I should see escaped "(.*)" in "(.*)"$} do |text, file| - regexp = Regexp.new(Regexp.escape(text)) - expect(file_contents(file)).to match regexp -end - -# - -Then %r{^the "(.*)" file should +exist$} do |file| - expect(Pathname.new(file)).to exist + step %(I should see "#{Regexp.escape(text)}" in "#{file}") end # -Then %r{^the "(.*)" file should not exist$} do |file| - expect(Pathname.new(file)).to_not exist +Then %r{^the "(.*)" file should +(not )?exist$} do |file, negative| + if negative.nil? + expect(Pathname.new(file)).to exist + else + expect(Pathname.new(file)).to_not exist + end end # Then %r{^I should see today's time in "(.*)"$} do |file| - seconds = seconds_agnostic_time(Time.now) - expect(file_contents(file)).to match Regexp.new(seconds) + step %(I should see "#{seconds_agnostic_time(Time.now)}" in "#{file}") end # Then %r{^I should see today's date in "(.*)"$} do |file| - regexp = Regexp.new(Date.today.to_s) - expect(file_contents(file)).to match regexp + step %(I should see "#{Date.today.to_s}" in "#{file}") end # -Then %r{^I should see "(.*)" in the build output$} do |text| - expect(jekyll_run_output).to match Regexp.new(text) +Then %r{^I should (not )?see "(.*)" in the build output$} do |negative, text| + if negative.nil? || negative.empty? + expect(jekyll_run_output).to match Regexp.new(text) + else + expect(jekyll_run_output).not_to match Regexp.new(text) + end end # @@ -244,5 +240,5 @@ # Then %r{^I should get a non-zero exit(?:\-| )status$} do - expect(jekyll_run_status.to_i).not_to match(%r{EXIT STATUS: 0}) + step %(I should not see "EXIT STATUS: 0" in the build output) end From 32fba4f01a4a1c9a947e1bedc52ba86e12c6a605 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 15:39:53 -0800 Subject: [PATCH 0321/4996] Release :gem: v3.1.0.pre.rc2 --- lib/jekyll/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 66eebc1c051..394cef78fec 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.0.pre.rc1' + VERSION = '3.1.0.pre.rc2' end From 00285f7b9ae8652df69a8cc1ad052f424a1994bb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 18 Jan 2016 15:39:56 -0800 Subject: [PATCH 0322/4996] Release :gem: 3.1.0.pre.rc2 From 56a711f1eea837b37d57a5868e222f435240d540 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 19 Jan 2016 10:11:54 -0600 Subject: [PATCH 0323/4996] Move to static Ruby versions so we can test on latest versions. --- .travis.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index fafd57c396b..29b0a836f47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,16 +6,17 @@ language: ruby sudo: false rvm: -- 2.2 -- 2.1 -- 2.0 -- jruby-9.0.3.0 +- 2.0.0-p648 +- 2.1.8 +- 2.2.4 +- 2.3.0 +- jruby-9.0.4.0 - ruby-head matrix: fast_finish: true allow_failures: - - rvm: jruby-9.0.3.0 + - rvm: jruby-9.0.4.0 - rvm: ruby-head env: matrix: From ecc5121918ba6fbec97f18d766a47ee3a18328f4 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 19 Jan 2016 10:15:58 -0600 Subject: [PATCH 0324/4996] Update our badge URL's for more reliability. --- README.markdown | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/README.markdown b/README.markdown index 9ee529f357d..577e774c347 100644 --- a/README.markdown +++ b/README.markdown @@ -1,11 +1,16 @@ # [Jekyll](http://jekyllrb.com/) -[![Gem Version](https://img.shields.io/gem/v/jekyll.svg)](https://rubygems.org/gems/jekyll) -[![Build Status](https://img.shields.io/travis/jekyll/jekyll/master.svg)](https://travis-ci.org/jekyll/jekyll) -[![Code Climate](https://img.shields.io/codeclimate/github/jekyll/jekyll.svg)](https://codeclimate.com/github/jekyll/jekyll) -[![Test Coverage](https://codeclimate.com/github/jekyll/jekyll/badges/coverage.svg)](https://codeclimate.com/github/jekyll/jekyll/coverage) -[![Dependency Status](https://gemnasium.com/jekyll/jekyll.svg)](https://gemnasium.com/jekyll/jekyll) -[![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)](https://hakiri.io/github/jekyll/jekyll/master) +[![Build Status](https://travis-ci.org/jekyll/jekyll.svg?branch=master)][travis] +[![Test Coverage](https://codeclimate.com/github/jekyll/jekyll/badges/coverage.svg)][coverage] +[![Code Climate](https://codeclimate.com/github/jekyll/jekyll/badges/gpa.svg)][codeclimate] +[![Dependency Status](https://gemnasium.com/jekyll/jekyll.svg)][gemnasium] +[![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)][hakiri] + +[gemnasium]: https://gemnasium.com/jekyll/jekyll +[codeclimate]: https://codeclimate.com/github/jekyll/jekyll +[coverage]: https://codeclimate.com/github/jekyll/jekyll/coverage +[hakiri]: https://hakiri.io/github/jekyll/jekyll/master +[travis]: https://travis-ci.org/jekyll/jekyll By Tom Preston-Werner, Nick Quaranto, Parker Moore, and many [awesome contributors](https://github.com/jekyll/jekyll/graphs/contributors)! From d50656021f2ff9ea0f46bd1a58eb1b4f1cc83d1e Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 27 Nov 2015 13:40:30 +0800 Subject: [PATCH 0325/4996] Fix #4188: Extract title from filename successfully when dateless. --- features/collections.feature | 19 +++++++++++++++++-- lib/jekyll/document.rb | 5 ++++- .../_thanksgiving/2015-11-26-thanksgiving.md | 3 +++ test/source/_thanksgiving/black-friday.md | 3 +++ 4 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 test/source/_thanksgiving/2015-11-26-thanksgiving.md create mode 100644 test/source/_thanksgiving/black-friday.md diff --git a/features/collections.feature b/features/collections.feature index 888bd1c2ddc..90715b57cd0 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -155,5 +155,20 @@ Feature: Collections """ When I run jekyll build Then I should get a zero exit status - And the _site directory should exist - And I should see "Collections: Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, , Site#generate," in "_site/index.html" + Then the _site directory should exist + And I should see "Collections: Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, Site#generate, YAML with Dots," in "_site/index.html" + + Scenario: Rendered collection with date/dateless filename + Given I have an "index.html" page that contains "Collections: {% for method in site.thanksgiving %}{{ method.title }} {% endfor %}" + And I have fixture collections + And I have a "_config.yml" file with content: + """ + collections: + thanksgiving: + output: true + """ + When I run jekyll build + Then the _site directory should exist + And I should see "Thanksgiving Black Friday" in "_site/index.html" + And I should see "Happy Thanksgiving" in "_site/thanksgiving/2015-11-26-thanksgiving.html" + And I should see "Black Friday" in "_site/thanksgiving/black-friday.html" diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 2911c4aa04b..d4db403cbbc 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -8,7 +8,7 @@ class Document attr_accessor :content, :output YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m - DATELESS_FILENAME_MATCHER = /^(.*)(\.[^.]+)$/ + DATELESS_FILENAME_MATCHER = /^(.+\/)*(.*)(\.[^.]+)$/ DATE_FILENAME_MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ # Create a new Document. @@ -294,6 +294,9 @@ def post_read }) merge_data!({ "date" => date }) if data['date'].nil? || data['date'].to_i == site.time.to_i data['title'] ||= slug.split('-').select(&:capitalize).join(' ') + elsif DATELESS_FILENAME_MATCHER =~ relative_path + m, cats, slug, ext = *relative_path.match(DATELESS_FILENAME_MATCHER) + data['title'] ||= slug.split('-').select {|w| w.capitalize! || w }.join(' ') end populate_categories populate_tags diff --git a/test/source/_thanksgiving/2015-11-26-thanksgiving.md b/test/source/_thanksgiving/2015-11-26-thanksgiving.md new file mode 100644 index 00000000000..48d2dd58cba --- /dev/null +++ b/test/source/_thanksgiving/2015-11-26-thanksgiving.md @@ -0,0 +1,3 @@ +--- +--- +Happy {{ page.title }} ! diff --git a/test/source/_thanksgiving/black-friday.md b/test/source/_thanksgiving/black-friday.md new file mode 100644 index 00000000000..1d8ea1bbad4 --- /dev/null +++ b/test/source/_thanksgiving/black-friday.md @@ -0,0 +1,3 @@ +--- +--- +{{ page.title }} From f8e86721481eff5f12910f0be800a1e36a790381 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 28 Nov 2015 01:22:24 -0600 Subject: [PATCH 0326/4996] Fix #4191: Reduce Document#post_read complexity slightly. --- lib/jekyll/document.rb | 32 ++++++++++++++++++-------------- lib/jekyll/utils.rb | 8 ++++++-- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index d4db403cbbc..51d0514ea34 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -286,24 +286,21 @@ def read(opts = {}) end def post_read - if DATE_FILENAME_MATCHER =~ relative_path - _, _, date, slug, ext = *relative_path.match(DATE_FILENAME_MATCHER) - merge_data!({ - "slug" => slug, - "ext" => ext - }) - merge_data!({ "date" => date }) if data['date'].nil? || data['date'].to_i == site.time.to_i - data['title'] ||= slug.split('-').select(&:capitalize).join(' ') + if relative_path =~ DATE_FILENAME_MATCHER + cats, date, slug, ext = $1, $2, $3, $4 + merge_data!("date" => date) if !data['date'] || data['date'].to_i == site.time.to_i elsif DATELESS_FILENAME_MATCHER =~ relative_path - m, cats, slug, ext = *relative_path.match(DATELESS_FILENAME_MATCHER) - data['title'] ||= slug.split('-').select {|w| w.capitalize! || w }.join(' ') + cats, slug, ext = $1, $2, $3 end + + merge_data!("slug" => slug, "ext" => ext) + + # Try to ensure the user gets a title. + data["title"] ||= Utils.titleize_slug(slug) + populate_categories populate_tags - - if generate_excerpt? - data['excerpt'] ||= Jekyll::Excerpt.new(self) - end + generate_excerpt end # Add superdirectories of the special_dir to categories. @@ -440,5 +437,12 @@ def method_missing(method, *args, &blck) super end end + + private # :nodoc: + def generate_excerpt + if generate_excerpt? + data["excerpt"] ||= Jekyll::Excerpt.new(self) + end + end end end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 9ffff548e6f..6e0023de679 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -10,8 +10,12 @@ module Utils SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze - def strip_heredoc(str) - str.gsub(/^[ \t]{#{(str.scan(/^[ \t]*(?=\S)/).min || "").size}}/, "") + # Takes a slug and turns it into a simple title. + + def titleize_slug(slug) + slug.split("-").map! do |val| + val.capitalize! + end.join(" ") end # Non-destructive version of deep_merge_hashes! See that method. From 805ab6b7f8c82466bd789723d312eae1456379c1 Mon Sep 17 00:00:00 2001 From: Brenton Horne Date: Wed, 20 Jan 2016 06:59:00 +1000 Subject: [PATCH 0327/4996] Adding commit/date indicators --- site/_docs/sites.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/site/_docs/sites.md b/site/_docs/sites.md index 7eb6559f600..1c509f3653d 100644 --- a/site/_docs/sites.md +++ b/site/_docs/sites.md @@ -9,17 +9,17 @@ with. Below are some Jekyll-powered blogs which were hand-picked for learning purposes. - [Tom Preston-Werner](http://tom.preston-werner.com/) - ([source](https://github.com/mojombo/mojombo.github.io)) + ([source](https://github.com/mojombo/mojombo.github.io)) (last commit [87f9f24](https://github.com/mojombo/mojombo.github.io/commit/87f9f24) at 20 June 2015) - [Nick Quaranto](http://quaran.to/) - ([source](https://github.com/qrush/qrush.github.com)) + ([source](https://github.com/qrush/qrush.github.com)) (last commit [c569be1](https://github.com/qrush/qrush.github.com/commit/c569be159c4c1075e8bf65b1995e43b262c86899) at 2 December 2014) - [GitHub Official Teaching Materials](http://training.github.com) - ([source](https://github.com/github/training.github.com/tree/7049d7532a6856411e34046aedfce43a4afaf424)) + ([source](https://github.com/github/training.github.com/tree/7049d7532a6856411e34046aedfce43a4afaf424)) (last commit [7049d75](https://github.com/github-archive/training.github.com/commit/7049d7532a6856411e34046aedfce43a4afaf424) at 20 December 2013) - [Rasmus Andersson](http://rsms.me/) - ([source](https://github.com/rsms/rsms.github.com)) + ([source](https://github.com/rsms/rsms.github.com)) (last commit [30e0555](https://github.com/rsms/rsms.github.com/commit/30e0555d3f22af951839e308c68ee548f6c03492) at 1 December 2015) - [Scott Chacon](http://schacon.github.com) - ([source](https://github.com/schacon/schacon.github.com)) + ([source](https://github.com/schacon/schacon.github.com)) (last commit [e7396ba](https://github.com/schacon/schacon.github.com/commit/e7396ba8eb964634c24a417c8b86c5c9a251a9fd) at 2 April 2011) - [Leonard Lamprecht](http://leo.im) - ([source](https://github.com/leo/leo.github.io)) + ([source](https://github.com/leo/leo.github.io)) (frequently updated) If you would like to explore more examples, you can find a list of sites and their sources on the ["Sites" page in the Jekyll wiki][jekyll-sites]. From 8507cda6ddfaf59fc25837df111b77a6651258fe Mon Sep 17 00:00:00 2001 From: Brenton Horne Date: Wed, 20 Jan 2016 07:22:54 +1000 Subject: [PATCH 0328/4996] Rm date indicators and >1 year inactive sites --- site/_docs/sites.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/site/_docs/sites.md b/site/_docs/sites.md index 1c509f3653d..f0b1a9b218e 100644 --- a/site/_docs/sites.md +++ b/site/_docs/sites.md @@ -9,17 +9,13 @@ with. Below are some Jekyll-powered blogs which were hand-picked for learning purposes. - [Tom Preston-Werner](http://tom.preston-werner.com/) - ([source](https://github.com/mojombo/mojombo.github.io)) (last commit [87f9f24](https://github.com/mojombo/mojombo.github.io/commit/87f9f24) at 20 June 2015) -- [Nick Quaranto](http://quaran.to/) - ([source](https://github.com/qrush/qrush.github.com)) (last commit [c569be1](https://github.com/qrush/qrush.github.com/commit/c569be159c4c1075e8bf65b1995e43b262c86899) at 2 December 2014) + ([source](https://github.com/mojombo/mojombo.github.io)) - [GitHub Official Teaching Materials](http://training.github.com) - ([source](https://github.com/github/training.github.com/tree/7049d7532a6856411e34046aedfce43a4afaf424)) (last commit [7049d75](https://github.com/github-archive/training.github.com/commit/7049d7532a6856411e34046aedfce43a4afaf424) at 20 December 2013) + ([source](https://github.com/github/training-kit)) - [Rasmus Andersson](http://rsms.me/) - ([source](https://github.com/rsms/rsms.github.com)) (last commit [30e0555](https://github.com/rsms/rsms.github.com/commit/30e0555d3f22af951839e308c68ee548f6c03492) at 1 December 2015) -- [Scott Chacon](http://schacon.github.com) - ([source](https://github.com/schacon/schacon.github.com)) (last commit [e7396ba](https://github.com/schacon/schacon.github.com/commit/e7396ba8eb964634c24a417c8b86c5c9a251a9fd) at 2 April 2011) + ([source](https://github.com/rsms/rsms.github.com)) - [Leonard Lamprecht](http://leo.im) - ([source](https://github.com/leo/leo.github.io)) (frequently updated) + ([source](https://github.com/leo/leo.github.io)) If you would like to explore more examples, you can find a list of sites and their sources on the ["Sites" page in the Jekyll wiki][jekyll-sites]. From 090cf5a50b0d99d2faf4346f6a1ea81e046f558b Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 19 Jan 2016 23:12:59 -0800 Subject: [PATCH 0329/4996] Disable auto-regeneration when running server detached --- lib/jekyll/commands/build.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb index d505e2fb3ff..baa4e88a767 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -33,7 +33,9 @@ def process(options) build(site, options) end - if options.fetch('watch', false) + if options.fetch('detach', false) + Jekyll.logger.info "Auto-regeneration:", "disabled when running server detached." + elsif options.fetch('watch', false) watch(site, options) else Jekyll.logger.info "Auto-regeneration:", "disabled. Use --watch to enable." From f44a9cf401f2499cc990f6fb067e64dda61aa896 Mon Sep 17 00:00:00 2001 From: Liam Bowers Date: Wed, 20 Jan 2016 12:25:29 +0000 Subject: [PATCH 0330/4996] Added the Wordpress2Jekyll Wordpress plugin --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 067fb6e7b26..a711fd4457b 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -887,6 +887,7 @@ LESS.js files during generation. - [vim-jekyll](https://github.com/parkr/vim-jekyll): A vim plugin to generate new posts and run `jekyll build` all without leaving vim. - [markdown-writer](https://atom.io/packages/markdown-writer): An Atom package for Jekyll. It can create new posts/drafts, manage tags/categories, insert link/images and add many useful key mappings. +- [Wordpress2Jekyll](https://wordpress.org/plugins/wp2jekyll/): A Wordpress plugin that allows you to use Wordpress as your editor and (automatically) export content in to Jekyll. WordPress2Jekyll attempts to marry these two systems together in order to make a site that can be easily managed from all devices.
    Jekyll Plugins Wanted
    From 37e11016902b58b1b92466a7b5c841c49f1ff753 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 20 Jan 2016 07:04:22 -0600 Subject: [PATCH 0331/4996] Re-add Gem version after accidental removal. --- README.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.markdown b/README.markdown index 577e774c347..4401ed30c6a 100644 --- a/README.markdown +++ b/README.markdown @@ -1,11 +1,13 @@ # [Jekyll](http://jekyllrb.com/) +[![Gem Version](https://img.shields.io/gem/v/jekyll.svg)][ruby-gems] [![Build Status](https://travis-ci.org/jekyll/jekyll.svg?branch=master)][travis] [![Test Coverage](https://codeclimate.com/github/jekyll/jekyll/badges/coverage.svg)][coverage] [![Code Climate](https://codeclimate.com/github/jekyll/jekyll/badges/gpa.svg)][codeclimate] [![Dependency Status](https://gemnasium.com/jekyll/jekyll.svg)][gemnasium] [![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)][hakiri] +[ruby-gems]: https://rubygems.org/gems/jekyll [gemnasium]: https://gemnasium.com/jekyll/jekyll [codeclimate]: https://codeclimate.com/github/jekyll/jekyll [coverage]: https://codeclimate.com/github/jekyll/jekyll/coverage From 61acafe97a1189f30f8a75c0c92bdedea96757ba Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 20 Jan 2016 07:24:16 -0600 Subject: [PATCH 0332/4996] Move ByeBug to development and disallow for JRuby. --- Gemfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 9e4796e60ee..091a7564d84 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,10 @@ group :development do gem "launchy", "~> 2.3" gem "rubocop", :branch => :master, :github => "bbatsov/rubocop" gem "pry" + + UNLESS RUBY_ENGINE == "jruby" + gem "byebug" + end end # @@ -18,7 +22,6 @@ group :test do gem "rspec-mocks" gem "nokogiri" gem "rspec" - gem "byebug" end # From e50d4d6b6e1acedabedf0dfe5d34410630856193 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 20 Jan 2016 07:30:07 -0600 Subject: [PATCH 0333/4996] Fix bad UNLESS. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 091a7564d84..4e4189d2722 100644 --- a/Gemfile +++ b/Gemfile @@ -7,7 +7,7 @@ group :development do gem "rubocop", :branch => :master, :github => "bbatsov/rubocop" gem "pry" - UNLESS RUBY_ENGINE == "jruby" + unless RUBY_ENGINE == "jruby" gem "byebug" end end From af20abf1bced9bd6af40e6cd1b72d4de2a19758a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 20 Jan 2016 11:06:31 -0800 Subject: [PATCH 0334/4996] Update history to reflect merge of #4377 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5bd8a10e186..729d80b9ea1 100644 --- a/History.markdown +++ b/History.markdown @@ -86,6 +86,7 @@ * Fixed broken link to blog on using mathjax with jekyll (#4344) * Documentation: correct reference in Precedence section of Configuration docs (#4355) * Add @jmcglone's guide to github-pages doc page (#4364) + * Added the Wordpress2Jekyll Wordpress plugin (#4377) ## 3.0.1 / 2015-11-17 From f1ac1f21252ae7a2da405c0eb365b09fbc07086e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 20 Jan 2016 11:07:34 -0800 Subject: [PATCH 0335/4996] Update history to reflect merge of #4376 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 729d80b9ea1..f3f6b1ba21a 100644 --- a/History.markdown +++ b/History.markdown @@ -39,6 +39,7 @@ * Allow custom file extensions if defined in `permalink` YAML front matter (#4314) * Fix deep_merge_hashes! handling of drops and hashes (#4359) * Page should respect output extension of its permalink (#4373) + * Disable auto-regeneration when running server detached (#4376) ### Development Fixes From ec0eff3315b5694be512d82bb494efd888370288 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 20 Jan 2016 13:30:49 -0600 Subject: [PATCH 0336/4996] Switch to pry-byebug so everybody gets the benefit. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 4e4189d2722..f63529e885a 100644 --- a/Gemfile +++ b/Gemfile @@ -8,7 +8,7 @@ group :development do gem "pry" unless RUBY_ENGINE == "jruby" - gem "byebug" + gem "pry-byebug" end end From 1ba23c32c69ad70721615e5b5cb82aef34606534 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 20 Jan 2016 11:46:18 -0800 Subject: [PATCH 0337/4996] add Utils.strip_heredoc --- lib/jekyll/utils.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 6e0023de679..6dd2b117f94 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -10,6 +10,12 @@ module Utils SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze + # Takes an indented string and removes the preceding spaces on each line + + def strip_heredoc(str) + str.gsub(/^[ \t]{#{(str.scan(/^[ \t]*(?=\S)/).min || "").size}}/, "") + end + # Takes a slug and turns it into a simple title. def titleize_slug(slug) From a72629908ae5c0886c4c1962df8ed0d1324f4868 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 20 Jan 2016 12:23:48 -0800 Subject: [PATCH 0338/4996] Document: throw a useful error when an invalid date is given --- features/post_data.feature | 14 ++++++++++++++ lib/jekyll/document.rb | 23 ++++++++++++++--------- lib/jekyll/site.rb | 2 +- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/features/post_data.feature b/features/post_data.feature index 3b4f3cf7ead..3692c382f53 100644 --- a/features/post_data.feature +++ b/features/post_data.feature @@ -39,6 +39,20 @@ Feature: Post data And the _site directory should exist And I should see "Post date: 27 Mar 2009" in "_site/2009/03/27/star-wars.html" + Scenario: Use post.date variable with invalid + Given I have a _posts directory + And I have a "_posts/2016-01-01-test.md" page with date "tuesday" that contains "I have a bad date." + When I run jekyll build + Then the _site directory should not exist + And I should see "Document '_posts/2016-01-01-test.md' does not have a valid date in the YAML front matter." in the build output + + Scenario: Invalid date in filename + Given I have a _posts directory + And I have a "_posts/2016-22-01-test.md" page that contains "I have a bad date." + When I run jekyll build + Then the _site directory should not exist + And I should see "Document '_posts/2016-22-01-test.md' does not have a valid date in the filename." in the build output + Scenario: Use post.id variable Given I have a _posts directory And I have a _layouts directory diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 2911c4aa04b..8e0d3e86d31 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -50,7 +50,7 @@ def data # Merge some data in with this document's data. # # Returns the merged data. - def merge_data!(other) + def merge_data!(other, source: "YAML front matter") if other.key?('categories') && !other['categories'].nil? if other['categories'].is_a?(String) other['categories'] = other['categories'].split(" ").map(&:strip) @@ -61,7 +61,7 @@ def merge_data!(other) if data.key?('date') && !data['date'].is_a?(Time) data['date'] = Utils.parse_date( data['date'].to_s, - "Document '#{relative_path}' does not have a valid date in the YAML front matter." + "Document '#{relative_path}' does not have a valid date in the #{source}." ) end data @@ -267,20 +267,23 @@ def read(opts = {}) else begin defaults = @site.frontmatter_defaults.all(url, collection.label.to_sym) - merge_data!(defaults) unless defaults.empty? + merge_data!(defaults, source: "front matter defaults") unless defaults.empty? self.content = File.read(path, merged_file_read_opts(opts)) if content =~ YAML_FRONT_MATTER_REGEXP self.content = $POSTMATCH data_file = SafeYAML.load(Regexp.last_match(1)) - merge_data!(data_file) if data_file + merge_data!(data_file, source: "YAML front matter") if data_file end post_read rescue SyntaxError => e - puts "YAML Exception reading #{path}: #{e.message}" + Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{e.message}" rescue Exception => e - puts "Error reading file #{path}: #{e.message}" + if e.is_a? Jekyll::Errors::FatalException + raise e + end + Jekyll.logger.error "Error:", "could not read file #{path}: #{e.message}" end end end @@ -291,9 +294,11 @@ def post_read merge_data!({ "slug" => slug, "ext" => ext - }) - merge_data!({ "date" => date }) if data['date'].nil? || data['date'].to_i == site.time.to_i + }, source: "filename") data['title'] ||= slug.split('-').select(&:capitalize).join(' ') + if data['date'].nil? || data['date'].to_i == site.time.to_i + merge_data!({"date" => date}, source: "filename") + end end populate_categories populate_tags @@ -312,7 +317,7 @@ def categories_from_path(special_dir) superdirs = relative_path.sub(/#{special_dir}(.*)/, '').split(File::SEPARATOR).reject do |c| c.empty? || c.eql?(special_dir) || c.eql?(basename) end - merge_data!({ 'categories' => superdirs }) + merge_data!({ 'categories' => superdirs }, source: "file path") end def populate_categories diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 15698b99d22..72d42ad90b9 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -225,7 +225,7 @@ def post_attr_hash(post_attr) # Build a hash map based on the specified post attribute ( post attr => # array of posts ) then sort each array in reverse order. hash = Hash.new { |h, key| h[key] = [] } - posts.docs.each { |p| p.data[post_attr].each { |t| hash[t] << p } } + posts.docs.each { |p| p.data[post_attr].each { |t| hash[t] << p } if p.data[post_attr] } hash.values.each { |posts| posts.sort!.reverse! } hash end From e9be8933de5590cae81c1f15fb3c9d22a86a66b5 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 20 Jan 2016 14:10:47 -0800 Subject: [PATCH 0339/4996] Release :gem: v3.0.2 --- History.markdown | 6 ++++++ site/_docs/history.md | 9 +++++++++ .../2016-01-20-jekyll-3-0-2-released.markdown | 19 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 site/_posts/2016-01-20-jekyll-3-0-2-released.markdown diff --git a/History.markdown b/History.markdown index f3f6b1ba21a..6bab0a71585 100644 --- a/History.markdown +++ b/History.markdown @@ -89,6 +89,12 @@ * Add @jmcglone's guide to github-pages doc page (#4364) * Added the Wordpress2Jekyll Wordpress plugin (#4377) +## 3.0.2 / 2016-01-20 + +### Bug Fixes + + * Document: throw a useful error when an invalid date is given (#4378) + ## 3.0.1 / 2015-11-17 ### Bug Fixes diff --git a/site/_docs/history.md b/site/_docs/history.md index a12653f2c1c..7d1ff85d0bf 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -4,6 +4,15 @@ title: History permalink: "/docs/history/" --- +## 3.0.2 / 2016-01-20 +{: #v3-0-2} + +### Bug Fixes +{: #bug-fixes-v3-0-2} + +- Document: throw a useful error when an invalid date is given ([#4378]({{ site.repository }}/issues/4378)) + + ## 3.0.1 / 2015-11-17 {: #v3-0-1} diff --git a/site/_posts/2016-01-20-jekyll-3-0-2-released.markdown b/site/_posts/2016-01-20-jekyll-3-0-2-released.markdown new file mode 100644 index 00000000000..88f8888f757 --- /dev/null +++ b/site/_posts/2016-01-20-jekyll-3-0-2-released.markdown @@ -0,0 +1,19 @@ +--- +layout: news_item +title: 'Jekyll 3.0.2 Released' +date: 2016-01-20 14:08:18 -0800 +author: parkr +version: 3.0.2 +categories: [release] +--- + +A crucial bug was found in v3.0.1 which caused invalid post dates to go +unnoticed in the build chain until the error that popped up was unhelpful. +v3.0.2 [throws errors as you'd expect](https://github.com/jekyll/jekyll/issues/4375) +when there is a post like `_posts/2016-22-01-future.md` or a post has an +invalid date like `date: "tuesday"` in their front matter. + +This should make the experience of working with Jekyll just a little +better. + +Happy Jekylling! From 31ae61b419fd422b7384ab006e66814b00532657 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 21 Jan 2016 18:20:35 -0800 Subject: [PATCH 0340/4996] Drop#[]: only use public_send for keys in the content_methods array --- features/post_data.feature | 12 ++++++++++++ lib/jekyll/drops/drop.rb | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/features/post_data.feature b/features/post_data.feature index 3692c382f53..79b92c2677a 100644 --- a/features/post_data.feature +++ b/features/post_data.feature @@ -301,6 +301,18 @@ Feature: Post data And the _site directory should exist And I should see "Post author: Darth Vader" in "_site/2009/03/27/star-wars.html" + Scenario: Use a variable which is a reserved keyword in Ruby + Given I have a _posts directory + And I have a _layouts directory + And I have the following post: + | title | date | layout | class | content | + | My post | 2016-01-21 | simple | kewl-post | Luke, I am your father. | + And I have a simple layout that contains "{{page.title}} has class {{page.class}}" + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And I should see "My post has class kewl-post" in "_site/2016/01/21/my-post.html" + Scenario: Previous and next posts title Given I have a _posts directory And I have a _layouts directory diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 35f0df26e81..9e3ac329b68 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -46,7 +46,7 @@ def initialize(obj) def [](key) if self.class.mutable? && @mutations.key?(key) @mutations[key] - elsif respond_to? key + elsif content_methods.include? key public_send key else fallback_data[key] From 4ecdf6ce108a91c593fa9d30115f2e3d63c70830 Mon Sep 17 00:00:00 2001 From: Zshawn Syed Date: Thu, 21 Jan 2016 23:44:30 -0600 Subject: [PATCH 0341/4996] Remove extra OR condition since a missing hash key will return a nil anyway. Added a test to catch this nil condition since it was missing to begin with. Reduced line length in test_page.rb --- lib/jekyll/page.rb | 3 +-- test/test_page.rb | 9 ++++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index fde456513d8..eda87f12346 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -63,8 +63,7 @@ def dir # # Returns the String permalink or nil if none has been set. def permalink - return nil if data.nil? || data['permalink'].nil? - data['permalink'] + data.nil? ? nil : data['permalink'] end # The template of the permalink. diff --git a/test/test_page.rb b/test/test_page.rb index 2728b4e3337..69794107c50 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -8,7 +8,9 @@ def setup_page(*args) end def do_render(page) - layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")} + layouts = { + "default" => Layout.new(@site, source_dir('_layouts'), "simple.html") + } page.render(layouts, @site.site_payload) end @@ -206,6 +208,11 @@ def do_render(page) assert_equal "/about/", @page.dir end + should "return nil permalink if no permalink exists" do + @page = setup_page('') + assert_equal nil, @page.permalink + end + should "not be writable outside of destination" do unexpected = File.expand_path("../../../baddie.html", dest_dir) File.delete unexpected if File.exist?(unexpected) From 442074fdb17ca64644118b9853e4b6dd1fcdf2c0 Mon Sep 17 00:00:00 2001 From: David Litvak Bruno Date: Fri, 22 Jan 2016 10:42:52 -0300 Subject: [PATCH 0342/4996] Add Contentful Extension to Plugins --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index a711fd4457b..5f1ba786584 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -880,6 +880,7 @@ LESS.js files during generation. - [Jekyll views router](https://bitbucket.org/nyufac/jekyll-views-router): Simple router between generator plugins and templates. - [Jekyll Language Plugin](https://github.com/vwochnik/jekyll-language-plugin): Jekyll 3.0-compatible multi-language plugin for posts, pages and includes. - [Jekyll Deploy](https://github.com/vwochnik/jekyll-deploy): Adds a `deploy` sub-command to Jekyll. +- [Official Contentful Jekyll Plugin](https://github.com/contentful/jekyll-contentful-data-import): Adds a `contentful` sub-command to Jekyll to import data from Contentful. #### Editors From cf51e32d0eb8d8ba3ab7785391b8526a154b5cf3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 22 Jan 2016 08:59:48 -0800 Subject: [PATCH 0343/4996] Drop#[]: use self.class.invokable? instead of content_methods.include? for speed --- lib/jekyll/drops/drop.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 9e3ac329b68..d1bffcc5abd 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -46,7 +46,7 @@ def initialize(obj) def [](key) if self.class.mutable? && @mutations.key?(key) @mutations[key] - elsif content_methods.include? key + elsif self.class.invokable? key public_send key else fallback_data[key] From 95df35134112b073c857481ca6bf32620f13d501 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Jan 2016 09:01:21 -0800 Subject: [PATCH 0344/4996] Update history to reflect merge of #4390 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6bab0a71585..909dccd5eba 100644 --- a/History.markdown +++ b/History.markdown @@ -88,6 +88,7 @@ * Documentation: correct reference in Precedence section of Configuration docs (#4355) * Add @jmcglone's guide to github-pages doc page (#4364) * Added the Wordpress2Jekyll Wordpress plugin (#4377) + * Add Contentful Extension to list of third-party plugins (#4390) ## 3.0.2 / 2016-01-20 From c0e01597833039472d3d0e9c6b6318aa94c9fe0b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Jan 2016 09:03:44 -0800 Subject: [PATCH 0345/4996] Update history to reflect merge of #4389 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 909dccd5eba..f5b43d3264a 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * Shim subcommands with indication of gem possibly required so users know how to use them (#4254) * Add smartify Liquid filter for SmartyPants (#4323) * Raise error on empty permalink (#4361) + * Refactor Page#permalink method (#4389) ### Bug Fixes From 1298ba6908e9beaa30462ae0d6ba45e776c7e806 Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 27 Nov 2015 13:40:30 +0800 Subject: [PATCH 0346/4996] Fix #4188: Extract title from filename successfully when dateless. --- features/collections.feature | 19 +++++++++++++++++-- lib/jekyll/document.rb | 5 ++++- .../_thanksgiving/2015-11-26-thanksgiving.md | 3 +++ test/source/_thanksgiving/black-friday.md | 3 +++ 4 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 test/source/_thanksgiving/2015-11-26-thanksgiving.md create mode 100644 test/source/_thanksgiving/black-friday.md diff --git a/features/collections.feature b/features/collections.feature index 888bd1c2ddc..90715b57cd0 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -155,5 +155,20 @@ Feature: Collections """ When I run jekyll build Then I should get a zero exit status - And the _site directory should exist - And I should see "Collections: Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, , Site#generate," in "_site/index.html" + Then the _site directory should exist + And I should see "Collections: Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, Site#generate, YAML with Dots," in "_site/index.html" + + Scenario: Rendered collection with date/dateless filename + Given I have an "index.html" page that contains "Collections: {% for method in site.thanksgiving %}{{ method.title }} {% endfor %}" + And I have fixture collections + And I have a "_config.yml" file with content: + """ + collections: + thanksgiving: + output: true + """ + When I run jekyll build + Then the _site directory should exist + And I should see "Thanksgiving Black Friday" in "_site/index.html" + And I should see "Happy Thanksgiving" in "_site/thanksgiving/2015-11-26-thanksgiving.html" + And I should see "Black Friday" in "_site/thanksgiving/black-friday.html" diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 8e0d3e86d31..b8c162a5371 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -8,7 +8,7 @@ class Document attr_accessor :content, :output YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m - DATELESS_FILENAME_MATCHER = /^(.*)(\.[^.]+)$/ + DATELESS_FILENAME_MATCHER = /^(.+\/)*(.*)(\.[^.]+)$/ DATE_FILENAME_MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ # Create a new Document. @@ -299,6 +299,9 @@ def post_read if data['date'].nil? || data['date'].to_i == site.time.to_i merge_data!({"date" => date}, source: "filename") end + elsif DATELESS_FILENAME_MATCHER =~ relative_path + m, cats, slug, ext = *relative_path.match(DATELESS_FILENAME_MATCHER) + data['title'] ||= slug.split('-').select {|w| w.capitalize! || w }.join(' ') end populate_categories populate_tags diff --git a/test/source/_thanksgiving/2015-11-26-thanksgiving.md b/test/source/_thanksgiving/2015-11-26-thanksgiving.md new file mode 100644 index 00000000000..48d2dd58cba --- /dev/null +++ b/test/source/_thanksgiving/2015-11-26-thanksgiving.md @@ -0,0 +1,3 @@ +--- +--- +Happy {{ page.title }} ! diff --git a/test/source/_thanksgiving/black-friday.md b/test/source/_thanksgiving/black-friday.md new file mode 100644 index 00000000000..1d8ea1bbad4 --- /dev/null +++ b/test/source/_thanksgiving/black-friday.md @@ -0,0 +1,3 @@ +--- +--- +{{ page.title }} From 67f842546efa980146778c85fb613e6c9b53dcb4 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 28 Nov 2015 01:22:24 -0600 Subject: [PATCH 0347/4996] Fix #4191: Reduce Document#post_read complexity slightly. --- lib/jekyll/document.rb | 34 +++++++++++++++++++--------------- lib/jekyll/utils.rb | 8 ++++++-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index b8c162a5371..c6f3cb876d0 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -289,26 +289,23 @@ def read(opts = {}) end def post_read - if DATE_FILENAME_MATCHER =~ relative_path - _, _, date, slug, ext = *relative_path.match(DATE_FILENAME_MATCHER) - merge_data!({ - "slug" => slug, - "ext" => ext - }, source: "filename") - data['title'] ||= slug.split('-').select(&:capitalize).join(' ') - if data['date'].nil? || data['date'].to_i == site.time.to_i + if relative_path =~ DATE_FILENAME_MATCHER + _, date, slug, ext = $1, $2, $3, $4 + if !data['date'] || data['date'].to_i == site.time.to_i merge_data!({"date" => date}, source: "filename") end - elsif DATELESS_FILENAME_MATCHER =~ relative_path - m, cats, slug, ext = *relative_path.match(DATELESS_FILENAME_MATCHER) - data['title'] ||= slug.split('-').select {|w| w.capitalize! || w }.join(' ') + elsif relative_path =~ DATELESS_FILENAME_MATCHER + _, slug, ext = $1, $2, $3 end + + merge_data!({"slug" => slug, "ext" => ext}, source: "filename") + + # Try to ensure the user gets a title. + data["title"] ||= Utils.titleize_slug(slug) + populate_categories populate_tags - - if generate_excerpt? - data['excerpt'] ||= Jekyll::Excerpt.new(self) - end + generate_excerpt end # Add superdirectories of the special_dir to categories. @@ -445,5 +442,12 @@ def method_missing(method, *args, &blck) super end end + + private # :nodoc: + def generate_excerpt + if generate_excerpt? + data["excerpt"] ||= Jekyll::Excerpt.new(self) + end + end end end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 9ffff548e6f..6e0023de679 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -10,8 +10,12 @@ module Utils SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze - def strip_heredoc(str) - str.gsub(/^[ \t]{#{(str.scan(/^[ \t]*(?=\S)/).min || "").size}}/, "") + # Takes a slug and turns it into a simple title. + + def titleize_slug(slug) + slug.split("-").map! do |val| + val.capitalize! + end.join(" ") end # Non-destructive version of deep_merge_hashes! See that method. From 8204e479c38f2c0fafbf504b8929c74190ee145f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 20 Jan 2016 11:46:18 -0800 Subject: [PATCH 0348/4996] add Utils.strip_heredoc --- lib/jekyll/utils.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 6e0023de679..6dd2b117f94 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -10,6 +10,12 @@ module Utils SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze + # Takes an indented string and removes the preceding spaces on each line + + def strip_heredoc(str) + str.gsub(/^[ \t]{#{(str.scan(/^[ \t]*(?=\S)/).min || "").size}}/, "") + end + # Takes a slug and turns it into a simple title. def titleize_slug(slug) From ba1cfab73c785a4153bfda14c72c7f5ac4100428 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 22 Jan 2016 09:36:25 -0800 Subject: [PATCH 0349/4996] step_definitions: fixture collections should copy _thanksgiving --- features/step_definitions.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 2e47e369aab..f609076d9b4 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -125,6 +125,7 @@ Given %r{^I have fixture collections$} do FileUtils.cp_r Paths.source_dir.join("test", "source", "_methods"), source_dir + FileUtils.cp_r Paths.source_dir.join("test", "source", "_thanksgiving"), source_dir end # From 6c40c7f553fca8eddd5cc42f86b141d1245e2a89 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 22 Jan 2016 09:36:37 -0800 Subject: [PATCH 0350/4996] collections.feature: check for 0 exit status always --- features/collections.feature | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features/collections.feature b/features/collections.feature index 90715b57cd0..ad17a896b99 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -168,7 +168,8 @@ Feature: Collections output: true """ When I run jekyll build - Then the _site directory should exist + Then I should get a zero exit status + And the _site directory should exist And I should see "Thanksgiving Black Friday" in "_site/index.html" And I should see "Happy Thanksgiving" in "_site/thanksgiving/2015-11-26-thanksgiving.html" And I should see "Black Friday" in "_site/thanksgiving/black-friday.html" From 5878acaaf1a0e0883364143abde32447b4f2f771 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 22 Jan 2016 09:36:55 -0800 Subject: [PATCH 0351/4996] Document#post_read: only overwrite slug & ext if they aren't set by YAML --- lib/jekyll/document.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index c6f3cb876d0..2840ba51078 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -290,18 +290,19 @@ def read(opts = {}) def post_read if relative_path =~ DATE_FILENAME_MATCHER - _, date, slug, ext = $1, $2, $3, $4 + date, slug, ext = $2, $3, $4 if !data['date'] || data['date'].to_i == site.time.to_i merge_data!({"date" => date}, source: "filename") end elsif relative_path =~ DATELESS_FILENAME_MATCHER - _, slug, ext = $1, $2, $3 + slug, ext = $2, $3 end - merge_data!({"slug" => slug, "ext" => ext}, source: "filename") - # Try to ensure the user gets a title. data["title"] ||= Utils.titleize_slug(slug) + # Only overwrite slug & ext if they aren't specified. + data['slug'] ||= slug + data['ext'] ||= ext populate_categories populate_tags From 2b8de5971725d4fb5404566f5d572cbe32ebf83a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 22 Jan 2016 09:38:34 -0800 Subject: [PATCH 0352/4996] remove merge conflict --- lib/jekyll/document.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 94def29b69d..2840ba51078 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -443,11 +443,7 @@ def method_missing(method, *args, &blck) super end end -<<<<<<< HEAD -======= - ->>>>>>> origin/pull/cleanup-document__post_read private # :nodoc: def generate_excerpt if generate_excerpt? From 6d67e9bdd4d5dda619109fd2175f4f9719424541 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Jan 2016 13:01:05 -0800 Subject: [PATCH 0353/4996] Update history to reflect merge of #4388 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f5b43d3264a..12834ca62aa 100644 --- a/History.markdown +++ b/History.markdown @@ -41,6 +41,7 @@ * Fix deep_merge_hashes! handling of drops and hashes (#4359) * Page should respect output extension of its permalink (#4373) * Disable auto-regeneration when running server detached (#4376) + * Drop#[]: only use public_send for keys in the content_methods array (#4388) ### Development Fixes From 4d138c9ab5a20eb762835e9fd1c580961434896d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Jan 2016 13:13:19 -0800 Subject: [PATCH 0354/4996] Update history to reflect merge of #4195 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 12834ca62aa..7f1c612d6b5 100644 --- a/History.markdown +++ b/History.markdown @@ -42,6 +42,7 @@ * Page should respect output extension of its permalink (#4373) * Disable auto-regeneration when running server detached (#4376) * Drop#[]: only use public_send for keys in the content_methods array (#4388) + * Extract title from filename successfully when no date. (#4195) ### Development Fixes From 4b827e1797844044c9077d16e258f2b5a4c6fc00 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 22 Jan 2016 13:15:41 -0800 Subject: [PATCH 0355/4996] Release :gem: 3.1.0.pre.rc3 --- lib/jekyll/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 394cef78fec..ee1f0d383e3 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.0.pre.rc2' + VERSION = '3.1.0.pre.rc3' end From 96b80b1a727a92cef0108684f263dc94aff817a1 Mon Sep 17 00:00:00 2001 From: John Perry Date: Sat, 23 Jan 2016 23:27:17 -0700 Subject: [PATCH 0356/4996] Minor spelling error --- site/_docs/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 5f1ba786584..4bcdd545cbb 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -870,7 +870,7 @@ LESS.js files during generation. - [File compressor](https://gist.github.com/2758691) by [mytharcher](https://github.com/mytharcher): Compress HTML and JavaScript files on site build. - [Jekyll-minibundle](https://github.com/tkareine/jekyll-minibundle): Asset bundling and cache busting using external minification tool of your choice. No gem dependencies. - [Singlepage-jekyll](https://github.com/JCB-K/singlepage-jekyll) by [JCB-K](https://github.com/JCB-K): Turns Jekyll into a dynamic one-page website. -- [generator-jekyllrb](https://github.com/robwierzbowski/generator-jekyllrb): A generator that wraps Jekyll in [Yeoman](http://yeoman.io/), a tool collection and workflow for builing modern web apps. +- [generator-jekyllrb](https://github.com/robwierzbowski/generator-jekyllrb): A generator that wraps Jekyll in [Yeoman](http://yeoman.io/), a tool collection and workflow for building modern web apps. - [grunt-jekyll](https://github.com/dannygarcia/grunt-jekyll): A straightforward [Grunt](http://gruntjs.com/) plugin for Jekyll. - [jekyll-postfiles](https://github.com/indirect/jekyll-postfiles): Add `_postfiles` directory and {% raw %}`{{ postfile }}`{% endraw %} tag so the files a post refers to will always be right there inside your repo. - [A layout that compresses HTML](http://jch.penibelst.de/): GitHub Pages compatible, configurable way to compress HTML files on site build. From ab8f2d6bb1cd582aaeb17d073f96b43ef7c60268 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 24 Jan 2016 08:40:31 -0600 Subject: [PATCH 0357/4996] Update History.markdown to reflect the merger of #4394 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7f1c612d6b5..749b03224c4 100644 --- a/History.markdown +++ b/History.markdown @@ -92,6 +92,7 @@ * Add @jmcglone's guide to github-pages doc page (#4364) * Added the Wordpress2Jekyll Wordpress plugin (#4377) * Add Contentful Extension to list of third-party plugins (#4390) + * Correct Minor spelling error (#4394) ## 3.0.2 / 2016-01-20 From c5818d18374b0b34d26a36013b964a5c64603ff5 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sun, 24 Jan 2016 09:50:02 -0600 Subject: [PATCH 0358/4996] Make our .travis.yml a little easier to maintain. --- .travis.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 29b0a836f47..5c6e585511d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,31 +1,31 @@ -bundler_args: --without benchmark:site:development before_script: bundle update +bundler_args: --without benchmark:site:development script: script/cibuild cache: bundler language: ruby sudo: false rvm: -- 2.0.0-p648 -- 2.1.8 -- 2.2.4 -- 2.3.0 -- jruby-9.0.4.0 -- ruby-head + - &ruby1 2.3.0 + - &ruby2 2.2.4 + - &ruby3 2.1.8 + - &ruby4 2.0.0-p648 + - &jruby jruby-9.0.4.0 + - &rhead ruby-head matrix: fast_finish: true allow_failures: - - rvm: jruby-9.0.4.0 - - rvm: ruby-head + - rvm: *jruby + - rvm: *rhead env: matrix: - - TEST_SUITE=test - - TEST_SUITE=cucumber + - TEST_SUITE=test + - TEST_SUITE=cucumber branches: only: - - master + - master notifications: irc: From 368f5b67a9a8947549b7e31a954d643018d536ce Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 24 Jan 2016 13:13:15 -0800 Subject: [PATCH 0359/4996] Release :gem: 3.1.0 --- History.markdown | 2 +- lib/jekyll/version.rb | 2 +- site/_docs/history.md | 101 ++++++++++++++++++ .../2016-01-23-jekyll-3-1-0-released.markdown | 50 +++++++++ site/latest_version.txt | 2 +- 5 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 site/_posts/2016-01-23-jekyll-3-1-0-released.markdown diff --git a/History.markdown b/History.markdown index 7f1c612d6b5..d03724b4b6c 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,4 @@ -## HEAD +## 3.1.0 / 2016-01-23 ### Minor Enhancements diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index ee1f0d383e3..b20df48404b 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.0.pre.rc3' + VERSION = '3.1.0' end diff --git a/site/_docs/history.md b/site/_docs/history.md index 7d1ff85d0bf..b05b18b0529 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -4,6 +4,107 @@ title: History permalink: "/docs/history/" --- +## 3.1.0 / 2016-01-23 +{: #v3-1-0} + +### Minor Enhancements +{: #minor-enhancements-v3-1-0} + +- Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` ([#4277]({{ site.repository }}/issues/4277)) +- Add 'sample' Liquid filter Equivalent to Array#sample functionality ([#4223]({{ site.repository }}/issues/4223)) +- Cache parsed include file to save liquid parsing time. ([#4120]({{ site.repository }}/issues/4120)) +- Slightly speed up url sanitization and handle multiples of ///. ([#4168]({{ site.repository }}/issues/4168)) +- Print debug message when a document is skipped from reading ([#4180]({{ site.repository }}/issues/4180)) +- Include tag should accept multiple variables in the include name ([#4183]({{ site.repository }}/issues/4183)) +- Add `-o` option to serve command which opens server URL ([#4144]({{ site.repository }}/issues/4144)) +- Add CodeClimate platform for better code quality. ([#4220]({{ site.repository }}/issues/4220)) +- General improvements for WEBrick via jekyll serve such as SSL & custom headers ([#4224]({{ site.repository }}/issues/4224), [#4228]({{ site.repository }}/issues/4228)) +- Add a default charset to content-type on webrick. ([#4231]({{ site.repository }}/issues/4231)) +- Switch `PluginManager` to use `require_with_graceful_fail` for better UX ([#4233]({{ site.repository }}/issues/4233)) +- Allow quoted date in front matter defaults ([#4184]({{ site.repository }}/issues/4184)) +- Add a Jekyll doctor warning for URLs that only differ by case ([#3171]({{ site.repository }}/issues/3171)) +- drops: create one base Drop class which can be set as mutable or not ([#4285]({{ site.repository }}/issues/4285)) +- drops: provide `#to_h` to allow for hash introspection ([#4281]({{ site.repository }}/issues/4281)) +- Shim subcommands with indication of gem possibly required so users know how to use them ([#4254]({{ site.repository }}/issues/4254)) +- Add smartify Liquid filter for SmartyPants ([#4323]({{ site.repository }}/issues/4323)) +- Raise error on empty permalink ([#4361]({{ site.repository }}/issues/4361)) +- Refactor Page#permalink method ([#4389]({{ site.repository }}/issues/4389)) + +### Bug Fixes +{: #bug-fixes-v3-1-0} + +- Pass build options into `clean` command ([#4177]({{ site.repository }}/issues/4177)) +- Allow users to use .htm and .xhtml (XHTML5.) ([#4160]({{ site.repository }}/issues/4160)) +- Prevent Shell Injection. ([#4200]({{ site.repository }}/issues/4200)) +- Convertible should make layout data accessible via `layout` instead of `page` ([#4205]({{ site.repository }}/issues/4205)) +- Avoid using `Dir.glob` with absolute path to allow special characters in the path ([#4150]({{ site.repository }}/issues/4150)) +- Handle empty config files ([#4052]({{ site.repository }}/issues/4052)) +- Rename `[@options](https://github.com/options)` so that it does not impact Liquid. ([#4173]({{ site.repository }}/issues/4173)) +- utils/drops: update Drop to support `Utils.deep_merge_hashes` ([#4289]({{ site.repository }}/issues/4289)) +- Make sure jekyll/drops/drop is loaded first. ([#4292]({{ site.repository }}/issues/4292)) +- Convertible/Page/Renderer: use payload hash accessor & setter syntax for backwards-compatibility ([#4311]({{ site.repository }}/issues/4311)) +- Drop: fix hash setter precendence ([#4312]({{ site.repository }}/issues/4312)) +- utils: `has_yaml_header?` should accept files with extraneous spaces ([#4290]({{ site.repository }}/issues/4290)) +- Escape html from site.title and page.title in site template ([#4307]({{ site.repository }}/issues/4307)) +- Allow custom file extensions if defined in `permalink` YAML front matter ([#4314]({{ site.repository }}/issues/4314)) +- Fix deep_merge_hashes! handling of drops and hashes ([#4359]({{ site.repository }}/issues/4359)) +- Page should respect output extension of its permalink ([#4373]({{ site.repository }}/issues/4373)) +- Disable auto-regeneration when running server detached ([#4376]({{ site.repository }}/issues/4376)) +- Drop#[]: only use public_send for keys in the content_methods array ([#4388]({{ site.repository }}/issues/4388)) +- Extract title from filename successfully when no date. ([#4195]({{ site.repository }}/issues/4195)) + +### Development Fixes +{: #development-fixes-v3-1-0} + +- `jekyll-docs` should be easily release-able ([#4152]({{ site.repository }}/issues/4152)) +- Allow use of Cucumber 2.1 or greater ([#4181]({{ site.repository }}/issues/4181)) +- Modernize Kramdown for Markdown converter. ([#4109]({{ site.repository }}/issues/4109)) +- Change TestDoctorCommand to JekyllUnitTest... ([#4263]({{ site.repository }}/issues/4263)) +- Create namespaced rake tasks in separate `.rake` files under `lib/tasks` ([#4282]({{ site.repository }}/issues/4282)) +- markdown: refactor for greater readability & efficiency ([#3771]({{ site.repository }}/issues/3771)) +- Fix many Rubocop style errors ([#4301]({{ site.repository }}/issues/4301)) +- Fix spelling of "GitHub" in docs and history ([#4322]({{ site.repository }}/issues/4322)) +- Reorganize and cleanup the Gemfile, shorten required depends. ([#4318]({{ site.repository }}/issues/4318)) +- Remove script/rebund. ([#4341]({{ site.repository }}/issues/4341)) +- Implement codeclimate platform ([#4340]({{ site.repository }}/issues/4340)) +- Remove ObectSpace dumping and start using inherited, it's faster. ([#4342]({{ site.repository }}/issues/4342)) +- Add script/travis so all people can play with Travis-CI images. ([#4338]({{ site.repository }}/issues/4338)) +- Move Cucumber to using RSpec-Expections and furthering JRuby support. ([#4343]({{ site.repository }}/issues/4343)) +- Rearrange Cucumber and add some flair. ([#4347]({{ site.repository }}/issues/4347)) +- Remove old FIXME ([#4349]({{ site.repository }}/issues/4349)) +- Clean up the Gemfile (and keep all the necessary dependencies) ([#4350]({{ site.repository }}/issues/4350)) + +### Site Enhancements +{: #site-enhancements-v3-1-0} + +- Add three plugins to directory ([#4163]({{ site.repository }}/issues/4163)) +- Add upgrading docs from 2.x to 3.x ([#4157]({{ site.repository }}/issues/4157)) +- Add `protect_email` to the plugins index. ([#4169]({{ site.repository }}/issues/4169)) +- Add `jekyll-deploy` to list of third-party plugins ([#4179]({{ site.repository }}/issues/4179)) +- Clarify plugin docs ([#4154]({{ site.repository }}/issues/4154)) +- Add Kickster to deployment methods in documentation ([#4190]({{ site.repository }}/issues/4190)) +- Add DavidBurela's tutorial for Windows to Windows docs page ([#4210]({{ site.repository }}/issues/4210)) +- Change GitHub code block to highlight tag to avoid it overlaps parent div ([#4121]({{ site.repository }}/issues/4121)) +- Update FormKeep link to be something more specific to Jekyll ([#4243]({{ site.repository }}/issues/4243)) +- Remove example Roger Chapman site, as the domain doesn't exist ([#4249]({{ site.repository }}/issues/4249)) +- Added configuration options for `draft_posts` to configuration docs ([#4251]({{ site.repository }}/issues/4251)) +- Fix checklist in `_assets.md` ([#4259]({{ site.repository }}/issues/4259)) +- Add Markdown examples to Pages docs ([#4275]({{ site.repository }}/issues/4275)) +- Add jekyll-paginate-category to list of third-party plugins ([#4273]({{ site.repository }}/issues/4273)) +- Add `jekyll-responsive_image` to list of third-party plugins ([#4286]({{ site.repository }}/issues/4286)) +- Add `jekyll-commonmark` to list of third-party plugins ([#4299]({{ site.repository }}/issues/4299)) +- Add documentation for incremental regeneration ([#4293]({{ site.repository }}/issues/4293)) +- Add note about removal of relative permalink support in upgrading docs ([#4303]({{ site.repository }}/issues/4303)) +- Add Pro Tip to use front matter variable to create clean URLs ([#4296]({{ site.repository }}/issues/4296)) +- Fix grammar in the documentation for posts. ([#4330]({{ site.repository }}/issues/4330)) +- Add documentation for smartify Liquid filter ([#4333]({{ site.repository }}/issues/4333)) +- Fixed broken link to blog on using mathjax with jekyll ([#4344]({{ site.repository }}/issues/4344)) +- Documentation: correct reference in Precedence section of Configuration docs ([#4355]({{ site.repository }}/issues/4355)) +- Add [@jmcglone](https://github.com/jmcglone)'s guide to github-pages doc page ([#4364]({{ site.repository }}/issues/4364)) +- Added the Wordpress2Jekyll Wordpress plugin ([#4377]({{ site.repository }}/issues/4377)) +- Add Contentful Extension to list of third-party plugins ([#4390]({{ site.repository }}/issues/4390)) + + ## 3.0.2 / 2016-01-20 {: #v3-0-2} diff --git a/site/_posts/2016-01-23-jekyll-3-1-0-released.markdown b/site/_posts/2016-01-23-jekyll-3-1-0-released.markdown new file mode 100644 index 00000000000..4acec55cb4d --- /dev/null +++ b/site/_posts/2016-01-23-jekyll-3-1-0-released.markdown @@ -0,0 +1,50 @@ +--- +layout: news_item +title: 'Jekyll 3.1.0 Released' +date: 2016-01-23 17:32:12 -0800 +author: parkr +version: 3.1.0 +categories: [release] +--- + +Happy weekend! To make your weekend all the better, we have just released +v3.1.0 of Jekyll. + +There are _lots_ of great performance improvements, including a huge one +which is to use Liquid drops instead of hashes. Much of the slowness in +Jekyll is due to Jekyll making lots of objects it doesn't need to make. +By making these objects only as they're needed, we can speed up Jekyll +considerably! + +Some other highlights: + +* Fix: `permalink`s with non-HTML extensions will not be honored +* Fix: `jekyll clean` now accepts build flags like `--source`. +* Enhancement: `include` tags can now accept multiple liquid variables +* Feature: adds new `sample` liquid tag which gets random element from an array +* Fix: Jekyll will read in files with YAML front matter that has extraneous +spaces after the first line +* Enhancement: extract the `title` attribute from the filename for +collection items without a date +* Fix: gracefully handle empty configuration files + +... and [a whole bunch more](/docs/history/#v3-1-0)! + +Please [file a bug]({{ site.repository }}/issues/new?title=Jekyll+3.1.0+Issue:) +if you encounter any issues! As always, [Jekyll Talk](https://talk.jekyllrb.com) +is the best place to get help if you're encountering a problem. + +Special thanks to all our amazing contributors who helped make v3.1.0 a +possibility: + +Alex J Best, Alexander Köplinger, Alfred Xing, Alistair Calder, Atul +Bhosale, Ben Orenstein, Chi Trung Nguyen, Conor O'Callaghan, Craig P. +Motlin, Dan K, David Burela, David Litvak Bruno, Decider UI, Ducksan Cho, +Florian Thomas, James Wen, Jordon Bedwell, Joseph Wynn, Kakoma, Liam +Bowers, Mike Neumegen, Nick Quaranto, Nielsen Ramon, Olivér Falvai, Pat +Hawks, Paul Robert Lloyd, Pedro Euko, Peter Suschlik, Sam Volin, Samuel +Wright, Sasha Friedenberg, Tim Cuthbertson, Vincent Wochnik, William +Entriken, Zshawn Syed, chrisfinazzo, ducksan cho, leethomas, +midnightSuyama, musoke, and rebornix + +Happy Jekylling! diff --git a/site/latest_version.txt b/site/latest_version.txt index cb2b00e4f7a..fd2a01863fd 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -3.0.1 +3.1.0 From 778fa4cc0eab5df12de73927d89df4f09e48b2c2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 24 Jan 2016 13:13:53 -0800 Subject: [PATCH 0360/4996] Release :gem: 3.1.0 From 29da9024ca339193cada226a8915e5e83fe9af25 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 24 Jan 2016 13:17:38 -0800 Subject: [PATCH 0361/4996] Today, not yesterday. --- site/_docs/history.md | 1 + ...eased.markdown => 2016-01-24-jekyll-3-1-0-released.markdown} | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) rename site/_posts/{2016-01-23-jekyll-3-1-0-released.markdown => 2016-01-24-jekyll-3-1-0-released.markdown} (98%) diff --git a/site/_docs/history.md b/site/_docs/history.md index b05b18b0529..e93521e7736 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -103,6 +103,7 @@ permalink: "/docs/history/" - Add [@jmcglone](https://github.com/jmcglone)'s guide to github-pages doc page ([#4364]({{ site.repository }}/issues/4364)) - Added the Wordpress2Jekyll Wordpress plugin ([#4377]({{ site.repository }}/issues/4377)) - Add Contentful Extension to list of third-party plugins ([#4390]({{ site.repository }}/issues/4390)) +- Correct Minor spelling error ([#4394]({{ site.repository }}/issues/4394)) ## 3.0.2 / 2016-01-20 diff --git a/site/_posts/2016-01-23-jekyll-3-1-0-released.markdown b/site/_posts/2016-01-24-jekyll-3-1-0-released.markdown similarity index 98% rename from site/_posts/2016-01-23-jekyll-3-1-0-released.markdown rename to site/_posts/2016-01-24-jekyll-3-1-0-released.markdown index 4acec55cb4d..42768b9fe3e 100644 --- a/site/_posts/2016-01-23-jekyll-3-1-0-released.markdown +++ b/site/_posts/2016-01-24-jekyll-3-1-0-released.markdown @@ -1,7 +1,7 @@ --- layout: news_item title: 'Jekyll 3.1.0 Released' -date: 2016-01-23 17:32:12 -0800 +date: 2016-01-24 13:16:12 -0800 author: parkr version: 3.1.0 categories: [release] From e940dd1be42a58da0bf383be03fe80b8aeee927f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 25 Jan 2016 14:09:22 -0800 Subject: [PATCH 0362/4996] Site: make github-pages project page url structure refer to site.github.url --- site/_docs/github-pages.md | 48 +++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/site/_docs/github-pages.md b/site/_docs/github-pages.md index 03d83b35bf2..add661c39e4 100644 --- a/site/_docs/github-pages.md +++ b/site/_docs/github-pages.md @@ -15,6 +15,26 @@ Jonathan McGlone to get you up and running](http://jmcglone.com/guides/github-pa This guide will teach you what you need to know about Git, GitHub, and Jekyll to create your very own website on GitHub Pages. +### Project Page URL Structure + +Sometimes it's nice to preview your Jekyll site before you push your `gh-pages` +branch to GitHub. However, the subdirectory-like URL structure GitHub uses for +Project Pages complicates the proper resolution of URLs. In order to assure your +site builds properly, use `site.github.url` in your URL's. + +{% highlight html %} +{% raw %} + + + +{{ page.title }} +{% endraw %} +{% endhighlight %} + +This way you can preview your site locally from the site root on localhost, +but when GitHub generates your pages from the gh-pages branch all the URLs +will resolve properly. + ## Deploying Jekyll to GitHub Pages GitHub Pages work by looking at certain branches of repositories on GitHub. @@ -101,38 +121,12 @@ GitHub Pages
    GitHub Pages Documentation, Help, and Support

    For more information about what you can do with GitHub Pages, as well as for troubleshooting guides, you should check out GitHub’s Pages Help + href="https://help.github.com/categories/github-pages-basics/">GitHub’s Pages Help section. If all else fails, you should contact GitHub Support.

    From d7ff4234f0f311979225bb718a73e5c2aa84f8d6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 25 Jan 2016 14:48:28 -0800 Subject: [PATCH 0363/4996] Renderer#output_ext: honor folders when looking for ext Previously, even if the document permalink was a folder, it would look for an extension on that. For example, if I have: permalink: "/new-version-jekyll-v3.0.0/" the output_ext would be ".0". Now, the output_ext honors the trailing slash and will report based on the converters instead. --- lib/jekyll/renderer.rb | 2 +- .../_with.dots/permalink.with.slash.tho.md | 5 +++ test/test_collections.rb | 2 +- test/test_document.rb | 35 +++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 test/source/_with.dots/permalink.with.slash.tho.md diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index c7b6042b538..09815a600f8 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -168,7 +168,7 @@ def place_in_layouts(content, payload, info) private def permalink_ext - if document.permalink + if document.permalink && !document.permalink.end_with?("/") permalink_ext = File.extname(document.permalink) permalink_ext unless permalink_ext.empty? end diff --git a/test/source/_with.dots/permalink.with.slash.tho.md b/test/source/_with.dots/permalink.with.slash.tho.md new file mode 100644 index 00000000000..71b9b2e44a5 --- /dev/null +++ b/test/source/_with.dots/permalink.with.slash.tho.md @@ -0,0 +1,5 @@ +--- +permalink: /with.dots/permalink.with.slash.tho/ +--- + +I'm a file with dots BUT I have a permalink which ends with a slash. diff --git a/test/test_collections.rb b/test/test_collections.rb index be3a932053c..138bed6bb6b 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -203,7 +203,7 @@ class TestCollections < JekyllUnitTest end should "contain one document" do - assert_equal 2, @collection.docs.size + assert_equal 3, @collection.docs.size end should "allow dots in the filename" do diff --git a/test/test_document.rb b/test/test_document.rb index 7c6f7bef6b8..1197c4da941 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -207,6 +207,10 @@ def assert_equal_value(key, one, other) should "produce the right destination file" do assert_equal @dest_file, @document.destination(dest_dir) end + + should "honor the output extension of its permalink" do + assert_equal ".html", @document.output_ext + end end context "a document in a collection with pretty permalink style" do @@ -267,6 +271,10 @@ def assert_equal_value(key, one, other) @dest_file = dest_dir("slides/example-slide-7.php") end + should "be written out properly" do + assert_exist @dest_file + end + should "produce the permalink as the url" do assert_equal "/slides/example-slide-7.php", @document.url end @@ -274,6 +282,10 @@ def assert_equal_value(key, one, other) should "be written to the proper directory" do assert_equal @dest_file, @document.destination(dest_dir) end + + should "honor the output extension of its permalink" do + assert_equal ".php", @document.output_ext + end end context "documents in a collection with custom title permalinks" do @@ -318,6 +330,29 @@ def assert_equal_value(key, one, other) end end + context "document with a permalink with dots & a trailing slash" do + setup do + @site = fixture_site({"collections" => { + "with.dots" => { "output" => true } + }}) + @site.process + @document = @site.collections["with.dots"].docs.last + @dest_file = dest_dir("with.dots", "permalink.with.slash.tho", "index.html") + end + + should "yield an HTML document" do + assert_equal @dest_file, @document.destination(dest_dir) + end + + should "be written properly" do + assert_exist @dest_file + end + + should "get the right output_ext" do + assert_equal ".html", @document.output_ext + end + end + context "documents in a collection" do setup do @site = fixture_site({ From 74fb4aca1616fb8c907357505bcfbfd4072c0277 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 25 Jan 2016 15:49:23 -0800 Subject: [PATCH 0364/4996] Update history to reflect merge of #4401 [ci skip] --- History.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/History.markdown b/History.markdown index 28c16468c16..15cda096640 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,9 @@ +## HEAD + +### Development Fixes + + * Renderer#output_ext: honor folders when looking for ext (#4401) + ## 3.1.0 / 2016-01-23 ### Minor Enhancements From ea5e3d56f544bee22b7f2bbfb6227c9892cb4981 Mon Sep 17 00:00:00 2001 From: David Celis Date: Mon, 25 Jan 2016 18:24:27 -0800 Subject: [PATCH 0365/4996] Update the Code of Conduct to the latest version The Contributor Code of Conduct is now at version 1.3.0 and has several changes. Many of these are simply wording changes, but an important note is added that project maintainers must maintain confidentiality when dealing with any code of conduct violations. Additionally, a note is added that states violations will be investigated and dealt with in a way that is deemed necessary and appropriate based on the circumstances. Signed-off-by: David Celis --- CONDUCT.md | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/CONDUCT.md b/CONDUCT.md index 65c05c57488..a0f06de773a 100644 --- a/CONDUCT.md +++ b/CONDUCT.md @@ -1,8 +1,14 @@ # Contributor Code of Conduct -As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. +As contributors and maintainers of this project, and in the interest of +fostering an open and welcoming community, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating +documentation, submitting pull requests or patches, and other activities. -We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality. +We are committed to making participation in this project a harassment-free +experience for everyone, regardless of level of experience, gender, gender +identity and expression, sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. Examples of unacceptable behavior by participants include: @@ -10,13 +16,34 @@ Examples of unacceptable behavior by participants include: * Personal attacks * Trolling or insulting/derogatory comments * Public or private harassment -* Publishing other's private information, such as physical or electronic addresses, without explicit permission -* Other unethical or unprofessional conduct. +* Publishing other's private information, such as physical or electronic + addresses, without explicit permission +* Other unethical or unprofessional conduct -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team. +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. -This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. +By adopting this Code of Conduct, project maintainers commit themselves to +fairly and consistently applying these principles to every aspect of managing +this project. Project maintainers who do not follow or enforce the Code of +Conduct may be permanently removed from the project team. -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. -This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) \ No newline at end of file +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by opening an issue or contacting a project maintainer. All complaints +will be reviewed and investigated and will result in a response that is deemed +necessary and appropriate to the circumstances. Maintainers are obligated to +maintain confidentiality with regard to the reporter of an incident. + + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.3.0, available at +[http://contributor-covenant.org/version/1/3/0/][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/3/0/ From ce77fe648874a8a0fa21d855bdfd6b369dc89155 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 26 Jan 2016 06:55:55 -0600 Subject: [PATCH 0366/4996] Update history.markdown to reflect the merger of #4402 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 15cda096640..304bd7c877d 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ ### Minor Enhancements + * Update the Code of Conduct to the latest version (#4402) * Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` (#4277) * Add 'sample' Liquid filter Equivalent to Array#sample functionality (#4223) * Cache parsed include file to save liquid parsing time. (#4120) From 38b64faeb2823cbf0927193f28bf83673ba4cd93 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 26 Jan 2016 16:44:30 -0800 Subject: [PATCH 0367/4996] Page#dir: ensure it ends in a slash --- lib/jekyll/page.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index eda87f12346..6bdfb6bc46e 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -55,7 +55,9 @@ def initialize(site, base, dir, name) # # Returns the String destination directory. def dir - url[-1, 1] == '/' ? url : File.dirname(url) + dest_dir = url[-1, 1] == '/' ? url : File.dirname(url) + dest_dir << '/' unless dest_dir.end_with?('/') + dest_dir end # The full path and filename of the post. Defined in the YAML of the post From aad54c9a8792ccf4b606cf0d2d4309ee902c65de Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 26 Jan 2016 17:08:54 -0800 Subject: [PATCH 0368/4996] Add Utils.merged_file_read_opts to unify reading & strip the BOM --- lib/jekyll/convertible.rb | 8 +------- lib/jekyll/document.rb | 12 +----------- lib/jekyll/utils.rb | 10 ++++++++++ test/test_utils.rb | 17 +++++++++++++++++ 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 383bb024dc0..f58796f0be0 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -28,12 +28,6 @@ def published? !(data.key?('published') && data['published'] == false) end - # Returns merged option hash for File.read of self.site (if exists) - # and a given param - def merged_file_read_opts(opts) - (site ? site.file_read_opts : {}).merge(opts) - end - # Read the YAML frontmatter. # # base - The String path to the dir containing the file. @@ -46,7 +40,7 @@ def read_yaml(base, name, opts = {}) begin self.content = File.read(site.in_source_dir(base, name), - merged_file_read_opts(opts)) + Utils.merged_file_read_opts(site, opts)) if content =~ /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m self.content = $POSTMATCH self.data = SafeYAML.load(Regexp.last_match(1)) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 2840ba51078..fc3633d8e09 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -237,16 +237,6 @@ def write(dest) trigger_hooks(:post_write) end - # Returns merged option hash for File.read of self.site (if exists) - # and a given param - # - # opts - override options - # - # Return the file read options hash. - def merged_file_read_opts(opts) - site ? site.file_read_opts.merge(opts) : opts - end - # Whether the file is published or not, as indicated in YAML front-matter # # Returns true if the 'published' key is specified in the YAML front-matter and not `false`. @@ -269,7 +259,7 @@ def read(opts = {}) defaults = @site.frontmatter_defaults.all(url, collection.label.to_sym) merge_data!(defaults, source: "front matter defaults") unless defaults.empty? - self.content = File.read(path, merged_file_read_opts(opts)) + self.content = File.read(path, Utils.merged_file_read_opts(site, opts)) if content =~ YAML_FRONT_MATTER_REGEXP self.content = $POSTMATCH data_file = SafeYAML.load(Regexp.last_match(1)) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 6dd2b117f94..e5d45c6d5e6 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -273,5 +273,15 @@ def safe_glob(dir, patterns, flags = 0) end end + # Returns merged option hash for File.read of self.site (if exists) + # and a given param + def merged_file_read_opts(site, opts) + merged = (site ? site.file_read_opts : {}).merge(opts) + if merged["encoding"] && !merged["encoding"].start_with?("bom|") + merged["encoding"].insert(0, "bom|") + end + merged + end + end end diff --git a/test/test_utils.rb b/test/test_utils.rb index d3720127098..a2335391dbe 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -276,4 +276,21 @@ class TestUtils < JekyllUnitTest refute Utils.has_yaml_header?(file) end end + + context "The \`Utils.merged_file_read_opts\` method" do + should "ignore encoding if it's not there" do + opts = Utils.merged_file_read_opts(nil, {}) + assert_nil opts["encoding"] + end + + should "add bom to encoding" do + opts = Utils.merged_file_read_opts(nil, { "encoding" => "utf-8" }) + assert_equal "bom|utf-8", opts["encoding"] + end + + should "preserve bom in encoding" do + opts = Utils.merged_file_read_opts(nil, { "encoding" => "bom|utf-8" }) + assert_equal "bom|utf-8", opts["encoding"] + end + end end From b70ee10198d0d43187b8071e838194a6cb90cc28 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 27 Jan 2016 08:28:41 -0800 Subject: [PATCH 0369/4996] Add benchmarks for Page#dir --- benchmark/end-with-vs-regexp | 2 + benchmark/file-dir-ensure-trailing-slash | 54 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 benchmark/file-dir-ensure-trailing-slash diff --git a/benchmark/end-with-vs-regexp b/benchmark/end-with-vs-regexp index cb849f42267..76f0312b93b 100644 --- a/benchmark/end-with-vs-regexp +++ b/benchmark/end-with-vs-regexp @@ -4,10 +4,12 @@ Benchmark.ips do |x| path_without_ending_slash = '/some/very/very/long/path/to/a/file/i/like' x.report('no slash regexp') { path_without_ending_slash =~ /\/$/ } x.report('no slash end_with?') { path_without_ending_slash.end_with?("/") } + x.report('no slash [-1, 1]') { path_without_ending_slash[-1, 1] == "/" } end Benchmark.ips do |x| path_with_ending_slash = '/some/very/very/long/path/to/a/file/i/like/' x.report('slash regexp') { path_with_ending_slash =~ /\/$/ } x.report('slash end_with?') { path_with_ending_slash.end_with?("/") } + x.report('slash [-1, 1]') { path_with_ending_slash[-1, 1] == "/" } end diff --git a/benchmark/file-dir-ensure-trailing-slash b/benchmark/file-dir-ensure-trailing-slash new file mode 100644 index 00000000000..aecfc039519 --- /dev/null +++ b/benchmark/file-dir-ensure-trailing-slash @@ -0,0 +1,54 @@ +#!/usr/bin/env ruby +require 'benchmark/ips' + +# For this pull request, which changes Page#dir +# https://github.com/jekyll/jekyll/pull/4403 + +FORWARD_SLASH = '/'.freeze + +def pre_pr(url) + url[-1, 1] == FORWARD_SLASH ? url : File.dirname(url) +end + +def pr(url) + if url.end_with?(FORWARD_SLASH) + url + else + url_dir = File.dirname(url) + url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/" + end +end + +def envygeeks(url) + return url if url.end_with?(FORWARD_SLASH) || url == FORWARD_SLASH + + url = File.dirname(url) + url == FORWARD_SLASH ? url : "#{url}/" +end + +# Just a slash +Benchmark.ips do |x| + path = '/' + x.report("pre_pr:#{path}") { pre_pr(path) } + x.report("pr:#{path}") { pr(path) } + x.report("envygeeks:#{path}") { pr(path) } + x.compare! +end + +# No trailing slash +Benchmark.ips do |x| + path = '/some/very/very/long/path/to/a/file/i/like' + x.report("pre_pr:#{path}") { pre_pr(path) } + x.report("pr:#{path}") { pr(path) } + x.report("envygeeks:#{path}") { pr(path) } + x.compare! +end + +# No trailing slash +Benchmark.ips do |x| + path = '/some/very/very/long/path/to/a/file/i/like/' + x.report("pre_pr:#{path}") { pre_pr(path) } + x.report("pr:#{path}") { pr(path) } + x.report("envygeeks:#{path}") { pr(path) } + x.compare! +end From 9daebe8dd253156893829cec335a18f8a2849bbb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 27 Jan 2016 08:28:47 -0800 Subject: [PATCH 0370/4996] Use improved Page#dir --- lib/jekyll/page.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 6bdfb6bc46e..6c402ee37d9 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -9,6 +9,8 @@ class Page alias_method :extname, :ext + FORWARD_SLASH = '/'.freeze + # Attributes for Liquid templates ATTRIBUTES_FOR_LIQUID = %w( content @@ -55,9 +57,12 @@ def initialize(site, base, dir, name) # # Returns the String destination directory. def dir - dest_dir = url[-1, 1] == '/' ? url : File.dirname(url) - dest_dir << '/' unless dest_dir.end_with?('/') - dest_dir + if url.end_with?(FORWARD_SLASH) + url + else + url_dir = File.dirname(url) + url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/" + end end # The full path and filename of the post. Defined in the YAML of the post From b1868983c778b3a056b87a35300fa6f95daf2c6e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 27 Jan 2016 08:44:59 -0800 Subject: [PATCH 0371/4996] Add test for Page#dir in :date/nil modes --- test/test_page.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/test/test_page.rb b/test/test_page.rb index 69794107c50..8930095db87 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -150,6 +150,12 @@ def do_render(page) assert_equal '/contacts.html', @page.url assert_equal @dest_file, @page.destination(dest_dir) end + + should "return dir correctly" do + assert_equal '/', setup_page('contacts.html').dir + assert_equal '/contacts/', setup_page('contacts/bar.html').dir + assert_equal '/contacts/', setup_page('contacts/index.html').dir + end end context "with custom permalink style with trailing slash" do @@ -194,8 +200,9 @@ def do_render(page) context "with any other permalink style" do should "return dir correctly" do @site.permalink_style = nil - @page = setup_page('contacts.html') - assert_equal '/', @page.dir + assert_equal '/', setup_page('contacts.html').dir + assert_equal '/contacts/', setup_page('contacts/index.html').dir + assert_equal '/contacts/', setup_page('contacts/bar.html').dir end end From e898b6e8bd8ae6a28bbf92b943f7ebb680c4ff3f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 27 Jan 2016 11:01:26 -0800 Subject: [PATCH 0372/4996] Update history to reflect merge of #4403 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 304bd7c877d..8e1844b2b84 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,9 @@ ## HEAD +### Bug Fixes + + * Page#dir: ensure it ends in a slash (#4403) + ### Development Fixes * Renderer#output_ext: honor folders when looking for ext (#4401) From 5fc48ffcb96f7880b036ea02e8794d975bd74082 Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Wed, 27 Jan 2016 13:41:40 -0800 Subject: [PATCH 0373/4996] Suppress stdout in liquid profiling test The test was spewing out some whitespace --- test/test_site.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/test_site.rb b/test/test_site.rb index e0883b49f90..c06c218e60c 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -465,6 +465,14 @@ def convert(*args) @site = Site.new(site_configuration('profile' => true)) end + # Suppress output while testing + setup do + $stdout = StringIO.new + end + teardown do + $stdout = STDOUT + end + should "print profile table" do expect(@site.liquid_renderer).to receive(:stats_table) @site.process From 6c4a1bf00ed3ec0fa9508b53b3e7cd19e5da6166 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Wed, 27 Jan 2016 22:22:12 -0500 Subject: [PATCH 0374/4996] Docs: Quickstart - added documentation about the `--force` option if directory is not empty --- site/_docs/quickstart.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/quickstart.md b/site/_docs/quickstart.md index d8ad5511943..8f5ffe8a96e 100644 --- a/site/_docs/quickstart.md +++ b/site/_docs/quickstart.md @@ -14,8 +14,8 @@ For the impatient, here's how to get a boilerplate Jekyll site up and running. # => Now browse to http://localhost:4000 {% endhighlight %} -If you wish to install jekyll into the current directory, you can do so by -alternatively running `jekyll new .` instead of a new directory name. +If you wish to install jekyll into an existing directory, you can do so by +alternatively running `jekyll new .` from within the directory instead of creating a new one. If the existing directory isn't empty, you'll also have to pass the `--force` option like so `jekyll new . --force`. That's nothing, though. The real magic happens when you start creating blog posts, using the front matter to control templates and layouts, and taking From 8592aed284cc13ed6d86165ef99be44edd91fbd7 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Thu, 28 Jan 2016 10:45:16 -0500 Subject: [PATCH 0375/4996] Small style fix --- site/_docs/assets.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/assets.md b/site/_docs/assets.md index 66023147b87..10f094bd5bd 100644 --- a/site/_docs/assets.md +++ b/site/_docs/assets.md @@ -86,7 +86,7 @@ here, too. To enable Coffeescript in Jekyll 3.0 and up you must * Install the `jekyll-coffeescript` gem -* Ensure that your `_config.yml` is up-to-date and includes the following +* Ensure that your `_config.yml` is up-to-date and includes the following: {% highlight yaml %} gems: From 5d126350d68810fe738529f55558642f6e95a37d Mon Sep 17 00:00:00 2001 From: Kroum Tzanev Date: Thu, 28 Jan 2016 22:20:40 +0100 Subject: [PATCH 0376/4996] Correct indent in yaml preamble --- site/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index f4327d3597c..4e78ab7ad9c 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -489,7 +489,7 @@ With these defaults, all posts would use the `my-site` layout. Any html files th {% highlight yaml %} collections: - my_collection: - output: true + output: true defaults: - From 0deae96a7503bfddb9e8232c1dc7f7803ccebbf2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 28 Jan 2016 14:21:41 -0800 Subject: [PATCH 0377/4996] Update history to reflect merge of #4409 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8e1844b2b84..28d061de481 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ ### Development Fixes * Renderer#output_ext: honor folders when looking for ext (#4401) + * Suppress stdout in liquid profiling test (#4409) ## 3.1.0 / 2016-01-23 From eb5be62cba5b6ab3eadcbf154a2958fd59ea3f14 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 28 Jan 2016 17:19:06 -0800 Subject: [PATCH 0378/4996] Upgrade 2-3 docs, include note about getting one single collection Yay, @pathawks! https://github.com/jekyll/jekyll/issues/4392#issuecomment-174369983 --- site/_docs/history.md | 1 + site/_docs/upgrading/2-to-3.md | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/site/_docs/history.md b/site/_docs/history.md index e93521e7736..ab87f5698f5 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -10,6 +10,7 @@ permalink: "/docs/history/" ### Minor Enhancements {: #minor-enhancements-v3-1-0} +- Update the Code of Conduct to the latest version ([#4402]({{ site.repository }}/issues/4402)) - Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` ([#4277]({{ site.repository }}/issues/4277)) - Add 'sample' Liquid filter Equivalent to Array#sample functionality ([#4223]({{ site.repository }}/issues/4223)) - Cache parsed include file to save liquid parsing time. ([#4120]({{ site.repository }}/issues/4120)) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index e3529f63164..d3ff4a38781 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -32,6 +32,16 @@ A simple conversion must be made in your templates: When iterating over `site.collections`, ensure the above conversions are made. +For `site.collections.myCollection` in Jekyll 2, you now do: + +{% highlight liquid %} +{% raw %} +{% assign myCollection = site.collections | where: "label", "myCollection" | first %} +{% endraw %} +{% endhighlight %} + +This is a bit cumbersome at first, but is easier than a big `for` loop. + ### Dropped dependencies We dropped a number of dependencies the Core Team felt were optional. As such, in 3.0, they must be explicitly installed and included if you use any of the features. They are: From 1d1ffdff9b5d655bf0a65ca8ee0cef38e9c88615 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 28 Jan 2016 17:20:34 -0800 Subject: [PATCH 0379/4996] Update history to reflect merge of #4404 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 28d061de481..e25582710b1 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Bug Fixes * Page#dir: ensure it ends in a slash (#4403) + * Add Utils.merged_file_read_opts to unify reading & strip the BOM (#4404) ### Development Fixes From bfee5c5b59166ee7405e8147d1f38c836156d406 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 28 Jan 2016 20:36:51 -0800 Subject: [PATCH 0380/4996] Release :gem: v3.1.1 --- History.markdown | 13 +++-- lib/jekyll/version.rb | 2 +- rake/site.rake | 27 ++++++++- site/_data/docs.yml | 1 + site/_docs/conduct.md | 55 +++++++++++++++++++ site/_docs/history.md | 21 ++++++- .../2016-01-28-jekyll-3-1-1-released.markdown | 31 +++++++++++ 7 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 site/_docs/conduct.md create mode 100644 site/_posts/2016-01-28-jekyll-3-1-1-released.markdown diff --git a/History.markdown b/History.markdown index e25582710b1..ecbd1794bb2 100644 --- a/History.markdown +++ b/History.markdown @@ -1,20 +1,23 @@ -## HEAD +## 3.1.1 / 2016-01-29 + +### Meta + + * Update the Code of Conduct to the latest version (#4402) ### Bug Fixes - * Page#dir: ensure it ends in a slash (#4403) - * Add Utils.merged_file_read_opts to unify reading & strip the BOM (#4404) + * `Page#dir`: ensure it ends in a slash (#4403) + * Add `Utils.merged_file_read_opts` to unify reading & strip the BOM (#4404) + * `Renderer#output_ext`: honor folders when looking for ext (#4401) ### Development Fixes - * Renderer#output_ext: honor folders when looking for ext (#4401) * Suppress stdout in liquid profiling test (#4409) ## 3.1.0 / 2016-01-23 ### Minor Enhancements - * Update the Code of Conduct to the latest version (#4402) * Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` (#4277) * Add 'sample' Liquid filter Equivalent to Array#sample functionality (#4223) * Cache parsed include file to save liquid parsing time. (#4120) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index b20df48404b..925e0b442d8 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.0' + VERSION = '3.1.1' end diff --git a/rake/site.rake b/rake/site.rake index eb5b263b8d1..2a6f8186478 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -5,8 +5,10 @@ ############################################################################# namespace :site do + task :generated_pages => [:history, :version_file, :conduct] + desc "Generate and view the site locally" - task :preview => [:history, :version_file] do + task :preview => :generated_pages do require "launchy" require "jekyll" @@ -31,7 +33,7 @@ namespace :site do end desc "Generate the site" - task :generate => [:history, :version_file] do + task :generate => :generated_pages do require "jekyll" Jekyll::Commands::Build.process({ "source" => File.expand_path("site"), @@ -50,7 +52,7 @@ namespace :site do end desc "Commit the local site to the gh-pages branch and publish to GitHub Pages" - task :publish => [:history, :version_file] do + task :publish => :generated_pages do # Ensure the gh-pages dir exists so we can generate into it. puts "Checking for gh-pages dir..." unless File.exist?("./gh-pages") @@ -119,6 +121,25 @@ namespace :site do end end + desc "Copy the Code of Conduct" + task :conduct do + code_of_conduct = File.read("CONDUCT.md") + header, _, body = code_of_conduct.partition("\n\n") + front_matter = { + "layout" => "docs", + "title" => header.sub('# Contributor ', ''), + "permalink" => "/docs/conduct/", + "redirect_from" => "/conduct/index.html", + "editable" => false + } + Dir.chdir('site/_docs') do + File.open("conduct.md", "w") do |file| + file.write("#{front_matter.to_yaml}---\n\n") + file.write(body) + end + end + end + desc "Write the site latest_version.txt file" task :version_file do File.open('site/latest_version.txt', 'wb') { |f| f.puts(version) } unless version =~ /(beta|rc|alpha)/i diff --git a/site/_data/docs.yml b/site/_data/docs.yml index dcd9ac2cb35..7cb8519893c 100644 --- a/site/_data/docs.yml +++ b/site/_data/docs.yml @@ -45,4 +45,5 @@ - title: Meta docs: - contributing + - conduct - history diff --git a/site/_docs/conduct.md b/site/_docs/conduct.md new file mode 100644 index 00000000000..d25c32c9d86 --- /dev/null +++ b/site/_docs/conduct.md @@ -0,0 +1,55 @@ +--- +layout: docs +title: Code of Conduct +permalink: "/docs/conduct/" +redirect_from: "/conduct/index.html" +editable: false +--- + +As contributors and maintainers of this project, and in the interest of +fostering an open and welcoming community, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating +documentation, submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free +experience for everyone, regardless of level of experience, gender, gender +identity and expression, sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, such as physical or electronic + addresses, without explicit permission +* Other unethical or unprofessional conduct + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +By adopting this Code of Conduct, project maintainers commit themselves to +fairly and consistently applying these principles to every aspect of managing +this project. Project maintainers who do not follow or enforce the Code of +Conduct may be permanently removed from the project team. + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by opening an issue or contacting a project maintainer. All complaints +will be reviewed and investigated and will result in a response that is deemed +necessary and appropriate to the circumstances. Maintainers are obligated to +maintain confidentiality with regard to the reporter of an incident. + + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.3.0, available at +[http://contributor-covenant.org/version/1/3/0/][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/3/0/ diff --git a/site/_docs/history.md b/site/_docs/history.md index ab87f5698f5..7943203b12b 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -4,13 +4,32 @@ title: History permalink: "/docs/history/" --- +## 3.1.1 / 2016-01-29 +{: #v3-1-1} + +### Meta + +- Update the Code of Conduct to the latest version ([#4402]({{ site.repository }}/issues/4402)) + +### Bug Fixes +{: #bug-fixes-v3-1-1} + +- `Page#dir`: ensure it ends in a slash ([#4403]({{ site.repository }}/issues/4403)) +- Add `Utils.merged_file_read_opts` to unify reading & strip the BOM ([#4404]({{ site.repository }}/issues/4404)) +- `Renderer#output_ext`: honor folders when looking for ext ([#4401]({{ site.repository }}/issues/4401)) + +### Development Fixes +{: #development-fixes-v3-1-1} + +- Suppress stdout in liquid profiling test ([#4409]({{ site.repository }}/issues/4409)) + + ## 3.1.0 / 2016-01-23 {: #v3-1-0} ### Minor Enhancements {: #minor-enhancements-v3-1-0} -- Update the Code of Conduct to the latest version ([#4402]({{ site.repository }}/issues/4402)) - Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` ([#4277]({{ site.repository }}/issues/4277)) - Add 'sample' Liquid filter Equivalent to Array#sample functionality ([#4223]({{ site.repository }}/issues/4223)) - Cache parsed include file to save liquid parsing time. ([#4120]({{ site.repository }}/issues/4120)) diff --git a/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown b/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown new file mode 100644 index 00000000000..cddabd22a30 --- /dev/null +++ b/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown @@ -0,0 +1,31 @@ +--- +layout: news_item +title: 'Jekyll 3.1.1 Released' +date: 2016-01-28 17:21:50 -0800 +author: parkr +version: 3.1.1 +categories: [release] +--- + +This release squashes a few bugs :bug: :bug: :bug: noticed by a few +wonderful Jekyll users: + +* If your `permalink` ended with a `/`, your URL didn't have any extension, +even if you wanted one +* We now strip the BOM by default per Ruby's `IO.open`. +* `page.dir` will not always end in a slash. + +We also updated our [Code of Conduct](/conduct/) to the latest version of +the Contributor Covenant. The update includes language to ensure that the +reporter of the incident remains confidential to non-maintainers and that +all complaints will result in an appropriate response. I care deeply about +Jekyll's community and will do everything in my power to ensure it is a +welcoming community. Feel free to reach out to me directly if you feel +there is a way we can improve the community for everyone! + +See links to the PR's on [the history page](/docs/history/#v3-1-1). + +Thanks to Jordon Bedwell, chrisfinazzo, Kroum Tzanev, David Celis, and +Alfred Xing for their commits on this latest release! :sparkles: + +Happy Jekylling! From 6fbd965509d2049bb34004e7f69a03baeda3498c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 28 Jan 2016 21:08:26 -0800 Subject: [PATCH 0381/4996] Update site/latest_version.txt --- site/_docs/conduct.md | 2 +- site/latest_version.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/conduct.md b/site/_docs/conduct.md index d25c32c9d86..8b9ac2c5041 100644 --- a/site/_docs/conduct.md +++ b/site/_docs/conduct.md @@ -2,7 +2,7 @@ layout: docs title: Code of Conduct permalink: "/docs/conduct/" -redirect_from: "/conduct/index.html" +redirect_from: "/conduct/" editable: false --- diff --git a/site/latest_version.txt b/site/latest_version.txt index fd2a01863fd..94ff29cc4de 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -3.1.0 +3.1.1 From 39ac364b2ccec3132df0a7cd6028eecdc695e6f7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 29 Jan 2016 15:12:17 -0800 Subject: [PATCH 0382/4996] CoC must be redirected from an HTML link due to bug in jekyll-redirect-from https://github.com/jekyll/jekyll-redirect-from/pull/96 --- site/_docs/conduct.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/conduct.md b/site/_docs/conduct.md index 8b9ac2c5041..d25c32c9d86 100644 --- a/site/_docs/conduct.md +++ b/site/_docs/conduct.md @@ -2,7 +2,7 @@ layout: docs title: Code of Conduct permalink: "/docs/conduct/" -redirect_from: "/conduct/" +redirect_from: "/conduct/index.html" editable: false --- From 9dc273ca50246afd3cf58fdd1b0640f6451b227c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 29 Jan 2016 15:12:29 -0800 Subject: [PATCH 0383/4996] Release :gem: 3.1.1 From 932d6641bcd0ce2ca61f5c186d9e7e8c02234eba Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 29 Jan 2016 16:00:04 -0800 Subject: [PATCH 0384/4996] Add link to diff between CoC's in release post. --- site/_posts/2016-01-28-jekyll-3-1-1-released.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown b/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown index cddabd22a30..18c693cfca4 100644 --- a/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown +++ b/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown @@ -21,7 +21,9 @@ reporter of the incident remains confidential to non-maintainers and that all complaints will result in an appropriate response. I care deeply about Jekyll's community and will do everything in my power to ensure it is a welcoming community. Feel free to reach out to me directly if you feel -there is a way we can improve the community for everyone! +there is a way we can improve the community for everyone! If you're +interested in more details, [there is a diff for +that](https://github.com/ContributorCovenant/contributor_covenant/blob/v1_4/diffs/1_3_vs_1_4.patch). See links to the PR's on [the history page](/docs/history/#v3-1-1). From 6e93dbbbd1147d80076eaa3bc7d20503f56e9700 Mon Sep 17 00:00:00 2001 From: Suriyaa Kudo Date: Sat, 30 Jan 2016 13:08:12 +0100 Subject: [PATCH 0385/4996] Rename CONDUCT.md to CONDUCT.markdown --- CONDUCT.md => CONDUCT.markdown | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename CONDUCT.md => CONDUCT.markdown (100%) diff --git a/CONDUCT.md b/CONDUCT.markdown similarity index 100% rename from CONDUCT.md rename to CONDUCT.markdown From 183ea08de6ce1d51fff29034fa79526fce37a28c Mon Sep 17 00:00:00 2001 From: toshi Date: Sun, 31 Jan 2016 00:47:06 +0900 Subject: [PATCH 0386/4996] Add jekyll-toc plugin --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 4bcdd545cbb..050cec0fe40 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -775,6 +775,7 @@ LESS.js files during generation. - [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-toc](https://github.com/toshimaru/jekyll-toc): A liquid filter plugin for Jekyll which generates a table of contents. - [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). - [Jekyll-Ordinal](https://github.com/PatrickC8t/Jekyll-Ordinal): Jekyll liquid filter to output a date ordinal such as "st", "nd", "rd", or "th". - [Deprecated articles keeper](https://github.com/kzykbys/JekyllPlugins) by [Kazuya Kobayashi](http://blog.kazuya.co/): A simple Jekyll filter which monitor how old an article is. From 4d805e29bc4b1c0df1bf6a44b00331de90643f27 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 30 Jan 2016 09:42:31 -0600 Subject: [PATCH 0387/4996] Fix #4427: Make our @config hash symbol accessible. --- .../converters/markdown/kramdown_parser.rb | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index 05b94337e55..d9c9c222ebe 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -12,7 +12,7 @@ class KramdownParser "line_number_start" => 1, "tab_width" => 4, "wrap" => "div" - } + }.freeze def initialize(config) Jekyll::External.require_with_graceful_fail "kramdown" @@ -32,22 +32,44 @@ def setup @config["syntax_highlighter_opts"] ||= {} @config["coderay"] ||= {} # XXX: Legacy. modernize_coderay_config + make_accessible end def convert(content) Kramdown::Document.new(content, @config).to_html end + private + def make_accessible(hash = @config) + proc_ = proc { |hash_, key| hash_[key.to_s] if key.is_a?(Symbol) } + hash.default_proc = proc_ + + hash.each do |_, val| + make_accessible val if val.is_a?( + Hash + ) + end + end + # config[kramdown][syntax_higlighter] > config[kramdown][enable_coderay] > config[highlighter] # Where `enable_coderay` is now deprecated because Kramdown # supports Rouge now too. private def highlighter - @highlighter ||= begin - if highlighter = @config["syntax_highlighter"] then highlighter - elsif @config.key?("enable_coderay") && @config["enable_coderay"] - Jekyll::Deprecator.deprecation_message "You are using 'enable_coderay', use syntax_highlighter: coderay in your configuration file." + return @highlighter if @highlighter + + if @config["syntax_highlighter"] + return @highlighter = @config[ + "syntax_highlighter" + ] + end + + @highlighter = begin + if @config.key?("enable_coderay") && @config["enable_coderay"] + Jekyll::Deprecator.deprecation_message "You are using 'enable_coderay', " \ + "use syntax_highlighter: coderay in your configuration file." + "coderay" else @main_fallback_highlighter @@ -59,7 +81,13 @@ def highlighter def strip_coderay_prefix(hash) hash.each_with_object({}) do |(key, val), hsh| cleaned_key = key.gsub(/\Acoderay_/, "") - Jekyll::Deprecator.deprecation_message "You are using '#{key}'. Normalizing to #{cleaned_key}." if key != cleaned_key + + if key != cleaned_key + Jekyll::Deprecator.deprecation_message( + "You are using '#{key}'. Normalizing to #{cleaned_key}." + ) + end + hsh[cleaned_key] = val end end @@ -71,7 +99,9 @@ def strip_coderay_prefix(hash) private def modernize_coderay_config if highlighter == "coderay" - Jekyll::Deprecator.deprecation_message "You are using 'kramdown.coderay' in your configuration, please use 'syntax_highlighter_opts' instead." + Jekyll::Deprecator.deprecation_message "You are using 'kramdown.coderay' in your configuration, " \ + "please use 'syntax_highlighter_opts' instead." + @config["syntax_highlighter_opts"] = begin strip_coderay_prefix( @config["syntax_highlighter_opts"] \ From 99aabaaf16e08a4c60a4c2711f0ff928c4ebb894 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Mon, 1 Feb 2016 10:22:31 -0500 Subject: [PATCH 0388/4996] Docs: Quickstart - removed alternatively --- site/_docs/quickstart.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/site/_docs/quickstart.md b/site/_docs/quickstart.md index 8f5ffe8a96e..8a63cb33508 100644 --- a/site/_docs/quickstart.md +++ b/site/_docs/quickstart.md @@ -14,8 +14,7 @@ For the impatient, here's how to get a boilerplate Jekyll site up and running. # => Now browse to http://localhost:4000 {% endhighlight %} -If you wish to install jekyll into an existing directory, you can do so by -alternatively running `jekyll new .` from within the directory instead of creating a new one. If the existing directory isn't empty, you'll also have to pass the `--force` option like so `jekyll new . --force`. +If you wish to install jekyll into an existing directory, you can do so by running `jekyll new .` from within the directory instead of creating a new one. If the existing directory isn't empty, you'll also have to pass the `--force` option like so `jekyll new . --force`. That's nothing, though. The real magic happens when you start creating blog posts, using the front matter to control templates and layouts, and taking From 1d58938f4bbb898cdff1422a2ef3da7a11d6dff0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 1 Feb 2016 10:49:44 -0800 Subject: [PATCH 0389/4996] Update history to reflect merge of #4429 [ci skip] --- History.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/History.markdown b/History.markdown index ecbd1794bb2..d928f530e96 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,9 @@ +## HEAD + +### Site Enhancements + + * Add jekyll-toc plugin (#4429) + ## 3.1.1 / 2016-01-29 ### Meta From 28148384063db9cfbfbf46568cd8d9edd165e658 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 1 Feb 2016 11:42:21 -0800 Subject: [PATCH 0390/4996] Update history to reflect merge of #4410 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d928f530e96..e0b87a5f75d 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Site Enhancements * Add jekyll-toc plugin (#4429) + * Docs: Quickstart - added documentation about the `--force` option (#4410) ## 3.1.1 / 2016-01-29 From 6e76f85b521fb1148d1304cf510ae2e30ae52f2b Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 1 Feb 2016 15:44:20 -0600 Subject: [PATCH 0391/4996] fix broken link to CONDUCT.markdown in README.markdown --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 4401ed30c6a..50ec363e2ad 100644 --- a/README.markdown +++ b/README.markdown @@ -37,7 +37,7 @@ See: http://jekyllrb.com/docs/troubleshooting/#jekyll-amp-mac-os-x-1011 ## Code of Conduct In order to have a more open and welcoming community, Jekyll adheres to a -[code of conduct](CONDUCT.md) adapted from the Ruby on Rails code of +[code of conduct](CONDUCT.markdown) adapted from the Ruby on Rails code of conduct. Please adhere to this code of conduct in any interactions you have in the From e32daaedb46d500fa6ff8df8987dc505c23db6f7 Mon Sep 17 00:00:00 2001 From: Daniel Schildt Date: Tue, 2 Feb 2016 02:17:48 +0200 Subject: [PATCH 0392/4996] fix(rake) fix broken site generation - Fix broken site generation caused by renamed CONDUCT.markdown file. --- rake/site.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rake/site.rake b/rake/site.rake index 2a6f8186478..08ad12b3ac6 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -123,7 +123,7 @@ namespace :site do desc "Copy the Code of Conduct" task :conduct do - code_of_conduct = File.read("CONDUCT.md") + code_of_conduct = File.read("CONDUCT.markdown") header, _, body = code_of_conduct.partition("\n\n") front_matter = { "layout" => "docs", From 8234c01d5819b9a7cba488c0d95d0a92dfb7b0d0 Mon Sep 17 00:00:00 2001 From: Daniel Schildt Date: Tue, 2 Feb 2016 02:19:50 +0200 Subject: [PATCH 0393/4996] fix(docs) update link to the Code of Conduct - Update links to use `[Code of Conduct](/docs/conduct/)` - Fix old URL that was pointing to a missing file in GitHub. --- site/_posts/2015-10-26-jekyll-3-0-released.markdown | 2 +- site/_posts/2016-01-28-jekyll-3-1-1-released.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_posts/2015-10-26-jekyll-3-0-released.markdown b/site/_posts/2015-10-26-jekyll-3-0-released.markdown index 0d27a458c19..e7cf9db4e8f 100644 --- a/site/_posts/2015-10-26-jekyll-3-0-released.markdown +++ b/site/_posts/2015-10-26-jekyll-3-0-released.markdown @@ -22,7 +22,7 @@ The much-anticipated Jekyll 3.0 has been released! Key changes: - Lots of performance improvements - ... and lots more! -We also added a [Code of Conduct]({{ site.repository }}/blob/master/CONDUCT.md) to encourage a happier, nicer community where contributions and discussion is protected from negative behaviour. +We also added a [Code of Conduct](/docs/conduct/) to encourage a happier, nicer community where contributions and discussion is protected from negative behaviour. A huge shout-out to the amazing Jekyll Core Team members Jordon Bedwell, Alfred Xing, and Matt Rogers for all their hard work in making Jekyll 3 the best release yet. diff --git a/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown b/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown index 18c693cfca4..b5932b0aefe 100644 --- a/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown +++ b/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown @@ -15,7 +15,7 @@ even if you wanted one * We now strip the BOM by default per Ruby's `IO.open`. * `page.dir` will not always end in a slash. -We also updated our [Code of Conduct](/conduct/) to the latest version of +We also updated our [Code of Conduct](/docs/conduct/) to the latest version of the Contributor Covenant. The update includes language to ensure that the reporter of the incident remains confidential to non-maintainers and that all complaints will result in an appropriate response. I care deeply about From 198103ce7a999ff8ee5060ae6dbc7756ab79a4e1 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 1 Feb 2016 17:46:31 -0800 Subject: [PATCH 0394/4996] Include .rubocop.yml in Gem --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 470781c7834..167e424c4d4 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -21,7 +21,7 @@ Gem::Specification.new do |s| s.homepage = 'https://github.com/jekyll/jekyll' all_files = `git ls-files -z`.split("\x0") - s.files = all_files.grep(%r{^(bin|lib)/}) + s.files = all_files.grep(%r{^(bin|lib)/|^.rubocop.yml$}) s.executables = all_files.grep(%r{^bin/}) { |f| File.basename(f) } s.require_paths = ['lib'] From b1b409433c119aec17806c64a8552b4d79170f4b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 2 Feb 2016 07:41:16 -0800 Subject: [PATCH 0395/4996] Update history to reflect merge of #4436 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e0b87a5f75d..8564082fc4b 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Add jekyll-toc plugin (#4429) * Docs: Quickstart - added documentation about the `--force` option (#4410) + * Fix broken links to the Code of Conduct (#4436) ## 3.1.1 / 2016-01-29 From 7ae4973788217deef5af8e1ec6a7504e014568ca Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 2 Feb 2016 07:42:38 -0800 Subject: [PATCH 0396/4996] Update history to reflect merge of #4437 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 8564082fc4b..4f5005a5162 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,9 @@ ## HEAD +### Minor Enhancements + + * Include .rubocop.yml in Gem (#4437) + ### Site Enhancements * Add jekyll-toc plugin (#4429) From 65a1fc4120bf5b39e0474ac6ac5c3726bd821b60 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Tue, 2 Feb 2016 12:25:50 -0600 Subject: [PATCH 0397/4996] Mispell Rouge intentionally. --- lib/jekyll/converters/markdown/kramdown_parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index d9c9c222ebe..93605cdd181 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -16,7 +16,7 @@ class KramdownParser def initialize(config) Jekyll::External.require_with_graceful_fail "kramdown" - @main_fallback_highlighter = config["highlighter"] || "rogue" + @main_fallback_highlighter = config["highlighter"] || "rouge" @config = config["kramdown"] || {} setup end From bbefef20cd09c9cd9ab46439ec6a74f70d927dbc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 2 Feb 2016 14:02:00 -0800 Subject: [PATCH 0398/4996] Update history to reflect merge of #4428 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 4f5005a5162..cd9c3c3d0a4 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,9 @@ ## HEAD +### Bug Fixes + + * Fix #4427: Make our @config hash symbol accessible. (#4428) + ### Minor Enhancements * Include .rubocop.yml in Gem (#4437) From 5058382d5ad9c7724cae558bfb114859708a2bc2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 2 Feb 2016 14:43:45 -0800 Subject: [PATCH 0399/4996] LiquidRenderer#parse: parse with line numbers. --- lib/jekyll/liquid_renderer/file.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/liquid_renderer/file.rb b/lib/jekyll/liquid_renderer/file.rb index f91a5a2c625..7dcca1b62a1 100644 --- a/lib/jekyll/liquid_renderer/file.rb +++ b/lib/jekyll/liquid_renderer/file.rb @@ -8,7 +8,7 @@ def initialize(renderer, filename) def parse(content) measure_time do - @template = Liquid::Template.parse(content) + @template = Liquid::Template.parse(content, line_numbers: true) end self From 7886fdb166786e2fe63cf3cd9fd72c0c6dd4b485 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 2 Feb 2016 15:19:08 -0800 Subject: [PATCH 0400/4996] Update history to reflect merge of #4452 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cd9c3c3d0a4..6f0ea19ec2b 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ ### Minor Enhancements * Include .rubocop.yml in Gem (#4437) + * LiquidRenderer#parse: parse with line numbers. (#4452) ### Site Enhancements From 75b55ff4f26ee04f9b664ba354804d6b40685e6b Mon Sep 17 00:00:00 2001 From: Dean Attali Date: Tue, 2 Feb 2016 16:16:12 -0800 Subject: [PATCH 0401/4996] upgrade notes: mention trailing slash in permalink; fixes #4440 --- site/_docs/upgrading/2-to-3.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index d3ff4a38781..dbbda9a9e3f 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -99,4 +99,9 @@ This can be fixed by removing the following line from your `_config.yml` file: relative_permalinks: true {% endhighlight %} +### Permalinks no longer automatically add a trailing slash + +In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slash (`/`) added to it automatically. Jekyll 3 no longer adds a trailing slash automatically to `permalink:` URLs. This can potentially result in old links to pages returning a 404 error. For example, suppose a page previously contained the YAML `permalink: /:year-:month-:day-:title` that resulted in the URL `example.com/2016-02-01-test/` (notice the trailing slash). In Jekyll 3, the URL for the same page is `example.com/2016-02-01-test`, and consequently any links to the old URL will result in a 404 error. In order to maintain the same URLs and avoid this problem, a trailing slash should be added to the `permalink:` field, for example `permalink: /:year-:month-:day-:title/`. + + _Did we miss something? Please click "Improve this page" above and add a section. Thanks!_ From 7df8f502487f3b6476b5ce0f296be28f70df59cb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 2 Feb 2016 16:59:25 -0800 Subject: [PATCH 0402/4996] Update history to reflect merge of #4455 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6f0ea19ec2b..665982a8219 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ * Add jekyll-toc plugin (#4429) * Docs: Quickstart - added documentation about the `--force` option (#4410) * Fix broken links to the Code of Conduct (#4436) + * upgrade notes: mention trailing slash in permalink; fixes #4440 (#4455) ## 3.1.1 / 2016-01-29 From 49e3180607a7bcb71c4c752d3b8454efd2b3d44c Mon Sep 17 00:00:00 2001 From: Robert Martin Date: Tue, 2 Feb 2016 23:31:21 -0500 Subject: [PATCH 0403/4996] Update structure.md --- site/_docs/structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/structure.md b/site/_docs/structure.md index eb6a0892784..f571aea8deb 100644 --- a/site/_docs/structure.md +++ b/site/_docs/structure.md @@ -132,7 +132,7 @@ An overview of what each of these does:

    - Well-formatted site data should be placed here. The jekyll engine + Well-formatted site data should be placed here. The Jekyll engine will autoload all YAML files in this directory (using either the .yml, .yaml, .json or .csv formats and extensions) and they will be From 53bb262fed1d397683c3ee49d6a77013e2edf905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Garc=C3=A9s?= Date: Wed, 3 Feb 2016 11:42:18 +0100 Subject: [PATCH 0404/4996] Added details about permalinks problem Small description about how Jekyll generated the files based on a permalink --- site/_docs/upgrading/2-to-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index dbbda9a9e3f..9b9cedc4dd9 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -101,7 +101,7 @@ relative_permalinks: true ### Permalinks no longer automatically add a trailing slash -In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slash (`/`) added to it automatically. Jekyll 3 no longer adds a trailing slash automatically to `permalink:` URLs. This can potentially result in old links to pages returning a 404 error. For example, suppose a page previously contained the YAML `permalink: /:year-:month-:day-:title` that resulted in the URL `example.com/2016-02-01-test/` (notice the trailing slash). In Jekyll 3, the URL for the same page is `example.com/2016-02-01-test`, and consequently any links to the old URL will result in a 404 error. In order to maintain the same URLs and avoid this problem, a trailing slash should be added to the `permalink:` field, for example `permalink: /:year-:month-:day-:title/`. +In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slash (`/`) added to it automatically. Jekyll 3 no longer adds a trailing slash automatically to `permalink:` URLs. This can potentially result in old links to pages returning a 404 error. For example, suppose a page previously contained the YAML `permalink: /:year-:month-:day-:title` that resulted in the URL `example.com/2016-02-01-test/` (notice the trailing slash), Jekyll internaly generates a folder named `2016-02-01-test`. In Jekyll 3, the same `permalink:` generate the file `2016-02-01-test.html` and the URL for the same page will be `example.com/2016-02-01-test`, and consequently any links to the old URL will result in a 404 error. In order to maintain the same URLs and avoid this problem, a trailing slash should be added to the `permalink:` field, for example `permalink: /:year-:month-:day-:title/`. _Did we miss something? Please click "Improve this page" above and add a section. Thanks!_ From b4deb79392322ab1249dbdfd7cb6f3fc76c79239 Mon Sep 17 00:00:00 2001 From: Mitesh Shah Date: Wed, 3 Feb 2016 17:01:01 +0530 Subject: [PATCH 0405/4996] [add note] Jekyll 3 requires newer ver. of Ruby. Adding a note that Jekyll 3 requires Ruby version >= 2.0.0. --- site/_docs/upgrading/2-to-3.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index dbbda9a9e3f..86cd910c499 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -13,6 +13,8 @@ Before we dive in, go ahead and fetch the latest version of Jekyll: $ gem update jekyll {% endhighlight %} +Please note: Jekyll 3 requires Ruby version >= 2.0.0. +

    Diving in

    Want to get a new Jekyll site up and running quickly? Simply From aa284d90ccafc100082af4c5812966d87c9a3ee7 Mon Sep 17 00:00:00 2001 From: Nicolas Hoizey Date: Wed, 3 Feb 2016 16:39:20 +0100 Subject: [PATCH 0406/4996] Add hooks to the plugin categories toc --- site/_docs/plugins.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 050cec0fe40..e7823465447 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -60,12 +60,13 @@ values of the gem names of the plugins you'd like to use. An example:

    -In general, plugins you make will fall into one of four categories: +In general, plugins you make will fall into one of five categories: 1. [Generators](#generators) 2. [Converters](#converters) 3. [Commands](#commands) 4. [Tags](#tags) +5. [Hooks](#hooks) ## Generators From d18769aff0fae47da54ce548de270b8593d23921 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Wed, 3 Feb 2016 11:31:07 -0500 Subject: [PATCH 0407/4996] Remove old flag which breaks htmlproof --- script/proof | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/proof b/script/proof index c8fff90819b..01da501651e 100755 --- a/script/proof +++ b/script/proof @@ -27,7 +27,7 @@ bundle install -j8 > /dev/null || bundle install > /dev/null # 2. msg "Building..." -bundle exec jekyll build -s $SOURCE -d $DESTINATION --full-rebuild --trace +bundle exec jekyll build -s $SOURCE -d $DESTINATION --trace # 3. msg "Proofing..." From 53c1107eaa3ffa6f576b8dcdade543f0b6fa436d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 3 Feb 2016 09:37:12 -0800 Subject: [PATCH 0408/4996] Update history to reflect merge of #4463 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 665982a8219..40ba3406e5a 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ * Docs: Quickstart - added documentation about the `--force` option (#4410) * Fix broken links to the Code of Conduct (#4436) * upgrade notes: mention trailing slash in permalink; fixes #4440 (#4455) + * Add hooks to the plugin categories toc (#4463) ## 3.1.1 / 2016-01-29 From 1671c989755c3eb414de4acc6719276fc0e19d01 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Wed, 3 Feb 2016 12:45:18 -0500 Subject: [PATCH 0409/4996] Remove broken link --- site/_docs/plugins.md | 1 - 1 file changed, 1 deletion(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 050cec0fe40..5e34b488e99 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -838,7 +838,6 @@ LESS.js files during generation. - [inline\_highlight](https://github.com/bdesham/inline_highlight): A tag for inline syntax highlighting. - [jekyll-mermaid](https://github.com/jasonbellamy/jekyll-mermaid): Simplify the creation of mermaid diagrams and flowcharts in your posts and pages. - [twa](https://github.com/Ezmyrelda/twa): Twemoji Awesome plugin for Jekyll. Liquid tag allowing you to use twitter emoji in your jekyll pages. -- [jekyll-files](https://github.com/x43x61x69/jekyll-files) by [Zhi-Wei Cai](http://vox.vg/): Output relative path strings and other info regarding specific assets. - [Fetch remote file content](https://github.com/dimitri-koenig/jekyll-plugins) by [Dimitri König](https://www.dimitrikoenig.net/): Using `remote_file_content` tag you can fetch the content of a remote file and include it as if you would put the content right into your markdown file yourself. Very useful for including code from github repo's to always have a current repo version. - [jekyll-asciinema](https://github.com/mnuessler/jekyll-asciinema): A tag for embedding asciicasts recorded with [asciinema](https://asciinema.org) in your Jekyll pages. - [Jekyll-Youtube](https://github.com/dommmel/jekyll-youtube) A Liquid tag that embeds Youtube videos. The default emded markup is responsive but you can also specify your own by using an include/partial. From d47ae6ce9511f9274d5a4f1534c68eddcad18bcf Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 3 Feb 2016 19:57:37 -0800 Subject: [PATCH 0410/4996] Update history to reflect merge of #4461 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 40ba3406e5a..850be8de2c5 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Fix broken links to the Code of Conduct (#4436) * upgrade notes: mention trailing slash in permalink; fixes #4440 (#4455) * Add hooks to the plugin categories toc (#4463) + * [add note] Jekyll 3 requires newer version of Ruby. (#4461) ## 3.1.1 / 2016-01-29 From 71e04760c94d0988d4a895d6898d437f8d1d20b1 Mon Sep 17 00:00:00 2001 From: Manabu Sakai Date: Fri, 5 Feb 2016 16:11:16 +0900 Subject: [PATCH 0411/4996] Fix typo --- site/_docs/upgrading/2-to-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index 4a2c638f8c6..8a29ae086ac 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -67,7 +67,7 @@ generate when running `jekyll build` or `jekyll serve`. ### Layout metadata -Introducing: `layout`. In Jekyll 2 and below, any metadata in the layout was munged onto +Introducing: `layout`. In Jekyll 2 and below, any metadata in the layout was merged onto the `page` variable in Liquid. This caused a lot of confusion in the way the data was merged and some unexpected behaviour. In Jekyll 3, all layout data is accessible via `layout` in Liquid. For example, if your layout has `class: my-layout` in its YAML front matter, From ac463bb397d4d2eaf4169bf925b76f4e4815d98a Mon Sep 17 00:00:00 2001 From: Alfred Xing Date: Fri, 5 Feb 2016 09:22:42 -0800 Subject: [PATCH 0412/4996] Update history to reflect merge of #4473 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 850be8de2c5..ca9cc4c2e19 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * upgrade notes: mention trailing slash in permalink; fixes #4440 (#4455) * Add hooks to the plugin categories toc (#4463) * [add note] Jekyll 3 requires newer version of Ruby. (#4461) + * Fix typo in upgrading docs (#4473) ## 3.1.1 / 2016-01-29 From fd121e2a5e060ed35c245a97ec8255988bd7c09d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 6 Feb 2016 19:04:47 -0800 Subject: [PATCH 0413/4996] Add note about upgrading documentation on jekyllrb.com/help/ --- site/help/index.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/site/help/index.md b/site/help/index.md index 5ce0846c71d..ba15959974e 100644 --- a/site/help/index.md +++ b/site/help/index.md @@ -5,6 +5,11 @@ title: Getting Help Need help with Jekyll? Try these resources. +### [Upgrading Documentation](/docs/upgrading/) + +Did you recently upgrade from Jekyll 1 to 2 or from Jekyll 2 to 3? +Known breaking changes are listed in the upgrading docs. + ### [Google](https://google.com) Add **jekyll** to almost any query, and you'll find just what you need. From 9366a90d385d0fe779ce9d3d951a026c5fd135ae Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 6 Feb 2016 19:05:13 -0800 Subject: [PATCH 0414/4996] Update history to reflect merge of #4484 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ca9cc4c2e19..122901cf010 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ * Add hooks to the plugin categories toc (#4463) * [add note] Jekyll 3 requires newer version of Ruby. (#4461) * Fix typo in upgrading docs (#4473) + * Add note about upgrading documentation on jekyllrb.com/help/ (#4484) ## 3.1.1 / 2016-01-29 From 38bc4f55e4b926f05d92ff589d8681414da84da3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 6 Feb 2016 19:17:35 -0800 Subject: [PATCH 0415/4996] Add note about dates without timezones --- site/_docs/upgrading/2-to-3.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index 8a29ae086ac..d4b105c9b99 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -105,5 +105,22 @@ relative_permalinks: true In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slash (`/`) added to it automatically. Jekyll 3 no longer adds a trailing slash automatically to `permalink:` URLs. This can potentially result in old links to pages returning a 404 error. For example, suppose a page previously contained the YAML `permalink: /:year-:month-:day-:title` that resulted in the URL `example.com/2016-02-01-test/` (notice the trailing slash), Jekyll internaly generates a folder named `2016-02-01-test`. In Jekyll 3, the same `permalink:` generate the file `2016-02-01-test.html` and the URL for the same page will be `example.com/2016-02-01-test`, and consequently any links to the old URL will result in a 404 error. In order to maintain the same URLs and avoid this problem, a trailing slash should be added to the `permalink:` field, for example `permalink: /:year-:month-:day-:title/`. +### All my posts are gone! Where'd they go! + +Try adding `future: true` to your `_config.yml` file. Are they showing up now? If they are, then you were ensnared by an issue with the way Ruby parses times. Each of your posts is being read in a different timezone than you might expect and, when compared to the computer's current time, is "in the future." The fix for this is to add [a timezone offset](https://en.wikipedia.org/wiki/List_of_UTC_time_offsets) to each post (and make sure you emove `future: true` from your `_config.yml` file). If you're writing from California, for example, you would change this: + +```yaml +--- +date: 2016-02-06 19:32:10 +--- +``` + +to this (note the offset): + +```yaml +--- +date: 2016-02-06 19:32:10 -0800 +--- +``` _Did we miss something? Please click "Improve this page" above and add a section. Thanks!_ From b0797c30353f6bdfaf1d76ee0436a8f5faaac2cb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 6 Feb 2016 19:18:30 -0800 Subject: [PATCH 0416/4996] Fix typo in upgrading docs --- site/_docs/upgrading/2-to-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index d4b105c9b99..058152fcefa 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -107,7 +107,7 @@ In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slas ### All my posts are gone! Where'd they go! -Try adding `future: true` to your `_config.yml` file. Are they showing up now? If they are, then you were ensnared by an issue with the way Ruby parses times. Each of your posts is being read in a different timezone than you might expect and, when compared to the computer's current time, is "in the future." The fix for this is to add [a timezone offset](https://en.wikipedia.org/wiki/List_of_UTC_time_offsets) to each post (and make sure you emove `future: true` from your `_config.yml` file). If you're writing from California, for example, you would change this: +Try adding `future: true` to your `_config.yml` file. Are they showing up now? If they are, then you were ensnared by an issue with the way Ruby parses times. Each of your posts is being read in a different timezone than you might expect and, when compared to the computer's current time, is "in the future." The fix for this is to add [a timezone offset](https://en.wikipedia.org/wiki/List_of_UTC_time_offsets) to each post (and make sure you remove `future: true` from your `_config.yml` file). If you're writing from California, for example, you would change this: ```yaml --- From 2d0c572d2934ef7924734444a23d449006bba64e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 6 Feb 2016 19:21:11 -0800 Subject: [PATCH 0417/4996] use the highlight tag for upgrading docs code block --- site/_docs/upgrading/2-to-3.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index 058152fcefa..33d9c364d88 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -103,24 +103,24 @@ relative_permalinks: true ### Permalinks no longer automatically add a trailing slash -In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slash (`/`) added to it automatically. Jekyll 3 no longer adds a trailing slash automatically to `permalink:` URLs. This can potentially result in old links to pages returning a 404 error. For example, suppose a page previously contained the YAML `permalink: /:year-:month-:day-:title` that resulted in the URL `example.com/2016-02-01-test/` (notice the trailing slash), Jekyll internaly generates a folder named `2016-02-01-test`. In Jekyll 3, the same `permalink:` generate the file `2016-02-01-test.html` and the URL for the same page will be `example.com/2016-02-01-test`, and consequently any links to the old URL will result in a 404 error. In order to maintain the same URLs and avoid this problem, a trailing slash should be added to the `permalink:` field, for example `permalink: /:year-:month-:day-:title/`. +In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slash (`/`) added to it automatically. Jekyll 3 no longer adds a trailing slash automatically to `permalink:` URLs. This can potentially result in old links to pages returning a 404 error. For example, suppose a page previously contained the YAML `permalink: /:year-:month-:day-:title` that resulted in the URL `example.com/2016-02-01-test/` (notice the trailing slash), Jekyll internaly generates a folder named `2016-02-01-test`. In Jekyll 3, the same `permalink:` generate the file `2016-02-01-test.html` and the URL for the same page will be `example.com/2016-02-01-test`, and consequently any links to the old URL will result in a 404 error. In order to maintain the same URLs and avoid this problem, a trailing slash should be added to the `permalink:` field, for example `permalink: /:year-:month-:day-:title/`. ### All my posts are gone! Where'd they go! Try adding `future: true` to your `_config.yml` file. Are they showing up now? If they are, then you were ensnared by an issue with the way Ruby parses times. Each of your posts is being read in a different timezone than you might expect and, when compared to the computer's current time, is "in the future." The fix for this is to add [a timezone offset](https://en.wikipedia.org/wiki/List_of_UTC_time_offsets) to each post (and make sure you remove `future: true` from your `_config.yml` file). If you're writing from California, for example, you would change this: -```yaml +{% highlight yaml %} --- date: 2016-02-06 19:32:10 --- -``` +{% endhighlight %} to this (note the offset): -```yaml +{% highlight yaml %} --- date: 2016-02-06 19:32:10 -0800 --- -``` +{% endhighlight %} _Did we miss something? Please click "Improve this page" above and add a section. Thanks!_ From 3950408e393989610a85abaf4f31b7bd62903659 Mon Sep 17 00:00:00 2001 From: Prayag Verma Date: Sun, 7 Feb 2016 13:18:19 +0530 Subject: [PATCH 0418/4996] Fix a typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Found a spelling mistake - `internaly` → `internally` --- site/_docs/upgrading/2-to-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index 33d9c364d88..330228de706 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -103,7 +103,7 @@ relative_permalinks: true ### Permalinks no longer automatically add a trailing slash -In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slash (`/`) added to it automatically. Jekyll 3 no longer adds a trailing slash automatically to `permalink:` URLs. This can potentially result in old links to pages returning a 404 error. For example, suppose a page previously contained the YAML `permalink: /:year-:month-:day-:title` that resulted in the URL `example.com/2016-02-01-test/` (notice the trailing slash), Jekyll internaly generates a folder named `2016-02-01-test`. In Jekyll 3, the same `permalink:` generate the file `2016-02-01-test.html` and the URL for the same page will be `example.com/2016-02-01-test`, and consequently any links to the old URL will result in a 404 error. In order to maintain the same URLs and avoid this problem, a trailing slash should be added to the `permalink:` field, for example `permalink: /:year-:month-:day-:title/`. +In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slash (`/`) added to it automatically. Jekyll 3 no longer adds a trailing slash automatically to `permalink:` URLs. This can potentially result in old links to pages returning a 404 error. For example, suppose a page previously contained the YAML `permalink: /:year-:month-:day-:title` that resulted in the URL `example.com/2016-02-01-test/` (notice the trailing slash), Jekyll internally generates a folder named `2016-02-01-test`. In Jekyll 3, the same `permalink:` generate the file `2016-02-01-test.html` and the URL for the same page will be `example.com/2016-02-01-test`, and consequently any links to the old URL will result in a 404 error. In order to maintain the same URLs and avoid this problem, a trailing slash should be added to the `permalink:` field, for example `permalink: /:year-:month-:day-:title/`. ### All my posts are gone! Where'd they go! From 3373eb65257789b62b5eafcb4512c37c7151a6ed Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 7 Feb 2016 17:28:03 -0800 Subject: [PATCH 0419/4996] EntryFilter#special?: ignore filenames which begin with '~' --- lib/jekyll/entry_filter.rb | 2 +- test/test_entry_filter.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index 6d42c067c55..48509f9deb5 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -1,6 +1,6 @@ module Jekyll class EntryFilter - SPECIAL_LEADING_CHARACTERS = ['.', '_', '#'].freeze + SPECIAL_LEADING_CHARACTERS = ['.', '_', '#', '~'].freeze attr_reader :site diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb index c0ce59b38ce..546f025272b 100644 --- a/test/test_entry_filter.rb +++ b/test/test_entry_filter.rb @@ -8,7 +8,7 @@ class TestEntryFilter < JekyllUnitTest should "filter entries" do ent1 = %w[foo.markdown bar.markdown baz.markdown #baz.markdown# - .baz.markdow foo.markdown~ .htaccess _posts _pages] + .baz.markdow foo.markdown~ .htaccess _posts _pages ~$benbalter.docx] entries = EntryFilter.new(@site).filter(ent1) assert_equal %w[foo.markdown bar.markdown baz.markdown .htaccess], entries From 246e65914ffef6affb7b699de6fcd496168c332e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 7 Feb 2016 17:52:15 -0800 Subject: [PATCH 0420/4996] Jekyll.sanitized_path: sanitizing a questionable path should handle tildes --- lib/jekyll.rb | 3 ++- test/test_path_sanitization.rb | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 8b92a045f61..6896bb0b8c8 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -153,8 +153,9 @@ def sites def sanitized_path(base_directory, questionable_path) return base_directory if base_directory.eql?(questionable_path) + questionable_path.insert(0, '/') if questionable_path.start_with?('~') clean_path = File.expand_path(questionable_path, "/") - clean_path = clean_path.sub(/\A\w\:\//, '/') + clean_path.sub!(/\A\w\:\//, '/') if clean_path.start_with?(base_directory.sub(/\A\w\:\//, '/')) clean_path diff --git a/test/test_path_sanitization.rb b/test/test_path_sanitization.rb index b04a2badd37..148103eacbd 100644 --- a/test/test_path_sanitization.rb +++ b/test/test_path_sanitization.rb @@ -15,4 +15,13 @@ class TestPathSanitization < JekyllUnitTest assert_equal "/tmp/foobar/jail/..c:/..c:/..c:/etc/passwd", Jekyll.sanitized_path("/tmp/foobar/jail", "..c:/..c:/..c:/etc/passwd") end end + + should "escape tilde" do + assert_equal source_dir("~hi.txt"), Jekyll.sanitized_path(source_dir, "~hi.txt") + assert_equal source_dir("files", "~hi.txt"), Jekyll.sanitized_path(source_dir, "files/../files/~hi.txt") + end + + should "remove path traversals" do + assert_equal source_dir("files", "hi.txt"), Jekyll.sanitized_path(source_dir, "f./../../../../../../files/hi.txt") + end end From 0e89a37eaf7a426181b489fe0325081f4b7cda66 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 7 Feb 2016 17:53:09 -0800 Subject: [PATCH 0421/4996] Revert "Jekyll.sanitized_path: sanitizing a questionable path should handle tildes" This reverts commit 246e65914ffef6affb7b699de6fcd496168c332e. --- lib/jekyll.rb | 3 +-- test/test_path_sanitization.rb | 9 --------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 6896bb0b8c8..8b92a045f61 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -153,9 +153,8 @@ def sites def sanitized_path(base_directory, questionable_path) return base_directory if base_directory.eql?(questionable_path) - questionable_path.insert(0, '/') if questionable_path.start_with?('~') clean_path = File.expand_path(questionable_path, "/") - clean_path.sub!(/\A\w\:\//, '/') + clean_path = clean_path.sub(/\A\w\:\//, '/') if clean_path.start_with?(base_directory.sub(/\A\w\:\//, '/')) clean_path diff --git a/test/test_path_sanitization.rb b/test/test_path_sanitization.rb index 148103eacbd..b04a2badd37 100644 --- a/test/test_path_sanitization.rb +++ b/test/test_path_sanitization.rb @@ -15,13 +15,4 @@ class TestPathSanitization < JekyllUnitTest assert_equal "/tmp/foobar/jail/..c:/..c:/..c:/etc/passwd", Jekyll.sanitized_path("/tmp/foobar/jail", "..c:/..c:/..c:/etc/passwd") end end - - should "escape tilde" do - assert_equal source_dir("~hi.txt"), Jekyll.sanitized_path(source_dir, "~hi.txt") - assert_equal source_dir("files", "~hi.txt"), Jekyll.sanitized_path(source_dir, "files/../files/~hi.txt") - end - - should "remove path traversals" do - assert_equal source_dir("files", "hi.txt"), Jekyll.sanitized_path(source_dir, "f./../../../../../../files/hi.txt") - end end From a040af37c08c6bf3fa0b29f98bde4eb58354eab1 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 7 Feb 2016 17:52:15 -0800 Subject: [PATCH 0422/4996] Jekyll.sanitized_path: sanitizing a questionable path should handle tildes --- lib/jekyll.rb | 3 ++- test/test_path_sanitization.rb | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 8b92a045f61..6896bb0b8c8 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -153,8 +153,9 @@ def sites def sanitized_path(base_directory, questionable_path) return base_directory if base_directory.eql?(questionable_path) + questionable_path.insert(0, '/') if questionable_path.start_with?('~') clean_path = File.expand_path(questionable_path, "/") - clean_path = clean_path.sub(/\A\w\:\//, '/') + clean_path.sub!(/\A\w\:\//, '/') if clean_path.start_with?(base_directory.sub(/\A\w\:\//, '/')) clean_path diff --git a/test/test_path_sanitization.rb b/test/test_path_sanitization.rb index b04a2badd37..148103eacbd 100644 --- a/test/test_path_sanitization.rb +++ b/test/test_path_sanitization.rb @@ -15,4 +15,13 @@ class TestPathSanitization < JekyllUnitTest assert_equal "/tmp/foobar/jail/..c:/..c:/..c:/etc/passwd", Jekyll.sanitized_path("/tmp/foobar/jail", "..c:/..c:/..c:/etc/passwd") end end + + should "escape tilde" do + assert_equal source_dir("~hi.txt"), Jekyll.sanitized_path(source_dir, "~hi.txt") + assert_equal source_dir("files", "~hi.txt"), Jekyll.sanitized_path(source_dir, "files/../files/~hi.txt") + end + + should "remove path traversals" do + assert_equal source_dir("files", "hi.txt"), Jekyll.sanitized_path(source_dir, "f./../../../../../../files/hi.txt") + end end From db241c4f91727d65f2f4608c57fa5005758f7241 Mon Sep 17 00:00:00 2001 From: Katya Demidova Date: Mon, 8 Feb 2016 14:05:50 +0300 Subject: [PATCH 0423/4996] Update Rake link The https://github.com/jimweirich/rake/ repository is retired, so I've changed the link to https://github.com/ruby/rake --- site/_docs/deployment-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index ad4ea93c283..7e77ce16733 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -90,7 +90,7 @@ Setup steps are fully documented ### Rake -Another way to deploy your Jekyll site is to use [Rake](https://github.com/jimweirich/rake), [HighLine](https://github.com/JEG2/highline), and +Another way to deploy your Jekyll site is to use [Rake](https://github.com/ruby/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). From b237b1f93cd8a16119d2abfc5f35bd2a2b144d0c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 8 Feb 2016 10:28:00 -0800 Subject: [PATCH 0424/4996] Update history to reflect merge of #4496 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 122901cf010..6ffe198db46 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * [add note] Jekyll 3 requires newer version of Ruby. (#4461) * Fix typo in upgrading docs (#4473) * Add note about upgrading documentation on jekyllrb.com/help/ (#4484) + * Update Rake link (#4496) ## 3.1.1 / 2016-01-29 From adadc2eeab8433f4de28c1568de779cc90b2d28a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 8 Feb 2016 10:52:15 -0800 Subject: [PATCH 0425/4996] Update history to reflect merge of #4374 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6ffe198db46..9dc835f860c 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * Fix typo in upgrading docs (#4473) * Add note about upgrading documentation on jekyllrb.com/help/ (#4484) * Update Rake link (#4496) + * Update & prune the short list of example sites (#4374) ## 3.1.1 / 2016-01-29 From f57899fdb86f86074bbb688e09643cd8d83e67a2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 8 Feb 2016 10:52:54 -0800 Subject: [PATCH 0426/4996] Update history to reflect merge of #4492 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9dc835f860c..170d6dab201 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Bug Fixes * Fix #4427: Make our @config hash symbol accessible. (#4428) + * Jekyll.sanitized_path: sanitizing a questionable path should handle tildes (#4492) ### Minor Enhancements From 2e5e6ace3d7913dbf467afe8358c956da3b52f89 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 8 Feb 2016 10:59:24 -0800 Subject: [PATCH 0427/4996] Fix emoji support on the site. Seems to work for us, despite https://github.com/jekyll/jemoji/issues/32 ? --- Gemfile | 1 + site/_config.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Gemfile b/Gemfile index f63529e885a..cd21a668f76 100644 --- a/Gemfile +++ b/Gemfile @@ -79,4 +79,5 @@ group :site do if ENV["PROOF"] gem "html-proofer", "~> 2.0" end + gem "jemoji" end diff --git a/site/_config.yml b/site/_config.yml index c065f9f7015..241c5b01762 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -22,3 +22,4 @@ url: http://jekyllrb.com gems: - jekyll-feed - jekyll-redirect-from + - jemoji From 05d99a9c96eeebdab8e7c3c360e745dad925e69d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 8 Feb 2016 10:47:22 -0800 Subject: [PATCH 0428/4996] Release v3.0.3 --- History.markdown | 12 ++++++- site/_docs/history.md | 13 ++++++++ .../2016-02-08-jekyll-3-0-3-released.markdown | 31 +++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 site/_posts/2016-02-08-jekyll-3-0-3-released.markdown diff --git a/History.markdown b/History.markdown index 170d6dab201..adbfb765657 100644 --- a/History.markdown +++ b/History.markdown @@ -3,7 +3,7 @@ ### Bug Fixes * Fix #4427: Make our @config hash symbol accessible. (#4428) - * Jekyll.sanitized_path: sanitizing a questionable path should handle tildes (#4492) + * `Jekyll.sanitized_path`: sanitizing a questionable path should handle tildes (#4492) ### Minor Enhancements @@ -135,6 +135,16 @@ * Add Contentful Extension to list of third-party plugins (#4390) * Correct Minor spelling error (#4394) +## 3.0.3 / 2016-02-08 + +### Bug Fixes + +* Fix extension weirdness with folders (#4493) +* EntryFilter: only include 'excluded' log on excluded files (#4479) +* `Jekyll.sanitized_path`: escape tildes before sanitizing a questionable path (#4468) +* `LiquidRenderer#parse`: parse with line numbers (#4453) +* `Document#<=>`: protect against nil comparison in dates. (#4446) + ## 3.0.2 / 2016-01-20 ### Bug Fixes diff --git a/site/_docs/history.md b/site/_docs/history.md index 7943203b12b..6514e2c40f0 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -126,6 +126,19 @@ permalink: "/docs/history/" - Correct Minor spelling error ([#4394]({{ site.repository }}/issues/4394)) +## 3.0.3 / 2016-02-08 +{: #v3-0-3} + +### Bug Fixes +{: #bug-fixes-v3-0-3} + +* Fix extension weirdness with folders ([#4493]({{ site.repository }}/issues/4493)) +* EntryFilter: only include 'excluded' log on excluded files ([#4479]({{ site.repository }}/issues/4479)) +* `Jekyll.sanitized_path`: escape tildes before sanitizing a questionable path ([#4468]({{ site.repository }}/issues/4468)) +* `LiquidRenderer#parse`: parse with line numbers ([#4453]({{ site.repository }}/issues/4453)) +* `Document#<=>`: protect against nil comparison in dates. ([#4446]({{ site.repository }}/issues/4446)) + + ## 3.0.2 / 2016-01-20 {: #v3-0-2} diff --git a/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown b/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown new file mode 100644 index 00000000000..f648cb28a7a --- /dev/null +++ b/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown @@ -0,0 +1,31 @@ +--- +layout: news_item +title: 'Jekyll 3.0.3 Released' +date: 2016-02-08 10:39:08 -0800 +author: +version: 3.0.3 +categories: [release] +--- + +[GitHub Pages upgraded to Jekyll 3.0.2][1] last week and there has been a +joyous reception so far! This release is to address some bugs that affected +some users during the cut-over. The fixes include: + +* Fix problem where outputting to a folder would have two extensions +* Handle tildes (`~`) in filenames properly +* Fix issue when comparing documents without dates +* Include line numbers in liquid error output + +Read more on the [changelog](/docs/history/#v3-0-3) with links to the +related patches. + +Please keep [submitting bugs][2] as you find them! Please do take a look +[in our various help resources](/help/) before filing a bug and use [our +forum][3] for asking questions and getting help on a specific problem +you're having. + +Happy Jekylling! + +[1]: https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0 +[2]: {{ site.repository }}/issues +[3]: https://talk.jekyllrb.com/ From b8f5b9f63e6e8a8d9c8a5e4c7809acf5374ceb28 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 8 Feb 2016 11:00:30 -0800 Subject: [PATCH 0429/4996] By me! --- site/_posts/2016-02-08-jekyll-3-0-3-released.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown b/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown index f648cb28a7a..a3dd93c97dc 100644 --- a/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown +++ b/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown @@ -2,7 +2,7 @@ layout: news_item title: 'Jekyll 3.0.3 Released' date: 2016-02-08 10:39:08 -0800 -author: +author: parkr version: 3.0.3 categories: [release] --- From 29a5a3c303c64abf90100cb6928c096c1cf8dc63 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 8 Feb 2016 11:09:42 -0800 Subject: [PATCH 0430/4996] site: A bit better wording on the 3.0.3 release post :tophat: tip to @benbalter for his generous and kind thoughts on my writing. --- site/_posts/2016-02-08-jekyll-3-0-3-released.markdown | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown b/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown index a3dd93c97dc..0c260cc696b 100644 --- a/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown +++ b/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown @@ -7,9 +7,10 @@ version: 3.0.3 categories: [release] --- -[GitHub Pages upgraded to Jekyll 3.0.2][1] last week and there has been a -joyous reception so far! This release is to address some bugs that affected -some users during the cut-over. The fixes include: +[GitHub Pages upgraded to Jekyll 3.0.2][1] last week. With a testbed of +over a million sites, this really put Jekyll 3 through the wringer. This +release addresses a handful of bugs that were surfaced as a result. The +fixes: * Fix problem where outputting to a folder would have two extensions * Handle tildes (`~`) in filenames properly From fd0e99ceac011c471a4845398c01d7edeb2883ac Mon Sep 17 00:00:00 2001 From: Cash Costello Date: Mon, 8 Feb 2016 21:08:48 -0500 Subject: [PATCH 0431/4996] fixes parenthesis typo in configuration docs --- site/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 4e78ab7ad9c..7a602b19e94 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -120,7 +120,7 @@ class="flag">flags
    (specified on the command-line) that control them.

    Encoding

    - Set the encoding of files by name. Only available for Ruby + Set the encoding of files by name (only available for Ruby 1.9 or later). The default value is utf-8 starting in 2.0.0, and nil before 2.0.0, which will yield the Ruby From e19110954960ae127bf5a4e61807bc6683ae90f4 Mon Sep 17 00:00:00 2001 From: lonnen Date: Tue, 9 Feb 2016 23:46:45 -0800 Subject: [PATCH 0432/4996] add consistency to the deprecation message --- lib/jekyll/deprecator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/deprecator.rb b/lib/jekyll/deprecator.rb index d4ea3c882c2..21449400b28 100644 --- a/lib/jekyll/deprecator.rb +++ b/lib/jekyll/deprecator.rb @@ -22,7 +22,7 @@ def process(args) def no_subcommand(args) if args.size > 0 && args.first =~ /^--/ && !%w(--help --version).include?(args.first) - deprecation_message "Jekyll now uses subcommands instead of just switches. Run `jekyll --help` to find out more." + deprecation_message "Jekyll now uses subcommands instead of just switches. Run `jekyll help` to find out more." abort end end From 99b9c8486cb5fe1984a7a5979422d292aeb366c8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 10 Feb 2016 15:26:54 -0800 Subject: [PATCH 0433/4996] Update history to reflect merge of #4505 [ci skip] --- History.markdown | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/History.markdown b/History.markdown index adbfb765657..36dc54b6f92 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,7 @@ * Include .rubocop.yml in Gem (#4437) * LiquidRenderer#parse: parse with line numbers. (#4452) + * add consistency to the deprecation message (#4505) ### Site Enhancements @@ -139,11 +140,11 @@ ### Bug Fixes -* Fix extension weirdness with folders (#4493) -* EntryFilter: only include 'excluded' log on excluded files (#4479) -* `Jekyll.sanitized_path`: escape tildes before sanitizing a questionable path (#4468) -* `LiquidRenderer#parse`: parse with line numbers (#4453) -* `Document#<=>`: protect against nil comparison in dates. (#4446) + * Fix extension weirdness with folders (#4493) + * EntryFilter: only include 'excluded' log on excluded files (#4479) + * `Jekyll.sanitized_path`: escape tildes before sanitizing a questionable path (#4468) + * `LiquidRenderer#parse`: parse with line numbers (#4453) + * `Document#<=>`: protect against nil comparison in dates. (#4446) ## 3.0.2 / 2016-01-20 From 769331d8c24661fd7535752fc70ea45c2dae2917 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Thu, 11 Feb 2016 22:12:02 -0500 Subject: [PATCH 0434/4996] A few grammar fixes --- site/_docs/configuration.md | 3 ++- site/_docs/pages.md | 2 +- site/_docs/posts.md | 10 +++++----- site/_docs/windows.md | 8 ++++---- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 7a602b19e94..57044184121 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -500,7 +500,8 @@ defaults: layout: "default" {% endhighlight %} -In this example the `layout` is set to `default` inside the [collection](../collections/) with the name `my_collection`. +In this example, the `layout` is set to `default` inside the +[collection](../collections/) with the name `my_collection`. ### Precedence diff --git a/site/_docs/pages.md b/site/_docs/pages.md index 59b827e2013..32f7f9b85af 100644 --- a/site/_docs/pages.md +++ b/site/_docs/pages.md @@ -86,7 +86,7 @@ might look like: {% endhighlight %} This approach may not suit everyone, but for people who like clean URLs it’s -simple and it works. In the end the decision is yours! +simple and it works. In the end, the decision is yours!

    ProTip™: Use permalink Front Matter Variable
    diff --git a/site/_docs/posts.md b/site/_docs/posts.md index 47f60f3c320..1b3e322b233 100644 --- a/site/_docs/posts.md +++ b/site/_docs/posts.md @@ -6,10 +6,10 @@ permalink: /docs/posts/ One of Jekyll’s best aspects is that it is “blog aware”. What does this mean, exactly? Well, simply put, it means that blogging is baked into Jekyll’s -functionality. If you write articles and publish them online, this means that -you can publish and maintain a blog simply by managing a folder of text-files on -your computer. Compared to the hassle of configuring and maintaining databases -and web-based CMS systems, this will be a welcome change! +functionality. If you write articles and publish them online, you can publish +and maintain a blog simply by managing a folder of text-files on your computer. +Compared to the hassle of configuring and maintaining databases and web-based +CMS systems, this will be a welcome change! ## The Posts Folder @@ -23,7 +23,7 @@ static site. ### Creating Post Files -To create a new post, all you need to do is create a new file in the `_posts` +To create a new post, all you need to do is create a file in the `_posts` directory. How you name files in this folder is important. Jekyll requires blog post files to be named according to the following format: diff --git a/site/_docs/windows.md b/site/_docs/windows.md index 5a1a0a56ffa..ddb0892662b 100644 --- a/site/_docs/windows.md +++ b/site/_docs/windows.md @@ -11,11 +11,11 @@ knowledge and lessons that have been unearthed by Windows users. ## Installation 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]. +[Jekyll running on Windows][windows-installation] and it seems to work for most +people. The instructions were written for Ruby 2.0.0, but should work for later +versions [prior to 2.2][hitimes-issue]. -Alternatively David Burela has written instructions on [how to install Jekyll via Chocolately with 3 command prompt entries](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/) +Alternatively David Burela has written instructions on [how to install Jekyll via Chocolately with 3 command prompt entries](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/). ## Encoding From 8d8021e0ac3ac9a3088f39e826cc6283c8bd0104 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Sat, 13 Feb 2016 00:06:03 +0100 Subject: [PATCH 0435/4996] require at least cucumber version 2.1.0 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index cd21a668f76..520616be4ee 100644 --- a/Gemfile +++ b/Gemfile @@ -15,7 +15,7 @@ end # group :test do - gem "cucumber" + gem "cucumber", "~> 2.1" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" gem "codeclimate-test-reporter" From bbdbcefbbba4b7cfdcf3de7c935f89b00ddd12f2 Mon Sep 17 00:00:00 2001 From: Juuso Mikkonen Date: Sat, 13 Feb 2016 20:16:09 +0200 Subject: [PATCH 0436/4996] Added amp-jekyll plugin to plugins docs --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 4695f4874c6..7249a8e8d9c 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -738,6 +738,7 @@ LESS.js files during generation. - [Jekyll-Umlauts by Arne Gockeln](https://github.com/webchef/jekyll-umlauts): This generator replaces all german umlauts (äöüß) case sensitive with html. - [Jekyll Flickr Plugin](https://github.com/lawmurray/indii-jekyll-flickr) by [Lawrence Murray](http://www.indii.org): Generates posts for photos uploaded to a Flickr photostream. - [Jekyll::Paginate::Category](https://github.com/midnightSuyama/jekyll-paginate-category): Pagination Generator for Jekyll Category. +- [AMP-Jekyll by Juuso Mikkonen](https://github.com/juusaw/amp-jekyll): Generate [Accelerated Mobile Pages](https://www.ampproject.org) of Jekyll posts. #### Converters From 5fa5c54c1ebd485f10644f7778f9013c2365dc77 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 13 Feb 2016 14:04:36 -0800 Subject: [PATCH 0437/4996] Update history to reflect merge of #4517 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 36dc54b6f92..9719fd2b4c7 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * Add note about upgrading documentation on jekyllrb.com/help/ (#4484) * Update Rake link (#4496) * Update & prune the short list of example sites (#4374) + * Added amp-jekyll plugin to plugins docs (#4517) ## 3.1.1 / 2016-01-29 From 13bea15bbef75d19a25d28b34bfe2a8dc056af4e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 13 Feb 2016 14:41:20 -0800 Subject: [PATCH 0438/4996] Update history to reflect merge of #4514 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 9719fd2b4c7..b4ee67cb308 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,9 @@ ## HEAD +### Development Fixes + + * require at least cucumber version 2.1.0 (#4514) + ### Bug Fixes * Fix #4427: Make our @config hash symbol accessible. (#4428) From 4c8c59dfcb8b80c8dd3d8df562a9d664be10348c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 13 Feb 2016 14:42:46 -0800 Subject: [PATCH 0439/4996] Update history to reflect merge of #4512 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b4ee67cb308..fdea67adbee 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,7 @@ * Update Rake link (#4496) * Update & prune the short list of example sites (#4374) * Added amp-jekyll plugin to plugins docs (#4517) + * A few grammar fixes (#4512) ## 3.1.1 / 2016-01-29 From abd8fef19bc71a5bc7b770e52c12c427e948bc30 Mon Sep 17 00:00:00 2001 From: bojanland Date: Mon, 15 Feb 2016 00:39:53 -0500 Subject: [PATCH 0440/4996] Update structure.md Two grammatical corrections. :) --- site/_docs/structure.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/structure.md b/site/_docs/structure.md index f571aea8deb..d4ba3ade6cf 100644 --- a/site/_docs/structure.md +++ b/site/_docs/structure.md @@ -7,9 +7,9 @@ permalink: /docs/structure/ Jekyll is, at its core, a text transformation engine. The concept behind the system is this: you give it text written in your favorite markup language, be that Markdown, Textile, or just plain HTML, and it churns that through a layout -or series of layout files. Throughout that process you can tweak how you want +or a series of layout files. Throughout that process you can tweak how you want the site URLs to look, what data gets displayed in the layout, and more. This -is all done through editing text files, and the static web site is the final +is all done through editing text files; the static web site is the final product. A basic Jekyll site usually looks something like this: From 4cb707960166c6148554b408f3c78c3c2a2d7631 Mon Sep 17 00:00:00 2001 From: toshi Date: Tue, 16 Feb 2016 00:33:28 +0900 Subject: [PATCH 0441/4996] Add jekyll-tagging-related_posts plugin --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 7249a8e8d9c..3236c03bad9 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -860,6 +860,7 @@ LESS.js files during generation. - [Growl Notification Generator by Tate Johnson](https://gist.github.com/490101): Send Jekyll notifications to Growl. - [Growl Notification Hook by Tate Johnson](https://gist.github.com/525267): Better alternative to the above, but requires his “hook” fork. - [Related Posts by Lawrence Woodman](https://github.com/LawrenceWoodman/related_posts-jekyll_plugin): Overrides `site.related_posts` to use categories to assess relationship. +- [jekyll-tagging-related_posts](https://github.com/toshimaru/jekyll-tagging-related_posts): Jekyll related_posts function based on tags (works on Jekyll3). - [Tiered Archives by Eli Naeher](https://gist.github.com/88cda643aa7e3b0ca1e5): Create tiered template variable that allows you to group archives by year and month. - [Jekyll-localization](https://github.com/blackwinter/jekyll-localization): Jekyll plugin that adds localization features to the rendering engine. - [Jekyll-rendering](https://github.com/blackwinter/jekyll-rendering): Jekyll plugin to provide alternative rendering engines. From e4aa45b03f0791068368252169079e5cf3f06258 Mon Sep 17 00:00:00 2001 From: atomicules Date: Mon, 15 Feb 2016 14:33:01 +0000 Subject: [PATCH 0442/4996] Fix titleize_slug so already capitalized words are not dropped Previously `titleize` used `capitalize!` which has the side effect of returning `nil` for anything already starting with a capital letter. This commit changes it to just `capitalize`. Example, before: A file "2016-01-01-This-is-a-title-with-Capitals.markdown" would return "Is A Title With" for `post.title` Example, after: A file "2016-01-01-This-is-a-title-with-Capitals.markdown" will return "This Is A Title With Capitals" for `post.title` Tests added for `titleize_slug` in test_utils.rb Fix problem introduced in 67f842546efa980146778c85fb613e6c9b53dcb4 References #4525 --- lib/jekyll/utils.rb | 2 +- test/test_utils.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index e5d45c6d5e6..5d0dda2e0d9 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -20,7 +20,7 @@ def strip_heredoc(str) def titleize_slug(slug) slug.split("-").map! do |val| - val.capitalize! + val.capitalize end.join(" ") end diff --git a/test/test_utils.rb b/test/test_utils.rb index a2335391dbe..eab0ca1ec41 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -206,6 +206,14 @@ class TestUtils < JekyllUnitTest end end + context "The \`Utils.titleize_slug\` method" do + should "capitalize all words and not drop any words" do + assert_equal "This Is A Long Title With Mixed Capitalization", Utils.titleize_slug("This-is-a-Long-title-with-Mixed-capitalization") + assert_equal "This Is A Title With Just The Initial Word Capitalized", Utils.titleize_slug("This-is-a-title-with-just-the-initial-word-capitalized") + assert_equal "This Is A Title With No Capitalization", Utils.titleize_slug("this-is-a-title-with-no-capitalization") + end + end + context "The \`Utils.add_permalink_suffix\` method" do should "handle built-in permalink styles" do assert_equal "/:basename/", Utils.add_permalink_suffix("/:basename", :pretty) From 4d648c85581dbdc646bc7f32985806195e2e1e44 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 15 Feb 2016 20:50:43 -0800 Subject: [PATCH 0443/4996] Update history to reflect merge of #4525 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fdea67adbee..1e50da10e16 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * Fix #4427: Make our @config hash symbol accessible. (#4428) * `Jekyll.sanitized_path`: sanitizing a questionable path should handle tildes (#4492) + * Fix titleize so already capitalized words are not dropped (#4525) ### Minor Enhancements From 22f5b1988452974a1e30ced6d694bb8a532a5fdb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 15 Feb 2016 20:58:11 -0800 Subject: [PATCH 0444/4996] Update history to reflect merge of #4522 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1e50da10e16..d2dc51a5382 100644 --- a/History.markdown +++ b/History.markdown @@ -30,6 +30,7 @@ * Update & prune the short list of example sites (#4374) * Added amp-jekyll plugin to plugins docs (#4517) * A few grammar fixes (#4512) + * Update structure.md (#4522) ## 3.1.1 / 2016-01-29 From 40928364d495615259560666eb657eea82ac1885 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 15 Feb 2016 20:58:55 -0800 Subject: [PATCH 0445/4996] Updaet history message for #4522 [ci skip] --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index d2dc51a5382..1341cbd3993 100644 --- a/History.markdown +++ b/History.markdown @@ -30,7 +30,7 @@ * Update & prune the short list of example sites (#4374) * Added amp-jekyll plugin to plugins docs (#4517) * A few grammar fixes (#4512) - * Update structure.md (#4522) + * Correct a couple mistakes in structure.md (#4522) ## 3.1.1 / 2016-01-29 From 84f9bcdd426e5a73ec3e3a94986a786779c24c6a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 15 Feb 2016 21:58:22 -0800 Subject: [PATCH 0446/4996] Update the site history --- README.markdown | 2 -- site/_docs/datafiles.md | 6 +++--- site/_docs/history.md | 10 +++++----- site/_includes/footer.html | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/README.markdown b/README.markdown index 50ec363e2ad..0e37c531468 100644 --- a/README.markdown +++ b/README.markdown @@ -14,8 +14,6 @@ [hakiri]: https://hakiri.io/github/jekyll/jekyll/master [travis]: https://travis-ci.org/jekyll/jekyll -By Tom Preston-Werner, Nick Quaranto, Parker Moore, and many [awesome contributors](https://github.com/jekyll/jekyll/graphs/contributors)! - Jekyll is a simple, blog-aware, static site generator perfect for personal, project, or organization sites. Think of it like a file-based CMS, without all the complexity. Jekyll takes your content, renders Markdown and Liquid templates, and spits out a complete, static website ready to be served by Apache, Nginx or another web server. Jekyll is the engine behind [GitHub Pages](http://pages.github.com), which you can use to host sites right from your GitHub repositories. ## Philosophy diff --git a/site/_docs/datafiles.md b/site/_docs/datafiles.md index afa54b8fc67..4fd85b4848c 100644 --- a/site/_docs/datafiles.md +++ b/site/_docs/datafiles.md @@ -33,8 +33,8 @@ of code in your Jekyll templates: In `_data/members.yml`: {% highlight yaml %} -- name: Tom Preston-Werner - github: mojombo +- name: Eric Mill + github: konklone - name: Parker Moore github: parkr @@ -47,7 +47,7 @@ Or `_data/members.csv`: {% highlight text %} name,github -Tom Preston-Werner,mojombo +Eric Mill,konklone Parker Moore,parkr Liu Fengyun,liufengyun {% endhighlight %} diff --git a/site/_docs/history.md b/site/_docs/history.md index 6514e2c40f0..c7086d00cfc 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -132,11 +132,11 @@ permalink: "/docs/history/" ### Bug Fixes {: #bug-fixes-v3-0-3} -* Fix extension weirdness with folders ([#4493]({{ site.repository }}/issues/4493)) -* EntryFilter: only include 'excluded' log on excluded files ([#4479]({{ site.repository }}/issues/4479)) -* `Jekyll.sanitized_path`: escape tildes before sanitizing a questionable path ([#4468]({{ site.repository }}/issues/4468)) -* `LiquidRenderer#parse`: parse with line numbers ([#4453]({{ site.repository }}/issues/4453)) -* `Document#<=>`: protect against nil comparison in dates. ([#4446]({{ site.repository }}/issues/4446)) +- Fix extension weirdness with folders ([#4493]({{ site.repository }}/issues/4493)) +- EntryFilter: only include 'excluded' log on excluded files ([#4479]({{ site.repository }}/issues/4479)) +- `Jekyll.sanitized_path`: escape tildes before sanitizing a questionable path ([#4468]({{ site.repository }}/issues/4468)) +- `LiquidRenderer#parse`: parse with line numbers ([#4453]({{ site.repository }}/issues/4453)) +- `Document#<=>`: protect against nil comparison in dates. ([#4446]({{ site.repository }}/issues/4446)) ## 3.0.2 / 2016-01-20 diff --git a/site/_includes/footer.html b/site/_includes/footer.html index 09bab7375da..4893510685d 100644 --- a/site/_includes/footer.html +++ b/site/_includes/footer.html @@ -1,7 +1,7 @@

    From 5e6aef6138794c6c69e74e8e111d093f4c3db2af Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 15 Feb 2016 21:59:44 -0800 Subject: [PATCH 0447/4996] Update some links on the index page --- site/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/index.html b/site/index.html index a8bda742851..faa87cb380b 100644 --- a/site/index.html +++ b/site/index.html @@ -30,7 +30,7 @@

    Blog-aware

    Permalinks, categories, pages, posts, and custom layouts are all first-class citizens here.

    - Migrate your blog → + Migrate your blog →
    @@ -79,7 +79,7 @@

    Get up and running in seconds.

    Free Jekyll hosting on GitHub Pages

    Free hosting with GitHub Pages

    -

    Sick of dealing with hosting companies? GitHub Pages are powered by Jekyll, so you can easily deploy your site using GitHub for free—custom domain name and all.

    +

    Sick of dealing with hosting companies? GitHub Pages are powered by Jekyll, so you can easily deploy your site using GitHub for free—custom domain name and all.

    Learn more about GitHub Pages →
    From d38d90f2782e630660d3db55ebb3a60f810b0b1d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 16 Feb 2016 12:54:41 -0800 Subject: [PATCH 0448/4996] Add some redirects. --- site/redirects/github.html | 4 ++++ site/redirects/issues.html | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 site/redirects/github.html create mode 100644 site/redirects/issues.html diff --git a/site/redirects/github.html b/site/redirects/github.html new file mode 100644 index 00000000000..6042d0d068a --- /dev/null +++ b/site/redirects/github.html @@ -0,0 +1,4 @@ +--- +permalink: /github.html +redirect_to: https://github.com/jekyll/jekyll +--- diff --git a/site/redirects/issues.html b/site/redirects/issues.html new file mode 100644 index 00000000000..677605101a1 --- /dev/null +++ b/site/redirects/issues.html @@ -0,0 +1,4 @@ +--- +permalink: /issues.html +redirect_to: https://github.com/jekyll/jekyll/issues +--- From 2bd0d062e11ee2b6bc4187fc00dec7f47f731515 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 17 Feb 2016 10:27:18 -0800 Subject: [PATCH 0449/4996] Add an issue template for new issues --- ISSUE_TEMPLATE.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 ISSUE_TEMPLATE.md diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 00000000000..37235ea3666 --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,18 @@ +###### What version of Jekyll are you using (`jekyll -v`)? + + +###### What operating system are you using? + + + +###### What did you do? + + + +###### What did you expect to see? + + + +###### What did you see instead? + + From 65e7605342bcb08b2582fbe241792bdbb5266c1c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 17 Feb 2016 10:27:48 -0800 Subject: [PATCH 0450/4996] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 37235ea3666..3a30fdbfc39 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,6 +1,7 @@ ###### What version of Jekyll are you using (`jekyll -v`)? + ###### What operating system are you using? From b440d478ea904c6a9a622835629c3e8ae1929211 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 17 Feb 2016 10:33:17 -0800 Subject: [PATCH 0451/4996] Add hint to "What did you do?" --- ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 3a30fdbfc39..614de1c9412 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -7,6 +7,7 @@ ###### What did you do? +(Please include the content causing the issue, any relevant configuration settings, and the command you ran) From d387fd0baab65675dbd973189db14359d36e4d54 Mon Sep 17 00:00:00 2001 From: Henry Goodman Date: Wed, 17 Feb 2016 00:29:57 -0800 Subject: [PATCH 0452/4996] Add show_dir_listing option for serve command --- lib/jekyll/commands/serve.rb | 4 ++++ lib/jekyll/configuration.rb | 1 + test/test_commands_serve.rb | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 29408fe2336..69ea8ba7c3d 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -10,6 +10,8 @@ class << self "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], "port" => ["-P", "--port [PORT]", "Port to listen on"], "baseurl" => ["-b", "--baseurl [URL]", "Base URL"], + "show_dir_listing" => ["--show-dir-listing", + "Show a directory listing instead of loading your index file."], "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", "Skips the initial site build which occurs before the server is started."] } @@ -91,6 +93,8 @@ def webrick_opts(opts) ) } + opts[:DirectoryIndex] = [] if opts[:JekyllOptions]['show_dir_listing'] + enable_ssl(opts) enable_logging(opts) opts diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 0f8618a1b8b..cf499aa21f3 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -44,6 +44,7 @@ class Configuration < Hash 'port' => '4000', 'host' => '127.0.0.1', 'baseurl' => '', + 'show_dir_listing' => false, # Output Configuration 'permalink' => 'date', diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 87472c3df06..9fd3c1db8e9 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -68,6 +68,11 @@ def custom_opts(what) ] end + should "use empty directory index list when show_dir_listing is true" do + opts = { "show_dir_listing" => true } + assert custom_opts(opts)[:DirectoryIndex].empty? + end + context "verbose" do should "debug when verbose" do assert_equal custom_opts({ "verbose" => true })[:Logger].level, 5 From 551f8b751fbe1da8c920ecfd81cf747ce3c1ed74 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 18 Feb 2016 16:56:39 -0800 Subject: [PATCH 0453/4996] `jekyll new` should create a Gemfile which is educational --- lib/jekyll/commands/new.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 433d33b79f2..0af8553bbfb 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -35,6 +35,10 @@ def process(args, options = {}) File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| f.write(scaffold_post_content) end + + File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| + f.write(gemfile_contents) + end end Jekyll.logger.info "New jekyll site installed in #{new_blog_path}." @@ -59,6 +63,27 @@ def initialized_post_name end private + + def gemfile_contents + <<-RUBY +source 'https://rubygems.org' + +# Hello! This is where you manage which Jekyll version is used to run. +# When you wwant to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem 'jekyll', '#{Jekyll::VERSION}' + +# If you have any plugins, put them here! +# group :jekyll_plugins do +# gem 'jekyll-github-metadata', '~> 1.0' +# end +RUBY + end def preserve_source_location?(path, options) !options["force"] && !Dir["#{path}/**/*"].empty? From 7897a1842cd97fa9e602b256129a8862a2737693 Mon Sep 17 00:00:00 2001 From: Michael Lyons Date: Fri, 19 Feb 2016 11:27:46 -0800 Subject: [PATCH 0454/4996] Updated "custom domain name" link on homepage --- site/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/index.html b/site/index.html index faa87cb380b..cda453f11e2 100644 --- a/site/index.html +++ b/site/index.html @@ -79,7 +79,7 @@

    Get up and running in seconds.

    Free Jekyll hosting on GitHub Pages

    Free hosting with GitHub Pages

    -

    Sick of dealing with hosting companies? GitHub Pages are powered by Jekyll, so you can easily deploy your site using GitHub for free—custom domain name and all.

    +

    Sick of dealing with hosting companies? GitHub Pages are powered by Jekyll, so you can easily deploy your site using GitHub for free—custom domain name and all.

    Learn more about GitHub Pages →
    From 3aa80b7d048edcddb246468b6e10c477764f874a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 13:31:18 -0800 Subject: [PATCH 0455/4996] Allow collections to have documents that have no file extension --- features/collections.feature | 27 ++++++++++++------------- lib/jekyll/collection.rb | 2 +- test/source/_methods/collection/entries | 5 +++++ test/test_collections.rb | 1 + test/test_document.rb | 4 ++-- 5 files changed, 22 insertions(+), 17 deletions(-) create mode 100644 test/source/_methods/collection/entries diff --git a/features/collections.feature b/features/collections.feature index ad17a896b99..ac67611edd6 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -10,7 +10,6 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status And the _site directory should exist - And I should see "Collections:

    Use Jekyll.configuration to build a full configuration for use w/Jekyll.

    \n\n

    Whatever: foo.bar

    \n

    Signs are nice

    \n

    Jekyll.sanitized_path is used to make sure your path is in your source.

    \n

    Run your generators! default

    \n

    Page without title.

    \n

    Run your generators! default

    " in "_site/index.html" And the "_site/methods/configuration.html" file should not exist Scenario: Rendered collection @@ -77,8 +76,8 @@ Feature: Collections """ When I run jekyll build Then I should get a zero exit status - And the _site directory should exist - And I should see "Collections: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" + Then the _site directory should exist + And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" Scenario: Collections specified as an hash Given I have an "index.html" page that contains "Collections: {% for method in site.methods %}{{ method.relative_path }} {% endfor %}" @@ -90,8 +89,8 @@ Feature: Collections """ When I run jekyll build Then I should get a zero exit status - And the _site directory should exist - And I should see "Collections: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" + Then the _site directory should exist + And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" Scenario: All the documents Given I have an "index.html" page that contains "All documents: {% for doc in site.documents %}{{ doc.relative_path }} {% endfor %}" @@ -103,11 +102,11 @@ Feature: Collections """ When I run jekyll build Then I should get a zero exit status - And the _site directory should exist - And I should see "All documents: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" + Then the _site directory should exist + And I should see "All documents: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" Scenario: Documents have an output attribute, which is the converted HTML - Given I have an "index.html" page that contains "First document's output: {{ site.documents.first.output }}" + Given I have an "index.html" page that contains "Second document's output: {{ site.documents[1].output }}" And I have fixture collections And I have a "_config.yml" file with content: """ @@ -116,8 +115,8 @@ Feature: Collections """ When I run jekyll build Then I should get a zero exit status - And the _site directory should exist - And I should see "First document's output:

    Use Jekyll.configuration to build a full configuration for use w/Jekyll.

    \n\n

    Whatever: foo.bar

    " in "_site/index.html" + Then the _site directory should exist + And I should see "Second document's output:

    Use Jekyll.configuration to build a full configuration for use w/Jekyll.

    \n\n

    Whatever: foo.bar

    " in "_site/index.html" Scenario: Filter documents by where Given I have an "index.html" page that contains "{% assign items = site.methods | where: 'whatever','foo.bar' %}Item count: {{ items.size }}" @@ -133,7 +132,7 @@ Feature: Collections And I should see "Item count: 2" in "_site/index.html" Scenario: Sort by title - Given I have an "index.html" page that contains "{% assign items = site.methods | sort: 'title' %}1. of {{ items.size }}: {{ items.first.output }}" + Given I have an "index.html" page that contains "{% assign items = site.methods | sort: 'title' %}2. of {{ items.size }}: {{ items[1].output }}" And I have fixture collections And I have a "_config.yml" file with content: """ @@ -143,10 +142,10 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status And the _site directory should exist - And I should see "1. of 7:

    Page without title.

    " in "_site/index.html" + And I should see "2. of 8:

    Page without title.

    " in "_site/index.html" Scenario: Sort by relative_path - Given I have an "index.html" page that contains "Collections: {% assign methods = site.methods | sort: 'relative_path' %}{% for method in methods %}{{ method.title }}, {% endfor %}" + Given I have an "index.html" page that contains "Collections: {% assign methods = site.methods | sort: 'relative_path' %}{{ methods | map:"title" | join: ", " }}" And I have fixture collections And I have a "_config.yml" file with content: """ @@ -156,7 +155,7 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status Then the _site directory should exist - And I should see "Collections: Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, Site#generate, YAML with Dots," in "_site/index.html" + And I should see "Collections: Collection#entries, Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, Site#generate," in "_site/index.html" Scenario: Rendered collection with date/dateless filename Given I have an "index.html" page that contains "Collections: {% for method in site.thanksgiving %}{{ method.title }} {% endfor %}" diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index f0e3333d6a9..11a4f06fe69 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -78,7 +78,7 @@ def read def entries return [] unless exists? @entries ||= - Utils.safe_glob(collection_dir, ["**", "*.*"]).map do |entry| + Utils.safe_glob(collection_dir, ["**", "*"]).map do |entry| entry["#{collection_dir}/"] = '' entry end diff --git a/test/source/_methods/collection/entries b/test/source/_methods/collection/entries new file mode 100644 index 00000000000..7622ac9ac81 --- /dev/null +++ b/test/source/_methods/collection/entries @@ -0,0 +1,5 @@ +--- +title: "Collection#entries" +--- + +I have no file extension but I should still be a part of the collection. diff --git a/test/test_collections.rb b/test/test_collections.rb index 138bed6bb6b..1ae8696cc7d 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -126,6 +126,7 @@ class TestCollections < JekyllUnitTest assert_includes %w[ _methods/configuration.md _methods/sanitized_path.md + _methods/collection/entries _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md diff --git a/test/test_document.rb b/test/test_document.rb index 1197c4da941..d3fac02f1e1 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -12,7 +12,7 @@ def assert_equal_value(key, one, other) "collections" => ["methods"] }) @site.process - @document = @site.collections["methods"].docs.first + @document = @site.collections["methods"].docs.detect {|d| d.relative_path == "_methods/configuration.md" } end should "exist" do @@ -49,7 +49,7 @@ def assert_equal_value(key, one, other) setup do @site = fixture_site({"collections" => ["methods"]}) @site.process - @document = @site.collections["methods"].docs.last + @document = @site.collections["methods"].docs.detect {|d| d.relative_path == "_methods/yaml_with_dots.md" } end should "know its data" do From d929242e2b3db510ff4d23d7c0ef7daa83ab1cb6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 15:00:28 -0800 Subject: [PATCH 0456/4996] Permalinks which end in a slash should always output HTML Duplicates #4493 for 3.1.1. /cc @jekyll/core --- lib/jekyll/document.rb | 7 +++++-- test/source/_with.dots/mit.txt | 4 ++++ test/source/contacts/humans.txt | 5 +++++ test/test_collections.rb | 2 +- test/test_filters.rb | 2 +- test/test_site.rb | 1 + 6 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 test/source/_with.dots/mit.txt create mode 100644 test/source/contacts/humans.txt diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index fc3633d8e09..10f1203e99a 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -217,8 +217,11 @@ def [](key) def destination(base_directory) dest = site.in_dest_dir(base_directory) path = site.in_dest_dir(dest, URL.unescape_path(url)) - path = File.join(path, "index.html") if url.end_with?("/") - path << output_ext unless path.end_with? output_ext + if url.end_with? "/" + path = File.join(path, "index.html") + else + path << output_ext unless path.end_with? output_ext + end path end diff --git a/test/source/_with.dots/mit.txt b/test/source/_with.dots/mit.txt new file mode 100644 index 00000000000..c366b0df4ed --- /dev/null +++ b/test/source/_with.dots/mit.txt @@ -0,0 +1,4 @@ +--- +--- + +I should be output to `/with.dots/mit/index.html`. diff --git a/test/source/contacts/humans.txt b/test/source/contacts/humans.txt new file mode 100644 index 00000000000..84e2982b561 --- /dev/null +++ b/test/source/contacts/humans.txt @@ -0,0 +1,5 @@ +--- +permalink: /contacts/humans/ +--- + +I should be output to `/contacts/humans/index.html`. diff --git a/test/test_collections.rb b/test/test_collections.rb index 138bed6bb6b..d6d7d7de36d 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -203,7 +203,7 @@ class TestCollections < JekyllUnitTest end should "contain one document" do - assert_equal 3, @collection.docs.size + assert_equal 4, @collection.docs.size end should "allow dots in the filename" do diff --git a/test/test_filters.rb b/test/test_filters.rb index ca7cd49d8d8..e9035b96bda 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -285,7 +285,7 @@ def to_liquid assert_equal 2, g["items"].size when "" assert g["items"].is_a?(Array), "The list of grouped items for '' is not an Array." - assert_equal 12, g["items"].size + assert_equal 13, g["items"].size end end end diff --git a/test/test_site.rb b/test/test_site.rb index c06c218e60c..3bb93c35bf0 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -178,6 +178,7 @@ def generate(site) environment.html exploit.md foo.md + humans.txt index.html index.html main.scss From 32c5ac35dd22b00d3ba3770b7747f41ba8335325 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 19 Feb 2016 15:13:15 -0800 Subject: [PATCH 0457/4996] Update history to reflect merge of #4546 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1341cbd3993..6990ded9dba 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,7 @@ * Fix #4427: Make our @config hash symbol accessible. (#4428) * `Jekyll.sanitized_path`: sanitizing a questionable path should handle tildes (#4492) * Fix titleize so already capitalized words are not dropped (#4525) + * Permalinks which end in a slash should always output HTML (#4546) ### Minor Enhancements From 05d753f4e00dac7bbdcae98fc86c4118f0f686bc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 15:40:57 -0800 Subject: [PATCH 0458/4996] Release :gem: v3.1.2 --- History.markdown | 20 ++++----- lib/jekyll/version.rb | 2 +- site/_docs/history.md | 41 +++++++++++++++++++ .../2016-02-19-jekyll-3-1-2-released.markdown | 20 +++++++++ site/latest_version.txt | 2 +- 5 files changed, 73 insertions(+), 12 deletions(-) create mode 100644 site/_posts/2016-02-19-jekyll-3-1-2-released.markdown diff --git a/History.markdown b/History.markdown index 6990ded9dba..14e8e235b3c 100644 --- a/History.markdown +++ b/History.markdown @@ -1,28 +1,28 @@ -## HEAD +## 3.1.2 / 2016-02-19 -### Development Fixes +### Minor Enhancements - * require at least cucumber version 2.1.0 (#4514) + * Include `.rubocop.yml` in Gem (#4437) + * `LiquidRenderer#parse`: parse with line numbers. (#4452) + * Add consistency to the no-subcommand deprecation message (#4505) ### Bug Fixes - * Fix #4427: Make our @config hash symbol accessible. (#4428) + * Fix syntax highlighting in kramdown by making `@config` accessible in the Markdown converter. (#4428) * `Jekyll.sanitized_path`: sanitizing a questionable path should handle tildes (#4492) - * Fix titleize so already capitalized words are not dropped (#4525) + * Fix `titleize` so already capitalized words are not dropped (#4525) * Permalinks which end in a slash should always output HTML (#4546) -### Minor Enhancements +### Development Fixes - * Include .rubocop.yml in Gem (#4437) - * LiquidRenderer#parse: parse with line numbers. (#4452) - * add consistency to the deprecation message (#4505) + * Require at least cucumber version 2.1.0 (#4514) ### Site Enhancements * Add jekyll-toc plugin (#4429) * Docs: Quickstart - added documentation about the `--force` option (#4410) * Fix broken links to the Code of Conduct (#4436) - * upgrade notes: mention trailing slash in permalink; fixes #4440 (#4455) + * Upgrade notes: mention trailing slash in permalink; fixes #4440 (#4455) * Add hooks to the plugin categories toc (#4463) * [add note] Jekyll 3 requires newer version of Ruby. (#4461) * Fix typo in upgrading docs (#4473) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 925e0b442d8..ba9ee23828d 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.1' + VERSION = '3.1.2' end diff --git a/site/_docs/history.md b/site/_docs/history.md index c7086d00cfc..b98ea83e94b 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -4,6 +4,47 @@ title: History permalink: "/docs/history/" --- +## 3.1.2 / 2016-02-19 +{: #v3-1-2} + +### Minor Enhancements +{: #minor-enhancements-v3-1-2} + +- Include `.rubocop.yml` in Gem ([#4437]({{ site.repository }}/issues/4437)) +- `LiquidRenderer#parse`: parse with line numbers. ([#4452]({{ site.repository }}/issues/4452)) +- Add consistency to the no-subcommand deprecation message ([#4505]({{ site.repository }}/issues/4505)) + +### Bug Fixes +{: #bug-fixes-v3-1-2} + +- Fix syntax highlighting in kramdown by making `[@config](https://github.com/config)` accessible in the Markdown converter. ([#4428]({{ site.repository }}/issues/4428)) +- `Jekyll.sanitized_path`: sanitizing a questionable path should handle tildes ([#4492]({{ site.repository }}/issues/4492)) +- Fix `titleize` so already capitalized words are not dropped ([#4525]({{ site.repository }}/issues/4525)) +- Permalinks which end in a slash should always output HTML ([#4546]({{ site.repository }}/issues/4546)) + +### Development Fixes +{: #development-fixes-v3-1-2} + +- Require at least cucumber version 2.1.0 ([#4514]({{ site.repository }}/issues/4514)) + +### Site Enhancements +{: #site-enhancements-v3-1-2} + +- Add jekyll-toc plugin ([#4429]({{ site.repository }}/issues/4429)) +- Docs: Quickstart - added documentation about the `--force` option ([#4410]({{ site.repository }}/issues/4410)) +- Fix broken links to the Code of Conduct ([#4436]({{ site.repository }}/issues/4436)) +- Upgrade notes: mention trailing slash in permalink; fixes [#4440]({{ site.repository }}/issues/4440) ([#4455]({{ site.repository }}/issues/4455)) +- Add hooks to the plugin categories toc ([#4463]({{ site.repository }}/issues/4463)) +- [add note] Jekyll 3 requires newer version of Ruby. ([#4461]({{ site.repository }}/issues/4461)) +- Fix typo in upgrading docs ([#4473]({{ site.repository }}/issues/4473)) +- Add note about upgrading documentation on jekyllrb.com/help/ ([#4484]({{ site.repository }}/issues/4484)) +- Update Rake link ([#4496]({{ site.repository }}/issues/4496)) +- Update & prune the short list of example sites ([#4374]({{ site.repository }}/issues/4374)) +- Added amp-jekyll plugin to plugins docs ([#4517]({{ site.repository }}/issues/4517)) +- A few grammar fixes ([#4512]({{ site.repository }}/issues/4512)) +- Correct a couple mistakes in structure.md ([#4522]({{ site.repository }}/issues/4522)) + + ## 3.1.1 / 2016-01-29 {: #v3-1-1} diff --git a/site/_posts/2016-02-19-jekyll-3-1-2-released.markdown b/site/_posts/2016-02-19-jekyll-3-1-2-released.markdown new file mode 100644 index 00000000000..775445107d0 --- /dev/null +++ b/site/_posts/2016-02-19-jekyll-3-1-2-released.markdown @@ -0,0 +1,20 @@ +--- +layout: news_item +title: 'Jekyll 3.1.2 Released!' +date: 2016-02-19 15:24:00 -0800 +author: parkr +version: 3.1.2 +categories: [release] +--- + +Happy Friday from sunny California! Today, we're excited to announce the release of Jekyll v3.1.2, which comes with some crucial bug fixes: + +* If a syntax error is encountered by Liquid, it will now print the line number. +* A nasty war between symbols and strings in our configuration hash caused kramdown syntax highlighting to break. That has been resolved; you stand victorious! +* A tilde at the beginning of a filename will no longer crash Jekyll. +* The `titleize` filter mistakenly dropped words that were already capitalized. Fixed! +* Permalinks which end in a slash will now always output as a folder with an `index.html` inside. + +Nitty-gritty details, like always, are available in the [history](/docs/history/). + +Thanks to those who contributed to this release: Alfred Xing, atomicules, bojanland, Brenton Horne, Carlos Garcés, Cash Costello, Chris, chrisfinazzo, Daniel Schildt, Dean Attali, Florian Thomas, Jordon Bedwell, Juuso Mikkonen, Katya Demidova, lonnen, Manabu Sakai, Michael Lee, Michael Lyons, Mitesh Shah, Nicolas Hoizey, Parker Moore, Pat Hawks, Prayag Verma, Robert Martin, Suriyaa Kudo, and toshi. diff --git a/site/latest_version.txt b/site/latest_version.txt index 94ff29cc4de..ef538c28109 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -3.1.1 +3.1.2 From 5d66a12ed4c34e73a4fb6cee5c14c967a0f295f7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 16:47:24 -0800 Subject: [PATCH 0459/4996] Ship jekyll-docs properly --- jekyll-docs/.gitignore | 3 +++ jekyll-docs/Gemfile | 2 ++ jekyll-docs/Rakefile | 19 ++++++++++++++++++ jekyll-docs/jekyll-docs.gemspec | 21 ++++++++++++++++++++ jekyll-docs/lib/jekyll-docs.rb | 34 +++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 jekyll-docs/.gitignore create mode 100644 jekyll-docs/Gemfile create mode 100644 jekyll-docs/Rakefile create mode 100644 jekyll-docs/jekyll-docs.gemspec create mode 100644 jekyll-docs/lib/jekyll-docs.rb diff --git a/jekyll-docs/.gitignore b/jekyll-docs/.gitignore new file mode 100644 index 00000000000..70c3dadcdcf --- /dev/null +++ b/jekyll-docs/.gitignore @@ -0,0 +1,3 @@ +jekyll +site +Gemfile.lock diff --git a/jekyll-docs/Gemfile b/jekyll-docs/Gemfile new file mode 100644 index 00000000000..851fabc21dd --- /dev/null +++ b/jekyll-docs/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gemspec diff --git a/jekyll-docs/Rakefile b/jekyll-docs/Rakefile new file mode 100644 index 00000000000..0d103d5293e --- /dev/null +++ b/jekyll-docs/Rakefile @@ -0,0 +1,19 @@ +require "bundler/gem_tasks" +task :build => :init +task :default => :init + +def jekyll_version + ENV.fetch('JEKYLL_VERSION') +end + +task :init do + sh "git clone git://github.com/jekyll/jekyll.git jekyll" unless Dir.exist? "jekyll/.git" + Dir.chdir("jekyll") { sh "git checkout v#{jekyll_version}" } + rm_rf "site" + cp_r "jekyll/site", "site" +end + +task :teardown do + rm_rf "site" + rm_rf "jekyll" +end diff --git a/jekyll-docs/jekyll-docs.gemspec b/jekyll-docs/jekyll-docs.gemspec new file mode 100644 index 00000000000..02c373ccd89 --- /dev/null +++ b/jekyll-docs/jekyll-docs.gemspec @@ -0,0 +1,21 @@ +# coding: utf-8 +require File.expand_path('../../lib/jekyll/version', __FILE__) + +Gem::Specification.new do |spec| + spec.name = 'jekyll-docs' + spec.version = ENV.fetch('JEKYLL_VERSION') + spec.authors = ['Parker Moore'] + spec.email = ['parkrmoore@gmail.com'] + spec.summary = %q{Offline usage documentation for Jekyll.} + spec.homepage = 'http://jekyllrb.com' + spec.license = 'MIT' + + spec.files = `git ls-files -z`.split("\x0").grep(%r{^site/}) + spec.files << "lib/jekyll-docs.rb" + spec.require_paths = ['lib'] + + spec.add_dependency 'jekyll', Jekyll::VERSION + + spec.add_development_dependency 'bundler', '~> 1.7' + spec.add_development_dependency 'rake', '~> 10.0' +end diff --git a/jekyll-docs/lib/jekyll-docs.rb b/jekyll-docs/lib/jekyll-docs.rb new file mode 100644 index 00000000000..76ed922d72e --- /dev/null +++ b/jekyll-docs/lib/jekyll-docs.rb @@ -0,0 +1,34 @@ +require 'rubygems' +require 'jekyll' + +module JekyllDocs + class DocsCommand < Jekyll::Command + class << self + def init_with_program(prog) + prog.command(:docs) do |cmd| + cmd.description "Start a local server for the Jekyll documentation" + cmd.syntax "docs [options]" + cmd.alias :d + + cmd.option "port", "-P", "--port", "Port to listen on." + + cmd.action do |_, opts| + JekyllDocs::DocsCommand.process(opts) + end + end + end + + def process(opts) + Dir.mktmpdir do |dest_dir| + Jekyll::Commands::Serve.process(opts.merge({ + "serving" => true, + "watch" => false, + "config" => File.expand_path("../../site/_config.yml", __FILE__), + "source" => File.expand_path("../../site/", __FILE__), + "destination" => dest_dir + })) + end + end + end + end +end From 391960b55f3c786775ea8d78ac387f97e3f6bc2b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 16:54:00 -0800 Subject: [PATCH 0460/4996] Add the ability to release jekyll-docs with the right site. --- jekyll-docs/Rakefile | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/jekyll-docs/Rakefile b/jekyll-docs/Rakefile index 0d103d5293e..a86fd4f8b3d 100644 --- a/jekyll-docs/Rakefile +++ b/jekyll-docs/Rakefile @@ -1,14 +1,24 @@ -require "bundler/gem_tasks" -task :build => :init task :default => :init -def jekyll_version +def name + "jekyll-docs".freeze +end + +def gemspec_file + "#{name}.gemspec" +end + +def gem_file + "#{name}-#{version}.gem" +end + +def version ENV.fetch('JEKYLL_VERSION') end task :init do sh "git clone git://github.com/jekyll/jekyll.git jekyll" unless Dir.exist? "jekyll/.git" - Dir.chdir("jekyll") { sh "git checkout v#{jekyll_version}" } + Dir.chdir("jekyll") { sh "git checkout v#{version}" } rm_rf "site" cp_r "jekyll/site", "site" end @@ -17,3 +27,29 @@ task :teardown do rm_rf "site" rm_rf "jekyll" end + +############################################################################# +# +# Packaging tasks +# +############################################################################# + +desc "Release #{name} v#{version}" +task :release => :build do + unless `git branch` =~ /^\* master$/ + puts "You must be on the master branch to release!" + exit! + end + unless `git diff`.empty? + puts "We cannot proceed with uncommitted changes!" + exit! + end + sh "gem push pkg/#{name}-#{version}.gem" +end + +desc "Build #{name} v#{version} into pkg/" +task :build => :init do + mkdir_p "pkg" + sh "gem build #{gemspec_file}" + sh "mv #{gem_file} pkg" +end From 8d7e329a6e62af4373a7f8911b8d76baef7a7652 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 16:54:24 -0800 Subject: [PATCH 0461/4996] Get jekyll-docs working. --- Gemfile | 1 + jekyll-docs.gemspec | 22 ---------------------- 2 files changed, 1 insertion(+), 22 deletions(-) delete mode 100644 jekyll-docs.gemspec diff --git a/Gemfile b/Gemfile index 520616be4ee..1aa5c5e4205 100644 --- a/Gemfile +++ b/Gemfile @@ -55,6 +55,7 @@ end group :jekyll_optional_dependencies do gem "toml", "~> 0.1.0" gem "coderay", "~> 1.1.0" + gem "jekyll-docs", path: './jekyll-docs' gem "jekyll-gist", "~> 1.0" gem "jekyll-feed", "~> 0.1.3" gem "jekyll-coffeescript", "~> 1.0" diff --git a/jekyll-docs.gemspec b/jekyll-docs.gemspec deleted file mode 100644 index 0a7975a351b..00000000000 --- a/jekyll-docs.gemspec +++ /dev/null @@ -1,22 +0,0 @@ -# coding: utf-8 -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'jekyll/version' - -Gem::Specification.new do |spec| - spec.name = 'jekyll-docs' - spec.version = Jekyll::VERSION - spec.authors = ['Parker Moore'] - spec.email = ['parkrmoore@gmail.com'] - spec.summary = %q{Offline usage documentation for Jekyll.} - spec.homepage = 'http://jekyllrb.com' - spec.license = 'MIT' - - spec.files = `git ls-files -z`.split("\x0").grep(%r{^site/}) - spec.require_paths = ['lib'] - - spec.add_dependency 'jekyll', Jekyll::VERSION - - spec.add_development_dependency 'bundler', '~> 1.7' - spec.add_development_dependency 'rake', '~> 10.0' -end From 18126d0ebd93568617dc4d38e817ab1b64e54c29 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 16:57:21 -0800 Subject: [PATCH 0462/4996] Fix jekyll-docs command. --- jekyll-docs/jekyll-docs.gemspec | 1 - jekyll-docs/lib/jekyll-docs.rb | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/jekyll-docs/jekyll-docs.gemspec b/jekyll-docs/jekyll-docs.gemspec index 02c373ccd89..9751ff52eec 100644 --- a/jekyll-docs/jekyll-docs.gemspec +++ b/jekyll-docs/jekyll-docs.gemspec @@ -1,5 +1,4 @@ # coding: utf-8 -require File.expand_path('../../lib/jekyll/version', __FILE__) Gem::Specification.new do |spec| spec.name = 'jekyll-docs' diff --git a/jekyll-docs/lib/jekyll-docs.rb b/jekyll-docs/lib/jekyll-docs.rb index 76ed922d72e..df8a9b024da 100644 --- a/jekyll-docs/lib/jekyll-docs.rb +++ b/jekyll-docs/lib/jekyll-docs.rb @@ -20,13 +20,15 @@ def init_with_program(prog) def process(opts) Dir.mktmpdir do |dest_dir| - Jekyll::Commands::Serve.process(opts.merge({ + options = opts.merge({ "serving" => true, "watch" => false, "config" => File.expand_path("../../site/_config.yml", __FILE__), - "source" => File.expand_path("../../site/", __FILE__), + "source" => File.expand_path("../../site", __FILE__), "destination" => dest_dir - })) + }) + Jekyll::Commands::Build.process(options) + Jekyll::Commands::Serve.process(options) end end end From fa4d327ddbaaf20a0e7efe35558150861baa242d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 16:58:40 -0800 Subject: [PATCH 0463/4996] jekyll-docs: use env var --- jekyll-docs/jekyll-docs.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll-docs/jekyll-docs.gemspec b/jekyll-docs/jekyll-docs.gemspec index 9751ff52eec..fcb4ed627b3 100644 --- a/jekyll-docs/jekyll-docs.gemspec +++ b/jekyll-docs/jekyll-docs.gemspec @@ -13,7 +13,7 @@ Gem::Specification.new do |spec| spec.files << "lib/jekyll-docs.rb" spec.require_paths = ['lib'] - spec.add_dependency 'jekyll', Jekyll::VERSION + spec.add_dependency 'jekyll', ENV.fetch('JEKYLL_VERSION') spec.add_development_dependency 'bundler', '~> 1.7' spec.add_development_dependency 'rake', '~> 10.0' From e9ecb93dec25f3086cc50c9dc53508a1b04d3569 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 17:07:22 -0800 Subject: [PATCH 0464/4996] fix up jekyll-docs --- jekyll-docs/Rakefile | 5 +++++ jekyll-docs/jekyll-docs.gemspec | 3 +-- jekyll-docs/lib/jekyll-docs.rb | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/jekyll-docs/Rakefile b/jekyll-docs/Rakefile index a86fd4f8b3d..770446b7c37 100644 --- a/jekyll-docs/Rakefile +++ b/jekyll-docs/Rakefile @@ -53,3 +53,8 @@ task :build => :init do sh "gem build #{gemspec_file}" sh "mv #{gem_file} pkg" end + +desc "Install #{name} v#{version} into your gem folder." +task :install => :build do + sh "gem install -l pkg/#{gem_file}" +end diff --git a/jekyll-docs/jekyll-docs.gemspec b/jekyll-docs/jekyll-docs.gemspec index fcb4ed627b3..11699172056 100644 --- a/jekyll-docs/jekyll-docs.gemspec +++ b/jekyll-docs/jekyll-docs.gemspec @@ -9,8 +9,7 @@ Gem::Specification.new do |spec| spec.homepage = 'http://jekyllrb.com' spec.license = 'MIT' - spec.files = `git ls-files -z`.split("\x0").grep(%r{^site/}) - spec.files << "lib/jekyll-docs.rb" + spec.files = Dir['**/*'].grep(%r{^(lib|site)/}) spec.require_paths = ['lib'] spec.add_dependency 'jekyll', ENV.fetch('JEKYLL_VERSION') diff --git a/jekyll-docs/lib/jekyll-docs.rb b/jekyll-docs/lib/jekyll-docs.rb index df8a9b024da..8e62f3de55a 100644 --- a/jekyll-docs/lib/jekyll-docs.rb +++ b/jekyll-docs/lib/jekyll-docs.rb @@ -1,5 +1,6 @@ require 'rubygems' require 'jekyll' +require 'tmpdir' module JekyllDocs class DocsCommand < Jekyll::Command From f05e3f340ef5d0c32c20b190521764d4390df142 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 17:16:49 -0800 Subject: [PATCH 0465/4996] Remove jekyll-docs and move to a separate repo. https://github.com/jekyll/jekyll-docs/commit/22ee87af88d4d0f3b7316ed6be0de3a087b99c82 --- jekyll-docs/.gitignore | 3 -- jekyll-docs/Gemfile | 2 -- jekyll-docs/Rakefile | 60 --------------------------------- jekyll-docs/jekyll-docs.gemspec | 19 ----------- jekyll-docs/lib/jekyll-docs.rb | 37 -------------------- 5 files changed, 121 deletions(-) delete mode 100644 jekyll-docs/.gitignore delete mode 100644 jekyll-docs/Gemfile delete mode 100644 jekyll-docs/Rakefile delete mode 100644 jekyll-docs/jekyll-docs.gemspec delete mode 100644 jekyll-docs/lib/jekyll-docs.rb diff --git a/jekyll-docs/.gitignore b/jekyll-docs/.gitignore deleted file mode 100644 index 70c3dadcdcf..00000000000 --- a/jekyll-docs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -jekyll -site -Gemfile.lock diff --git a/jekyll-docs/Gemfile b/jekyll-docs/Gemfile deleted file mode 100644 index 851fabc21dd..00000000000 --- a/jekyll-docs/Gemfile +++ /dev/null @@ -1,2 +0,0 @@ -source 'https://rubygems.org' -gemspec diff --git a/jekyll-docs/Rakefile b/jekyll-docs/Rakefile deleted file mode 100644 index 770446b7c37..00000000000 --- a/jekyll-docs/Rakefile +++ /dev/null @@ -1,60 +0,0 @@ -task :default => :init - -def name - "jekyll-docs".freeze -end - -def gemspec_file - "#{name}.gemspec" -end - -def gem_file - "#{name}-#{version}.gem" -end - -def version - ENV.fetch('JEKYLL_VERSION') -end - -task :init do - sh "git clone git://github.com/jekyll/jekyll.git jekyll" unless Dir.exist? "jekyll/.git" - Dir.chdir("jekyll") { sh "git checkout v#{version}" } - rm_rf "site" - cp_r "jekyll/site", "site" -end - -task :teardown do - rm_rf "site" - rm_rf "jekyll" -end - -############################################################################# -# -# Packaging tasks -# -############################################################################# - -desc "Release #{name} v#{version}" -task :release => :build do - unless `git branch` =~ /^\* master$/ - puts "You must be on the master branch to release!" - exit! - end - unless `git diff`.empty? - puts "We cannot proceed with uncommitted changes!" - exit! - end - sh "gem push pkg/#{name}-#{version}.gem" -end - -desc "Build #{name} v#{version} into pkg/" -task :build => :init do - mkdir_p "pkg" - sh "gem build #{gemspec_file}" - sh "mv #{gem_file} pkg" -end - -desc "Install #{name} v#{version} into your gem folder." -task :install => :build do - sh "gem install -l pkg/#{gem_file}" -end diff --git a/jekyll-docs/jekyll-docs.gemspec b/jekyll-docs/jekyll-docs.gemspec deleted file mode 100644 index 11699172056..00000000000 --- a/jekyll-docs/jekyll-docs.gemspec +++ /dev/null @@ -1,19 +0,0 @@ -# coding: utf-8 - -Gem::Specification.new do |spec| - spec.name = 'jekyll-docs' - spec.version = ENV.fetch('JEKYLL_VERSION') - spec.authors = ['Parker Moore'] - spec.email = ['parkrmoore@gmail.com'] - spec.summary = %q{Offline usage documentation for Jekyll.} - spec.homepage = 'http://jekyllrb.com' - spec.license = 'MIT' - - spec.files = Dir['**/*'].grep(%r{^(lib|site)/}) - spec.require_paths = ['lib'] - - spec.add_dependency 'jekyll', ENV.fetch('JEKYLL_VERSION') - - spec.add_development_dependency 'bundler', '~> 1.7' - spec.add_development_dependency 'rake', '~> 10.0' -end diff --git a/jekyll-docs/lib/jekyll-docs.rb b/jekyll-docs/lib/jekyll-docs.rb deleted file mode 100644 index 8e62f3de55a..00000000000 --- a/jekyll-docs/lib/jekyll-docs.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'rubygems' -require 'jekyll' -require 'tmpdir' - -module JekyllDocs - class DocsCommand < Jekyll::Command - class << self - def init_with_program(prog) - prog.command(:docs) do |cmd| - cmd.description "Start a local server for the Jekyll documentation" - cmd.syntax "docs [options]" - cmd.alias :d - - cmd.option "port", "-P", "--port", "Port to listen on." - - cmd.action do |_, opts| - JekyllDocs::DocsCommand.process(opts) - end - end - end - - def process(opts) - Dir.mktmpdir do |dest_dir| - options = opts.merge({ - "serving" => true, - "watch" => false, - "config" => File.expand_path("../../site/_config.yml", __FILE__), - "source" => File.expand_path("../../site", __FILE__), - "destination" => dest_dir - }) - Jekyll::Commands::Build.process(options) - Jekyll::Commands::Serve.process(options) - end - end - end - end -end From d1c08d85d2e63a63ab476e7b2471e566107b79d9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 17:18:08 -0800 Subject: [PATCH 0466/4996] Look for local docs if the dir exists. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 1aa5c5e4205..bad462bce52 100644 --- a/Gemfile +++ b/Gemfile @@ -55,7 +55,7 @@ end group :jekyll_optional_dependencies do gem "toml", "~> 0.1.0" gem "coderay", "~> 1.1.0" - gem "jekyll-docs", path: './jekyll-docs' + gem "jekyll-docs", path: '../docs' if Dir.exist?('../docs') gem "jekyll-gist", "~> 1.0" gem "jekyll-feed", "~> 0.1.3" gem "jekyll-coffeescript", "~> 1.0" From 0fd3c2d64c91255e29c28f2755193c7dad64b41c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 19 Feb 2016 17:44:52 -0800 Subject: [PATCH 0467/4996] Release :gem: 3.1.2 From 7bffb3924417b34669a7cf3c34736027c398db1e Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Sat, 20 Feb 2016 12:54:28 -0500 Subject: [PATCH 0468/4996] add jekyll-seo-tag, jekyll-avatar, jekyll-sitemap --- Gemfile | 3 +++ site/_config.yml | 8 ++++++++ site/_includes/news_item.html | 2 +- site/_includes/top.html | 2 +- site/_layouts/news_item.html | 2 +- site/index.html | 1 - 6 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index bad462bce52..d78513f5cdf 100644 --- a/Gemfile +++ b/Gemfile @@ -81,4 +81,7 @@ group :site do gem "html-proofer", "~> 2.0" end gem "jemoji" + gem "jekyll-sitemap" + gem "jekyll-seo-tag" + gem "jekyll-avatar" end diff --git a/site/_config.yml b/site/_config.yml index 241c5b01762..fe02703acc4 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -19,7 +19,15 @@ name: Jekyll • Simple, blog-aware, static sites description: Transform your plain text into static websites and blogs url: http://jekyllrb.com +twitter: + username: jekyllrb + +logo: img/logo-2x.png + gems: - jekyll-feed - jekyll-redirect-from - jemoji + - jekyll-sitemap + - jekyll-seo-tag + - jekyll-avatar diff --git a/site/_includes/news_item.html b/site/_includes/news_item.html index aaf0521742d..3ded9925abd 100644 --- a/site/_includes/news_item.html +++ b/site/_includes/news_item.html @@ -14,7 +14,7 @@

    {{ post.date | date_to_string }} diff --git a/site/_includes/top.html b/site/_includes/top.html index 2d12d1bd929..155ffbcacaf 100644 --- a/site/_includes/top.html +++ b/site/_includes/top.html @@ -2,7 +2,6 @@ - {{ page.title }} {% feed_meta %} @@ -10,6 +9,7 @@ + {% seo %} +- [ ] I believe this to be a bug, not a question about using Jekyll. +- [ ] I Read the CONTRIBUTION file at https://github.com/jekyll/jekyll/blob/master/.github/CONTRIBUTING.markdown +- [ ] I Updated to the latest Jekyll (or) if on Github Pages to the latest `github-pages` +--- -###### What operating system are you using? +- [ ] I am on ***MacOS*** 10+ +- [ ] I am on ***Ubuntu*** GNU/Linux +- [ ] I am on ***Fedora*** GNU/Linux +- [ ] I am on ***Arch*** GNU/Linux +- [ ] I am on ***Other*** GNU/Linux +- [ ] I am on ***Windows*** 10+ + -###### What did you do? -(Please include the content causing the issue, any relevant configuration settings, and the command you ran) +--- +- [ ] I was trying to install. +- [ ] There is a broken Plugin API. +- [ ] I was trying to build. +- [ ] It was another bug. +## My Reproduction Steps -###### What did you expect to see? + +## The Output I Got - -###### What did you see instead? + From 035352feff52725656a8114f4ff85a7fae161bd2 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 28 Apr 2016 04:28:15 -0500 Subject: [PATCH 0741/4996] Update the ISSUE_TEMPLATE.md file. * Link to jekyllrb.com as @parkr suggested. * Add a few more directions and hints for Github Pages users who have errors. * Add words that were missing and made stuff make no sense. --- .github/ISSUE_TEMPLATE.md | 52 +++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 125a851675d..5265bea4826 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,9 +1,9 @@ - [ ] I believe this to be a bug, not a question about using Jekyll. -- [ ] I Read the CONTRIBUTION file at https://github.com/jekyll/jekyll/blob/master/.github/CONTRIBUTING.markdown - [ ] I Updated to the latest Jekyll (or) if on Github Pages to the latest `github-pages` +- [ ] I Read the CONTRIBUTION file at https://jekyllrb.com/docs/contributing/ +- [ ] This is a feature request. --- -- [ ] I am on ***MacOS*** 10+ -- [ ] I am on ***Ubuntu*** GNU/Linux -- [ ] I am on ***Fedora*** GNU/Linux -- [ ] I am on ***Arch*** GNU/Linux -- [ ] I am on ***Other*** GNU/Linux -- [ ] I am on ***Windows*** 10+ - +- [ ] I am on (or have tested on) ***Mac OS*** 10+ +- [ ] I am on (or have tested on) ***Debian/Ubuntu*** GNU/Linux +- [ ] I am on (or have tested on) ***Fedora*** GNU/Linux +- [ ] I am on (or have tested on) ***Arch*** GNU/Linux +- [ ] I am on (or have tested on) ***Other*** GNU/Linux +- [ ] I am on (or have tested on) ***Windows*** 10+ + + -## The Output I Got +## The Output I Wanted - From d74f8d6dd941b507aa714679d0a2106c7ec657fb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 28 Apr 2016 17:55:15 -0700 Subject: [PATCH 0742/4996] Fix spacing on the msg in Configuration#renamed_key --- lib/jekyll/configuration.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 735b2c6745d..87bfeb46015 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -286,8 +286,8 @@ def add_default_collections def renamed_key(old, new, config, _ = nil) if config.key?(old) Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" \ - "option has been renamed to '#{new}'. Please update your config " \ - "file accordingly." + " option has been renamed to '#{new}'. Please update your config" \ + " file accordingly." config[new] = config.delete(old) end end From 19b566e6ea22548e4d2540ec56ee375ca2f2b672 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 28 Apr 2016 18:26:29 -0700 Subject: [PATCH 0743/4996] site: use rouge instead of pygments --- site/_config.yml | 2 +- site/_docs/continuous-integration.md | 4 +-- site/_docs/deployment-methods.md | 14 ++++---- site/_docs/installation.md | 8 ++--- site/_docs/pages.md | 4 +-- site/_docs/posts.md | 4 +-- site/_docs/quickstart.md | 2 +- site/_docs/structure.md | 2 +- site/_docs/templates.md | 22 ++++++------ site/_docs/troubleshooting.md | 34 +++++++++---------- site/_docs/upgrading/0-to-2.md | 2 +- site/_docs/upgrading/2-to-3.md | 2 +- site/_docs/usage.md | 8 ++--- site/_docs/windows.md | 2 +- ...01-24-jekyll-3-0-0-beta1-released.markdown | 2 +- 15 files changed, 56 insertions(+), 56 deletions(-) diff --git a/site/_config.yml b/site/_config.yml index a7c596534ca..e284a81bedd 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -1,5 +1,5 @@ markdown: kramdown -highlighter: pygments +highlighter: rouge permalink: /news/:year/:month/:day/:title/ excerpt_separator: "" diff --git a/site/_docs/continuous-integration.md b/site/_docs/continuous-integration.md index 15e498986c0..8a50afa768d 100644 --- a/site/_docs/continuous-integration.md +++ b/site/_docs/continuous-integration.md @@ -38,7 +38,7 @@ Save the commands you want to run and succeed in a file: `./script/cibuild` ### The HTML Proofer Executable -{% highlight bash %} +{% highlight shell %} #!/usr/bin/env bash set -e # halt script on error @@ -52,7 +52,7 @@ Some options can be specified via command-line switches. Check out the For example to avoid testing external sites, use this command: -{% highlight bash %} +{% highlight shell %} $ bundle exec htmlproofer ./_site --disable-external {% endhighlight %} diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index 7ec7546fc9b..b516c931b19 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -35,7 +35,7 @@ this](http://web.archive.org/web/20091223025644/http://www.taknado.com/en/2009/0 To have a remote server handle the deploy for you every time you push changes using Git, you can create a user account which has all the public keys that are authorized to deploy in its `authorized_keys` file. With that in place, setting up the post-receive hook is done as follows: -{% highlight bash %} +{% highlight shell %} laptop$ ssh deployer@example.com server$ mkdir myrepo.git server$ cd myrepo.git @@ -47,7 +47,7 @@ server$ mkdir /var/www/myrepo Next, add the following lines to hooks/post-receive and be sure Jekyll is installed on the server: -{% highlight bash %} +{% highlight shell %} GIT_REPO=$HOME/myrepo.git TMP_GIT_CLONE=$HOME/tmp/myrepo PUBLIC_WWW=/var/www/myrepo @@ -61,14 +61,14 @@ exit Finally, run the following command on any users laptop that needs to be able to deploy using this hook: -{% highlight bash %} +{% highlight shell %} laptops$ git remote add deploy deployer@example.com:~/myrepo.git {% endhighlight %} Deploying is now as easy as telling nginx or Apache to look at `/var/www/myrepo` and running the following: -{% highlight bash %} +{% highlight shell %} laptops$ git push deploy master {% endhighlight %} @@ -129,7 +129,7 @@ is to put the restriction to certificate-based authorization in `~/.ssh/authorized_keys`. Then, launch `rrsync` and supply it with the folder it shall have read-write access to: -{% highlight bash %} +{% highlight shell %} command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa {% endhighlight %} @@ -139,7 +139,7 @@ command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pt Add the `deploy` script to the site source folder: -{% highlight bash %} +{% highlight shell %} #!/bin/sh rsync -crvz --rsh='ssh -p2222' --delete-after --delete-excluded @: @@ -155,7 +155,7 @@ your host uses a different port than the default (e.g, HostGator) Using this setup, you might run the following command: -{% highlight bash %} +{% highlight shell %} rsync -crvz --rsh='ssh -p2222' --delete-after --delete-excluded _site/ hostuser@example.org: {% endhighlight %} diff --git a/site/_docs/installation.md b/site/_docs/installation.md index e557cb76960..f608a29908f 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -37,7 +37,7 @@ The best way to install Jekyll is via [RubyGems](http://rubygems.org/pages/download). At the terminal prompt, simply run the following command to install Jekyll: -{% highlight bash %} +{% highlight shell %} $ gem install jekyll {% endhighlight %} @@ -62,14 +62,14 @@ community can improve the experience for everyone. In order to install a pre-release, make sure you have all the requirements installed properly and run: -{% highlight bash %} +{% highlight shell %} gem install jekyll --pre {% endhighlight %} This will install the latest pre-release. If you want a particular pre-release, use the `-v` switch to indicate the version you'd like to install: -{% highlight bash %} +{% highlight shell %} gem install jekyll -v '2.0.0.alpha.1' {% endhighlight %} @@ -77,7 +77,7 @@ If you'd like to install a development version of Jekyll, the process is a bit more involved. This gives you the advantage of having the latest and greatest, but may be unstable. -{% highlight bash %} +{% highlight shell %} $ git clone git://github.com/jekyll/jekyll.git $ cd jekyll $ script/bootstrap diff --git a/site/_docs/pages.md b/site/_docs/pages.md index aaed2e14ba6..48ba3de67bc 100644 --- a/site/_docs/pages.md +++ b/site/_docs/pages.md @@ -46,7 +46,7 @@ directory with a suitable name for the page you want to create. For a site with a homepage, an about page, and a contact page, here’s what the root directory and associated URLs might look like: -{% highlight bash %} +{% highlight shell %} . |-- _config.yml |-- _includes/ @@ -69,7 +69,7 @@ the page URL ends up being the folder name, and the web server will serve up the respective `index.html` file. Here's an example of what this structure might look like: -{% highlight bash %} +{% highlight shell %} . ├── _config.yml ├── _includes/ diff --git a/site/_docs/posts.md b/site/_docs/posts.md index 33710b53e23..2a9bf3faed8 100644 --- a/site/_docs/posts.md +++ b/site/_docs/posts.md @@ -27,7 +27,7 @@ To create a new post, all you need to do is create a file in the `_posts` directory. How you name files in this folder is important. Jekyll requires blog post files to be named according to the following format: -{% highlight bash %} +{% highlight shell %} YEAR-MONTH-DAY-title.MARKUP {% endhighlight %} @@ -35,7 +35,7 @@ Where `YEAR` is a four-digit number, `MONTH` and `DAY` are both two-digit numbers, and `MARKUP` is the file extension representing the format used in the file. For example, the following are examples of valid post filenames: -{% highlight bash %} +{% highlight shell %} 2011-12-31-new-years-eve-is-awesome.md 2012-09-12-how-to-write-a-blog.textile {% endhighlight %} diff --git a/site/_docs/quickstart.md b/site/_docs/quickstart.md index 8a63cb33508..9d3800f5f15 100644 --- a/site/_docs/quickstart.md +++ b/site/_docs/quickstart.md @@ -6,7 +6,7 @@ permalink: /docs/quickstart/ For the impatient, here's how to get a boilerplate Jekyll site up and running. -{% highlight bash %} +{% highlight shell %} ~ $ gem install jekyll ~ $ jekyll new myblog ~ $ cd myblog diff --git a/site/_docs/structure.md b/site/_docs/structure.md index d4ba3ade6cf..227b8491ce9 100644 --- a/site/_docs/structure.md +++ b/site/_docs/structure.md @@ -14,7 +14,7 @@ product. A basic Jekyll site usually looks something like this: -{% highlight bash %} +{% highlight shell %} . ├── _config.yml ├── _drafts diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 663a060db92..1c09cab0787 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -341,7 +341,7 @@ The default is `default`. They are as follows (with what they filter): If you have small page fragments that you wish to include in multiple places on your site, you can use the `include` tag. -{% highlight ruby %} +{% highlight liquid %} {% raw %}{% include footer.html %}{% endraw %} {% endhighlight %} @@ -362,13 +362,13 @@ root of your source directory. This will embed the contents of You can also pass parameters to an include. Omit the quotation marks to send a variable's value. Liquid curly brackets should not be used here: -{% highlight ruby %} +{% highlight liquid %} {% raw %}{% include footer.html param="value" variable-param=page.variable %}{% endraw %} {% endhighlight %} These parameters are available via Liquid in the include: -{% highlight ruby %} +{% highlight liquid %} {% raw %}{{ include.param }}{% endraw %} {% endhighlight %} @@ -376,7 +376,7 @@ These parameters are available via Liquid in the include: You can also choose to include file fragments relative to the current file: -{% highlight ruby %} +{% highlight liquid %} {% raw %}{% include_relative somedir/footer.html %}{% endraw %} {% endhighlight %} @@ -404,7 +404,7 @@ languages](http://pygments.org/languages/) To render a code block with syntax highlighting, surround your code as follows: -{% highlight text %} +{% highlight liquid %} {% raw %} {% highlight ruby %} def foo @@ -427,7 +427,7 @@ Including the `linenos` argument will force the highlighted code to include line numbers. For instance, the following code block would include line numbers next to each line: -{% highlight text %} +{% highlight liquid %} {% raw %} {% highlight ruby linenos %} def foo @@ -452,7 +452,7 @@ numbers from the highlighted code. If you would like to include a link to a post on your site, the `post_url` tag will generate the correct permalink URL for the post you specify. -{% highlight text %} +{% highlight liquid %} {% raw %} {% post_url 2010-07-21-name-of-post %} {% endraw %} @@ -461,7 +461,7 @@ will generate the correct permalink URL for the post you specify. If you organize your posts in subdirectories, you need to include subdirectory path to the post: -{% highlight text %} +{% highlight liquid %} {% raw %} {% post_url /subdir/2010-07-21-name-of-post %} {% endraw %} @@ -471,7 +471,7 @@ There is no need to include the file extension when using the `post_url` tag. You can also use this tag to create a link to a post in Markdown as follows: -{% highlight text %} +{% highlight liquid %} {% raw %} [Name of Link]({% post_url 2010-07-21-name-of-post %}) {% endraw %} @@ -482,7 +482,7 @@ You can also use this tag to create a link to a post in Markdown as follows: Use the `gist` tag to easily embed a GitHub Gist onto your site. This works with public or secret gists: -{% highlight text %} +{% highlight liquid %} {% raw %} {% gist parkr/931c1c8d465a04042403 %} {% endraw %} @@ -490,7 +490,7 @@ with public or secret gists: You may also optionally specify the filename in the gist to display: -{% highlight text %} +{% highlight liquid %} {% raw %} {% gist parkr/931c1c8d465a04042403 jekyll-private-gist.markdown %} {% endraw %} diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index 899f129e05a..c78e7a060dc 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -20,19 +20,19 @@ If you encounter errors during gem installation, you may need to install the header files for compiling extension modules for Ruby 2.0.0. This can be done on Ubuntu or Debian by running: -{% highlight bash %} +{% highlight shell %} sudo apt-get install ruby2.0.0-dev {% endhighlight %} On Red Hat, CentOS, and Fedora systems you can do this by running: -{% highlight bash %} +{% highlight shell %} sudo yum install ruby-devel {% endhighlight %} If you installed the above - specifically on Fedora 23 - but the extensions would still not compile, you are probably running a Fedora image that misses the `redhat-rpm-config` package. To solve this, simply run: -{% highlight bash %} +{% highlight shell %} sudo dnf install redhat-rpm-config {% endhighlight %} @@ -40,7 +40,7 @@ sudo dnf install redhat-rpm-config On [NearlyFreeSpeech](https://www.nearlyfreespeech.net/) you need to run the following commands before installing Jekyll: -{% highlight bash %} +{% highlight shell %} export GEM_HOME=/home/private/gems export GEM_PATH=/home/private/gems:/usr/local/lib/ruby/gems/1.8/ export PATH=$PATH:/home/private/gems/bin @@ -49,7 +49,7 @@ export RB_USER_INSTALL='true' To install RubyGems on Gentoo: -{% highlight bash %} +{% highlight shell %} sudo emerge -av dev-ruby/rubygems {% endhighlight %} @@ -58,21 +58,21 @@ DevKit](https://wiki.github.com/oneclick/rubyinstaller/development-kit). On Mac OS X, you may need to update RubyGems (using `sudo` only if necessary): -{% highlight bash %} +{% highlight shell %} sudo gem update --system {% endhighlight %} If you still have issues, you can download and install new Command Line Tools (such as `gcc`) using the command -{% highlight bash %} +{% highlight shell %} xcode-select --install {% endhighlight %} which may allow you to install native gems using this command (again using `sudo` only if necessary): -{% highlight bash %} +{% highlight shell %} sudo gem install jekyll {% endhighlight %} @@ -90,20 +90,20 @@ longer available. Given these changes, there are a couple of simple ways to get up and running. One option is to change the location where the gem will be installed (again using `sudo` only if necessary): -{% highlight bash %} +{% highlight shell %} sudo gem install -n /usr/local/bin jekyll {% endhighlight %} Alternatively, Homebrew can be installed and used to set up Ruby. This can be done as follows: -{% highlight bash %} +{% highlight shell %} ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" {% endhighlight %} Once Homebrew is installed, the second step is easy: -{% highlight bash %} +{% highlight shell %} brew install ruby {% endhighlight %} @@ -119,13 +119,13 @@ which to install Jekyll. If you elect to use one of the above methods to install Ruby, it might be necessary to modify your `$PATH` variable using the following command: -{% highlight bash %} +{% highlight shell %} export PATH=/usr/local/bin:$PATH {% endhighlight %} GUI apps can modify the `$PATH` as follows: -{% highlight bash %} +{% highlight shell %} launchctl setenv PATH "/usr/local/bin:$PATH" {% endhighlight %} @@ -151,19 +151,19 @@ in order to have the `jekyll` executable be available in your Terminal. If you are using base-url option like: -{% highlight bash %} +{% highlight shell %} jekyll serve --baseurl '/blog' {% endhighlight %} … then make sure that you access the site at: -{% highlight bash %} +{% highlight shell %} http://localhost:4000/blog/index.html {% endhighlight %} It won’t work to just access: -{% highlight bash %} +{% highlight shell %} http://localhost:4000/blog {% endhighlight %} @@ -192,7 +192,7 @@ The latest version, version 2.0, seems to break the use of `{{ "{{" }}` in templates. Unlike previous versions, using `{{ "{{" }}` in 2.0 triggers the following error: -{% highlight bash %} +{% highlight shell %} '{{ "{{" }}' was not properly terminated with regexp: /\}\}/ (Liquid::SyntaxError) {% endhighlight %} diff --git a/site/_docs/upgrading/0-to-2.md b/site/_docs/upgrading/0-to-2.md index 84ec90e71b7..9d91b01948a 100644 --- a/site/_docs/upgrading/0-to-2.md +++ b/site/_docs/upgrading/0-to-2.md @@ -9,7 +9,7 @@ and 2.0 that you'll want to know about. Before we dive in, go ahead and fetch the latest version of Jekyll: -{% highlight bash %} +{% highlight shell %} $ gem update jekyll {% endhighlight %} diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index e6fb2366f3d..775937fd07e 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -9,7 +9,7 @@ that you'll want to know about. Before we dive in, go ahead and fetch the latest version of Jekyll: -{% highlight bash %} +{% highlight shell %} $ gem update jekyll {% endhighlight %} diff --git a/site/_docs/usage.md b/site/_docs/usage.md index 28c4efb0a06..ee02b508e14 100644 --- a/site/_docs/usage.md +++ b/site/_docs/usage.md @@ -7,7 +7,7 @@ permalink: /docs/usage/ The Jekyll gem makes a `jekyll` executable available to you in your Terminal window. You can use this command in a number of ways: -{% highlight bash %} +{% highlight shell %} $ jekyll build # => The current folder will be generated into ./_site @@ -52,7 +52,7 @@ $ jekyll build --watch Jekyll also comes with a built-in development server that will allow you to preview what the generated site will look like in your browser locally. -{% highlight bash %} +{% highlight shell %} $ jekyll serve # => A development server will run at http://localhost:4000/ # Auto-regeneration: enabled. Use `--no-watch` to disable. @@ -70,7 +70,7 @@ $ jekyll serve --detach

    -{% highlight bash %} +{% highlight shell %} $ jekyll serve --no-watch # => Same as `jekyll serve` but will not watch for changes. {% endhighlight %} @@ -89,7 +89,7 @@ destination: _deploy Then the following two commands will be equivalent: -{% highlight bash %} +{% highlight shell %} $ jekyll build $ jekyll build --source _source --destination _deploy {% endhighlight %} diff --git a/site/_docs/windows.md b/site/_docs/windows.md index c573747dfc0..ec98dcdeda0 100644 --- a/site/_docs/windows.md +++ b/site/_docs/windows.md @@ -27,7 +27,7 @@ Additionally, you might need to change the code page of the console window to UT in case you get a "Liquid Exception: Incompatible character encoding" error during the site generation process. It can be done with the following command: -{% highlight bash %} +{% highlight shell %} $ chcp 65001 {% endhighlight %} diff --git a/site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown b/site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown index 49b35b77d76..9ba83b045a0 100644 --- a/site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown +++ b/site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown @@ -20,7 +20,7 @@ to get a feel for what changes are afoot. Key features: To install just run: -{% highlight bash %} +{% highlight shell %} $ gem install jekyll --pre {% endhighlight %} From 342d5a425054cfba494d584fdf44b29efe5690f3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 28 Apr 2016 18:26:44 -0700 Subject: [PATCH 0744/4996] site: optimize liquid for whitespace removal --- site/_includes/docs_option.html | 12 +++--------- site/_includes/docs_ul.html | 16 +++------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/site/_includes/docs_option.html b/site/_includes/docs_option.html index c2593971921..e7afcc88aa1 100644 --- a/site/_includes/docs_option.html +++ b/site/_includes/docs_option.html @@ -1,11 +1,5 @@ -{% assign items = include.items %} - -{% for item in items %} +{% for item in include.items %} {% assign item_url = item | prepend:"/docs/" | append:"/" %} - - {% for p in site.docs %} - {% if p.url == item_url %} - - {% endif %} - {% endfor %} + {% assign doc = site.docs | where: "url", item_url | first %} + {% endfor %} diff --git a/site/_includes/docs_ul.html b/site/_includes/docs_ul.html index 34b6278a84f..7688328fc20 100644 --- a/site/_includes/docs_ul.html +++ b/site/_includes/docs_ul.html @@ -1,17 +1,7 @@ -{% assign items = include.items %} -
      -{% for item in items %} +{% for item in include.items %} {% assign item_url = item | prepend:"/docs/" | append:"/" %} - - {% if item_url == page.url %} - {% assign c = "current" %} - {% else %} - {% assign c = "" %} - {% endif %} - - {% assign p = site.docs | where:"url",item_url | first %} -
    • {{ p.title }}
    • - + {% assign p = site.docs | where:"url", item_url | first %} +
    • {{ p.title }}
    • {% endfor %}
    From 0ee1a75d16265abc250d0747c5f93bf2ad2daa05 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 28 Apr 2016 18:27:57 -0700 Subject: [PATCH 0745/4996] Update history to reflect merge of #4854 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7525ba4972d..b7922ae2d03 100644 --- a/History.markdown +++ b/History.markdown @@ -84,6 +84,7 @@ * Organize Form Platforms-as-a-Service into unified list & add FormSpree.io (#4754) * Fixed typo on Configuration page (#4804) * Update FormKeep URL on the Resources doc (#4844) + * site: use liquid & reduce some whitespace noise (#4854) ## 3.1.3 / 2016-04-18 From 46f54e6b94f69d668b372d75722c147a1c3641a0 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 28 Apr 2016 20:58:05 -0500 Subject: [PATCH 0746/4996] Update Colorator to 1.0 --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 167e424c4d4..62c944148db 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -32,7 +32,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency('kramdown', '~> 1.3') s.add_runtime_dependency('mercenary', '~> 0.3.3') s.add_runtime_dependency('safe_yaml', '~> 1.0') - s.add_runtime_dependency('colorator', '~> 0.1') + s.add_runtime_dependency('colorator', '~> 1.0') s.add_runtime_dependency('rouge', '~> 1.7') s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0') s.add_runtime_dependency('jekyll-watch', '~> 1.1') From b8e7669228ab24342b87d0a480b75f4e68c30a5f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 28 Apr 2016 19:07:17 -0700 Subject: [PATCH 0747/4996] Update history to reflect merge of #4855 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b7922ae2d03..83af4a44b6a 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * Globalize Jekyll's Filters. (#4792) * Gem-based themes (#4595) * Allow symlinks if they point to stuff inside site.source (#4710) + * Update colorator dependency to v1.x (#4855) ### Bug Fixes From 44cf61d241013ad72d616d85624f9202ceb661b4 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 29 Apr 2016 06:35:58 -0500 Subject: [PATCH 0748/4996] Fix #4856: Don't rescue LoadError or bundler load errors for Bundler. When it comes to bundler it's smart enough to know what to require, and in casees it's not, it's smart enough to accept :require. In most cases when bundler has a LoadError (or otherwise) it's because there is a problem inside of the Gem itself and when this happens, Jekyll will happily let that error slip when it shouldn't, resulting in a badly placed error that is actually wrong. This corrects that so errors can surface properly. --- lib/jekyll/plugin_manager.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index 502c4a731b1..45eeaa79506 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -30,16 +30,16 @@ def require_gems def self.require_from_bundler if !ENV["JEKYLL_NO_BUNDLER_REQUIRE"] && File.file?("Gemfile") require "bundler" - Bundler.setup # puts all groups on the load path - required_gems = Bundler.require(:jekyll_plugins) # requires the gems in this group only + + Bundler.setup + required_gems = Bundler.require(:jekyll_plugins) Jekyll.logger.debug("PluginManager:", "Required #{required_gems.map(&:name).join(', ')}") ENV["JEKYLL_NO_BUNDLER_REQUIRE"] = "true" + true else false end - rescue LoadError, Bundler::GemfileNotFound - false end # Check whether a gem plugin is allowed to be used during this build. From 53d6b91fc86c30f18db40fa5defa8f28d73358b1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 29 Apr 2016 12:22:47 -0700 Subject: [PATCH 0749/4996] Update history to reflect merge of #4857 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 83af4a44b6a..5967f2a6ac4 100644 --- a/History.markdown +++ b/History.markdown @@ -39,6 +39,7 @@ * convertible: use Document::YAML_FRONT_MATTER_REGEXP to parse transformable files (#4786) * Example in the site template should be IANA-approved example.com (#4793) * 3.2.x/master: Fix defaults for Documents (posts/collection docs) (#4808) + * Don't rescue LoadError or bundler load errors for Bundler. (#4857) ### Development Fixes From 55734ee482e58019ca4aedc9ad386de810a4b91d Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 3 May 2016 12:27:37 -0700 Subject: [PATCH 0750/4996] Add jekyll-ideal-image-slider --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 17de8fdc62d..ead3861f090 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -859,6 +859,7 @@ LESS.js files during generation. - [jekyll-figure](https://github.com/paulrobertlloyd/jekyll-figure): A liquid tag for Jekyll that generates `
    ` elements. - [Jekyll Video Embed](https://github.com/eug/jekyll-video-embed): It provides several tags to easily embed videos (e.g. Youtube, Vimeo, UStream and Ted Talks) - [jekyll-i18n_tags](https://github.com/KrzysiekJ/jekyll-i18n_tags): Translate your templates. +- [Jekyll Ideal Image Slider](https://github.com/xHN35RQ/jekyll-ideal-image-slider): Liquid tag plugin to create image sliders using [Ideal Image Slider](https://github.com/gilbitron/Ideal-Image-Slider). #### Collections From 2d8a228b599e7f62e691410d191261f4c25c3bad Mon Sep 17 00:00:00 2001 From: Andrew Artajos Date: Thu, 5 May 2016 09:14:03 +1000 Subject: [PATCH 0751/4996] Fixed a typo Fixed a typo from indend to indent. Just making the code more readable. --- features/support/formatter.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/support/formatter.rb b/features/support/formatter.rb index f399a3ce16c..9e82a4e5c95 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -82,9 +82,9 @@ def after_background(background) # - def background_name(keyword, name, source_line, indend) + def background_name(keyword, name, source_line, indent) print_feature_element_name( - keyword, name, source_line, indend + keyword, name, source_line, indent ) end From 770b6ab0734436876a1eecbc737fee06a33a0152 Mon Sep 17 00:00:00 2001 From: Josh Waller Date: Sat, 7 May 2016 08:37:34 -0400 Subject: [PATCH 0752/4996] Adding pug plugin Jade has been moved to Pug https://github.com/pugjs/pug This was forked from the previous Jade plugin and merged the pug update to maintain the newer version and avoid deprecation usage. --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 17de8fdc62d..80688b53cc2 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -757,6 +757,7 @@ LESS.js files during generation. - [Textile converter](https://github.com/jekyll/jekyll-textile-converter): Convert `.textile` files into HTML. Also includes the `textilize` Liquid filter. - [Slim plugin](https://github.com/slim-template/jekyll-slim): Slim converter and includes for Jekyll with support for Liquid tags. - [Jade plugin by John Papandriopoulos](https://github.com/snappylabs/jade-jekyll-plugin): Jade converter for Jekyll. +- [Pug plugin by Josh Waller](https://github.com/mdxprograms/pug-jekyll-plugin): Pug (previously Jade) converter for Jekyll. - [HAML plugin by Sam Z](https://gist.github.com/517556): HAML converter for Jekyll. - [HAML-Sass Converter by Adam Pearson](https://gist.github.com/481456): Simple HAML-Sass converter for Jekyll. [Fork](https://gist.github.com/528642) by Sam X. - [Sass SCSS Converter by Mark Wolfe](https://gist.github.com/960150): Sass converter which uses the new CSS compatible syntax, based Sam X’s fork above. From d9ab71cb59dfdd98128dee77c788db079d22a490 Mon Sep 17 00:00:00 2001 From: No Date: Sat, 7 May 2016 20:15:16 +0200 Subject: [PATCH 0753/4996] Breadcrumbs integration for Jekyll 3.x --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 17de8fdc62d..e7c0ecffd0d 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -901,6 +901,7 @@ LESS.js files during generation. - [jekyll-paspagon](https://github.com/KrzysiekJ/jekyll-paspagon): Sell your posts in various formats for cryptocurrencies. - [Hawkins](https://github.com/awood/hawkins): Adds a `liveserve` sub-command to Jekyll that incorporates [LiveReload](http://livereload.com/) into your pages while you preview them. No more hitting the refresh button in your browser! - [Jekyll Autoprefixer](https://github.com/vwochnik/jekyll-autoprefixer): Autoprefixer integration for Jekyll +- [Jekyll-breadcrumbs](https://github.com/git-no/jekyll-breadcrumbs): Creates breadcrumbs for Jekyll 3.x, includes features like SEO optimization, optional breadcrumb item translation and more. #### Editors From 4dab3dd4230774f8ae0a5ee0177ec7d19f00a28d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 10 May 2016 12:33:15 -0700 Subject: [PATCH 0754/4996] Update history to reflect merge of #4874 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5967f2a6ac4..0549a9fa8b1 100644 --- a/History.markdown +++ b/History.markdown @@ -87,6 +87,7 @@ * Fixed typo on Configuration page (#4804) * Update FormKeep URL on the Resources doc (#4844) * site: use liquid & reduce some whitespace noise (#4854) + * Add jekyll-breadcrumbs to list of third-party plugins (#4874) ## 3.1.3 / 2016-04-18 From 7f3a9e1f40aea6283664bd851d78c5e630f636fa Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 10 May 2016 12:34:02 -0700 Subject: [PATCH 0755/4996] Update history to reflect merge of #4872 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0549a9fa8b1..034b69a662c 100644 --- a/History.markdown +++ b/History.markdown @@ -88,6 +88,7 @@ * Update FormKeep URL on the Resources doc (#4844) * site: use liquid & reduce some whitespace noise (#4854) * Add jekyll-breadcrumbs to list of third-party plugins (#4874) + * Added Pug converter to list of third-party plugins (#4872) ## 3.1.3 / 2016-04-18 From 92720363e1f8a4b0a5baf1f0f9a3e0e5c6c8ce14 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 10 May 2016 12:35:42 -0700 Subject: [PATCH 0756/4996] Update history to reflect merge of #4863 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 034b69a662c..39b9d91a423 100644 --- a/History.markdown +++ b/History.markdown @@ -89,6 +89,7 @@ * site: use liquid & reduce some whitespace noise (#4854) * Add jekyll-breadcrumbs to list of third-party plugins (#4874) * Added Pug converter to list of third-party plugins (#4872) + * Add jekyll-ideal-image-slider to list of third-party plugins (#4863) ## 3.1.3 / 2016-04-18 From 3751b47c504fe80fff5acd51a58904b5975eff4c Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Sat, 30 Apr 2016 01:16:43 -0500 Subject: [PATCH 0757/4996] Cleanup EntryFilter and make it far more robust. * Allow users to filter directories by ending their path with "/" * Allow users to filter with a Regexp, some scenariors can really require it. * Use Pathutil#in_path? for Symlink verification, it real/expand. This also requires some downstream work in "jekyll-watch" which at this time is not very robust, it doesn't recognize the difference either, and should probably start doing so (what I mean is detecting "/" and using the full path.) --- jekyll.gemspec | 1 + lib/jekyll.rb | 1 + lib/jekyll/entry_filter.rb | 76 +++++++++++++++++++++++++++++--------- test/test_entry_filter.rb | 11 ++++++ 4 files changed, 72 insertions(+), 17 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 62c944148db..3f32f0a96d3 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -36,4 +36,5 @@ Gem::Specification.new do |s| s.add_runtime_dependency('rouge', '~> 1.7') s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0') s.add_runtime_dependency('jekyll-watch', '~> 1.1') + s.add_runtime_dependency("pathutil", "~> 0.9") end diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 8afdf06ad4c..ffc1539f373 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -16,6 +16,7 @@ def require_all(path) require 'rubygems' # stdlib +require "pathutil" require 'forwardable' require 'fileutils' require 'time' diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index cccd05f9117..496bf56f2ad 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -1,12 +1,15 @@ module Jekyll class EntryFilter - SPECIAL_LEADING_CHARACTERS = ['.', '_', '#', '~'].freeze - attr_reader :site + SPECIAL_LEADING_CHARACTERS = [ + '.', '_', '#', '~' + ].freeze def initialize(site, base_directory = nil) @site = site - @base_directory = derive_base_directory(@site, base_directory.to_s.dup) + @base_directory = derive_base_directory( + @site, base_directory.to_s.dup + ) end def base_directory @@ -14,14 +17,14 @@ def base_directory end def derive_base_directory(site, base_dir) - if base_dir.start_with?(site.source) - base_dir[site.source] = "" - end + base_dir[site.source] = "" if base_dir.start_with?(site.source) base_dir end def relative_to_source(entry) - File.join(base_directory, entry) + File.join( + base_directory, entry + ) end def filter(entries) @@ -33,7 +36,9 @@ def filter(entries) end def included?(entry) - glob_include?(site.include, entry) + glob_include?(site.include, + entry + ) end def special?(entry) @@ -51,25 +56,62 @@ def excluded?(entry) excluded end + # -- + # Check if a file is a symlink. + # NOTE: This can be converted to allowing even in safe, + # since we use Pathutil#in_path? now. + # -- def symlink?(entry) site.safe && File.symlink?(entry) && symlink_outside_site_source?(entry) end + # -- + # NOTE: Pathutil#in_path? gets the realpath. + # @param [] entry the entry you want to validate. + # Check if a path is outside of our given root. + # -- def symlink_outside_site_source?(entry) - ! File.realpath(entry).start_with?(File.realpath(@site.source)) - end - - def ensure_leading_slash(path) - path[0..0] == "/" ? path : "/#{path}" + !Pathutil.new(entry).in_path?( + site.in_source_dir + ) end + # -- + # Check if an entry matches a specific pattern and return true,false. # Returns true if path matches against any glob pattern. - # Look for more detail about glob pattern in method File::fnmatch. + # -- def glob_include?(enum, e) - entry = ensure_leading_slash(e) + entry = Pathutil.new(site.in_source_dir).join(e) enum.any? do |exp| - item = ensure_leading_slash(exp) - File.fnmatch?(item, entry) || entry.start_with?(item) + + # Users who send a Regexp knows what they want to + # exclude, so let them send a Regexp to exclude files, + # we will not bother caring if it works or not, it's + # on them at this point. + + if exp.is_a?(Regexp) + entry =~ exp + + else + item = Pathutil.new(site.in_source_dir).join(exp) + + # If it's a directory they want to exclude, AKA + # ends with a "/" then we will go on to check and + # see if the entry falls within that path and + # exclude it if that's the case. + + if e.end_with?("/") + entry.in_path?( + item + ) + + else + File.fnmatch?(item, entry) || + entry.to_path.start_with?( + item + ) + end + end end end end diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb index d20c9be2d0f..d9e38300bca 100644 --- a/test/test_entry_filter.rb +++ b/test/test_entry_filter.rb @@ -14,6 +14,17 @@ class TestEntryFilter < JekyllUnitTest assert_equal %w[foo.markdown bar.markdown baz.markdown .htaccess], entries end + should "allow regexp filtering" do + files = %w(README.md) + @site.exclude = excludes = [ + /README/ + ] + + assert_empty @site.reader.filter_entries( + files + ) + end + should "filter entries with exclude" do excludes = %w[README TODO vendor/bundle] files = %w[index.html site.css .htaccess vendor] From 209cd6b7296b20e0cf579c219beec59fd0a81cab Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 12 May 2016 12:16:35 -0500 Subject: [PATCH 0758/4996] Update history to reflect merge of #4859 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 39b9d91a423..b0a9c7bad9c 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * Gem-based themes (#4595) * Allow symlinks if they point to stuff inside site.source (#4710) * Update colorator dependency to v1.x (#4855) + * Move EntryFilter to use Pathutil & fix `glob_include?` (#4859) ### Bug Fixes From 1ae4f513d887c32c335a286ca5373e710095de53 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 12:19:46 -0500 Subject: [PATCH 0759/4996] Add 'ruby' to pre-filled Gemfile for 'jekyll new' Fixes #4839 --- lib/jekyll/commands/new.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 689895be9cf..50838f41e1c 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -35,7 +35,7 @@ def process(args, options = {}) File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| f.write(scaffold_post_content) end - + File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| f.write(gemfile_contents) end @@ -63,11 +63,12 @@ def initialized_post_name end private - + def gemfile_contents <<-RUBY source "https://rubygems.org" - +ruby RUBY_VERSION + # Hello! This is where you manage which Jekyll version is used to run. # When you want to use a different version, change it below, save the # file and run `bundle install`. Run Jekyll with `bundle exec`, like so: @@ -81,7 +82,7 @@ def gemfile_contents # If you want to use GitHub Pages, remove the "gem "jekyll"" above and # uncomment the line below. To upgrade, run `bundle update github-pages`. # gem "github-pages", group: :jekyll_plugins - + # If you have any plugins, put them here! # group :jekyll_plugins do # gem "jekyll-github-metadata", "~> 1.0" From 917b47045922a58ad1d85f450137f00b59a0ad46 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 13:41:53 -0500 Subject: [PATCH 0760/4996] merge rubocop rules with the ones from pages-gem --- .rubocop.yml | 267 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 193 insertions(+), 74 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 1f0ffeb231d..8821744604c 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,80 +1,199 @@ -Metrics/MethodLength: { Max: 24 } -Metrics/ClassLength: { Max: 240 } -Metrics/ModuleLength: { Max: 240 } -Metrics/LineLength: { Max: 112 } -Metrics/CyclomaticComplexity: { Max: 8 } -Metrics/PerceivedComplexity: { Max: 8 } -Metrics/ParameterLists: { Max: 4 } -Metrics/MethodLength: { Max: 24 } -Metrics/AbcSize: { Max: 20 } - -Style/IndentHash: { EnforcedStyle: consistent } -Style/HashSyntax: { EnforcedStyle: hash_rockets } -Style/SignalException: { EnforcedStyle: only_raise } -Style/AlignParameters: { EnforcedStyle: with_fixed_indentation } -Style/StringLiteralsInInterpolation: { EnforcedStyle: double_quotes } -Style/MultilineMethodCallIndentation: { EnforcedStyle: indented } -Style/MultilineOperationIndentation: { EnforcedStyle: indented } -Style/FirstParameterIndentation: { EnforcedStyle: consistent } -Style/StringLiterals: { EnforcedStyle: double_quotes } -Style/RegexpLiteral: { EnforcedStyle: slashes } -Style/IndentArray: { EnforcedStyle: consistent } -Style/ExtraSpacing: { AllowForAlignment: true } - -Style/PercentLiteralDelimiters: - PreferredDelimiters: - '%q': '{}' - '%Q': '{}' - '%r': '!!' - '%s': '()' - '%w': '()' - '%W': '()' - '%x': '()' - -Style/AlignArray: { Enabled: false } -Style/StringLiterals: { Enabled: false } -Style/Documentation: { Enabled: false } -Style/DoubleNegation: { Enabled: false } -Style/UnneededCapitalW: { Enabled: false } -Style/EmptyLinesAroundModuleBody: { Enabled: false } -Style/EmptyLinesAroundAccessModifier: { Enabled: false } -Style/BracesAroundHashParameters: { Enabled: false } -Style/SpaceInsideBrackets: { Enabled: false } -Style/IfUnlessModifier: { Enabled: false } -Style/ModuleFunction: { Enabled: false } -Style/RescueModifier: { Enabled: false } -Style/GuardClause: { Enabled: false } -Style/FileName: { Enabled: false } -Lint/UselessAccessModifier: { Enabled: false } -Style/SpaceAroundOperators: { Enabled: false } -Style/RedundantReturn: { Enabled: false } -Style/SingleLineMethods: { Enabled: false } - +--- AllCops: TargetRubyVersion: 2.0 Include: - lib/**/*.rb - Exclude: - - .rubocop.yml - - .codeclimate.yml - - .travis.yml - - .gitignore - - .rspec - - - Gemfile.lock - - CHANGELOG.{md,markdown,txt,textile} - - CONTRIBUTING.{md,markdown,txt,textile} - - readme.{md,markdown,txt,textile} - - README.{md,markdown,txt,textile} - - Readme.{md,markdown,txt,textile} - - ReadMe.{md,markdown,txt,textile} - - COPYING - - LICENSE - - - site/**/* - - test/**/* - - vendor/**/* - - features/**/* + - lib/jekyll/cleaner.rb + - lib/jekyll/collection.rb + - lib/jekyll/command.rb + - lib/jekyll/commands/build.rb + - lib/jekyll/commands/clean.rb + - lib/jekyll/commands/doctor.rb + - lib/jekyll/commands/help.rb + - lib/jekyll/commands/new.rb + - lib/jekyll/commands/serve + - lib/jekyll/commands/serve/servlet.rb + - lib/jekyll/commands/serve.rb + - lib/jekyll/configuration.rb + - lib/jekyll/converter.rb + - lib/jekyll/converters/identity.rb + - lib/jekyll/converters/markdown + - lib/jekyll/converters/markdown/kramdown_parser.rb + - lib/jekyll/converters/markdown/rdiscount_parser.rb + - lib/jekyll/converters/markdown/redcarpet_parser.rb + - lib/jekyll/converters/markdown.rb + - lib/jekyll/converters/smartypants.rb + - lib/jekyll/convertible.rb + - lib/jekyll/deprecator.rb + - lib/jekyll/document.rb + - lib/jekyll/drops/collection_drop.rb + - lib/jekyll/drops/document_drop.rb + - lib/jekyll/drops/drop.rb + - lib/jekyll/drops/jekyll_drop.rb + - lib/jekyll/drops/site_drop.rb + - lib/jekyll/drops/unified_payload_drop.rb + - lib/jekyll/drops/url_drop.rb + - lib/jekyll/entry_filter.rb + - lib/jekyll/errors.rb + - lib/jekyll/excerpt.rb + - lib/jekyll/external.rb + - lib/jekyll/filters.rb + - lib/jekyll/frontmatter_defaults.rb + - lib/jekyll/generator.rb + - lib/jekyll/hooks.rb + - lib/jekyll/layout.rb + - lib/jekyll/liquid_extensions.rb + - lib/jekyll/liquid_renderer/file.rb + - lib/jekyll/liquid_renderer/table.rb + - lib/jekyll/liquid_renderer.rb + - lib/jekyll/log_adapter.rb + - lib/jekyll/page.rb + - lib/jekyll/plugin.rb + - lib/jekyll/plugin_manager.rb + - lib/jekyll/publisher.rb + - lib/jekyll/reader.rb + - lib/jekyll/readers/collection_reader.rb + - lib/jekyll/readers/data_reader.rb + - lib/jekyll/readers/layout_reader.rb + - lib/jekyll/readers/page_reader.rb + - lib/jekyll/readers/post_reader.rb + - lib/jekyll/readers/static_file_reader.rb + - lib/jekyll/regenerator.rb + - lib/jekyll/related_posts.rb + - lib/jekyll/renderer.rb + - lib/jekyll/site.rb + - lib/jekyll/static_file.rb + - lib/jekyll/stevenson.rb + - lib/jekyll/tags/highlight.rb + - lib/jekyll/tags/include.rb + - lib/jekyll/tags/link.rb + - lib/jekyll/tags/post_url.rb + - lib/jekyll/theme.rb + - lib/jekyll/url.rb + - lib/jekyll/utils/ansi.rb + - lib/jekyll/utils/platforms.rb + - lib/jekyll/utils.rb + - lib/jekyll/version.rb + - lib/jekyll.rb + - bin/**/* - script/**/* - - spec/**/* + - vendor/**/* +Lint/AmbiguousRegexpLiteral: + Exclude: + - features/step_definitions.rb +Lint/EndAlignment: + Severity: error +Lint/UnreachableCode: + Severity: error +Lint/UselessAccessModifier: + Enabled: false +Metrics/AbcSize: + Max: 20 +Metrics/ClassLength: + Max: 240 + Exclude: + - !ruby/regexp /features\/.*.rb$/ +Metrics/CyclomaticComplexity: + Max: 8 +Metrics/LineLength: + Max: 90 + Severity: warning + Exclude: + - !ruby/regexp /features\/.*.rb/ +Metrics/MethodLength: + Max: 20 + CountComments: false + Severity: error +Metrics/ModuleLength: + Max: 240 +Metrics/ParameterLists: + Max: 4 +Metrics/PerceivedComplexity: + Max: 8 +Style/Alias: + Enabled: false +Style/AlignArray: + Enabled: false +Style/AlignHash: + SupportedLastArgumentHashStyles: always_ignore +Style/AlignParameters: + EnforcedStyle: with_fixed_indentation + Enabled: false +Style/AndOr: + Severity: error +Style/Attr: + Enabled: false +Style/BracesAroundHashParameters: + Enabled: false +Style/ClassAndModuleChildren: + Enabled: false +Style/Documentation: + Enabled: false + Exclude: + - !ruby/regexp /features\/.*.rb$/ +Style/DoubleNegation: + Enabled: false +Style/EmptyLinesAroundAccessModifier: + Enabled: false +Style/EmptyLinesAroundModuleBody: + Enabled: false +Style/ExtraSpacing: + AllowForAlignment: true +Style/FileName: + Enabled: false +Style/FirstParameterIndentation: + EnforcedStyle: consistent +Style/GuardClause: + Enabled: false +Style/HashSyntax: + EnforcedStyle: hash_rockets + Severity: error +Style/IfUnlessModifier: + Enabled: false +Style/IndentArray: + EnforcedStyle: consistent +Style/IndentHash: + EnforcedStyle: consistent +Style/IndentationWidth: + Severity: error +Style/ModuleFunction: + Enabled: false +Style/MultilineMethodCallIndentation: + EnforcedStyle: indented +Style/MultilineOperationIndentation: + EnforcedStyle: indented +Style/MultilineTernaryOperator: + Severity: error +Style/PercentLiteralDelimiters: + PreferredDelimiters: + "%q": "{}" + "%Q": "{}" + "%r": "{}" + "%s": "()" + "%w": "()" + "%W": "()" + "%x": "()" +Style/RedundantReturn: + Enabled: false +Style/RedundantSelf: + Enabled: false +Style/RegexpLiteral: + EnforcedStyle: slashes +Style/RescueModifier: + Enabled: false +Style/SignalException: + EnforcedStyle: only_raise +Style/SingleLineMethods: + Enabled: false +Style/SpaceAroundOperators: + Enabled: false +Style/SpaceInsideBrackets: + Enabled: false +Style/StringLiterals: + Enabled: false + EnforcedStyle: double_quotes +Style/StringLiteralsInInterpolation: + EnforcedStyle: double_quotes +Style/UnneededCapitalW: + Enabled: false From b28e14bcd6fd8a77aa73a6b5f36ac071f9a248e8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 13:42:05 -0500 Subject: [PATCH 0761/4996] create script/fmt to format the code --- script/fmt | 3 +++ 1 file changed, 3 insertions(+) create mode 100755 script/fmt diff --git a/script/fmt b/script/fmt new file mode 100755 index 00000000000..360b6e53419 --- /dev/null +++ b/script/fmt @@ -0,0 +1,3 @@ +#!/bin/sh + +bundle exec rubocop -D $@ From ffe6e0d996b9255277d04131d3ab83024b69bd27 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 14:00:49 -0500 Subject: [PATCH 0762/4996] rubocop: enforce Style/StringLiterals --- .rubocop.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index 8821744604c..92909eec4db 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -191,7 +191,6 @@ Style/SpaceAroundOperators: Style/SpaceInsideBrackets: Enabled: false Style/StringLiterals: - Enabled: false EnforcedStyle: double_quotes Style/StringLiteralsInInterpolation: EnforcedStyle: double_quotes From fa3323ec922ddbf8c0acdb9c4fdcc553ca66b174 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 14:05:16 -0500 Subject: [PATCH 0763/4996] rubocop: default for Lint/AmbiguousRegexpLiteral --- .rubocop.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 92909eec4db..bee896e680c 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -79,9 +79,6 @@ AllCops: - bin/**/* - script/**/* - vendor/**/* -Lint/AmbiguousRegexpLiteral: - Exclude: - - features/step_definitions.rb Lint/EndAlignment: Severity: error Lint/UnreachableCode: From 85e3ce37af98c6e1766bc23caba352aa22768361 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 14:11:59 -0500 Subject: [PATCH 0764/4996] rubocop: %r should use exclamation marks as delimeters --- .rubocop.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index bee896e680c..2aca1299479 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -166,7 +166,7 @@ Style/PercentLiteralDelimiters: PreferredDelimiters: "%q": "{}" "%Q": "{}" - "%r": "{}" + "%r": "!!" "%s": "()" "%w": "()" "%W": "()" From cddc40fef4af06a3e4c46636726af867f474ea43 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 14:14:44 -0500 Subject: [PATCH 0765/4996] rubocop: exclude test and features files that fail --- .rubocop.yml | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/.rubocop.yml b/.rubocop.yml index 2aca1299479..7bf38d38ae7 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -76,7 +76,48 @@ AllCops: - lib/jekyll/utils.rb - lib/jekyll/version.rb - lib/jekyll.rb + - features/step_definitions.rb + - features/support/formatter.rb + - features/support/helpers.rb + - test/helper.rb + - test/simplecov_custom_profile.rb + - test/test_ansi.rb + - test/test_cleaner.rb + - test/test_coffeescript.rb + - test/test_collections.rb + - test/test_command.rb + - test/test_commands_serve.rb + - test/test_configuration.rb + - test/test_convertible.rb + - test/test_doctor_command.rb + - test/test_document.rb + - test/test_entry_filter.rb + - test/test_excerpt.rb + - test/test_filters.rb + - test/test_front_matter_defaults.rb + - test/test_generated_site.rb + - test/test_kramdown.rb + - test/test_layout_reader.rb + - test/test_liquid_extensions.rb + - test/test_liquid_renderer.rb + - test/test_log_adapter.rb + - test/test_new_command.rb + - test/test_page.rb + - test/test_path_sanitization.rb + - test/test_plugin_manager.rb + - test/test_rdiscount.rb + - test/test_redcarpet.rb + - test/test_regenerator.rb + - test/test_related_posts.rb + - test/test_sass.rb + - test/test_site.rb + - test/test_static_file.rb + - test/test_tags.rb + - test/test_theme.rb + - test/test_url.rb + - test/test_utils.rb - bin/**/* + - benchmark/**/* - script/**/* - vendor/**/* Lint/EndAlignment: From 419c67094765468a6f96f90c0ea2c78b69c634db Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 14:17:45 -0500 Subject: [PATCH 0766/4996] travis: run one script/fmt job --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index d88446d60b3..6b24b213938 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,9 @@ matrix: allow_failures: - rvm: *jruby - rvm: *rhead + include: + - rvm: 2.3.0 + env: TEST_SUITE=fmt env: matrix: - TEST_SUITE=test From 3b021c6046b4b981184a985d3d92b7b0538a22f8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 14:33:48 -0500 Subject: [PATCH 0767/4996] Move Rubocop gem to :test group in Gemfile --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 2d5e86dffa8..54983415f45 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,6 @@ gemspec :name => "jekyll" gem "rake", "~> 11.0" group :development do gem "launchy", "~> 2.3" - gem "rubocop" gem "pry" unless RUBY_ENGINE == "jruby" @@ -15,6 +14,7 @@ end # group :test do + gem "rubocop" gem "cucumber", "~> 2.1" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" From 73ae01b4e5c5bce4966e2b5d2e49868b0827f740 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 12 May 2016 14:45:02 -0500 Subject: [PATCH 0768/4996] Update history to reflect merge of #4886 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b0a9c7bad9c..de4a4b640d5 100644 --- a/History.markdown +++ b/History.markdown @@ -53,6 +53,7 @@ * Fix many warnings (#4537) * Don't blindly assume the last system when determining "open" cmd (#4717) * Fix "locally" typo in contributing documentation (#4756) + * Update Rubocop rules (#4886) ### Site Enhancements From 5258f78a51620adc84f95d48b460eeaca264adcd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 12 May 2016 14:54:40 -0500 Subject: [PATCH 0769/4996] Add Jekyll Tips and the Cheatsheet to the list of resources --- site/_docs/resources.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/_docs/resources.md b/site/_docs/resources.md index 64f250ecd89..6d585a599dd 100644 --- a/site/_docs/resources.md +++ b/site/_docs/resources.md @@ -8,6 +8,8 @@ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, ext ### Useful Guides +- [Jekyll Tips](http://jekyll.tips) is a set of resources created by [CloudCannon](https://cloudcannon.com) to help folks get up and running with Jekyll. The cover all skill levels, and even include some great video tutorials. +- [Jekyll Cheatsheet](http://cheat.jekyll.tips) is a single-page resource for Jekyll filters, variables, and the like. - [“Creating and Hosting a Personal Site on GitHub”](http://jmcglone.com/guides/github-pages/) - [‘Build A Blog With Jekyll And GitHub Pages’ on Smashing Magazine](http://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) - Publishing to GitHub Pages? [Check out our documentation page for just that purpose](/docs/github-pages/). From 207e4df3de9c8da6b02c38f5e8ed9c570869929b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 12 May 2016 14:56:49 -0500 Subject: [PATCH 0770/4996] Update history to reflect merge of #4887 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index de4a4b640d5..552f0c10bee 100644 --- a/History.markdown +++ b/History.markdown @@ -92,6 +92,7 @@ * Add jekyll-breadcrumbs to list of third-party plugins (#4874) * Added Pug converter to list of third-party plugins (#4872) * Add jekyll-ideal-image-slider to list of third-party plugins (#4863) + * Add Jekyll Tips and the Cheatsheet to the list of resources (#4887) ## 3.1.3 / 2016-04-18 From f2bad8524fd2cd1501b2d72cb4ac899f416fb4ef Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 12 May 2016 15:25:10 -0500 Subject: [PATCH 0771/4996] Update history to reflect merge of #4849 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 552f0c10bee..7068efe00d5 100644 --- a/History.markdown +++ b/History.markdown @@ -54,6 +54,7 @@ * Don't blindly assume the last system when determining "open" cmd (#4717) * Fix "locally" typo in contributing documentation (#4756) * Update Rubocop rules (#4886) + * Flesh out the issue template to be much more detailed (#4849) ### Site Enhancements From 6f89fd5f3fb27ff13230c67d40b8d8cb4f1dd2c9 Mon Sep 17 00:00:00 2001 From: TheLucasMoore Date: Thu, 12 May 2016 16:58:17 -0500 Subject: [PATCH 0772/4996] clean.rb passing rubocop --- .rubocop.yml | 1 - lib/jekyll/commands/clean.rb | 17 +++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 7bf38d38ae7..b6fe2cc3187 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -8,7 +8,6 @@ AllCops: - lib/jekyll/collection.rb - lib/jekyll/command.rb - lib/jekyll/commands/build.rb - - lib/jekyll/commands/clean.rb - lib/jekyll/commands/doctor.rb - lib/jekyll/commands/help.rb - lib/jekyll/commands/new.rb diff --git a/lib/jekyll/commands/clean.rb b/lib/jekyll/commands/clean.rb index ca19d9b581c..addf11a2f95 100644 --- a/lib/jekyll/commands/clean.rb +++ b/lib/jekyll/commands/clean.rb @@ -4,8 +4,9 @@ class Clean < Command class << self def init_with_program(prog) prog.command(:clean) do |c| - c.syntax 'clean [subcommand]' - c.description 'Clean the site (removes site output and metadata file) without building.' + c.syntax "clean [subcommand]" + c.description "Clean the site + (removes site output and metadata file) without building." add_build_options(c) @@ -17,13 +18,13 @@ def init_with_program(prog) def process(options) options = configuration_from_options(options) - destination = options['destination'] - metadata_file = File.join(options['source'], '.jekyll-metadata') - sass_cache = File.join(options['source'], '.sass-cache') + destination = options["destination"] + metadata_file = File.join(options["source"], ".jekyll-metadata") + sass_cache = File.join(options["source"], ".sass-cache") - remove(destination, checker_func: :directory?) - remove(metadata_file, checker_func: :file?) - remove(sass_cache, checker_func: :directory?) + remove(destination, :checker_func => :directory?) + remove(metadata_file, :checker_func => :file?) + remove(sass_cache, :checker_func => :directory?) end def remove(filename, checker_func: :file?) From 26d0a8db77086f69d3ae279a785844ee8ca098fa Mon Sep 17 00:00:00 2001 From: TheLucasMoore Date: Thu, 12 May 2016 19:11:58 -0500 Subject: [PATCH 0773/4996] Passing RuboCop for commands --- .rubocop.yml | 7 ---- lib/jekyll/commands/build.rb | 27 ++++++++------- lib/jekyll/commands/clean.rb | 4 +-- lib/jekyll/commands/doctor.rb | 13 ++++---- lib/jekyll/commands/help.rb | 7 ++-- lib/jekyll/commands/new.rb | 49 +++++++++++++++------------- lib/jekyll/commands/serve.rb | 26 +++++++-------- lib/jekyll/commands/serve/servlet.rb | 4 +-- 8 files changed, 70 insertions(+), 67 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b6fe2cc3187..dc57b94d715 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -7,13 +7,6 @@ AllCops: - lib/jekyll/cleaner.rb - lib/jekyll/collection.rb - lib/jekyll/command.rb - - lib/jekyll/commands/build.rb - - lib/jekyll/commands/doctor.rb - - lib/jekyll/commands/help.rb - - lib/jekyll/commands/new.rb - - lib/jekyll/commands/serve - - lib/jekyll/commands/serve/servlet.rb - - lib/jekyll/commands/serve.rb - lib/jekyll/configuration.rb - lib/jekyll/converter.rb - lib/jekyll/converters/identity.rb diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb index baa4e88a767..cef13c91bdf 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -5,8 +5,8 @@ class << self # Create the Mercenary command for the Jekyll CLI for this Command def init_with_program(prog) prog.command(:build) do |c| - c.syntax 'build [options]' - c.description 'Build your site' + c.syntax "build [options]" + c.description "Build your site" c.alias :b add_build_options(c) @@ -27,15 +27,17 @@ def process(options) options = configuration_from_options(options) site = Jekyll::Site.new(options) - if options.fetch('skip_initial_build', false) - Jekyll.logger.warn "Build Warning:", "Skipping the initial build. This may result in an out-of-date site." + if options.fetch("skip_initial_build", false) + Jekyll.logger.warn "Build Warning:", "Skipping the initial build." \ + " This may result in an out-of-date site." else build(site, options) end - if options.fetch('detach', false) - Jekyll.logger.info "Auto-regeneration:", "disabled when running server detached." - elsif options.fetch('watch', false) + if options.fetch("detach", false) + Jekyll.logger.info "Auto-regeneration:", + "disabled when running server detached." + elsif options.fetch("watch", false) watch(site, options) else Jekyll.logger.info "Auto-regeneration:", "disabled. Use --watch to enable." @@ -50,12 +52,13 @@ def process(options) # Returns nothing. def build(site, options) t = Time.now - source = options['source'] - destination = options['destination'] - incremental = options['incremental'] + source = options["source"] + destination = options["destination"] + incremental = options["incremental"] Jekyll.logger.info "Source:", source Jekyll.logger.info "Destination:", destination - Jekyll.logger.info "Incremental build:", (incremental ? "enabled" : "disabled. Enable with --incremental") + Jekyll.logger.info "Incremental build:", + (incremental ? "enabled" : "disabled. Enable with --incremental") Jekyll.logger.info "Generating..." process_site(site) Jekyll.logger.info "", "done in #{(Time.now - t).round(3)} seconds." @@ -68,7 +71,7 @@ def build(site, options) # # Returns nothing. def watch(_site, options) - External.require_with_graceful_fail 'jekyll-watch' + External.require_with_graceful_fail "jekyll-watch" Jekyll::Watcher.watch(options) end end # end of class << self diff --git a/lib/jekyll/commands/clean.rb b/lib/jekyll/commands/clean.rb index addf11a2f95..3a44d59683e 100644 --- a/lib/jekyll/commands/clean.rb +++ b/lib/jekyll/commands/clean.rb @@ -5,8 +5,8 @@ class << self def init_with_program(prog) prog.command(:clean) do |c| c.syntax "clean [subcommand]" - c.description "Clean the site - (removes site output and metadata file) without building." + c.description "Clean the site " \ + "(removes site output and metadata file) without building." add_build_options(c) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 5c48d5bebc9..68caa2e014f 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -4,11 +4,12 @@ class Doctor < Command class << self def init_with_program(prog) prog.command(:doctor) do |c| - c.syntax 'doctor' - c.description 'Search site and print specific deprecation warnings' + c.syntax "doctor" + c.description "Search site and print specific deprecation warnings" c.alias(:hyde) - c.option 'config', '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file' + c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", Array, + "Custom configuration file" c.action do |_, options| Jekyll::Commands::Doctor.process(options) @@ -37,7 +38,7 @@ def healthy?(site) end def deprecated_relative_permalinks(site) - if site.config['relative_permalinks'] + if site.config["relative_permalinks"] Jekyll::Deprecator.deprecation_message "Your site still uses relative" \ " permalinks, which was removed in" \ " Jekyll v3.0.0." @@ -78,7 +79,7 @@ def fsnotify_buggy?(_site) def urls_only_differ_by_case(site) urls_only_differ_by_case = false urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest) - urls.each do |case_insensitive_url, real_urls| + urls.each do |_case_insensitive_url, real_urls| next unless real_urls.uniq.size > 1 urls_only_differ_by_case = true Jekyll.logger.warn "Warning:", "The following URLs only differ" \ @@ -102,7 +103,7 @@ def collect_urls(urls, things, destination) end def case_insensitive_urls(things, destination) - things.inject({}) do |memo, thing| + things.each_with_object({}) do |memo, thing| dest = thing.destination(destination) (memo[dest.downcase] ||= []) << dest memo diff --git a/lib/jekyll/commands/help.rb b/lib/jekyll/commands/help.rb index 01bf3280141..b4f136bf3e5 100644 --- a/lib/jekyll/commands/help.rb +++ b/lib/jekyll/commands/help.rb @@ -4,8 +4,8 @@ class Help < Command class << self def init_with_program(prog) prog.command(:help) do |c| - c.syntax 'help [subcommand]' - c.description 'Show the help message, optionally for a given subcommand.' + c.syntax "help [subcommand]" + c.description "Show the help message, optionally for a given subcommand." c.action do |args, _| cmd = (args.first || "").to_sym @@ -22,7 +22,8 @@ def init_with_program(prog) end def invalid_command(prog, cmd) - Jekyll.logger.error "Error:", "Hmm... we don't know what the '#{cmd}' command is." + Jekyll.logger.error "Error:", + "Hmm... we don't know what the '#{cmd}' command is." Jekyll.logger.info "Valid commands:", prog.commands.keys.join(", ") end end diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 50838f41e1c..c44379eb6df 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -1,4 +1,4 @@ -require 'erb' +require "erb" module Jekyll module Commands @@ -6,11 +6,11 @@ class New < Command class << self def init_with_program(prog) prog.command(:new) do |c| - c.syntax 'new PATH' - c.description 'Creates a new Jekyll site scaffold in PATH' + c.syntax "new PATH" + c.description "Creates a new Jekyll site scaffold in PATH" - c.option 'force', '--force', 'Force creation even if PATH already exists' - c.option 'blank', '--blank', 'Creates scaffolding but with empty files' + c.option "force", "--force", "Force creation even if PATH already exists" + c.option "blank", "--blank", "Creates scaffolding but with empty files" c.action do |args, options| Jekyll::Commands::New.process(args, options) @@ -19,27 +19,16 @@ def init_with_program(prog) end def process(args, options = {}) - raise ArgumentError.new('You must specify a path.') if args.empty? + raise ArgumentError, "You must specify a path." if args.empty? new_blog_path = File.expand_path(args.join(" "), Dir.pwd) FileUtils.mkdir_p new_blog_path if preserve_source_location?(new_blog_path, options) - Jekyll.logger.abort_with "Conflict:", "#{new_blog_path} exists and is not empty." + Jekyll.logger.abort_with "Conflict:", + "#{new_blog_path} exists and is not empty." end - if options["blank"] - create_blank_site new_blog_path - else - create_sample_files new_blog_path - - File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| - f.write(scaffold_post_content) - end - - File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| - f.write(gemfile_contents) - end - end + if_blank_options Jekyll.logger.info "New jekyll site installed in #{new_blog_path}." end @@ -59,7 +48,7 @@ def scaffold_post_content # # Returns the filename of the sample post, as a String def initialized_post_name - "_posts/#{Time.now.strftime('%Y-%m-%d')}-welcome-to-jekyll.markdown" + "_posts/#{Time.now.strftime("%Y-%m-%d")}-welcome-to-jekyll.markdown" end private @@ -95,7 +84,7 @@ def preserve_source_location?(path, options) end def create_sample_files(path) - FileUtils.cp_r site_template + '/.', path + FileUtils.cp_r site_template + "/.", path FileUtils.rm File.expand_path(scaffold_path, path) end @@ -106,6 +95,22 @@ def site_template def scaffold_path "_posts/0000-00-00-welcome-to-jekyll.markdown.erb" end + + def if_blank_options + if options["blank"] + create_blank_site new_blog_path + else + create_sample_files new_blog_path + + File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| + f.write(scaffold_post_content) + end + + File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| + f.write(gemfile_contents) + end + end + end end end end diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 1482dbed0fd..7f0d0f842f4 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -14,7 +14,7 @@ class << self "Show a directory listing instead of loading your index file."], "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", "Skips the initial site build which occurs before the server is started."] - } + }.freeze # @@ -93,7 +93,7 @@ def webrick_opts(opts) ) } - opts[:DirectoryIndex] = [] if opts[:JekyllOptions]['show_dir_listing'] + opts[:DirectoryIndex] = [] if opts[:JekyllOptions]["show_dir_listing"] enable_ssl(opts) enable_logging(opts) @@ -107,7 +107,7 @@ def file_handler_opts WEBrick::Config::FileHandler.merge({ :FancyIndexing => true, :NondisclosureName => [ - '.ht*', '~*' + ".ht*", "~*" ] }) end @@ -116,12 +116,12 @@ def file_handler_opts private def server_address(server, opts) - "%{prefix}://%{address}:%{port}%{baseurl}" % { + format("%{prefix}://%{address}:%{port}%{baseurl}", { :prefix => server.config[:SSLEnable] ? "https" : "http", :baseurl => opts["baseurl"] ? "#{opts["baseurl"]}/" : "", :address => server.config[:BindAddress], :port => server.config[:Port] - } + }) end # @@ -173,20 +173,20 @@ def enable_logging(opts) private def enable_ssl(opts) return if !opts[:JekyllOptions]["ssl_cert"] && !opts[:JekyllOptions]["ssl_key"] - if !opts[:JekyllOptions]["ssl_cert"] || !opts[:JekyllOptions]["ssl_key"] - raise RuntimeError, "--ssl-cert or --ssl-key missing." - end - require "openssl" require "webrick/https" - source_key = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], opts[:JekyllOptions]["ssl_key" ]) - source_certificate = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], opts[:JekyllOptions]["ssl_cert"]) - opts[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.read(source_certificate)) + source_key = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], \ + opts[:JekyllOptions]["ssl_key" ]) + source_certificate = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], \ + opts[:JekyllOptions]["ssl_cert"]) + opts[:SSLCertificate] = + OpenSSL::X509::Certificate.new(File.read(source_certificate)) opts[:SSLPrivateKey ] = OpenSSL::PKey::RSA.new(File.read(source_key)) opts[:SSLEnable] = true end private + def start_callback(detached) unless detached proc do @@ -197,7 +197,7 @@ def start_callback(detached) private def mime_types - file = File.expand_path('../mime.types', File.dirname(__FILE__)) + file = File.expand_path("../mime.types", File.dirname(__FILE__)) WEBrick::HTTPUtils.load_mime_types(file) end end diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index bb4afe5a57b..d7c52af9f88 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -7,7 +7,7 @@ class Servlet < WEBrick::HTTPServlet::FileHandler DEFAULTS = { "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ "no-store, no-cache, must-revalidate" - } + }.freeze def initialize(server, root, callbacks) # So we can access them easily. @@ -27,7 +27,7 @@ def search_file(req, res, basename) # - def do_GET(req, res) + def do_get(req, res) rtn = super validate_and_ensure_charset(req, res) res.header.merge!(@headers) From 894d1fe21e32aae70b5f1a63850cc9cb8ffb7fb5 Mon Sep 17 00:00:00 2001 From: TheLucasMoore Date: Thu, 12 May 2016 19:42:04 -0500 Subject: [PATCH 0774/4996] Tests Passing. Three RuboCop revisions remain --- lib/jekyll/commands/doctor.rb | 3 +-- lib/jekyll/commands/new.rb | 30 +++++++++++++----------------- lib/jekyll/commands/serve.rb | 3 +++ 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 68caa2e014f..0c4f52f867e 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -103,10 +103,9 @@ def collect_urls(urls, things, destination) end def case_insensitive_urls(things, destination) - things.each_with_object({}) do |memo, thing| + things.each_with_object({}) do |thing, memo| dest = thing.destination(destination) (memo[dest.downcase] ||= []) << dest - memo end end end diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index c44379eb6df..4bfcca0fad7 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -28,7 +28,19 @@ def process(args, options = {}) "#{new_blog_path} exists and is not empty." end - if_blank_options + if options["blank"] + create_blank_site new_blog_path + else + create_sample_files new_blog_path + + File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| + f.write(scaffold_post_content) + end + + File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| + f.write(gemfile_contents) + end + end Jekyll.logger.info "New jekyll site installed in #{new_blog_path}." end @@ -95,22 +107,6 @@ def site_template def scaffold_path "_posts/0000-00-00-welcome-to-jekyll.markdown.erb" end - - def if_blank_options - if options["blank"] - create_blank_site new_blog_path - else - create_sample_files new_blog_path - - File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| - f.write(scaffold_post_content) - end - - File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| - f.write(gemfile_contents) - end - end - end end end end diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 7f0d0f842f4..3f63006516e 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -173,6 +173,9 @@ def enable_logging(opts) private def enable_ssl(opts) return if !opts[:JekyllOptions]["ssl_cert"] && !opts[:JekyllOptions]["ssl_key"] + if !opts[:JekyllOptions]["ssl_cert"] || !opts[:JekyllOptions]["ssl_key"] + raise RuntimeError, "--ssl-cert or --ssl-key missing." + end require "openssl" require "webrick/https" source_key = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], \ From 451881efcf969b379af068a4f0d6b93c47d12bee Mon Sep 17 00:00:00 2001 From: TheLucasMoore Date: Thu, 12 May 2016 20:21:19 -0500 Subject: [PATCH 0775/4996] ABC Condition Size too high --- lib/jekyll/commands/serve.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 3f63006516e..8813ac0475d 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -174,7 +174,7 @@ def enable_logging(opts) def enable_ssl(opts) return if !opts[:JekyllOptions]["ssl_cert"] && !opts[:JekyllOptions]["ssl_key"] if !opts[:JekyllOptions]["ssl_cert"] || !opts[:JekyllOptions]["ssl_key"] - raise RuntimeError, "--ssl-cert or --ssl-key missing." + raise RuntimeError end require "openssl" require "webrick/https" From a4369ea7e564fb1f8e7b0ee4889343492069c05c Mon Sep 17 00:00:00 2001 From: ajhit406 Date: Wed, 11 May 2016 13:16:56 -0700 Subject: [PATCH 0776/4996] added pubstorm deployment instructions --- site/_docs/deployment-methods.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index b516c931b19..af57119b64c 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -225,3 +225,13 @@ Setting up Kickster is very easy, just install the gem and you are good to go. M [Aerobatic](https://www.aerobatic.com) is an add-on for Bitbucket that brings GitHub Pages style functionality to Bitbucket users. It includes continuous deployment, custom domains with a wildcard SSL cert, CDN, basic auth, and staging branches all in the box. Automating the build and deployment of a Jekyll site is just as simple as GitHub Pages - push your changes to your repo (excluding the `_site` directory) and within seconds a build will be triggered and your built site deployed to our highly- available, globally distributed hosting service. The build process will even install and execute custom Ruby plugins. See our [Jekyll docs](https://www.aerobatic.com/docs/static-generators#jekyll) for more details. + +## PubStorm + +[PubStorm](https://www.pubstorm.com) is a free front-end and static-site publishing platform built by [Nitrous](https://www.nitrous.io). PubStorm is distributed as a node package and can be installed by running `npm install -g pubstorm`. You can create a free account by running `storm signup`. + +To publish your site, run `storm init` from the root of your project and enter `_site` as the project path when prompted. You can the run `jekyll build` to build your site and then run `storm deploy` to publish your site in seconds. + +PubStorm offers a pre-configured CDN, free custom domains, SSL certs, rollbacks, collaboration and more. To configure additional features, [follow the instructions on the PubStorm help site](http://help.pubstorm.com). + +You can also use the [Nitrous Jekyll Template](https://www.nitrous.io/quickstarts) to develop your Jekyll project and deploy to PubStorm directly from Nitrous. This is a great option for developing Jekyll projects on Windows. From 1e89aa7a130163c3e7f6e76677f0b3fcfe37b6a9 Mon Sep 17 00:00:00 2001 From: Marcos Brito Date: Fri, 13 May 2016 14:39:56 +0200 Subject: [PATCH 0777/4996] Removed extra

    from site/_docs/permalinks.md It seems there's an extra

    in the html code, in the line number 103. --- site/_docs/permalinks.md | 1 - 1 file changed, 1 deletion(-) diff --git a/site/_docs/permalinks.md b/site/_docs/permalinks.md index 9ccf27060c5..254c5d6dd98 100644 --- a/site/_docs/permalinks.md +++ b/site/_docs/permalinks.md @@ -101,7 +101,6 @@ permalink is defined according to the format `/:categories/:year/:month/:day/:ti

    Second of the minute from the post’s date front matter. (00..59)

    -

    From 64219cc11a01bc8048c0bb387c0a4fc036449285 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 13 May 2016 10:12:36 -0500 Subject: [PATCH 0778/4996] Update history to reflect merge of #4890 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7068efe00d5..f2e9f7c323b 100644 --- a/History.markdown +++ b/History.markdown @@ -94,6 +94,7 @@ * Added Pug converter to list of third-party plugins (#4872) * Add jekyll-ideal-image-slider to list of third-party plugins (#4863) * Add Jekyll Tips and the Cheatsheet to the list of resources (#4887) + * Removed extra `

    ` from `site/_docs/permalinks.md` (#4890) ## 3.1.3 / 2016-04-18 From 6a2ffbac62bccf6eb4e85a8465c5bad8047e5d92 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 13 May 2016 11:49:59 -0500 Subject: [PATCH 0779/4996] Add note about being unreleased to the Themes documentation. Fixes #4510. --- site/_docs/themes.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/site/_docs/themes.md b/site/_docs/themes.md index 2b7155bb63d..02e1ebf577c 100644 --- a/site/_docs/themes.md +++ b/site/_docs/themes.md @@ -4,6 +4,15 @@ title: Themes permalink: /docs/themes/ --- +
    +
    This feature is unreleased!
    +

    + Jekyll 3.0 and 3.1 do NOT have the ability to add themes in this way. + The documentation below is for an unreleased version of Jekyll and + cannot be used at the moment. +

    +
    + Jekyll has an extensive theme system, which allows you to leverage community-maintained templates and styles to customize your site's presentation. Jekyll themes package layouts, includes, and stylesheets in a way that can be overridden by your site's content. ## Installing a theme From 83f8df49abd00e876e0e0d63753639aea3c9b31e Mon Sep 17 00:00:00 2001 From: Derek Gottlieb Date: Fri, 13 May 2016 12:34:11 -0500 Subject: [PATCH 0780/4996] Fixing rubocop offenses in lib/jekyll/cleaner.rb --- .rubocop.yml | 1 - lib/jekyll/cleaner.rb | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 7bf38d38ae7..12e6553fdb1 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,7 +4,6 @@ AllCops: Include: - lib/**/*.rb Exclude: - - lib/jekyll/cleaner.rb - lib/jekyll/collection.rb - lib/jekyll/command.rb - lib/jekyll/commands/build.rb diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index cab94d55aa1..db8a9180f94 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -1,9 +1,9 @@ -require 'set' +require "set" module Jekyll # Handles the cleanup of a site's destination before it is built. class Cleaner - HIDDEN_FILE_REGEX = /\/\.{1,2}$/ + HIDDEN_FILE_REGEX = %r!\/\.{1,2}$! attr_reader :site def initialize(site) @@ -32,7 +32,8 @@ def metadata_file [site.regenerator.metadata_file] end - # Private: The list of existing files, apart from those included in keep_files and hidden files. + # Private: The list of existing files, apart from those included in + # keep_files and hidden files. # # Returns a Set with the file paths def existing_files @@ -77,15 +78,16 @@ def parent_dirs(file) end end - # Private: The list of existing files that will be replaced by a directory during build + # Private: The list of existing files that will be replaced by a directory + # during build # # Returns a Set with the file paths def replaced_files new_dirs.select { |dir| File.file?(dir) }.to_set end - # Private: The list of directories that need to be kept because they are parent directories - # of files specified in keep_files + # Private: The list of directories that need to be kept because they are + # parent directories of files specified in keep_files # # Returns a Set with the directory paths def keep_dirs @@ -95,12 +97,12 @@ def keep_dirs # Private: Creates a regular expression from the config's keep_files array # # Examples - # ['.git','.svn'] with site.dest "/myblog/_site" creates + # ['.git','.svn'] with site.dest "/myblog/_site" creates # the following regex: /\A\/myblog\/_site\/(\.git|\/.svn)/ # # Returns the regular expression def keep_file_regex - /\A#{Regexp.quote(site.dest)}\/(#{Regexp.union(site.keep_files).source})/ + %r!\A#{Regexp.quote(site.dest)}\/(#{Regexp.union(site.keep_files).source})! end end end From 96ac1185a1f1e5d00a3bbd3a147c1b27c1e5879e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 13 May 2016 12:50:41 -0500 Subject: [PATCH 0781/4996] Update history to reflect merge of #4892 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f2e9f7c323b..53942209d24 100644 --- a/History.markdown +++ b/History.markdown @@ -55,6 +55,7 @@ * Fix "locally" typo in contributing documentation (#4756) * Update Rubocop rules (#4886) * Flesh out the issue template to be much more detailed (#4849) + * Fixing rubocop offenses in lib/jekyll/cleaner.rb (#4892) ### Site Enhancements From 465e7dd8b0c0ebf38a15ef1c6e4eb388439395ba Mon Sep 17 00:00:00 2001 From: TheLucasMoore Date: Fri, 13 May 2016 13:46:42 -0500 Subject: [PATCH 0782/4996] Added Exceptions and Passing ABC Metric --- lib/jekyll/commands/new.rb | 30 ++++++++++++++++------------ lib/jekyll/commands/serve.rb | 4 +++- lib/jekyll/commands/serve/servlet.rb | 5 ++--- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 4bfcca0fad7..af336e9ca98 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -28,19 +28,7 @@ def process(args, options = {}) "#{new_blog_path} exists and is not empty." end - if options["blank"] - create_blank_site new_blog_path - else - create_sample_files new_blog_path - - File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| - f.write(scaffold_post_content) - end - - File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| - f.write(gemfile_contents) - end - end + if_options_blank(new_blog_path, options) Jekyll.logger.info "New jekyll site installed in #{new_blog_path}." end @@ -91,6 +79,22 @@ def gemfile_contents RUBY end + def if_options_blank(new_blog_path, options) + if options["blank"] + create_blank_site new_blog_path + else + create_sample_files new_blog_path + + File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| + f.write(scaffold_post_content) + end + + File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| + f.write(gemfile_contents) + end + end + end + def preserve_source_location?(path, options) !options["force"] && !Dir["#{path}/**/*"].empty? end diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 8813ac0475d..8c63339772e 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -171,10 +171,12 @@ def enable_logging(opts) # forget to add one of the certificates. private + # rubocop:disable Metrics/AbcSize def enable_ssl(opts) return if !opts[:JekyllOptions]["ssl_cert"] && !opts[:JekyllOptions]["ssl_key"] if !opts[:JekyllOptions]["ssl_cert"] || !opts[:JekyllOptions]["ssl_key"] - raise RuntimeError + # rubocop:disable Style/RedundantException + raise RuntimeError, "--ssl-cert or --ssl-key missing." end require "openssl" require "webrick/https" diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index d7c52af9f88..5f258e6eda7 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -25,9 +25,8 @@ def search_file(req, res, basename) super || super(req, res, "#{basename}.html") end - # - - def do_get(req, res) + # rubocop:disable Style/MethodName + def do_GET(req, res) rtn = super validate_and_ensure_charset(req, res) res.header.merge!(@headers) From b64b6aa52601025e5fddf4b8c68588f120536612 Mon Sep 17 00:00:00 2001 From: TheLucasMoore Date: Fri, 13 May 2016 15:10:59 -0500 Subject: [PATCH 0783/4996] Refactor if/else for new.rb process method --- lib/jekyll/commands/new.rb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index af336e9ca98..2658383c1c6 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -28,7 +28,11 @@ def process(args, options = {}) "#{new_blog_path} exists and is not empty." end - if_options_blank(new_blog_path, options) + if options["blank"] + create_blank_site new_blog_path + else + create_site new_blog_path + end Jekyll.logger.info "New jekyll site installed in #{new_blog_path}." end @@ -79,19 +83,15 @@ def gemfile_contents RUBY end - def if_options_blank(new_blog_path, options) - if options["blank"] - create_blank_site new_blog_path - else - create_sample_files new_blog_path + def create_site(new_blog_path) + create_sample_files new_blog_path - File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| - f.write(scaffold_post_content) - end + File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| + f.write(scaffold_post_content) + end - File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| - f.write(gemfile_contents) - end + File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| + f.write(gemfile_contents) end end From 2a81fef9969b65104cc4a0b1a6d876766696e974 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 15 May 2016 12:14:51 -0500 Subject: [PATCH 0784/4996] Update history to reflect merge of #4881 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 53942209d24..f2a50b9e428 100644 --- a/History.markdown +++ b/History.markdown @@ -96,6 +96,7 @@ * Add jekyll-ideal-image-slider to list of third-party plugins (#4863) * Add Jekyll Tips and the Cheatsheet to the list of resources (#4887) * Removed extra `

    ` from `site/_docs/permalinks.md` (#4890) + * Add pubstorm deployment instructions to docs (#4881) ## 3.1.3 / 2016-04-18 From 3611ae99d9c42f4eb87d0357a0c1bb5d7afeb984 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 26 Apr 2016 18:45:05 -0700 Subject: [PATCH 0785/4996] WIP: Add 'jekyll new-theme' command --- lib/jekyll/commands/new_theme.rb | 82 ++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 lib/jekyll/commands/new_theme.rb diff --git a/lib/jekyll/commands/new_theme.rb b/lib/jekyll/commands/new_theme.rb new file mode 100644 index 00000000000..3e37bd84391 --- /dev/null +++ b/lib/jekyll/commands/new_theme.rb @@ -0,0 +1,82 @@ +require 'erb' + +module Jekyll + module Commands + class NewTheme < Command + class << self + def init_with_program(prog) + prog.command(:"new-theme") do |c| + c.syntax 'new-theme NAME' + c.description 'Creates a new Jekyll theme scaffold' + + c.action do |args, _| + Jekyll::Commands::NewTheme.process(args) + end + end + end + + def process(args) + raise InvalidThemeName, 'You must specify a theme name.' if args.empty? + + new_theme_name = args.join("_") + theme = ThemeBuilder.new(new_theme_name) + if theme.path.exist? + Jekyll.logger.abort_with "Conflict:", "#{theme.path} already exists." + end + + theme.create! + Jekyll.logger.info "Your new Jekyll theme, #{theme.name} is ready for you in #{theme.path}." + end + + class ThemeBuilder + attr_reader :name, :path + def initialize(theme_name) + @name = theme_name + @path = Pathname.new(File.expand_path(theme_name, Dir.pwd)) + end + + def create! + create_directories + create_gemspec + create_readme + end + + private + + def create_directories + Dir.chdir(path) do + FileUtils.mkdir_p(%w{_includes _layouts _sass}) + end + end + end + + private + + def gemfile_contents + <<-RUBY +source "https://rubygems.org" + +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "#{Jekyll::VERSION}" + +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +# gem "github-pages", group: :jekyll_plugins + +# If you have any plugins, put them here! +# group :jekyll_plugins do +# gem "jekyll-github-metadata", "~> 1.0" +# end +RUBY + end + end + end + end +end From e3df910533eeb808325a326d0bd1a79f9cd31c4f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 16 May 2016 09:07:22 -0700 Subject: [PATCH 0786/4996] Add more template files and add a ThemeBuilder which can create the site --- lib/jekyll.rb | 1 + lib/jekyll/commands/new_theme.rb | 94 +++++----------------- lib/jekyll/theme_builder.rb | 108 ++++++++++++++++++++++++++ lib/theme_template/CODE_OF_CONDUCT.md | 0 lib/theme_template/Gemfile | 2 + lib/theme_template/LICENSE.txt.erb | 21 +++++ lib/theme_template/README.md | 0 lib/theme_template/theme.gemspec.erb | 21 +++++ 8 files changed, 174 insertions(+), 73 deletions(-) create mode 100644 lib/jekyll/theme_builder.rb create mode 100644 lib/theme_template/CODE_OF_CONDUCT.md create mode 100644 lib/theme_template/Gemfile create mode 100644 lib/theme_template/LICENSE.txt.erb create mode 100644 lib/theme_template/README.md create mode 100644 lib/theme_template/theme.gemspec.erb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index ffc1539f373..e9f4547b3c6 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -68,6 +68,7 @@ module Jekyll autoload :StaticFile, 'jekyll/static_file' autoload :Stevenson, 'jekyll/stevenson' autoload :Theme, 'jekyll/theme' + autoload :ThemeBuilder, 'jekyll/theme_builder' autoload :URL, 'jekyll/url' autoload :Utils, 'jekyll/utils' autoload :VERSION, 'jekyll/version' diff --git a/lib/jekyll/commands/new_theme.rb b/lib/jekyll/commands/new_theme.rb index 3e37bd84391..3855c3f8cc2 100644 --- a/lib/jekyll/commands/new_theme.rb +++ b/lib/jekyll/commands/new_theme.rb @@ -1,82 +1,30 @@ require 'erb' -module Jekyll - module Commands - class NewTheme < Command - class << self - def init_with_program(prog) - prog.command(:"new-theme") do |c| - c.syntax 'new-theme NAME' - c.description 'Creates a new Jekyll theme scaffold' - - c.action do |args, _| - Jekyll::Commands::NewTheme.process(args) - end - end - end - - def process(args) - raise InvalidThemeName, 'You must specify a theme name.' if args.empty? - - new_theme_name = args.join("_") - theme = ThemeBuilder.new(new_theme_name) - if theme.path.exist? - Jekyll.logger.abort_with "Conflict:", "#{theme.path} already exists." - end - - theme.create! - Jekyll.logger.info "Your new Jekyll theme, #{theme.name} is ready for you in #{theme.path}." +class Jekyll::Commands::NewTheme < Jekyll::Command + class << self + def init_with_program(prog) + prog.command(:"new-theme") do |c| + c.syntax 'new-theme NAME' + c.description 'Creates a new Jekyll theme scaffold' + + c.action do |args, _| + Jekyll::Commands::NewTheme.process(args) end + end + end - class ThemeBuilder - attr_reader :name, :path - def initialize(theme_name) - @name = theme_name - @path = Pathname.new(File.expand_path(theme_name, Dir.pwd)) - end - - def create! - create_directories - create_gemspec - create_readme - end - - private - - def create_directories - Dir.chdir(path) do - FileUtils.mkdir_p(%w{_includes _layouts _sass}) - end - end - end - - private - - def gemfile_contents - <<-RUBY -source "https://rubygems.org" - -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! -gem "jekyll", "#{Jekyll::VERSION}" - -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -# gem "github-pages", group: :jekyll_plugins + def process(args) + raise InvalidThemeName, 'You must specify a theme name.' if args.empty? -# If you have any plugins, put them here! -# group :jekyll_plugins do -# gem "jekyll-github-metadata", "~> 1.0" -# end -RUBY - end + new_theme_name = args.join("_") + theme = Jekyll::ThemeBuilder.new(new_theme_name) + if theme.path.exist? + Jekyll.logger.abort_with "Conflict:", "#{theme.path} already exists." end + + theme.create! + Jekyll.logger.info "Your new Jekyll theme, #{theme.name}, is ready for you in #{theme.path}!" + Jekyll.logger.info "For help getting started, read #{theme.path}/README.md." end end end diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb new file mode 100644 index 00000000000..8b352865c2d --- /dev/null +++ b/lib/jekyll/theme_builder.rb @@ -0,0 +1,108 @@ +class Jekyll::ThemeBuilder + SCAFFOLD_DIRECTORIES = %w{ + _layouts _includes _sass + }.freeze + + attr_reader :name, :path + + def initialize(theme_name) + @name = theme_name.to_s.gsub(/ /, "_").gsub(/_+/, "_") + @path = Pathname.new(File.expand_path(name, Dir.pwd)) + end + + def create! + create_directories + create_gemspec + create_accessories + initialize_git_repo + end + + private + + def root + @root ||= Pathname.new(File.expand_path("../", __dir__)) + end + + def template_file(filename) + [ + root.join("theme_template", "#{filename}.erb"), + root.join("theme_template", "#{filename}") + ].find do |pathname| + pathname.exist? + end + end + + def template(filename) + erb.render(template_file(filename).read) + end + + def erb + @erb ||= ERBRenderer.new(self) + end + + def mkdir_p(directories) + Array(directories).each do |directory| + full_path = path.join(directory) + Jekyll.logger.info "create", "#{full_path}" + FileUtils.mkdir_p(full_path) + end + end + + def write_file(filename, contents) + full_path = path.join(filename) + Jekyll.logger.info "create", "#{full_path}" + File.write(full_path, contents) + end + + def create_directories + mkdir_p(SCAFFOLD_DIRECTORIES) + end + + def create_gemspec + write_file("Gemfile", template("Gemfile")) + write_file("#{name}.gemspec", template("theme.gemspec")) + end + + def create_accessories + %w{README.md CODE_OF_CONDUCT.md LICENSE.txt}.each do |filename| + write_file(filename, template(filename)) + end + end + + def initialize_git_repo + Jekyll.logger.info "initialize", "#{path.join(".git")}" + Dir.chdir(path.to_s) { `git init` } + end + + def user_name + @user_name ||= `git config user.name`.chomp + end + + def user_email + @user_email ||= `git config user.email`.chomp + end + + class ERBRenderer + extend Forwardable + + def_delegator :@theme_builder, :name, :theme_name + def_delegator :@theme_builder, :user_name, :user_name + def_delegator :@theme_builder, :user_email, :user_email + + def initialize(theme_builder) + @theme_builder = theme_builder + end + + def jekyll_pessimistic_version + Jekyll::VERSION.split(".").take(2).join(".") + end + + def theme_directories + SCAFFOLD_DIRECTORIES + end + + def render(contents) + ERB.new(contents).result binding + end + end +end diff --git a/lib/theme_template/CODE_OF_CONDUCT.md b/lib/theme_template/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/lib/theme_template/Gemfile b/lib/theme_template/Gemfile new file mode 100644 index 00000000000..3be9c3cd812 --- /dev/null +++ b/lib/theme_template/Gemfile @@ -0,0 +1,2 @@ +source "https://rubygems.org" +gemspec diff --git a/lib/theme_template/LICENSE.txt.erb b/lib/theme_template/LICENSE.txt.erb new file mode 100644 index 00000000000..df80313502d --- /dev/null +++ b/lib/theme_template/LICENSE.txt.erb @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 <%= user_name %> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/lib/theme_template/README.md b/lib/theme_template/README.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/lib/theme_template/theme.gemspec.erb b/lib/theme_template/theme.gemspec.erb new file mode 100644 index 00000000000..507a7c52a85 --- /dev/null +++ b/lib/theme_template/theme.gemspec.erb @@ -0,0 +1,21 @@ +# coding: utf-8 + +Gem::Specification.new do |spec| + spec.name = <%= theme_name.inspect %> + spec.version = "0.1.0" + spec.authors = [<%= user_name.inspect %>] + spec.email = [<%= user_email.inspect %>] + + spec.summary = %q{TODO: Write a short summary, because Rubygems requires one.} + spec.description = %q{TODO: Write a longer description or delete this line.} + spec.homepage = "TODO: Put your gem's website or public repo URL here." + spec.license = "MIT" + + spec.metadata["jekyll"] = { "theme" => true } + + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(exe|<%= theme_directories.join("|") %>)/}) } + spec.bindir = "exe" + spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } + + spec.add_development_dependency "jekyll", "~> <%= jekyll_pessimistic_version %>" +end From 583fe84edc7e4a80803907317edc29275cef7b37 Mon Sep 17 00:00:00 2001 From: EricH Date: Mon, 16 May 2016 14:06:27 -0400 Subject: [PATCH 0787/4996] Corrected pagination docs for hidden: true feature --- site/_docs/pagination.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/pagination.md b/site/_docs/pagination.md index 25482d01a32..35361b2bf80 100644 --- a/site/_docs/pagination.md +++ b/site/_docs/pagination.md @@ -133,8 +133,8 @@ attributes:
    Pagination does not support tags or categories

    Pagination pages through every post in the posts - variable regardless of variables defined in the YAML Front Matter of - each. It does not currently allow paging over groups of posts linked + variable unless a post has `hidden: true` in its YAML Front Matter. + It does not currently allow paging over groups of posts linked by a common tag or category. It cannot include any collection of documents because it is restricted to posts.

    From 473d85b580bb755476cec61ffead3cb6131ce6df Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 16 May 2016 11:06:47 -0700 Subject: [PATCH 0788/4996] Add CoC and README for theme; make standard with Rubocop --- lib/jekyll/commands/new_theme.rb | 11 ++-- lib/jekyll/errors.rb | 2 + lib/jekyll/theme_builder.rb | 20 +++--- lib/theme_template/CODE_OF_CONDUCT.md | 0 lib/theme_template/CODE_OF_CONDUCT.md.erb | 74 +++++++++++++++++++++++ lib/theme_template/README.md | 0 lib/theme_template/README.md.erb | 40 ++++++++++++ 7 files changed, 131 insertions(+), 16 deletions(-) delete mode 100644 lib/theme_template/CODE_OF_CONDUCT.md create mode 100644 lib/theme_template/CODE_OF_CONDUCT.md.erb delete mode 100644 lib/theme_template/README.md create mode 100644 lib/theme_template/README.md.erb diff --git a/lib/jekyll/commands/new_theme.rb b/lib/jekyll/commands/new_theme.rb index 3855c3f8cc2..e8919ae3816 100644 --- a/lib/jekyll/commands/new_theme.rb +++ b/lib/jekyll/commands/new_theme.rb @@ -1,11 +1,11 @@ -require 'erb' +require "erb" class Jekyll::Commands::NewTheme < Jekyll::Command class << self def init_with_program(prog) prog.command(:"new-theme") do |c| - c.syntax 'new-theme NAME' - c.description 'Creates a new Jekyll theme scaffold' + c.syntax "new-theme NAME" + c.description "Creates a new Jekyll theme scaffold" c.action do |args, _| Jekyll::Commands::NewTheme.process(args) @@ -14,7 +14,7 @@ def init_with_program(prog) end def process(args) - raise InvalidThemeName, 'You must specify a theme name.' if args.empty? + raise Jekyll::Errors::InvalidThemeName, "You must specify a theme name." if args.empty? new_theme_name = args.join("_") theme = Jekyll::ThemeBuilder.new(new_theme_name) @@ -23,7 +23,8 @@ def process(args) end theme.create! - Jekyll.logger.info "Your new Jekyll theme, #{theme.name}, is ready for you in #{theme.path}!" + Jekyll.logger.info "Your new Jekyll theme, #{theme.name}," \ + " is ready for you in #{theme.path}!" Jekyll.logger.info "For help getting started, read #{theme.path}/README.md." end end diff --git a/lib/jekyll/errors.rb b/lib/jekyll/errors.rb index 322eb6af9f9..01bc99b3d12 100644 --- a/lib/jekyll/errors.rb +++ b/lib/jekyll/errors.rb @@ -2,6 +2,8 @@ module Jekyll module Errors FatalException = Class.new(::RuntimeError) + InvalidThemeName = Class.new(FatalException) + DropMutationException = Class.new(FatalException) InvalidPermalinkError = Class.new(FatalException) InvalidYAMLFrontMatterError = Class.new(FatalException) diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index 8b352865c2d..cde4eaff31e 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -1,12 +1,12 @@ class Jekyll::ThemeBuilder - SCAFFOLD_DIRECTORIES = %w{ + SCAFFOLD_DIRECTORIES = %w( _layouts _includes _sass - }.freeze + ).freeze attr_reader :name, :path def initialize(theme_name) - @name = theme_name.to_s.gsub(/ /, "_").gsub(/_+/, "_") + @name = theme_name.to_s.tr(" ", "_").gsub(/_+/, "_") @path = Pathname.new(File.expand_path(name, Dir.pwd)) end @@ -26,10 +26,8 @@ def root def template_file(filename) [ root.join("theme_template", "#{filename}.erb"), - root.join("theme_template", "#{filename}") - ].find do |pathname| - pathname.exist? - end + root.join("theme_template", filename.to_s) + ].find(&:exist?) end def template(filename) @@ -43,14 +41,14 @@ def erb def mkdir_p(directories) Array(directories).each do |directory| full_path = path.join(directory) - Jekyll.logger.info "create", "#{full_path}" + Jekyll.logger.info "create", full_path.to_s FileUtils.mkdir_p(full_path) end end def write_file(filename, contents) full_path = path.join(filename) - Jekyll.logger.info "create", "#{full_path}" + Jekyll.logger.info "create", full_path.to_s File.write(full_path, contents) end @@ -64,13 +62,13 @@ def create_gemspec end def create_accessories - %w{README.md CODE_OF_CONDUCT.md LICENSE.txt}.each do |filename| + %w(README.md CODE_OF_CONDUCT.md LICENSE.txt).each do |filename| write_file(filename, template(filename)) end end def initialize_git_repo - Jekyll.logger.info "initialize", "#{path.join(".git")}" + Jekyll.logger.info "initialize", path.join(".git").to_s Dir.chdir(path.to_s) { `git init` } end diff --git a/lib/theme_template/CODE_OF_CONDUCT.md b/lib/theme_template/CODE_OF_CONDUCT.md deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/lib/theme_template/CODE_OF_CONDUCT.md.erb b/lib/theme_template/CODE_OF_CONDUCT.md.erb new file mode 100644 index 00000000000..2b2c7734f87 --- /dev/null +++ b/lib/theme_template/CODE_OF_CONDUCT.md.erb @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at <%= user_email %>. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/lib/theme_template/README.md b/lib/theme_template/README.md deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/lib/theme_template/README.md.erb b/lib/theme_template/README.md.erb new file mode 100644 index 00000000000..75909a4946e --- /dev/null +++ b/lib/theme_template/README.md.erb @@ -0,0 +1,40 @@ +# <%= theme_name %> + +Welcome to your new Jekyll theme! In this directory, you'll find the files you need to be able to package up your theme into a gem. Put your layouts in `_layouts`, your includes in `_includes` and your sass in `_sass`. To experiment with this code, add some sample content and run `bundle exec jekyll serve` – this directory is setup just like a Jekyll site! + +TODO: Delete this and the text above, and describe your gem + +## Installation + +Add this line to your Jekyll site's Gemfile: + +```ruby +gem <%= theme_name.inspect %> +``` + +And add this line to your Jekyll site: + +```yaml +theme: <%= theme_name %> +``` + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install <%= theme_name %> + +## Usage + +TODO: Write usage instructions here. Describe your available layouts, includes, and/or sass. + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/hello. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. + +## License + +The theme is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). + From eb56ca8c4190bfe520bdc1a97596be55c8261e80 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 16 May 2016 16:04:41 -0700 Subject: [PATCH 0789/4996] Update history to reflect merge of #4888 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f2a50b9e428..f4948c57503 100644 --- a/History.markdown +++ b/History.markdown @@ -56,6 +56,7 @@ * Update Rubocop rules (#4886) * Flesh out the issue template to be much more detailed (#4849) * Fixing rubocop offenses in lib/jekyll/cleaner.rb (#4892) + * Update `jekyll/commands*` to pass rubocop rules (#4888) ### Site Enhancements From 2caff755c4f9e9c6bb5818d9d38cb106f39a56c8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 16 May 2016 16:24:01 -0700 Subject: [PATCH 0790/4996] Set Style/AlignHash EnforcedHashRocketStyle to 'table' --- .rubocop.yml | 2 +- lib/jekyll/commands/serve.rb | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 99e1e2b3d79..2ceac7c46b4 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -145,7 +145,7 @@ Style/Alias: Style/AlignArray: Enabled: false Style/AlignHash: - SupportedLastArgumentHashStyles: always_ignore + EnforcedHashRocketStyle: table Style/AlignParameters: EnforcedStyle: with_fixed_indentation Enabled: false diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 8c63339772e..134991b4616 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -3,14 +3,14 @@ module Commands class Serve < Command class << self COMMAND_OPTIONS = { - "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], - "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], - "open_url" => ["-o", "--open-url", "Launch your browser with your site."], - "detach" => ["-B", "--detach", "Run the server in the background (detach)"], - "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], - "port" => ["-P", "--port [PORT]", "Port to listen on"], - "baseurl" => ["-b", "--baseurl [URL]", "Base URL"], - "show_dir_listing" => ["--show-dir-listing", + "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], + "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], + "open_url" => ["-o", "--open-url", "Launch your site in a browser"], + "detach" => ["-B", "--detach", "Run the server in the background"], + "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], + "port" => ["-P", "--port [PORT]", "Port to listen on"], + "baseurl" => ["-b", "--baseurl [URL]", "Base URL"], + "show_dir_listing" => ["--show-dir-listing", "Show a directory listing instead of loading your index file."], "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", "Skips the initial site build which occurs before the server is started."] @@ -117,10 +117,10 @@ def file_handler_opts private def server_address(server, opts) format("%{prefix}://%{address}:%{port}%{baseurl}", { - :prefix => server.config[:SSLEnable] ? "https" : "http", + :prefix => server.config[:SSLEnable] ? "https" : "http", :baseurl => opts["baseurl"] ? "#{opts["baseurl"]}/" : "", :address => server.config[:BindAddress], - :port => server.config[:Port] + :port => server.config[:Port] }) end From 146d49dc8f1eb3a7d903e7af2d8d2a9ddb3243cf Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 16:51:06 -0500 Subject: [PATCH 0791/4996] Rubocop test cleanups for #4885 This commit cleans up rubocop violations for the following files: test/test_ansi.rb test/test_cleaner.rb test/test_coffeescript.rb test/test_collections.rb test/test_command.rb test/test_commands_serve.rb --- .rubocop.yml | 6 ---- test/test_ansi.rb | 2 +- test/test_cleaner.rb | 57 +++++++++++++++++++------------------ test/test_coffeescript.rb | 7 +++-- test/test_collections.rb | 31 +++++++++++--------- test/test_command.rb | 2 +- test/test_commands_serve.rb | 5 ++-- 7 files changed, 55 insertions(+), 55 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 2ceac7c46b4..acdd1022736 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -72,12 +72,6 @@ AllCops: - features/support/helpers.rb - test/helper.rb - test/simplecov_custom_profile.rb - - test/test_ansi.rb - - test/test_cleaner.rb - - test/test_coffeescript.rb - - test/test_collections.rb - - test/test_command.rb - - test/test_commands_serve.rb - test/test_configuration.rb - test/test_convertible.rb - test/test_doctor_command.rb diff --git a/test/test_ansi.rb b/test/test_ansi.rb index b209e23775c..8f18f56ec7b 100644 --- a/test/test_ansi.rb +++ b/test/test_ansi.rb @@ -6,7 +6,7 @@ class TestAnsi < JekyllUnitTest @subject = Jekyll::Utils::Ansi end - Jekyll::Utils::Ansi::COLORS.each do |color, val| + Jekyll::Utils::Ansi::COLORS.each do |color, _val| should "respond_to? #{color}" do assert @subject.respond_to?(color) end diff --git a/test/test_cleaner.rb b/test/test_cleaner.rb index 2118c4f4dee..5e421c07672 100644 --- a/test/test_cleaner.rb +++ b/test/test_cleaner.rb @@ -1,73 +1,74 @@ -require 'helper' +require "helper" class TestCleaner < JekyllUnitTest context "directory in keep_files" do setup do clear_dest - FileUtils.mkdir_p(dest_dir('to_keep/child_dir')) - FileUtils.touch(File.join(dest_dir('to_keep'), 'index.html')) - FileUtils.touch(File.join(dest_dir('to_keep/child_dir'), 'index.html')) + FileUtils.mkdir_p(dest_dir("to_keep/child_dir")) + FileUtils.touch(File.join(dest_dir("to_keep"), "index.html")) + FileUtils.touch(File.join(dest_dir("to_keep/child_dir"), "index.html")) @site = fixture_site - @site.keep_files = ['to_keep/child_dir'] + @site.keep_files = ["to_keep/child_dir"] @cleaner = Cleaner.new(@site) @cleaner.cleanup! end teardown do - FileUtils.rm_rf(dest_dir('to_keep')) + FileUtils.rm_rf(dest_dir("to_keep")) end should "keep the parent directory" do - assert_exist dest_dir('to_keep') + assert_exist dest_dir("to_keep") end should "keep the child directory" do - assert_exist dest_dir('to_keep', 'child_dir') + assert_exist dest_dir("to_keep", "child_dir") end should "keep the file in the directory in keep_files" do - assert_exist dest_dir('to_keep', 'child_dir', 'index.html') + assert_exist dest_dir("to_keep", "child_dir", "index.html") end should "delete the file in the directory not in keep_files" do - refute_exist dest_dir('to_keep', 'index.html') + refute_exist dest_dir("to_keep", "index.html") end end - context "not-nested directory in keep_files and similary named directory not in keep_files" do + context "not-nested directory in keep_files and similary named directory not "\ + "in keep_files" do setup do clear_dest - FileUtils.mkdir_p(dest_dir('.git/child_dir')) - FileUtils.mkdir_p(dest_dir('username.github.io')) - FileUtils.touch(File.join(dest_dir('.git'), 'index.html')) - FileUtils.touch(File.join(dest_dir('username.github.io'), 'index.html')) + FileUtils.mkdir_p(dest_dir(".git/child_dir")) + FileUtils.mkdir_p(dest_dir("username.github.io")) + FileUtils.touch(File.join(dest_dir(".git"), "index.html")) + FileUtils.touch(File.join(dest_dir("username.github.io"), "index.html")) @site = fixture_site - @site.keep_files = ['.git'] + @site.keep_files = [".git"] @cleaner = Cleaner.new(@site) @cleaner.cleanup! end teardown do - FileUtils.rm_rf(dest_dir('.git')) - FileUtils.rm_rf(dest_dir('username.github.io')) + FileUtils.rm_rf(dest_dir(".git")) + FileUtils.rm_rf(dest_dir("username.github.io")) end should "keep the file in the directory in keep_files" do - assert File.exist?(File.join(dest_dir('.git'), 'index.html')) + assert File.exist?(File.join(dest_dir(".git"), "index.html")) end should "delete the file in the directory not in keep_files" do - assert !File.exist?(File.join(dest_dir('username.github.io'), 'index.html')) + assert !File.exist?(File.join(dest_dir("username.github.io"), "index.html")) end should "delete the directory not in keep_files" do - assert !File.exist?(dest_dir('username.github.io')) + assert !File.exist?(dest_dir("username.github.io")) end end @@ -75,8 +76,8 @@ class TestCleaner < JekyllUnitTest setup do clear_dest - FileUtils.mkdir_p(source_dir('no_files_inside', 'child_dir')) - FileUtils.touch(source_dir('no_files_inside', 'child_dir', 'index.html')) + FileUtils.mkdir_p(source_dir("no_files_inside", "child_dir")) + FileUtils.touch(source_dir("no_files_inside", "child_dir", "index.html")) @site = fixture_site @site.process @@ -86,20 +87,20 @@ class TestCleaner < JekyllUnitTest end teardown do - FileUtils.rm_rf(source_dir('no_files_inside')) - FileUtils.rm_rf(dest_dir('no_files_inside')) + FileUtils.rm_rf(source_dir("no_files_inside")) + FileUtils.rm_rf(dest_dir("no_files_inside")) end should "keep the parent directory" do - assert_exist dest_dir('no_files_inside') + assert_exist dest_dir("no_files_inside") end should "keep the child directory" do - assert_exist dest_dir('no_files_inside', 'child_dir') + assert_exist dest_dir("no_files_inside", "child_dir") end should "keep the file" do - assert_exist source_dir('no_files_inside', 'child_dir', 'index.html') + assert_exist source_dir("no_files_inside", "child_dir", "index.html") end end end diff --git a/test/test_coffeescript.rb b/test/test_coffeescript.rb index 09c9b0a87a0..95c06db8983 100644 --- a/test/test_coffeescript.rb +++ b/test/test_coffeescript.rb @@ -1,9 +1,9 @@ -require 'helper' +require "helper" class TestCoffeeScript < JekyllUnitTest context "converting CoffeeScript" do setup do - External.require_with_graceful_fail('jekyll-coffeescript') + External.require_with_graceful_fail("jekyll-coffeescript") @site = fixture_site @site.process @test_coffeescript_file = dest_dir("js/coffeescript.js") @@ -37,7 +37,8 @@ class TestCoffeeScript < JekyllUnitTest end should "write a JS file in place" do - assert_exist @test_coffeescript_file, "Can't find the converted CoffeeScript file in the dest_dir." + assert_exist @test_coffeescript_file, "Can't find the converted CoffeeScript file "\ + "in the dest_dir." end should "produce JS" do diff --git a/test/test_collections.rb b/test/test_collections.rb index 82175bc5498..4c0b8379aca 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestCollections < JekyllUnitTest context "an evil collection" do @@ -50,7 +50,7 @@ class TestCollections < JekyllUnitTest end should "have a docs attribute" do - assert_equal @collection.to_liquid["docs"], Array.new + assert_equal @collection.to_liquid["docs"], [] end should "have a directory attribute" do @@ -68,9 +68,9 @@ class TestCollections < JekyllUnitTest should "know whether it should be written or not" do assert_equal @collection.write?, false - @collection.metadata['output'] = true + @collection.metadata["output"] = true assert_equal @collection.write?, true - @collection.metadata.delete 'output' + @collection.metadata.delete "output" end end @@ -80,8 +80,8 @@ class TestCollections < JekyllUnitTest @site.process end - should "contain only the defaul collections" do - refute_equal Hash.new, @site.collections + should "contain only the default collections" do + refute_equal @site.collections, {} refute_nil @site.collections end end @@ -113,7 +113,8 @@ class TestCollections < JekyllUnitTest @collection = @site.collections["methods"] end - should "create a Hash on Site with the label mapped to the instance of the Collection" do + should "create a Hash on Site with the label mapped to the instance of the "\ + "Collection" do assert @site.collections.is_a?(Hash) refute_nil @site.collections["methods"] assert @site.collections["methods"].is_a? Jekyll::Collection @@ -123,7 +124,7 @@ class TestCollections < JekyllUnitTest assert @site.collections["methods"].docs.is_a? Array @site.collections["methods"].docs.each do |doc| assert doc.is_a? Jekyll::Document - assert_includes %w[ + assert_includes %w( _methods/configuration.md _methods/sanitized_path.md _methods/collection/entries @@ -132,11 +133,12 @@ class TestCollections < JekyllUnitTest _methods/um_hi.md _methods/escape-+\ #%20[].md _methods/yaml_with_dots.md - ], doc.relative_path + ), doc.relative_path end end - should "not include files which start with an underscore in the base collection directory" do + should "not include files which start with an underscore in the base collection "\ + "directory" do refute_includes @collection.filtered_entries, "_do_not_read_me.md" end @@ -146,7 +148,8 @@ class TestCollections < JekyllUnitTest should "not include the underscored files in the list of docs" do refute_includes @collection.docs.map(&:relative_path), "_methods/_do_not_read_me.md" - refute_includes @collection.docs.map(&:relative_path), "_methods/site/_dont_include_me_either.md" + refute_includes @collection.docs.map(&:relative_path), + "_methods/site/_dont_include_me_either.md" end end @@ -165,7 +168,7 @@ class TestCollections < JekyllUnitTest end should "extract the configuration collection information as metadata" do - assert_equal @collection.metadata, {"foo" => "bar", "baz" => "whoo"} + assert_equal @collection.metadata, { "foo" => "bar", "baz" => "whoo" } end end @@ -184,7 +187,8 @@ class TestCollections < JekyllUnitTest refute_includes @collection.filtered_entries, "/um_hi.md" end - should "include the symlinked file in the list of docs as it resolves to inside site.source" do + should "include the symlinked file in the list of docs as it resolves to inside "\ + "site.source" do assert_includes @collection.docs.map(&:relative_path), "_methods/um_hi.md" end end @@ -215,5 +219,4 @@ class TestCollections < JekyllUnitTest assert @collection.docs.any? { |d| d.path.include?("all.dots") } end end - end diff --git a/test/test_command.rb b/test/test_command.rb index 7d1211e893b..90767013b92 100644 --- a/test/test_command.rb +++ b/test/test_command.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestCommand < JekyllUnitTest context "when calling .add_build_options" do diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 0db8bdf9b31..b02232b9fa6 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -11,7 +11,8 @@ def custom_opts(what) context "with a program" do setup do - @merc, @cmd = nil, Jekyll::Commands::Serve + @merc = nil + @cmd = Jekyll::Commands::Serve Mercenary.program(:jekyll) do |p| @merc = @cmd.init_with_program( p @@ -63,7 +64,7 @@ def custom_opts(what) should "use user port" do # WHAT?!?!1 Over 9000? That's impossible. - assert_equal 9001, custom_opts( { "port" => 9001 })[ + assert_equal 9001, custom_opts({ "port" => 9001 })[ :Port ] end From aad587ca2f924895bd434c6c8bcc53110d9cb5be Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 19:20:29 -0500 Subject: [PATCH 0792/4996] Rubocop fixes for test/helper.rb --- .rubocop.yml | 1 - test/helper.rb | 44 ++++++++++++++++++++------------------------ 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index acdd1022736..fc8fcb6cf66 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -70,7 +70,6 @@ AllCops: - features/step_definitions.rb - features/support/formatter.rb - features/support/helpers.rb - - test/helper.rb - test/simplecov_custom_profile.rb - test/test_configuration.rb - test/test_convertible.rb diff --git a/test/helper.rb b/test/helper.rb index ade8b77d3ea..3a3dafa27ae 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -6,7 +6,7 @@ $VERBOSE = nil def jruby? - defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' + defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby" end if ENV["CI"] @@ -22,23 +22,23 @@ def jruby? end require "nokogiri" -require 'rubygems' -require 'ostruct' -require 'minitest/autorun' -require 'minitest/reporters' -require 'minitest/profile' -require 'rspec/mocks' -require 'jekyll' +require "rubygems" +require "ostruct" +require "minitest/autorun" +require "minitest/reporters" +require "minitest/profile" +require "rspec/mocks" +require "jekyll" Jekyll.logger = Logger.new(StringIO.new) unless jruby? - require 'rdiscount' - require 'redcarpet' + require "rdiscount" + require "redcarpet" end -require 'kramdown' -require 'shoulda' +require "kramdown" +require "shoulda" include Jekyll @@ -51,16 +51,12 @@ def jruby? module Minitest::Assertions def assert_exist(filename, msg = nil) - msg = message(msg) { - "Expected '#{filename}' to exist" - } + msg = message(msg) { "Expected '#{filename}' to exist" } assert File.exist?(filename), msg end def refute_exist(filename, msg = nil) - msg = message(msg) { - "Expected '#{filename}' not to exist" - } + msg = message(msg) { "Expected '#{filename}' not to exist" } refute File.exist?(filename), msg end end @@ -69,8 +65,8 @@ class JekyllUnitTest < Minitest::Test include ::RSpec::Mocks::ExampleMethods def mocks_expect(*args) - RSpec::Mocks::ExampleMethods::ExpectHost.instance_method(:expect).\ - bind(self).call(*args) + RSpec::Mocks::ExampleMethods::ExpectHost.instance_method(:expect)\ + .bind(self).call(*args) end def before_setup @@ -105,16 +101,16 @@ def site_configuration(overrides = {}) end def dest_dir(*subdirs) - test_dir('dest', *subdirs) + test_dir("dest", *subdirs) end def source_dir(*subdirs) - test_dir('source', *subdirs) + test_dir("source", *subdirs) end def clear_dest FileUtils.rm_rf(dest_dir) - FileUtils.rm_rf(source_dir('.jekyll-metadata')) + FileUtils.rm_rf(source_dir(".jekyll-metadata")) end def test_dir(*subdirs) @@ -124,7 +120,7 @@ def test_dir(*subdirs) def directory_with_contents(path) FileUtils.rm_rf(path) FileUtils.mkdir(path) - File.open("#{path}/index.html", "w"){ |f| f.write("I was previously generated.") } + File.open("#{path}/index.html", "w") { |f| f.write("I was previously generated.") } end def with_env(key, value) From 5034cc377a86f884aa3466aff71ccac730193d57 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 19:22:52 -0500 Subject: [PATCH 0793/4996] Rubocop fixes for test/simplecov_custom_profile.rb --- .rubocop.yml | 1 - test/simplecov_custom_profile.rb | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index fc8fcb6cf66..588e630c006 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -70,7 +70,6 @@ AllCops: - features/step_definitions.rb - features/support/formatter.rb - features/support/helpers.rb - - test/simplecov_custom_profile.rb - test/test_configuration.rb - test/test_convertible.rb - test/test_doctor_command.rb diff --git a/test/simplecov_custom_profile.rb b/test/simplecov_custom_profile.rb index d7f4914cbce..0aaec88a58c 100644 --- a/test/simplecov_custom_profile.rb +++ b/test/simplecov_custom_profile.rb @@ -1,10 +1,10 @@ -require 'simplecov' +require "simplecov" -SimpleCov.profiles.define 'gem' do - add_filter '/test/' - add_filter '/features/' - add_filter '/autotest/' +SimpleCov.profiles.define "gem" do + add_filter "/test/" + add_filter "/features/" + add_filter "/autotest/" - add_group 'Binaries', '/bin/' - add_group 'Libraries', '/lib/' + add_group "Binaries", "/bin/" + add_group "Libraries", "/lib/" end From 454a1e415cd822d02922f7c70afe736c5aec9907 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 19:36:00 -0500 Subject: [PATCH 0794/4996] Rubocop fixes for test/test_convertible.rb --- .rubocop.yml | 1 - test/test_convertible.rb | 28 ++++++++++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 588e630c006..b6e5b25a615 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -71,7 +71,6 @@ AllCops: - features/support/formatter.rb - features/support/helpers.rb - test/test_configuration.rb - - test/test_convertible.rb - test/test_doctor_command.rb - test/test_document.rb - test/test_entry_filter.rb diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 517f5c3b13f..4509ed36f0b 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -1,30 +1,30 @@ -require 'helper' -require 'ostruct' +require "helper" +require "ostruct" class TestConvertible < JekyllUnitTest context "yaml front-matter" do setup do @convertible = OpenStruct.new( "site" => Site.new(Jekyll.configuration( - "source" => File.expand_path('../fixtures', __FILE__) + "source" => File.expand_path("../fixtures", __FILE__) )) ) @convertible.extend Jekyll::Convertible - @base = File.expand_path('../fixtures', __FILE__) + @base = File.expand_path("../fixtures", __FILE__) end should "parse the front-matter correctly" do - ret = @convertible.read_yaml(@base, 'front_matter.erb') - assert_equal({'test' => 'good'}, ret) + ret = @convertible.read_yaml(@base, "front_matter.erb") + assert_equal({ "test" => "good" }, ret) end should "not parse if the front-matter is not at the start of the file" do - ret = @convertible.read_yaml(@base, 'broken_front_matter1.erb') + ret = @convertible.read_yaml(@base, "broken_front_matter1.erb") assert_equal({}, ret) end should "not parse if there is syntax error in front-matter" do - name = 'broken_front_matter2.erb' + name = "broken_front_matter2.erb" out = capture_stderr do ret = @convertible.read_yaml(@base, name) assert_equal({}, ret) @@ -35,15 +35,15 @@ class TestConvertible < JekyllUnitTest should "not allow ruby objects in yaml" do out = capture_stderr do - @convertible.read_yaml(@base, 'exploit_front_matter.erb') + @convertible.read_yaml(@base, "exploit_front_matter.erb") end - refute_match(/undefined class\/module DoesNotExist/, out) + refute_match(%r!undefined class\/module DoesNotExist!, out) end should "not parse if there is encoding error in file" do - name = 'broken_front_matter3.erb' + name = "broken_front_matter3.erb" out = capture_stderr do - ret = @convertible.read_yaml(@base, name, :encoding => 'utf-8') + ret = @convertible.read_yaml(@base, name, :encoding => "utf-8") assert_equal({}, ret) end assert_match(/invalid byte sequence in UTF-8/, out) @@ -51,7 +51,7 @@ class TestConvertible < JekyllUnitTest end should "parse the front-matter but show an error if permalink is empty" do - name = 'empty_permalink.erb' + name = "empty_permalink.erb" assert_raises(Errors::InvalidPermalinkError) do @convertible.read_yaml(@base, name) end @@ -59,7 +59,7 @@ class TestConvertible < JekyllUnitTest should "parse the front-matter correctly whitout permalink" do out = capture_stderr do - @convertible.read_yaml(@base, 'front_matter.erb') + @convertible.read_yaml(@base, "front_matter.erb") end refute_match(/Invalid permalink/, out) end From cfe6cf7ca1874488d15b88cbd5a2ea5d1a7855f8 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 20:54:54 -0500 Subject: [PATCH 0795/4996] Rubocop fixes for test/test_doctor_command.rb --- .rubocop.yml | 1 - test/test_doctor_command.rb | 26 ++++++++++++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b6e5b25a615..d14330d5399 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -71,7 +71,6 @@ AllCops: - features/support/formatter.rb - features/support/helpers.rb - test/test_configuration.rb - - test/test_doctor_command.rb - test/test_document.rb - test/test_entry_filter.rb - test/test_excerpt.rb diff --git a/test/test_doctor_command.rb b/test/test_doctor_command.rb index dee50ac210f..aa6cf12507d 100644 --- a/test/test_doctor_command.rb +++ b/test/test_doctor_command.rb @@ -1,36 +1,38 @@ -require 'helper' -require 'jekyll/commands/doctor' +require "helper" +require "jekyll/commands/doctor" class TestDoctorCommand < JekyllUnitTest - context 'urls only differ by case' do + context "urls only differ by case" do setup do clear_dest end - should 'return success on a valid site/page' do + should "return success on a valid site/page" do @site = Site.new(Jekyll.configuration({ - "source" => File.join(source_dir, '/_urls_differ_by_case_valid'), + "source" => File.join(source_dir, "/_urls_differ_by_case_valid"), "destination" => dest_dir })) @site.process output = capture_stderr do - ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) - assert_equal false, ret + ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) + assert_equal false, ret end assert_equal "", output end - should 'return warning for pages only differing by case' do + should "return warning for pages only differing by case" do @site = Site.new(Jekyll.configuration({ - "source" => File.join(source_dir, '/_urls_differ_by_case_invalid'), + "source" => File.join(source_dir, "/_urls_differ_by_case_invalid"), "destination" => dest_dir })) @site.process output = capture_stderr do - ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) - assert_equal true, ret + ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) + assert_equal true, ret end - assert_includes output, "Warning: The following URLs only differ by case. On a case-insensitive file system one of the URLs will be overwritten by the other: #{dest_dir}/about/index.html, #{dest_dir}/About/index.html" + assert_includes output, "Warning: The following URLs only differ by case. "\ + "On a case-insensitive file system one of the URLs will be overwritten by the "\ + "other: #{dest_dir}/about/index.html, #{dest_dir}/About/index.html" end end end From c8cae38da6d8fbbc5d6e085904088032e2ebec8a Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 21:59:00 -0500 Subject: [PATCH 0796/4996] Rubocop fixes for test/test_excerpt.rb --- .rubocop.yml | 1 - test/test_excerpt.rb | 37 ++++++++++++++++++++----------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index d14330d5399..5195d933bc5 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -73,7 +73,6 @@ AllCops: - test/test_configuration.rb - test/test_document.rb - test/test_entry_filter.rb - - test/test_excerpt.rb - test/test_filters.rb - test/test_front_matter_defaults.rb - test/test_generated_site.rb diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index 61ffded302b..2314431380e 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -1,22 +1,23 @@ -require 'helper' +require "helper" class TestExcerpt < JekyllUnitTest def setup_post(file) - Document.new(@site.in_source_dir(File.join('_posts', file)), { - site: @site, - collection: @site.posts + Document.new(@site.in_source_dir(File.join("_posts", file)), { + :site => @site, + :collection => @site.posts }).tap(&:read) end def do_render(document) - @site.layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")} + @site.layouts = { "default" => Layout.new(@site, source_dir("_layouts"), + "simple.html") } document.output = Jekyll::Renderer.new(@site, document, @site.site_payload).run end context "With extraction disabled" do setup do clear_dest - @site = fixture_site('excerpt_separator' => '') + @site = fixture_site("excerpt_separator" => "") @post = setup_post("2013-07-22-post-excerpt-with-layout.markdown") end @@ -30,11 +31,10 @@ def do_render(document) clear_dest @site = fixture_site @post = setup_post("2013-07-22-post-excerpt-with-layout.markdown") - @excerpt = @post.data['excerpt'] + @excerpt = @post.data["excerpt"] end context "#include(string)" do - setup do @excerpt.output = "Here is a fake output stub" end @@ -78,19 +78,21 @@ def do_render(document) context "#to_liquid" do should "contain the proper page data to mimick the post liquid" do assert_equal "Post Excerpt with Layout", @excerpt.to_liquid["title"] - assert_equal "/bar/baz/z_category/mixedcase/2013/07/22/post-excerpt-with-layout.html", @excerpt.to_liquid["url"] + assert_equal "/bar/baz/z_category/mixedcase/2013/07/22/"\ + "post-excerpt-with-layout.html", @excerpt.to_liquid["url"] assert_equal Time.parse("2013-07-22"), @excerpt.to_liquid["date"] - assert_equal %w[bar baz z_category MixedCase], @excerpt.to_liquid["categories"] - assert_equal %w[first second third jekyllrb.com], @excerpt.to_liquid["tags"] - assert_equal "_posts/2013-07-22-post-excerpt-with-layout.markdown", @excerpt.to_liquid["path"] + assert_equal %w(bar baz z_category MixedCase), @excerpt.to_liquid["categories"] + assert_equal %w(first second third jekyllrb.com), @excerpt.to_liquid["tags"] + assert_equal "_posts/2013-07-22-post-excerpt-with-layout.markdown", + @excerpt.to_liquid["path"] end end context "#content" do - context "before render" do should "be the first paragraph of the page" do - assert_equal "First paragraph with [link ref][link].\n\n[link]: http://www.jekyllrb.com/", @excerpt.content + assert_equal "First paragraph with [link ref][link].\n\n[link]:"\ + " http://www.jekyllrb.com/", @excerpt.content end should "contain any refs at the bottom of the page" do @@ -102,11 +104,12 @@ def do_render(document) setup do @rendered_post = @post.dup do_render(@rendered_post) - @extracted_excerpt = @rendered_post.data['excerpt'] + @extracted_excerpt = @rendered_post.data["excerpt"] end should "be the first paragraph of the page" do - assert_equal "

    First paragraph with link ref.

    \n\n", @extracted_excerpt.output + assert_equal "

    First paragraph with "\ + "link ref.

    \n\n", @extracted_excerpt.output end should "link properly" do @@ -121,7 +124,7 @@ def do_render(document) clear_dest @site = fixture_site @post = setup_post("2008-02-02-published.markdown") - @excerpt = @post.data['excerpt'] + @excerpt = @post.data["excerpt"] end should "be generated" do From 555b2fbe72a2bbcba173205f465ad287dc44114c Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 22:05:28 -0500 Subject: [PATCH 0797/4996] Rubocop fixes for test/test_front_matter_defaults.rb --- .rubocop.yml | 1 - test/test_front_matter_defaults.rb | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 5195d933bc5..4a1b4feabd5 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -74,7 +74,6 @@ AllCops: - test/test_document.rb - test/test_entry_filter.rb - test/test_filters.rb - - test/test_front_matter_defaults.rb - test/test_generated_site.rb - test/test_kramdown.rb - test/test_layout_reader.rb diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index 8eeed7f3ae0..4be4ce2f1ff 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -1,7 +1,6 @@ -require 'helper' +require "helper" class TestFrontMatterDefaults < JekyllUnitTest - context "A site with full front matter defaults" do setup do @site = Site.new(Jekyll.configuration({ @@ -69,7 +68,7 @@ class TestFrontMatterDefaults < JekyllUnitTest }] })) @site.process - @affected = @site.posts.docs.find { |page| page.relative_path =~ /win\// } + @affected = @site.posts.docs.find { |page| page.relative_path =~ %r!win\/! } @not_affected = @site.pages.find { |page| page.relative_path == "about.html" } end @@ -100,7 +99,8 @@ class TestFrontMatterDefaults < JekyllUnitTest should "affect only the specified type and all paths" do assert_equal @affected.reject { |page| page.data["key"] == "val" }, [] - assert_equal @not_affected.reject { |page| page.data["key"] == "val" }, @not_affected + assert_equal @not_affected.reject { |page| page.data["key"] == "val" }, + @not_affected end end @@ -125,7 +125,8 @@ class TestFrontMatterDefaults < JekyllUnitTest should "affect only the specified type and all paths" do assert_equal @affected.reject { |page| page.data["key"] == "val" }, [] - assert_equal @not_affected.reject { |page| page.data["key"] == "val" }, @not_affected + assert_equal @not_affected.reject { |page| page.data["key"] == "val" }, + @not_affected end end @@ -199,5 +200,4 @@ class TestFrontMatterDefaults < JekyllUnitTest assert @site.posts.find { |page| page.data["date"] == date } end end - end From 0635bbba0602a4f674ba7fc9fb9ec93923935912 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 22:14:17 -0500 Subject: [PATCH 0798/4996] Rubocop fixes for test/test_generated_site.rb --- .rubocop.yml | 1 - test/test_generated_site.rb | 45 ++++++++++++++++++++----------------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 4a1b4feabd5..bb0f238113e 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -74,7 +74,6 @@ AllCops: - test/test_document.rb - test/test_entry_filter.rb - test/test_filters.rb - - test/test_generated_site.rb - test/test_kramdown.rb - test/test_layout_reader.rb - test/test_liquid_extensions.rb diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 301cd8f8fea..463748625dc 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -1,14 +1,15 @@ -require 'helper' +require "helper" class TestGeneratedSite < JekyllUnitTest context "generated sites" do setup do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir}) + config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, + "destination" => dest_dir }) @site = fixture_site(config) @site.process - @index = File.read(dest_dir('index.html')) + @index = File.read(dest_dir("index.html")) end should "ensure post count is as expected" do @@ -24,29 +25,29 @@ class TestGeneratedSite < JekyllUnitTest end should "hide unpublished posts" do - published = Dir[dest_dir('publish_test/2008/02/02/*.html')].map {|f| File.basename(f)} - + published = Dir[dest_dir("publish_test/2008/02/02/*.html")].map \ + { |f| File.basename(f) } assert_equal 1, published.size assert_equal "published.html", published.first end should "hide unpublished page" do - refute_exist dest_dir('/unpublished.html') + refute_exist dest_dir("/unpublished.html") end should "not copy _posts directory" do - refute_exist dest_dir('_posts') + refute_exist dest_dir("_posts") end should "process a page with a folder permalink properly" do - about = @site.pages.find {|page| page.name == 'about.html' } - assert_equal dest_dir('about', 'index.html'), about.destination(dest_dir) - assert_exist dest_dir('about', 'index.html') + about = @site.pages.find { |page| page.name == "about.html" } + assert_equal dest_dir("about", "index.html"), about.destination(dest_dir) + assert_exist dest_dir("about", "index.html") end should "process other static files and generate correct permalinks" do - assert_exist dest_dir('contacts.html') - assert_exist dest_dir('dynamic_file.php') + assert_exist dest_dir("contacts.html") + assert_exist dest_dir("dynamic_file.php") end should "print a nice list of static files" do @@ -57,17 +58,19 @@ class TestGeneratedSite < JekyllUnitTest - /products.yml last edited at #{time_regexp} with extname .yml - /symlink-test/symlinked-dir/screen.css last edited at #{time_regexp} with extname .css OUTPUT - assert_match expected_output, File.read(dest_dir('static_files.html')) + assert_match expected_output, File.read(dest_dir("static_files.html")) end end context "generating limited posts" do setup do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => 5}) + config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, + "destination" => dest_dir, + "limit_posts" => 5 }) @site = fixture_site(config) @site.process - @index = File.read(dest_dir('index.html')) + @index = File.read(dest_dir("index.html")) end should "generate only the specified number of posts" do @@ -78,9 +81,9 @@ class TestGeneratedSite < JekyllUnitTest assert_raises ArgumentError do clear_dest config = Jekyll::Configuration::DEFAULTS.merge({ - 'source' => source_dir, - 'destination' => dest_dir, - 'limit_posts' => -1 + "source" => source_dir, + "destination" => dest_dir, + "limit_posts" => -1 }) @site = fixture_site(config) end @@ -89,9 +92,9 @@ class TestGeneratedSite < JekyllUnitTest should "acceptable limit post is 0" do clear_dest config = Jekyll::Configuration::DEFAULTS.merge({ - 'source' => source_dir, - 'destination' => dest_dir, - 'limit_posts' => 0 + "source" => source_dir, + "destination" => dest_dir, + "limit_posts" => 0 }) assert Site.new(config), "Couldn't create a site with the given limit_posts." From 271a8aebfb80c18bc02869c11840a57ae38ab78c Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 22:47:38 -0500 Subject: [PATCH 0799/4996] Rubocop fixes for test/test_layout_reader.rb --- .rubocop.yml | 1 - test/test_layout_reader.rb | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index bb0f238113e..bd088278636 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -75,7 +75,6 @@ AllCops: - test/test_entry_filter.rb - test/test_filters.rb - test/test_kramdown.rb - - test/test_layout_reader.rb - test/test_liquid_extensions.rb - test/test_liquid_renderer.rb - test/test_log_adapter.rb diff --git a/test/test_layout_reader.rb b/test/test_layout_reader.rb index 11acdb3140e..dabe29c0c7e 100644 --- a/test/test_layout_reader.rb +++ b/test/test_layout_reader.rb @@ -1,9 +1,10 @@ -require 'helper' +require "helper" class TestLayoutReader < JekyllUnitTest context "reading layouts" do setup do - config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir}) + config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, + "destination" => dest_dir }) @site = fixture_site(config) end From 5a1a8c9c82adad67137a7787bb0ac365e7369aec Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 22:58:06 -0500 Subject: [PATCH 0800/4996] Rubocop fixes for test/test_liquid_extensions.rb --- .rubocop.yml | 1 - test/test_liquid_extensions.rb | 15 +++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index bd088278636..66b68f47540 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -75,7 +75,6 @@ AllCops: - test/test_entry_filter.rb - test/test_filters.rb - test/test_kramdown.rb - - test/test_liquid_extensions.rb - test/test_liquid_renderer.rb - test/test_log_adapter.rb - test/test_new_command.rb diff --git a/test/test_liquid_extensions.rb b/test/test_liquid_extensions.rb index 0ab95e94e4b..a76f378623e 100644 --- a/test/test_liquid_extensions.rb +++ b/test/test_liquid_extensions.rb @@ -1,12 +1,11 @@ -require 'helper' +require "helper" class TestLiquidExtensions < JekyllUnitTest - context "looking up a variable in a Liquid context" do class SayHi < Liquid::Tag include Jekyll::LiquidExtensions - def initialize(tag_name, markup, tokens) + def initialize(_tag_name, markup, _tokens) @markup = markup.strip end @@ -14,18 +13,18 @@ def render(context) "hi #{lookup_variable(context, @markup)}" end end - Liquid::Template.register_tag('say_hi', SayHi) + Liquid::Template.register_tag("say_hi", SayHi) setup do - @template = Liquid::Template.parse("{% say_hi page.name %}") # Parses and compiles the template + # Parses and compiles the template + @template = Liquid::Template.parse("{% say_hi page.name %}") end should "extract the var properly" do - assert_equal @template.render({'page' => {'name' => 'tobi'}}), 'hi tobi' + assert_equal @template.render({ "page" => { "name" => "tobi" } }), "hi tobi" end should "return the variable name if the value isn't there" do - assert_equal @template.render({'page' => {'title' => 'tobi'}}), 'hi page.name' + assert_equal @template.render({ "page" => { "title" => "tobi" } }), "hi page.name" end end - end From ad988838435de085cd90ca3a8ff285a74ef5eee2 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 23:16:28 -0500 Subject: [PATCH 0801/4996] Rubocop fixes for test/test_log_adapter.rb --- .rubocop.yml | 1 - test/test_log_adapter.rb | 31 +++++++++++++++++++------------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 66b68f47540..e8b111021a3 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -76,7 +76,6 @@ AllCops: - test/test_filters.rb - test/test_kramdown.rb - test/test_liquid_renderer.rb - - test/test_log_adapter.rb - test/test_new_command.rb - test/test_page.rb - test/test_path_sanitization.rb diff --git a/test/test_log_adapter.rb b/test/test_log_adapter.rb index 0160d821907..f34be99df6b 100644 --- a/test/test_log_adapter.rb +++ b/test/test_log_adapter.rb @@ -1,12 +1,15 @@ -require 'helper' +require "helper" class TestLogAdapter < JekyllUnitTest class LoggerDouble attr_accessor :level def debug(*); end + def info(*); end + def warn(*); end + def error(*); end end @@ -58,8 +61,9 @@ def error(*); end should "call #debug on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) - allow(writer).to receive(:debug).with('topic '.rjust(20) + 'log message').and_return(true) - assert logger.debug('topic', 'log message') + allow(writer).to receive(:debug).with("topic ".rjust(20) + + "log message").and_return(true) + assert logger.debug("topic", "log message") end end @@ -67,8 +71,9 @@ def error(*); end should "call #info on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) - allow(writer).to receive(:info).with('topic '.rjust(20) + 'log message').and_return(true) - assert logger.info('topic', 'log message') + allow(writer).to receive(:info).with("topic ".rjust(20) + + "log message").and_return(true) + assert logger.info("topic", "log message") end end @@ -76,8 +81,9 @@ def error(*); end should "call #warn on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) - allow(writer).to receive(:warn).with('topic '.rjust(20) + 'log message').and_return(true) - assert logger.warn('topic', 'log message') + allow(writer).to receive(:warn).with("topic ".rjust(20) + + "log message").and_return(true) + assert logger.warn("topic", "log message") end end @@ -85,16 +91,17 @@ def error(*); end should "call #error on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) - allow(writer).to receive(:error).with('topic '.rjust(20) + 'log message').and_return(true) - assert logger.error('topic', 'log message') + allow(writer).to receive(:error).with("topic ".rjust(20) + + "log message").and_return(true) + assert logger.error("topic", "log message") end end context "#abort_with" do should "call #error and abort" do logger = Jekyll::LogAdapter.new(LoggerDouble.new) - allow(logger).to receive(:error).with('topic', 'log message').and_return(true) - assert_raises(SystemExit) { logger.abort_with('topic', 'log message') } + allow(logger).to receive(:error).with("topic", "log message").and_return(true) + assert_raises(SystemExit) { logger.abort_with("topic", "log message") } end end @@ -105,7 +112,7 @@ def error(*); end should "store each log value in the array" do logger = Jekyll::LogAdapter.new(LoggerDouble.new) - values = %w{one two three four} + values = %w(one two three four) logger.debug(values[0]) logger.info(values[1]) logger.warn(values[2]) From c76b458dd5cdb8162edfefe23775699c475210f8 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 23:20:48 -0500 Subject: [PATCH 0802/4996] Rubocop fixes for test/test_new_command.rb --- .rubocop.yml | 1 - test/test_new_command.rb | 54 ++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index e8b111021a3..e63fa50bd80 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -76,7 +76,6 @@ AllCops: - test/test_filters.rb - test/test_kramdown.rb - test/test_liquid_renderer.rb - - test/test_new_command.rb - test/test_page.rb - test/test_path_sanitization.rb - test/test_plugin_manager.rb diff --git a/test/test_new_command.rb b/test/test_new_command.rb index 451b525de47..e020940086c 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -1,10 +1,10 @@ -require 'helper' -require 'jekyll/commands/new' +require "helper" +require "jekyll/commands/new" class TestNewCommand < JekyllUnitTest def dir_contents(path) Dir["#{path}/**/*"].each do |file| - file.gsub! path, '' + file.gsub! path, "" end end @@ -12,9 +12,9 @@ def site_template File.expand_path("../lib/site_template", File.dirname(__FILE__)) end - context 'when args contains a path' do + context "when args contains a path" do setup do - @path = 'new-site' + @path = "new-site" @args = [@path] @full_path = File.expand_path(@path, Dir.pwd) end @@ -23,7 +23,7 @@ def site_template FileUtils.rm_r @full_path end - should 'create a new directory' do + should "create a new directory" do refute_exist @full_path Jekyll::Commands::New.process(@args) assert_exist @full_path @@ -34,43 +34,43 @@ def site_template refute_exist @full_path capture_stdout { Jekyll::Commands::New.process(@args) } assert_exist gemfile - assert_match /gem "jekyll", "#{Jekyll::VERSION}"/, File.read(gemfile) - assert_match /gem "github-pages"/, File.read(gemfile) + assert_match(/gem "jekyll", "#{Jekyll::VERSION}"/, File.read(gemfile)) + assert_match(/gem "github-pages"/, File.read(gemfile)) end - should 'display a success message' do + should "display a success message" do Jekyll::Commands::New.process(@args) output = Jekyll.logger.messages.last success_message = "New jekyll site installed in #{@full_path}." assert_includes output, success_message end - should 'copy the static files in site template to the new directory' do + should "copy the static files in site template to the new directory" do static_template_files = dir_contents(site_template).reject do |f| - File.extname(f) == '.erb' + File.extname(f) == ".erb" end static_template_files << "/Gemfile" capture_stdout { Jekyll::Commands::New.process(@args) } new_site_files = dir_contents(@full_path).reject do |f| - File.extname(f) == '.markdown' + File.extname(f) == ".markdown" end assert_same_elements static_template_files, new_site_files end - should 'process any ERB files' do + should "process any ERB files" do erb_template_files = dir_contents(site_template).select do |f| - File.extname(f) == '.erb' + File.extname(f) == ".erb" end - stubbed_date = '2013-01-01' + stubbed_date = "2013-01-01" allow_any_instance_of(Time).to receive(:strftime) { stubbed_date } erb_template_files.each do |f| - f.chomp! '.erb' - f.gsub! '0000-00-00', stubbed_date + f.chomp! ".erb" + f.gsub! "0000-00-00", stubbed_date end capture_stdout { Jekyll::Commands::New.process(@args) } @@ -82,22 +82,22 @@ def site_template assert_same_elements erb_template_files, new_site_files end - should 'create blank project' do + should "create blank project" do blank_contents = %w(/_drafts /_layouts /_posts /index.html) - capture_stdout { Jekyll::Commands::New.process(@args, '--blank') } + capture_stdout { Jekyll::Commands::New.process(@args, "--blank") } assert_same_elements blank_contents, dir_contents(@full_path) end - should 'force created folder' do + should "force created folder" do capture_stdout { Jekyll::Commands::New.process(@args) } - output = capture_stdout { Jekyll::Commands::New.process(@args, '--force') } + output = capture_stdout { Jekyll::Commands::New.process(@args, "--force") } assert_match(/New jekyll site installed in/, output) end end - context 'when multiple args are given' do + context "when multiple args are given" do setup do - @site_name_with_spaces = 'new site name' + @site_name_with_spaces = "new site name" @multiple_args = @site_name_with_spaces.split end @@ -105,23 +105,23 @@ def site_template FileUtils.rm_r File.expand_path(@site_name_with_spaces, Dir.pwd) end - should 'create a new directory' do + should "create a new directory" do refute_exist @site_name_with_spaces capture_stdout { Jekyll::Commands::New.process(@multiple_args) } assert_exist @site_name_with_spaces end end - context 'when no args are given' do + context "when no args are given" do setup do @empty_args = [] end - should 'raise an ArgumentError' do + should "raise an ArgumentError" do exception = assert_raises ArgumentError do Jekyll::Commands::New.process(@empty_args) end - assert_equal 'You must specify a path.', exception.message + assert_equal "You must specify a path.", exception.message end end end From df01b6825e731a357f7d5886be615a9b67c3c2c3 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 23:25:40 -0500 Subject: [PATCH 0803/4996] Rubocop fixes for test/test_path_sanitization.rb --- .rubocop.yml | 1 - test/test_path_sanitization.rb | 14 +++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index e63fa50bd80..368195531e4 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -77,7 +77,6 @@ AllCops: - test/test_kramdown.rb - test/test_liquid_renderer.rb - test/test_page.rb - - test/test_path_sanitization.rb - test/test_plugin_manager.rb - test/test_rdiscount.rb - test/test_redcarpet.rb diff --git a/test/test_path_sanitization.rb b/test/test_path_sanitization.rb index 148103eacbd..df7ef172d68 100644 --- a/test/test_path_sanitization.rb +++ b/test/test_path_sanitization.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestPathSanitization < JekyllUnitTest context "on Windows with absolute source" do @@ -8,20 +8,24 @@ class TestPathSanitization < JekyllUnitTest allow(Dir).to receive(:pwd).and_return("C:/Users/xmr/Desktop/mpc-hc.org") end should "strip drive name from path" do - assert_equal "C:/Users/xmr/Desktop/mpc-hc.org/_site", Jekyll.sanitized_path(@source, @dest) + assert_equal "C:/Users/xmr/Desktop/mpc-hc.org/_site", + Jekyll.sanitized_path(@source, @dest) end should "strip just the initial drive name" do - assert_equal "/tmp/foobar/jail/..c:/..c:/..c:/etc/passwd", Jekyll.sanitized_path("/tmp/foobar/jail", "..c:/..c:/..c:/etc/passwd") + assert_equal "/tmp/foobar/jail/..c:/..c:/..c:/etc/passwd", + Jekyll.sanitized_path("/tmp/foobar/jail", "..c:/..c:/..c:/etc/passwd") end end should "escape tilde" do assert_equal source_dir("~hi.txt"), Jekyll.sanitized_path(source_dir, "~hi.txt") - assert_equal source_dir("files", "~hi.txt"), Jekyll.sanitized_path(source_dir, "files/../files/~hi.txt") + assert_equal source_dir("files", "~hi.txt"), + Jekyll.sanitized_path(source_dir, "files/../files/~hi.txt") end should "remove path traversals" do - assert_equal source_dir("files", "hi.txt"), Jekyll.sanitized_path(source_dir, "f./../../../../../../files/hi.txt") + assert_equal source_dir("files", "hi.txt"), + Jekyll.sanitized_path(source_dir, "f./../../../../../../files/hi.txt") end end From df7992c62601f5514b13f446799a2ec8afa82481 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 23:31:08 -0500 Subject: [PATCH 0804/4996] Rubocop fixes for test/test_plugin_manager.rb --- .rubocop.yml | 1 - test/test_plugin_manager.rb | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 368195531e4..4fb11302140 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -77,7 +77,6 @@ AllCops: - test/test_kramdown.rb - test/test_liquid_renderer.rb - test/test_page.rb - - test/test_plugin_manager.rb - test/test_rdiscount.rb - test/test_redcarpet.rb - test/test_regenerator.rb diff --git a/test/test_plugin_manager.rb b/test/test_plugin_manager.rb index 9cdb45d88ce..22ad617fad5 100644 --- a/test/test_plugin_manager.rb +++ b/test/test_plugin_manager.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestPluginManager < JekyllUnitTest def with_no_gemfile @@ -10,14 +10,16 @@ def with_no_gemfile def test_requiring_from_bundler with_env("JEKYLL_NO_BUNDLER_REQUIRE", nil) do - assert Jekyll::PluginManager.require_from_bundler, 'require_from_bundler should return true.' - assert ENV["JEKYLL_NO_BUNDLER_REQUIRE"], 'Gemfile plugins were not required.' + assert Jekyll::PluginManager.require_from_bundler, + "require_from_bundler should return true." + assert ENV["JEKYLL_NO_BUNDLER_REQUIRE"], "Gemfile plugins were not required." end end def test_blocking_requiring_from_bundler with_env("JEKYLL_NO_BUNDLER_REQUIRE", "true") do - assert_equal false, Jekyll::PluginManager.require_from_bundler, "Gemfile plugins were required but shouldn't have been" + assert_equal false, Jekyll::PluginManager.require_from_bundler, + "Gemfile plugins were required but shouldn't have been" assert ENV["JEKYLL_NO_BUNDLER_REQUIRE"] end end @@ -25,7 +27,8 @@ def test_blocking_requiring_from_bundler def test_no_gemfile with_env("JEKYLL_NO_BUNDLER_REQUIRE", nil) do with_no_gemfile do - assert_equal false, Jekyll::PluginManager.require_from_bundler, "Gemfile plugins were required but shouldn't have been" + assert_equal false, Jekyll::PluginManager.require_from_bundler, + "Gemfile plugins were required but shouldn't have been" assert_nil ENV["JEKYLL_NO_BUNDLER_REQUIRE"] end end From de5d773a6abde68e451ed4adc7965f2b17cd3fc7 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 23:36:47 -0500 Subject: [PATCH 0805/4996] Rubocop fixes for test/test_rdiscount.rb --- .rubocop.yml | 1 - test/test_rdiscount.rb | 16 +++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 4fb11302140..fcb1726e9ef 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -77,7 +77,6 @@ AllCops: - test/test_kramdown.rb - test/test_liquid_renderer.rb - test/test_page.rb - - test/test_rdiscount.rb - test/test_redcarpet.rb - test/test_regenerator.rb - test/test_related_posts.rb diff --git a/test/test_rdiscount.rb b/test/test_rdiscount.rb index 96446404f18..889f96592d6 100644 --- a/test/test_rdiscount.rb +++ b/test/test_rdiscount.rb @@ -1,7 +1,6 @@ -require 'helper' +require "helper" class TestRdiscount < JekyllUnitTest - context "rdiscount" do setup do if jruby? @@ -11,12 +10,10 @@ class TestRdiscount < JekyllUnitTest end config = { - 'markdown' => 'rdiscount', - 'rdiscount' => { - 'toc_token' => '{:toc}', - 'extensions' => [ - 'smart', 'generate_toc' - ], + "markdown" => "rdiscount", + "rdiscount" => { + "toc_token" => "{:toc}", + "extensions" => %w(smart generate_toc) } } @@ -45,7 +42,8 @@ class TestRdiscount < JekyllUnitTest

    TOC - assert_equal toc.strip, @markdown.convert("# Header 1\n\n## Header 2\n\n{:toc}").strip + assert_equal toc.strip, + @markdown.convert("# Header 1\n\n## Header 2\n\n{:toc}").strip end end end From 6ef54393c2b180fdfaf9842b54fcc7c676c7e33f Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Sun, 15 May 2016 23:46:44 -0500 Subject: [PATCH 0806/4996] Rubocop fixes for test/test_redcarpet.rb --- .rubocop.yml | 1 - test/test_redcarpet.rb | 54 +++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index fcb1726e9ef..ac3c83008eb 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -77,7 +77,6 @@ AllCops: - test/test_kramdown.rb - test/test_liquid_renderer.rb - test/test_page.rb - - test/test_redcarpet.rb - test/test_regenerator.rb - test/test_related_posts.rb - test/test_sass.rb diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb index 528bc8a3ce6..7231cff9d74 100644 --- a/test/test_redcarpet.rb +++ b/test/test_redcarpet.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestRedcarpet < JekyllUnitTest context "redcarpet" do @@ -10,11 +10,9 @@ class TestRedcarpet < JekyllUnitTest end @config = { - 'markdown' => 'redcarpet', - 'redcarpet' => { - 'extensions' => [ - 'smart', 'strikethrough', 'filter_html' - ] + "markdown" => "redcarpet", + "redcarpet" => { + "extensions" => %w(smart strikethrough filter_html) } } @@ -22,7 +20,7 @@ class TestRedcarpet < JekyllUnitTest end should "pass redcarpet options" do - assert_equal "

    Some Header

    ", @markdown.convert('# Some Header #').strip + assert_equal "

    Some Header

    ", @markdown.convert("# Some Header #").strip end should "pass redcarpet SmartyPants options" do @@ -30,58 +28,70 @@ class TestRedcarpet < JekyllUnitTest end should "pass redcarpet extensions" do - assert_equal "

    deleted

    ", @markdown.convert('~~deleted~~').strip + assert_equal "

    deleted

    ", @markdown.convert("~~deleted~~").strip end should "pass redcarpet render options" do - assert_equal "

    bad code not here: i am bad

    ", @markdown.convert('**bad code not here**: ').strip + assert_equal "

    bad code not here: i am bad

    ", + @markdown.convert("**bad code not here**: ").strip end context "with pygments enabled" do setup do - @markdown = Converters::Markdown.new @config.merge({ 'highlighter' => 'pygments' }) + @markdown = Converters::Markdown.new @config.merge( + { "highlighter" => "pygments" } + ) end should "render fenced code blocks with syntax highlighting" do - assert_equal "
    puts "Hello world"\n
    ", @markdown.convert( - <<-EOS + assert_equal "
    puts "Hello world"\n
    ", + @markdown.convert( + <<-EOS ```ruby puts "Hello world" ``` - EOS - ).strip +EOS + ).strip end end context "with rouge enabled" do setup do - @markdown = Converters::Markdown.new @config.merge({ 'highlighter' => 'rouge' }) + @markdown = Converters::Markdown.new @config.merge({ "highlighter" => "rouge" }) end should "render fenced code blocks with syntax highlighting" do - assert_equal "
    puts \"Hello world\"\n
    ", @markdown.convert( - <<-EOS + assert_equal "
    puts \"Hello world\"\n
    ", + @markdown.convert( + <<-EOS ```ruby puts "Hello world" ``` EOS - ).strip + ).strip end end context "without any highlighter" do setup do - @markdown = Converters::Markdown.new @config.merge({ 'highlighter' => nil }) + @markdown = Converters::Markdown.new @config.merge({ "highlighter" => nil }) end should "render fenced code blocks without syntax highlighting" do - assert_equal "
    puts "Hello world"\n
    ", @markdown.convert( - <<-EOS + assert_equal "
    puts "Hello world"\n
    "\ + "
    ", + @markdown.convert( + <<-EOS ```ruby puts "Hello world" ``` EOS - ).strip + ).strip end end end From bc16d13d7926ad92a911763ffe825b2f71b630a5 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Mon, 16 May 2016 19:31:43 -0500 Subject: [PATCH 0807/4996] Shortening messages to keep things down to one line where possible --- test/test_cleaner.rb | 3 +-- test/test_coffeescript.rb | 3 +-- test/test_collections.rb | 9 +++------ 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/test/test_cleaner.rb b/test/test_cleaner.rb index 5e421c07672..d3072e54977 100644 --- a/test/test_cleaner.rb +++ b/test/test_cleaner.rb @@ -37,8 +37,7 @@ class TestCleaner < JekyllUnitTest end end - context "not-nested directory in keep_files and similary named directory not "\ - "in keep_files" do + context "non-nested directory & similarly-named directory *not* in keep_files" do setup do clear_dest diff --git a/test/test_coffeescript.rb b/test/test_coffeescript.rb index 95c06db8983..189ce05df3e 100644 --- a/test/test_coffeescript.rb +++ b/test/test_coffeescript.rb @@ -37,8 +37,7 @@ class TestCoffeeScript < JekyllUnitTest end should "write a JS file in place" do - assert_exist @test_coffeescript_file, "Can't find the converted CoffeeScript file "\ - "in the dest_dir." + assert_exist @test_coffeescript_file end should "produce JS" do diff --git a/test/test_collections.rb b/test/test_collections.rb index 4c0b8379aca..795c0d8b0f3 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -113,8 +113,7 @@ class TestCollections < JekyllUnitTest @collection = @site.collections["methods"] end - should "create a Hash on Site with the label mapped to the instance of the "\ - "Collection" do + should "create a Hash mapping label to Collection instance" do assert @site.collections.is_a?(Hash) refute_nil @site.collections["methods"] assert @site.collections["methods"].is_a? Jekyll::Collection @@ -137,8 +136,7 @@ class TestCollections < JekyllUnitTest end end - should "not include files which start with an underscore in the base collection "\ - "directory" do + should "not include files from base dir which start with an underscore" do refute_includes @collection.filtered_entries, "_do_not_read_me.md" end @@ -187,8 +185,7 @@ class TestCollections < JekyllUnitTest refute_includes @collection.filtered_entries, "/um_hi.md" end - should "include the symlinked file in the list of docs as it resolves to inside "\ - "site.source" do + should "include the symlinked file from site.source in the list of docs" do assert_includes @collection.docs.map(&:relative_path), "_methods/um_hi.md" end end From 211c16003e0b7064deabd659b3e6ac4c2ba12e68 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Mon, 16 May 2016 19:39:43 -0500 Subject: [PATCH 0808/4996] test/test_exerpt.rb variable assignment cleanup --- test/test_excerpt.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index 2314431380e..8b29f6fd10a 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -9,8 +9,9 @@ def setup_post(file) end def do_render(document) - @site.layouts = { "default" => Layout.new(@site, source_dir("_layouts"), - "simple.html") } + @site.layouts = { + "default" => Layout.new(@site, source_dir("_layouts"), "simple.html") + } document.output = Jekyll::Renderer.new(@site, document, @site.site_payload).run end From 98eef8af95c3d1ad8566215cf2a31fa5c8ff7792 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Mon, 16 May 2016 19:48:04 -0500 Subject: [PATCH 0809/4996] Aligning hashes per 2caff75 --- test/test_commands_serve.rb | 6 +++--- test/test_doctor_command.rb | 4 ++-- test/test_excerpt.rb | 2 +- test/test_front_matter_defaults.rb | 28 ++++++++++++++-------------- test/test_generated_site.rb | 8 ++++---- test/test_layout_reader.rb | 2 +- test/test_rdiscount.rb | 4 ++-- test/test_redcarpet.rb | 2 +- 8 files changed, 28 insertions(+), 28 deletions(-) diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index b02232b9fa6..7ffd0a578cd 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -105,10 +105,10 @@ def custom_opts(what) allow(File).to receive(:read).and_return("foo") result = custom_opts({ - "ssl_cert" => "foo", - "source" => "bar", + "ssl_cert" => "foo", + "source" => "bar", "enable_ssl" => true, - "ssl_key" => "bar" + "ssl_key" => "bar" }) assert result[:SSLEnable] diff --git a/test/test_doctor_command.rb b/test/test_doctor_command.rb index aa6cf12507d..7280b2871ee 100644 --- a/test/test_doctor_command.rb +++ b/test/test_doctor_command.rb @@ -9,7 +9,7 @@ class TestDoctorCommand < JekyllUnitTest should "return success on a valid site/page" do @site = Site.new(Jekyll.configuration({ - "source" => File.join(source_dir, "/_urls_differ_by_case_valid"), + "source" => File.join(source_dir, "/_urls_differ_by_case_valid"), "destination" => dest_dir })) @site.process @@ -22,7 +22,7 @@ class TestDoctorCommand < JekyllUnitTest should "return warning for pages only differing by case" do @site = Site.new(Jekyll.configuration({ - "source" => File.join(source_dir, "/_urls_differ_by_case_invalid"), + "source" => File.join(source_dir, "/_urls_differ_by_case_invalid"), "destination" => dest_dir })) @site.process diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index 8b29f6fd10a..e91fb7c06a1 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -3,7 +3,7 @@ class TestExcerpt < JekyllUnitTest def setup_post(file) Document.new(@site.in_source_dir(File.join("_posts", file)), { - :site => @site, + :site => @site, :collection => @site.posts }).tap(&:read) end diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index 4be4ce2f1ff..f1b55ac164c 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -6,8 +6,8 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "defaults" => [{ - "scope" => { + "defaults" => [{ + "scope" => { "path" => "contacts", "type" => "page" }, @@ -32,8 +32,8 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "defaults" => [{ - "scope" => { + "defaults" => [{ + "scope" => { "path" => "index.html" }, "values" => { @@ -58,8 +58,8 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "defaults" => [{ - "scope" => { + "defaults" => [{ + "scope" => { "path" => "win" }, "values" => { @@ -83,8 +83,8 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "defaults" => [{ - "scope" => { + "defaults" => [{ + "scope" => { "type" => "page" }, "values" => { @@ -109,8 +109,8 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "defaults" => [{ - "scope" => { + "defaults" => [{ + "scope" => { "type" => "pages" }, "values" => { @@ -135,8 +135,8 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "defaults" => [{ - "scope" => { + "defaults" => [{ + "scope" => { }, "values" => { "key" => "val" @@ -159,7 +159,7 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "defaults" => [{ + "defaults" => [{ "values" => { "key" => "val" } @@ -181,7 +181,7 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "defaults" => [{ + "defaults" => [{ "values" => { "date" => "2015-01-01 00:00:01" } diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 463748625dc..0a24172c468 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -4,7 +4,7 @@ class TestGeneratedSite < JekyllUnitTest context "generated sites" do setup do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, + config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, "destination" => dest_dir }) @site = fixture_site(config) @@ -65,7 +65,7 @@ class TestGeneratedSite < JekyllUnitTest context "generating limited posts" do setup do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, + config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, "destination" => dest_dir, "limit_posts" => 5 }) @site = fixture_site(config) @@ -81,7 +81,7 @@ class TestGeneratedSite < JekyllUnitTest assert_raises ArgumentError do clear_dest config = Jekyll::Configuration::DEFAULTS.merge({ - "source" => source_dir, + "source" => source_dir, "destination" => dest_dir, "limit_posts" => -1 }) @@ -92,7 +92,7 @@ class TestGeneratedSite < JekyllUnitTest should "acceptable limit post is 0" do clear_dest config = Jekyll::Configuration::DEFAULTS.merge({ - "source" => source_dir, + "source" => source_dir, "destination" => dest_dir, "limit_posts" => 0 }) diff --git a/test/test_layout_reader.rb b/test/test_layout_reader.rb index dabe29c0c7e..133cd6f219c 100644 --- a/test/test_layout_reader.rb +++ b/test/test_layout_reader.rb @@ -3,7 +3,7 @@ class TestLayoutReader < JekyllUnitTest context "reading layouts" do setup do - config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, + config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, "destination" => dest_dir }) @site = fixture_site(config) end diff --git a/test/test_rdiscount.rb b/test/test_rdiscount.rb index 889f96592d6..9390aaed080 100644 --- a/test/test_rdiscount.rb +++ b/test/test_rdiscount.rb @@ -10,9 +10,9 @@ class TestRdiscount < JekyllUnitTest end config = { - "markdown" => "rdiscount", + "markdown" => "rdiscount", "rdiscount" => { - "toc_token" => "{:toc}", + "toc_token" => "{:toc}", "extensions" => %w(smart generate_toc) } } diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb index 7231cff9d74..140fabbea9b 100644 --- a/test/test_redcarpet.rb +++ b/test/test_redcarpet.rb @@ -10,7 +10,7 @@ class TestRedcarpet < JekyllUnitTest end @config = { - "markdown" => "redcarpet", + "markdown" => "redcarpet", "redcarpet" => { "extensions" => %w(smart strikethrough filter_html) } From b006810f172a94e9bd5aa9cad8440e5cd1bacac1 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Mon, 16 May 2016 19:59:13 -0500 Subject: [PATCH 0810/4996] Moving .with down one line 4x times --- test/test_log_adapter.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/test_log_adapter.rb b/test/test_log_adapter.rb index f34be99df6b..7e0873ca33f 100644 --- a/test/test_log_adapter.rb +++ b/test/test_log_adapter.rb @@ -61,8 +61,8 @@ def error(*); end should "call #debug on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) - allow(writer).to receive(:debug).with("topic ".rjust(20) + - "log message").and_return(true) + allow(writer).to receive(:debug) + .with("topic ".rjust(20) + "log message").and_return(true) assert logger.debug("topic", "log message") end end @@ -71,8 +71,8 @@ def error(*); end should "call #info on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) - allow(writer).to receive(:info).with("topic ".rjust(20) + - "log message").and_return(true) + allow(writer).to receive(:info) + .with("topic ".rjust(20) + "log message").and_return(true) assert logger.info("topic", "log message") end end @@ -81,8 +81,8 @@ def error(*); end should "call #warn on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) - allow(writer).to receive(:warn).with("topic ".rjust(20) + - "log message").and_return(true) + allow(writer).to receive(:warn) + .with("topic ".rjust(20) + "log message").and_return(true) assert logger.warn("topic", "log message") end end @@ -91,8 +91,8 @@ def error(*); end should "call #error on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) - allow(writer).to receive(:error).with("topic ".rjust(20) + - "log message").and_return(true) + allow(writer).to receive(:error) + .with("topic ".rjust(20) + "log message").and_return(true) assert logger.error("topic", "log message") end end From df585aa5c61c5e9552e32e473617be19474293e9 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Mon, 16 May 2016 20:13:50 -0500 Subject: [PATCH 0811/4996] Moving expected output into variable to make asserts more readable --- test/test_excerpt.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index e91fb7c06a1..6e4b8cbf01e 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -92,8 +92,9 @@ def do_render(document) context "#content" do context "before render" do should "be the first paragraph of the page" do - assert_equal "First paragraph with [link ref][link].\n\n[link]:"\ - " http://www.jekyllrb.com/", @excerpt.content + expected = "First paragraph with [link ref][link].\n\n[link]: "\ + "http://www.jekyllrb.com/" + assert_equal expected, @excerpt.content end should "contain any refs at the bottom of the page" do @@ -109,8 +110,9 @@ def do_render(document) end should "be the first paragraph of the page" do - assert_equal "

    First paragraph with "\ - "link ref.

    \n\n", @extracted_excerpt.output + expected = "

    First paragraph with link "\ + "ref.

    \n\n" + assert_equal expected, @extracted_excerpt.output end should "link properly" do From ce9a8cb0f2a1dbfd4a416ad12f4c3f104cdb7e11 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Mon, 16 May 2016 20:42:59 -0500 Subject: [PATCH 0812/4996] Moving url to local var for better readability --- test/test_excerpt.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index 6e4b8cbf01e..060323feb8b 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -79,8 +79,8 @@ def do_render(document) context "#to_liquid" do should "contain the proper page data to mimick the post liquid" do assert_equal "Post Excerpt with Layout", @excerpt.to_liquid["title"] - assert_equal "/bar/baz/z_category/mixedcase/2013/07/22/"\ - "post-excerpt-with-layout.html", @excerpt.to_liquid["url"] + url = "/bar/baz/z_category/mixedcase/2013/07/22/post-excerpt-with-layout.html" + assert_equal url, @excerpt.to_liquid["url"] assert_equal Time.parse("2013-07-22"), @excerpt.to_liquid["date"] assert_equal %w(bar baz z_category MixedCase), @excerpt.to_liquid["categories"] assert_equal %w(first second third jekyllrb.com), @excerpt.to_liquid["tags"] From 66e5453c35ee6f8e1f96d4a431f401d45f845e01 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 May 2016 08:00:00 -0700 Subject: [PATCH 0813/4996] Update history to reflect merge of #4902 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f4948c57503..f1258a87ab3 100644 --- a/History.markdown +++ b/History.markdown @@ -57,6 +57,7 @@ * Flesh out the issue template to be much more detailed (#4849) * Fixing rubocop offenses in lib/jekyll/cleaner.rb (#4892) * Update `jekyll/commands*` to pass rubocop rules (#4888) + * Clean up many test files to pass Rubocop rules (#4902) ### Site Enhancements From eab2b438c958166bf034cfbf78fe17f74f3ef7d5 Mon Sep 17 00:00:00 2001 From: EricH Date: Tue, 17 May 2016 13:54:42 -0400 Subject: [PATCH 0814/4996] Replaced markdown ` with inside HTML block --- site/_docs/pagination.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/pagination.md b/site/_docs/pagination.md index 35361b2bf80..1ef2d496f15 100644 --- a/site/_docs/pagination.md +++ b/site/_docs/pagination.md @@ -133,7 +133,7 @@ attributes:
    Pagination does not support tags or categories

    Pagination pages through every post in the posts - variable unless a post has `hidden: true` in its YAML Front Matter. + variable unless a post has hidden: true in its YAML Front Matter. It does not currently allow paging over groups of posts linked by a common tag or category. It cannot include any collection of documents because it is restricted to posts.

    From 952947c65efd9ca5d4636edd8b26f5d7ac2bfdbf Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 May 2016 11:07:42 -0700 Subject: [PATCH 0815/4996] Update history to reflect merge of #4903 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f1258a87ab3..7a43096c83f 100644 --- a/History.markdown +++ b/History.markdown @@ -99,6 +99,7 @@ * Add Jekyll Tips and the Cheatsheet to the list of resources (#4887) * Removed extra `

    ` from `site/_docs/permalinks.md` (#4890) * Add pubstorm deployment instructions to docs (#4881) + * Corrected pagination docs for hidden: true feature (#4903) ## 3.1.3 / 2016-04-18 From eb14b8817546b4982fc8ed7e6a45d190f070ebec Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 17:16:52 -0700 Subject: [PATCH 0816/4996] Port forward the release information for v3.1.4 --- History.markdown | 11 ++++++++ lib/jekyll/version.rb | 2 +- site/_docs/history.md | 14 ++++++++++ .../2016-05-18-jekyll-3-1-4-released.markdown | 26 +++++++++++++++++++ site/latest_version.txt | 2 +- 5 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 site/_posts/2016-05-18-jekyll-3-1-4-released.markdown diff --git a/History.markdown b/History.markdown index 7a43096c83f..90ee65c0f50 100644 --- a/History.markdown +++ b/History.markdown @@ -101,6 +101,17 @@ * Add pubstorm deployment instructions to docs (#4881) * Corrected pagination docs for hidden: true feature (#4903) +## 3.1.4 / 2016-05-18 + +### Bug Fixes + + * Add `ExcerptDrop` and remove excerpt's ability to refer to itself in Liquid (#4907) + * Configuration permalink fix where `collections.posts.permalink` inherits properly from `permalink` only when it doesn't exist (#4910) + * Add `Configuration.from` to make it easier to build configs from just a hash + * Sorting `site.collections` in Liquid by label (#4910) + * Fix bug where `layout` in Liquid would inherit from previously-rendered layouts' metadatas (#4909) + * Fix bug where `layout` in Liquid would override in the wrong direction (more-specific layouts' data were overwritten by their parent layouts' data; this has now been reversed) (#4909) + ## 3.1.3 / 2016-04-18 * Fix defaults for Documents to lookup defaults based on `relative_path` instead of `url` (#4807) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index ba9ee23828d..61f613e6fb4 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.2' + VERSION = '3.1.4' end diff --git a/site/_docs/history.md b/site/_docs/history.md index 017b6d39f56..f95224aba04 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -5,6 +5,20 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.1.4 / 2016-05-18 +{: #v3-1-4} + +### Bug Fixes +{: #bug-fixes-v3-1-4} + +- Add `ExcerptDrop` and remove excerpt's ability to refer to itself in Liquid ([#4907]({{ site.repository }}/issues/4907)) +- Configuration permalink fix where `collections.posts.permalink` inherits properly from `permalink` only when it doesn't exist ([#4910]({{ site.repository }}/issues/4910)) +- Add `Configuration.from` to make it easier to build configs from just a hash +- Sorting `site.collections` in Liquid by label ([#4910]({{ site.repository }}/issues/4910)) +- Fix bug where `layout` in Liquid would inherit from previously-rendered layouts' metadatas ([#4909]({{ site.repository }}/issues/4909)) +- Fix bug where `layout` in Liquid would override in the wrong direction (more-specific layouts' data were overwritten by their parent layouts' data; this has now been reversed) ([#4909]({{ site.repository }}/issues/4909)) + + ## 3.1.3 / 2016-04-18 {: #v3-1-3} diff --git a/site/_posts/2016-05-18-jekyll-3-1-4-released.markdown b/site/_posts/2016-05-18-jekyll-3-1-4-released.markdown new file mode 100644 index 00000000000..161d4746346 --- /dev/null +++ b/site/_posts/2016-05-18-jekyll-3-1-4-released.markdown @@ -0,0 +1,26 @@ +--- +layout: news_item +title: 'Jekyll 3.1.4 "Stability Sam" Released' +date: 2016-05-18 16:50:37 -0700 +author: parkr +version: 3.1.4 +categories: [release] +--- + +Hey Jekyllites! + +Today, we released v3.1.4 in an effort to bring more stability to the v3.1.x series. This bugfix release consists of: + +* A fix for `layout` in Liquid where values would carry over from one document to the next +* A fix for `layout` in Liquid where a parent layout (e.g. `default` or `base`) would overwrite the metadata of the child layout (e.g. `post` or `special`). +* A fix where `page.excerpt` referencing its excerpt would cause an infinite loop of recursive horror. +* We added `Configuration.from` and the great permalink fix from [v3.0.4](/news/2016/04/19/jekyll-3-0-4-released/) to the v3.1.x series +* `site.collections` in Liquid is now sorted alphabetically by label, so `docs` shows up before `posts` reliably. + +The fixes for `layout` may not be seamless for everyone, but we believe they will be the "right thing to do" going forward. + +We are alwawys striving to make Jekyll more straight-forward to use. Please do open an issue if you believe an aspect of Jekyll's user experience isn't up to par. + +For a full history of our changes, [see the changelog](/docs/history/#v3-1-4). + +As always, Happy Jekylling! diff --git a/site/latest_version.txt b/site/latest_version.txt index ef538c28109..0aec50e6ede 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -3.1.2 +3.1.4 From 5949b4a5bb34cc8140d2c696a77d7778ea0f3679 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 21:38:53 -0700 Subject: [PATCH 0817/4996] Add release information for v3.1.5 --- History.markdown | 6 ++++++ lib/jekyll/version.rb | 2 +- site/_docs/history.md | 9 +++++++++ .../2016-05-18-jekyll-3-1-5-released.markdown | 17 +++++++++++++++++ site/latest_version.txt | 2 +- 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 site/_posts/2016-05-18-jekyll-3-1-5-released.markdown diff --git a/History.markdown b/History.markdown index 90ee65c0f50..10bfc158808 100644 --- a/History.markdown +++ b/History.markdown @@ -101,6 +101,12 @@ * Add pubstorm deployment instructions to docs (#4881) * Corrected pagination docs for hidden: true feature (#4903) +## 3.1.5 / 2016-05-18 + +### Bug Fixes + + * Sort the results of the `require_all` glob (affects Linux only). (#4912) + ## 3.1.4 / 2016-05-18 ### Bug Fixes diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 61f613e6fb4..9f900f154ae 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.4' + VERSION = '3.1.5' end diff --git a/site/_docs/history.md b/site/_docs/history.md index f95224aba04..0d079a4b808 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -5,6 +5,15 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.1.5 / 2016-05-18 +{: #v3-1-5} + +### Bug Fixes +{: #bug-fixes-v3-1-5} + +- Sort the results of the `require_all` glob (affects Linux only). ([#4912]({{ site.repository }}/issues/4912)) + + ## 3.1.4 / 2016-05-18 {: #v3-1-4} diff --git a/site/_posts/2016-05-18-jekyll-3-1-5-released.markdown b/site/_posts/2016-05-18-jekyll-3-1-5-released.markdown new file mode 100644 index 00000000000..c341b37b1a6 --- /dev/null +++ b/site/_posts/2016-05-18-jekyll-3-1-5-released.markdown @@ -0,0 +1,17 @@ +--- +layout: news_item +title: 'Jekyll 3.1.5 Released' +date: 2016-05-18 21:35:27 -0700 +author: parkr +version: 3.1.5 +categories: [release] +--- + +There's always at least one bug, right? :) + +Hot on the trails of [v3.1.4](/news/2016/05/18/jekyll-3-1-4-released/), we +bring you v3.1.5! It fixes one bug around requiring the `ExcerptDrop`, +which only affects Linux. For the gory details, see [the pull +request for the fix](https://github.com/jekyll/jekyll/pull/4912). + +Happy Jekylling! diff --git a/site/latest_version.txt b/site/latest_version.txt index 0aec50e6ede..3ad0595adcc 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -3.1.4 +3.1.5 From 1d81d2087e462353b8d7371c56016a3a7df133aa Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 12:54:04 -0700 Subject: [PATCH 0818/4996] Add info about 3.1.6 to master. --- History.markdown | 6 ++++++ lib/jekyll/version.rb | 2 +- site/_docs/history.md | 9 +++++++++ .../2016-05-19-jekyll-3-1-6-released.markdown | 19 +++++++++++++++++++ site/latest_version.txt | 2 +- 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 site/_posts/2016-05-19-jekyll-3-1-6-released.markdown diff --git a/History.markdown b/History.markdown index 10bfc158808..29f76125e10 100644 --- a/History.markdown +++ b/History.markdown @@ -101,6 +101,12 @@ * Add pubstorm deployment instructions to docs (#4881) * Corrected pagination docs for hidden: true feature (#4903) +## 3.1.6 / 2016-05-19 + +### Bug Fixes + + * Add ability to `jsonify` Drops such that, e.g. `site | jsonify`, works. (#4914) + ## 3.1.5 / 2016-05-18 ### Bug Fixes diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 9f900f154ae..65a1431d673 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.5' + VERSION = '3.1.6' end diff --git a/site/_docs/history.md b/site/_docs/history.md index 0d079a4b808..f02427c8ab5 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -5,6 +5,15 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.1.6 / 2016-05-19 +{: #v3-1-6} + +### Bug Fixes +{: #bug-fixes-v3-1-6} + +- Add ability to `jsonify` Drops such that, e.g. `site | jsonify`, works. ([#4914]({{ site.repository }}/issues/4914)) + + ## 3.1.5 / 2016-05-18 {: #v3-1-5} diff --git a/site/_posts/2016-05-19-jekyll-3-1-6-released.markdown b/site/_posts/2016-05-19-jekyll-3-1-6-released.markdown new file mode 100644 index 00000000000..45e7312f1fe --- /dev/null +++ b/site/_posts/2016-05-19-jekyll-3-1-6-released.markdown @@ -0,0 +1,19 @@ +--- +layout: news_item +title: 'Jekyll 3.1.6 Released' +date: 2016-05-19 12:48:14 -0700 +author: parkr +version: 3.1.6 +categories: [release] +--- + +Upon releasing 3.1.5 and kicking the tires, we noticed a glaring bug: our +beloved `jsonify` filter doesn't work! With that, our work was cut out for +us and we decided a 3.1.6 was necessary. This release restores sanity to +our object-to-JSON generation in Liquid and we hope you enjoy. + +For the gory details, see [the pull +request](https://github.com/jekyll/jekyll/pull/4914) or [the +changelog](/docs/history/#v3-1-6). + +Happy Jekylling! diff --git a/site/latest_version.txt b/site/latest_version.txt index 3ad0595adcc..9cec7165ab0 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -3.1.5 +3.1.6 From 3885057e9e4f8cdf1df40aaa55983e45e9a0110a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 13:16:32 -0700 Subject: [PATCH 0819/4996] Fix rubocop offense. --- lib/jekyll/commands/new_theme.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/commands/new_theme.rb b/lib/jekyll/commands/new_theme.rb index e8919ae3816..08eb4291a44 100644 --- a/lib/jekyll/commands/new_theme.rb +++ b/lib/jekyll/commands/new_theme.rb @@ -14,7 +14,9 @@ def init_with_program(prog) end def process(args) - raise Jekyll::Errors::InvalidThemeName, "You must specify a theme name." if args.empty? + if !args || args.empty? + raise Jekyll::Errors::InvalidThemeName, "You must specify a theme name." + end new_theme_name = args.join("_") theme = Jekyll::ThemeBuilder.new(new_theme_name) From 20110571ef8a3d15d94ac19a47f474bc59f38bb4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 14:36:01 -0700 Subject: [PATCH 0820/4996] Add a Rakefile to do releases as well as adding an example website. --- lib/jekyll/theme_builder.rb | 12 +++- lib/theme_template/README.md.erb | 6 ++ lib/theme_template/Rakefile.erb | 74 ++++++++++++++++++++++ lib/theme_template/example/_config.yml.erb | 1 + lib/theme_template/example/_post.md | 13 ++++ lib/theme_template/example/index.html | 14 ++++ lib/theme_template/example/style.scss | 7 ++ lib/theme_template/theme.gemspec.erb | 4 +- 8 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 lib/theme_template/Rakefile.erb create mode 100644 lib/theme_template/example/_config.yml.erb create mode 100644 lib/theme_template/example/_post.md create mode 100644 lib/theme_template/example/index.html create mode 100644 lib/theme_template/example/style.scss diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index cde4eaff31e..413aa772b76 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -1,6 +1,6 @@ class Jekyll::ThemeBuilder SCAFFOLD_DIRECTORIES = %w( - _layouts _includes _sass + _layouts _includes _sass example example/_posts ).freeze attr_reader :name, :path @@ -14,6 +14,7 @@ def create! create_directories create_gemspec create_accessories + create_example_site initialize_git_repo end @@ -62,11 +63,18 @@ def create_gemspec end def create_accessories - %w(README.md CODE_OF_CONDUCT.md LICENSE.txt).each do |filename| + %w(README.md Rakefile CODE_OF_CONDUCT.md LICENSE.txt).each do |filename| write_file(filename, template(filename)) end end + def create_example_site + %w(example/_config.yml example/index.html example/style.scss).each do |filename| + write_file(filename, template(filename)) + end + write_file("example/_posts/#{Time.now.strftime("%Y-%m-%d")}-my-example-post.md", template("example/_post.md")) + end + def initialize_git_repo Jekyll.logger.info "initialize", path.join(".git").to_s Dir.chdir(path.to_s) { `git init` } diff --git a/lib/theme_template/README.md.erb b/lib/theme_template/README.md.erb index 75909a4946e..bcf0d9a0329 100644 --- a/lib/theme_template/README.md.erb +++ b/lib/theme_template/README.md.erb @@ -34,6 +34,12 @@ TODO: Write usage instructions here. Describe your available layouts, includes, Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/hello. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. +## Development + +To set up your environment to develop this theme, run `bundle install`. + +To test your theme, run `bundle exec rake preview` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme and the contents of the `example/` directory. As you make modifications to your theme and to the example site, your site will regenerate and you should see the changes in the browser after a refresh. + ## License The theme is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/lib/theme_template/Rakefile.erb b/lib/theme_template/Rakefile.erb new file mode 100644 index 00000000000..a3eac316966 --- /dev/null +++ b/lib/theme_template/Rakefile.erb @@ -0,0 +1,74 @@ +require "bundler/gem_tasks" +require "jekyll" +require "listen" + +def listen_ignore_paths(base, options) + [ + /_config\.ya?ml/, + /_site/, + /\.jekyll-metadata/ + ] +end + +def listen_handler(base, options) + site = Jekyll::Site.new(options) + Jekyll::Command.process_site(site) + proc do |modified, added, removed| + t = Time.now + c = modified + added + removed + n = c.length + relative_paths = c.map{ |p| Pathname.new(p).relative_path_from(base).to_s } + print Jekyll.logger.message("Regenerating:", "#{relative_paths.join(", ")} changed... ") + begin + Jekyll::Command.process_site(site) + puts "regenerated in #{Time.now - t} seconds." + rescue => e + puts "error:" + Jekyll.logger.warn "Error:", e.message + Jekyll.logger.warn "Error:", "Run jekyll build --trace for more information." + end + end +end + +task :preview do + base = Pathname.new('.').expand_path + options = { + "source" => base.join('example').to_s, + "destination" => base.join('example/_site').to_s, + "force_polling" => false, + "serving" => true, + "theme" => <%= theme_name.inspect %> + } + + options = Jekyll.configuration(options) + + ENV["LISTEN_GEM_DEBUGGING"] = "1" + listener = Listen.to( + base.join("_includes"), + base.join("_layouts"), + base.join("_sass"), + options["source"], + :ignore => listen_ignore_paths(base, options), + :force_polling => options['force_polling'], + &(listen_handler(base, options)) + ) + + begin + listener.start + Jekyll.logger.info "Auto-regeneration:", "enabled for '#{options["source"]}'" + + unless options['serving'] + trap("INT") do + listener.stop + puts " Halting auto-regeneration." + exit 0 + end + + loop { sleep 1000 } + end + rescue ThreadError + # You pressed Ctrl-C, oh my! + end + + Jekyll::Commands::Serve.process(options) +end diff --git a/lib/theme_template/example/_config.yml.erb b/lib/theme_template/example/_config.yml.erb new file mode 100644 index 00000000000..82e8d42df7b --- /dev/null +++ b/lib/theme_template/example/_config.yml.erb @@ -0,0 +1 @@ +theme: <%= theme_name %> diff --git a/lib/theme_template/example/_post.md b/lib/theme_template/example/_post.md new file mode 100644 index 00000000000..cf40b7f0dea --- /dev/null +++ b/lib/theme_template/example/_post.md @@ -0,0 +1,13 @@ +--- +# Specify a layout from your theme! +# This will be the layout users specify for their posts. +--- + +Eos eu docendi tractatos sapientem, brute option menandri in vix, quando vivendo accommodare te ius. Nec melius fastidii constituam id, viderer theophrastus ad sit, hinc semper periculis cum id. Noluisse postulant assentior est in, no choro sadipscing repudiandae vix. Vis in euismod delenit dignissim. Ex quod nostrum sit, suas decore animal id ius, nobis solet detracto quo te. + +{% comment %} +Might you have an include in your theme? Why not try it here! +{% include my-themes-great-include.html %} +{% endcomment %} + +No laudem altera adolescens has, volumus lucilius eum no. Eam ei nulla audiam efficiantur. Suas affert per no, ei tale nibh sea. Sea ne magna harum, in denique scriptorem sea, cetero alienum tibique ei eos. Labores persequeris referrentur eos ei. diff --git a/lib/theme_template/example/index.html b/lib/theme_template/example/index.html new file mode 100644 index 00000000000..858e5a11c23 --- /dev/null +++ b/lib/theme_template/example/index.html @@ -0,0 +1,14 @@ +--- +# Specify a layout from your theme! +--- + +Lorem ipsum dolor sit amet, quo id prima corrumpit pertinacia, id ius dolor dolores, an veri pertinax explicari mea. Agam solum et qui, his id ludus graeco adipiscing. Duis theophrastus nam in, at his vidisse atomorum. Tantas gloriatur scripserit ne eos. Est wisi tempor habemus at, ei graeco dissentiet eos. Ne usu aliquip sanctus conceptam, te vis ignota animal, modus latine contentiones ius te. + +{% for post in site.posts %} +

    {{ post.title }}

    +
    {{ post.excerpt }}
    +{% endfor %} + +Te falli veritus sea, at molestiae scribentur deterruisset vix, et mea zril phaedrum vulputate. No cum dicit consulatu. Ut has nostro noluisse expetendis, te pro quaeque disputando, eu sed summo omnes. Eos at tale aperiam, usu cu propriae quaestio constituto, sed aperiam erroribus temporibus an. + +Quo eu liber mediocritatem, vix an delectus eleifend, iuvaret suscipit ei vel. Partem invenire per an, mea postulant dissentias eu, ius tantas audire nominavi eu. Dicunt tritani veritus ex vis, mei in case sententiae. At exerci democritum nam, cu lobortis iracundia mei. Alia eligendi consectetuer eu sed, paulo docendi noluisse sit ex. diff --git a/lib/theme_template/example/style.scss b/lib/theme_template/example/style.scss new file mode 100644 index 00000000000..7388f52b367 --- /dev/null +++ b/lib/theme_template/example/style.scss @@ -0,0 +1,7 @@ +--- +--- + +// Here, you can test out the Sass/SCSS that you include in your theme. +// Simply `@import` the necessary file(s) to get the proper styles on the site. +// E.g.: +// @import "a-file-from-my-theme"; diff --git a/lib/theme_template/theme.gemspec.erb b/lib/theme_template/theme.gemspec.erb index 507a7c52a85..8a0b97a93b1 100644 --- a/lib/theme_template/theme.gemspec.erb +++ b/lib/theme_template/theme.gemspec.erb @@ -11,11 +11,13 @@ Gem::Specification.new do |spec| spec.homepage = "TODO: Put your gem's website or public repo URL here." spec.license = "MIT" - spec.metadata["jekyll"] = { "theme" => true } + spec.metadata["plugin_type"] = "theme" spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(exe|<%= theme_directories.join("|") %>)/}) } spec.bindir = "exe" spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.add_development_dependency "jekyll", "~> <%= jekyll_pessimistic_version %>" + spec.add_development_dependency "bundler", "~> 1.12" + spec.add_development_dependency "rake", "~> 10.0" end From 12deccc51379df1c1cc33a7839078c345ff509e9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 14:39:55 -0700 Subject: [PATCH 0821/4996] Only spec.summary is needed... --- features/theme.feature | 5 +++++ lib/theme_template/theme.gemspec.erb | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/features/theme.feature b/features/theme.feature index 40877f849ee..ae18d3a6e60 100644 --- a/features/theme.feature +++ b/features/theme.feature @@ -3,6 +3,11 @@ Feature: Writing themes I want to be able to make a gemified theme In order to share my awesome style skillz with other Jekyllites + Scenario: Generating a new theme scaffold + When I run jekyll new-theme my-cool-theme + Then I should get a zero exit status + And the my-cool-theme directory should exist + Scenario: A theme with SCSS Given I have a configuration file with "theme" set to "test-theme" And I have a css directory diff --git a/lib/theme_template/theme.gemspec.erb b/lib/theme_template/theme.gemspec.erb index 8a0b97a93b1..0bd7c365732 100644 --- a/lib/theme_template/theme.gemspec.erb +++ b/lib/theme_template/theme.gemspec.erb @@ -7,7 +7,6 @@ Gem::Specification.new do |spec| spec.email = [<%= user_email.inspect %>] spec.summary = %q{TODO: Write a short summary, because Rubygems requires one.} - spec.description = %q{TODO: Write a longer description or delete this line.} spec.homepage = "TODO: Put your gem's website or public repo URL here." spec.license = "MIT" From ca0b1f7ea691012234a642d8f90e7617f21f7ffe Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 14:44:00 -0700 Subject: [PATCH 0822/4996] Add note about {{ layout }} to site. --- site/_docs/variables.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/site/_docs/variables.md b/site/_docs/variables.md index 60323886a9a..f068aeb66f9 100644 --- a/site/_docs/variables.md +++ b/site/_docs/variables.md @@ -40,6 +40,16 @@ following is a reference of the available data.

    + +

    layout

    +

    + + Layout specific information + the YAML front + matter. Custom variables set via the YAML Front Matter in + layouts will be available here. + +

    +

    content

    @@ -326,6 +336,14 @@ following is a reference of the available data. page.custom_css.

    +

    + + If you specify front matter in a layout, access that via page + For example, if you specify class: full_page + in a page’s front matter, that value will be available as + layout.class in the layout and its parents. + +

    ## Paginator From f2d08cf1381044831411784b9e770d3574423baa Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 17:15:33 -0700 Subject: [PATCH 0823/4996] Correct variable reference. --- site/_docs/variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/variables.md b/site/_docs/variables.md index f068aeb66f9..f3ead4c70c1 100644 --- a/site/_docs/variables.md +++ b/site/_docs/variables.md @@ -338,7 +338,7 @@ following is a reference of the available data.

    - If you specify front matter in a layout, access that via page + If you specify front matter in a layout, access that via layout. For example, if you specify class: full_page in a page’s front matter, that value will be available as layout.class in the layout and its parents. From f7714add1506b06a1352b17b2dedc415ea87911a Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 19 May 2016 19:59:22 -0700 Subject: [PATCH 0824/4996] Add normalize_whitepace filter --- lib/jekyll/filters.rb | 9 +++++++++ test/test_filters.rb | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 65fc7e41049..a996c496922 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -150,6 +150,15 @@ def uri_escape(input) URI.escape(input) end + # Replace any whitespace in the input string with a single space + # + # input - The String on which to operate. + # + # Returns the formatted String + def normalize_whitespace(input) + input.to_s.gsub(/\s+/, " ").strip + end + # Count the number of words in the input string. # # input - The String on which to operate. diff --git a/test/test_filters.rb b/test/test_filters.rb index 565e82089b8..7c10c8dff65 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -86,6 +86,30 @@ def initialize(opts = {}) assert_equal "chunky, bacon, bits, and pieces", @filter.array_to_sentence_string(["chunky", "bacon", "bits", "pieces"]) end + context "normalize_whitespace filter" do + should "replace newlines with a space" do + assert_equal "a b", @filter.normalize_whitespace("a\nb") + assert_equal "a b", @filter.normalize_whitespace("a\n\nb") + end + + should "replace tabs with a space" do + assert_equal "a b", @filter.normalize_whitespace("a\tb") + assert_equal "a b", @filter.normalize_whitespace("a\t\tb") + end + + should "replace multiple spaces with a single space" do + assert_equal "a b", @filter.normalize_whitespace("a b") + assert_equal "a b", @filter.normalize_whitespace("a\t\nb") + assert_equal "a b", @filter.normalize_whitespace("a \t \n\nb") + end + + should "strip whitespace from begining and end of string" do + assert_equal "a", @filter.normalize_whitespace("a ") + assert_equal "a", @filter.normalize_whitespace(" a") + assert_equal "a", @filter.normalize_whitespace(" a ") + end + end + context "date filters" do context "with Time object" do should "format a date with short format" do From f3a29677f9763bf935d36fa260ec36acdf126dc8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 21:34:30 -0700 Subject: [PATCH 0825/4996] Fix rubocop issues. --- lib/jekyll/theme_builder.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index 413aa772b76..041faafe7bf 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -72,7 +72,10 @@ def create_example_site %w(example/_config.yml example/index.html example/style.scss).each do |filename| write_file(filename, template(filename)) end - write_file("example/_posts/#{Time.now.strftime("%Y-%m-%d")}-my-example-post.md", template("example/_post.md")) + write_file( + "example/_posts/#{Time.now.strftime("%Y-%m-%d")}-my-example-post.md", + template("example/_post.md") + ) end def initialize_git_repo From cd31761f9ac7b96a8c6faeca0edf64030ad5a45a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 19 May 2016 22:13:05 -0700 Subject: [PATCH 0826/4996] Update history to reflect merge of #4848 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 29f76125e10..2d2494c1d7c 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Allow symlinks if they point to stuff inside site.source (#4710) * Update colorator dependency to v1.x (#4855) * Move EntryFilter to use Pathutil & fix `glob_include?` (#4859) + * Add 'jekyll new-theme' command to help users get up and running creating a theme (#4848) ### Bug Fixes From 8ac5b03006650f91c6ef34e071ae6af19df6461f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 20 May 2016 19:15:46 -0700 Subject: [PATCH 0827/4996] Cleaning up site template & theme updates. --- lib/jekyll/theme_builder.rb | 3 +- lib/site_template/_config.yml | 1 + lib/site_template/_includes/footer.html | 38 --- lib/site_template/_includes/head.html | 12 - lib/site_template/_includes/header.html | 27 -- lib/site_template/_includes/icon-github.html | 1 - lib/site_template/_includes/icon-github.svg | 1 - lib/site_template/_includes/icon-twitter.html | 1 - lib/site_template/_includes/icon-twitter.svg | 1 - lib/site_template/_layouts/default.html | 20 -- lib/site_template/_layouts/page.html | 14 - lib/site_template/_layouts/post.html | 15 -- lib/site_template/_sass/_base.scss | 200 --------------- lib/site_template/_sass/_layout.scss | 242 ------------------ .../_sass/_syntax-highlighting.scss | 71 ----- lib/site_template/css/main.scss | 20 +- 16 files changed, 6 insertions(+), 661 deletions(-) delete mode 100644 lib/site_template/_includes/footer.html delete mode 100644 lib/site_template/_includes/head.html delete mode 100644 lib/site_template/_includes/header.html delete mode 100644 lib/site_template/_includes/icon-github.html delete mode 100644 lib/site_template/_includes/icon-github.svg delete mode 100644 lib/site_template/_includes/icon-twitter.html delete mode 100644 lib/site_template/_includes/icon-twitter.svg delete mode 100644 lib/site_template/_layouts/default.html delete mode 100644 lib/site_template/_layouts/page.html delete mode 100644 lib/site_template/_layouts/post.html delete mode 100644 lib/site_template/_sass/_base.scss delete mode 100644 lib/site_template/_sass/_layout.scss delete mode 100644 lib/site_template/_sass/_syntax-highlighting.scss diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index 041faafe7bf..649df0efeee 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -1,6 +1,6 @@ class Jekyll::ThemeBuilder SCAFFOLD_DIRECTORIES = %w( - _layouts _includes _sass example example/_posts + _layouts _includes _sass ).freeze attr_reader :name, :path @@ -55,6 +55,7 @@ def write_file(filename, contents) def create_directories mkdir_p(SCAFFOLD_DIRECTORIES) + mkdir_p(%w{example example/_posts}) end def create_gemspec diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index 0f5a60882c1..adbffacd2d5 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -25,3 +25,4 @@ github_username: jekyll # Build settings markdown: kramdown +theme: minima diff --git a/lib/site_template/_includes/footer.html b/lib/site_template/_includes/footer.html deleted file mode 100644 index 1e4b2bc9165..00000000000 --- a/lib/site_template/_includes/footer.html +++ /dev/null @@ -1,38 +0,0 @@ -

    - -
    - - - - - -
    - -
    diff --git a/lib/site_template/_includes/head.html b/lib/site_template/_includes/head.html deleted file mode 100644 index c6a6e0bc7c2..00000000000 --- a/lib/site_template/_includes/head.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} - - - - - - diff --git a/lib/site_template/_includes/header.html b/lib/site_template/_includes/header.html deleted file mode 100644 index 5043f53908b..00000000000 --- a/lib/site_template/_includes/header.html +++ /dev/null @@ -1,27 +0,0 @@ - diff --git a/lib/site_template/_includes/icon-github.html b/lib/site_template/_includes/icon-github.html deleted file mode 100644 index e501a16b187..00000000000 --- a/lib/site_template/_includes/icon-github.html +++ /dev/null @@ -1 +0,0 @@ -{% include icon-github.svg %}{{ include.username }} diff --git a/lib/site_template/_includes/icon-github.svg b/lib/site_template/_includes/icon-github.svg deleted file mode 100644 index 4422c4f5dcc..00000000000 --- a/lib/site_template/_includes/icon-github.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/site_template/_includes/icon-twitter.html b/lib/site_template/_includes/icon-twitter.html deleted file mode 100644 index e623dbd6efc..00000000000 --- a/lib/site_template/_includes/icon-twitter.html +++ /dev/null @@ -1 +0,0 @@ -{{ include.username }} diff --git a/lib/site_template/_includes/icon-twitter.svg b/lib/site_template/_includes/icon-twitter.svg deleted file mode 100644 index dcf660e7bb3..00000000000 --- a/lib/site_template/_includes/icon-twitter.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/site_template/_layouts/default.html b/lib/site_template/_layouts/default.html deleted file mode 100644 index 81aa4ec6379..00000000000 --- a/lib/site_template/_layouts/default.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - {% include head.html %} - - - - {% include header.html %} - -
    -
    - {{ content }} -
    -
    - - {% include footer.html %} - - - - diff --git a/lib/site_template/_layouts/page.html b/lib/site_template/_layouts/page.html deleted file mode 100644 index 01e4b2a93b8..00000000000 --- a/lib/site_template/_layouts/page.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -layout: default ---- -
    - -
    -

    {{ page.title | escape }}

    -
    - -
    - {{ content }} -
    - -
    diff --git a/lib/site_template/_layouts/post.html b/lib/site_template/_layouts/post.html deleted file mode 100644 index 2592391f894..00000000000 --- a/lib/site_template/_layouts/post.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: default ---- -
    - -
    -

    {{ page.title | escape }}

    - -
    - -
    - {{ content }} -
    - -
    diff --git a/lib/site_template/_sass/_base.scss b/lib/site_template/_sass/_base.scss deleted file mode 100644 index 9b8f292dc79..00000000000 --- a/lib/site_template/_sass/_base.scss +++ /dev/null @@ -1,200 +0,0 @@ -/** - * Reset some basic elements - */ -body, h1, h2, h3, h4, h5, h6, -p, blockquote, pre, hr, -dl, dd, ol, ul, figure { - margin: 0; - padding: 0; -} - - - -/** - * Basic styling - */ -body { - font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family; - color: $text-color; - background-color: $background-color; - -webkit-text-size-adjust: 100%; - -webkit-font-feature-settings: "kern" 1; - -moz-font-feature-settings: "kern" 1; - -o-font-feature-settings: "kern" 1; - font-feature-settings: "kern" 1; - font-kerning: normal; -} - - - -/** - * Set `margin-bottom` to maintain vertical rhythm - */ -h1, h2, h3, h4, h5, h6, -p, blockquote, pre, -ul, ol, dl, figure, -%vertical-rhythm { - margin-bottom: $spacing-unit / 2; -} - - - -/** - * Images - */ -img { - max-width: 100%; - vertical-align: middle; -} - - - -/** - * Figures - */ -figure > img { - display: block; -} - -figcaption { - font-size: $small-font-size; -} - - - -/** - * Lists - */ -ul, ol { - margin-left: $spacing-unit; -} - -li { - > ul, - > ol { - margin-bottom: 0; - } -} - - - -/** - * Headings - */ -h1, h2, h3, h4, h5, h6 { - font-weight: $base-font-weight; -} - - - -/** - * Links - */ -a { - color: $brand-color; - text-decoration: none; - - &:visited { - color: darken($brand-color, 15%); - } - - &:hover { - color: $text-color; - text-decoration: underline; - } -} - - - -/** - * Blockquotes - */ -blockquote { - color: $grey-color; - border-left: 4px solid $grey-color-light; - padding-left: $spacing-unit / 2; - font-size: 18px; - letter-spacing: -1px; - font-style: italic; - - > :last-child { - margin-bottom: 0; - } -} - - - -/** - * Code formatting - */ -pre, -code { - font-size: 15px; - border: 1px solid $grey-color-light; - border-radius: 3px; - background-color: #eef; -} - -code { - padding: 1px 5px; -} - -pre { - padding: 8px 12px; - overflow-x: auto; - - > code { - border: 0; - padding-right: 0; - padding-left: 0; - } -} - - - -/** - * Wrapper - */ -.wrapper { - max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2)); - max-width: calc(#{$content-width} - (#{$spacing-unit} * 2)); - margin-right: auto; - margin-left: auto; - padding-right: $spacing-unit; - padding-left: $spacing-unit; - @extend %clearfix; - - @include media-query($on-laptop) { - max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit})); - max-width: calc(#{$content-width} - (#{$spacing-unit})); - padding-right: $spacing-unit / 2; - padding-left: $spacing-unit / 2; - } -} - - - -/** - * Clearfix - */ -%clearfix:after { - content: ""; - display: table; - clear: both; -} - - - -/** - * Icons - */ -.icon > svg { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - - path { - fill: $grey-color; - } -} diff --git a/lib/site_template/_sass/_layout.scss b/lib/site_template/_sass/_layout.scss deleted file mode 100644 index 9cbfddefefb..00000000000 --- a/lib/site_template/_sass/_layout.scss +++ /dev/null @@ -1,242 +0,0 @@ -/** - * Site header - */ -.site-header { - border-top: 5px solid $grey-color-dark; - border-bottom: 1px solid $grey-color-light; - min-height: 56px; - - // Positioning context for the mobile navigation icon - position: relative; -} - -.site-title { - font-size: 26px; - font-weight: 300; - line-height: 56px; - letter-spacing: -1px; - margin-bottom: 0; - float: left; - - &, - &:visited { - color: $grey-color-dark; - } -} - -.site-nav { - float: right; - line-height: 56px; - - .menu-icon { - display: none; - } - - .page-link { - color: $text-color; - line-height: $base-line-height; - - // Gaps between nav items, but not on the last one - &:not(:last-child) { - margin-right: 20px; - } - } - - @include media-query($on-palm) { - position: absolute; - top: 9px; - right: $spacing-unit / 2; - background-color: $background-color; - border: 1px solid $grey-color-light; - border-radius: 5px; - text-align: right; - - .menu-icon { - display: block; - float: right; - width: 36px; - height: 26px; - line-height: 0; - padding-top: 10px; - text-align: center; - - > svg { - width: 18px; - height: 15px; - - path { - fill: $grey-color-dark; - } - } - } - - .trigger { - clear: both; - display: none; - } - - &:hover .trigger { - display: block; - padding-bottom: 5px; - } - - .page-link { - display: block; - padding: 5px 10px; - - &:not(:last-child) { - margin-right: 0; - } - margin-left: 20px; - } - } -} - - - -/** - * Site footer - */ -.site-footer { - border-top: 1px solid $grey-color-light; - padding: $spacing-unit 0; -} - -.footer-heading { - font-size: 18px; - margin-bottom: $spacing-unit / 2; -} - -.contact-list, -.social-media-list { - list-style: none; - margin-left: 0; -} - -.footer-col-wrapper { - font-size: 15px; - color: $grey-color; - margin-left: -$spacing-unit / 2; - @extend %clearfix; -} - -.footer-col { - float: left; - margin-bottom: $spacing-unit / 2; - padding-left: $spacing-unit / 2; -} - -.footer-col-1 { - width: -webkit-calc(35% - (#{$spacing-unit} / 2)); - width: calc(35% - (#{$spacing-unit} / 2)); -} - -.footer-col-2 { - width: -webkit-calc(20% - (#{$spacing-unit} / 2)); - width: calc(20% - (#{$spacing-unit} / 2)); -} - -.footer-col-3 { - width: -webkit-calc(45% - (#{$spacing-unit} / 2)); - width: calc(45% - (#{$spacing-unit} / 2)); -} - -@include media-query($on-laptop) { - .footer-col-1, - .footer-col-2 { - width: -webkit-calc(50% - (#{$spacing-unit} / 2)); - width: calc(50% - (#{$spacing-unit} / 2)); - } - - .footer-col-3 { - width: -webkit-calc(100% - (#{$spacing-unit} / 2)); - width: calc(100% - (#{$spacing-unit} / 2)); - } -} - -@include media-query($on-palm) { - .footer-col { - float: none; - width: -webkit-calc(100% - (#{$spacing-unit} / 2)); - width: calc(100% - (#{$spacing-unit} / 2)); - } -} - - - -/** - * Page content - */ -.page-content { - padding: $spacing-unit 0; -} - -.page-heading { - font-size: 20px; -} - -.post-list { - margin-left: 0; - list-style: none; - - > li { - margin-bottom: $spacing-unit; - } -} - -.post-meta { - font-size: $small-font-size; - color: $grey-color; -} - -.post-link { - display: block; - font-size: 24px; -} - - - -/** - * Posts - */ -.post-header { - margin-bottom: $spacing-unit; -} - -.post-title { - font-size: 42px; - letter-spacing: -1px; - line-height: 1; - - @include media-query($on-laptop) { - font-size: 36px; - } -} - -.post-content { - margin-bottom: $spacing-unit; - - h2 { - font-size: 32px; - - @include media-query($on-laptop) { - font-size: 28px; - } - } - - h3 { - font-size: 26px; - - @include media-query($on-laptop) { - font-size: 22px; - } - } - - h4 { - font-size: 20px; - - @include media-query($on-laptop) { - font-size: 18px; - } - } -} diff --git a/lib/site_template/_sass/_syntax-highlighting.scss b/lib/site_template/_sass/_syntax-highlighting.scss deleted file mode 100644 index 8fac59776d5..00000000000 --- a/lib/site_template/_sass/_syntax-highlighting.scss +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Syntax highlighting styles - */ -.highlight { - background: #fff; - @extend %vertical-rhythm; - - .highlighter-rouge & { - background: #eef; - } - - .c { color: #998; font-style: italic } // Comment - .err { color: #a61717; background-color: #e3d2d2 } // Error - .k { font-weight: bold } // Keyword - .o { font-weight: bold } // Operator - .cm { color: #998; font-style: italic } // Comment.Multiline - .cp { color: #999; font-weight: bold } // Comment.Preproc - .c1 { color: #998; font-style: italic } // Comment.Single - .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special - .gd { color: #000; background-color: #fdd } // Generic.Deleted - .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific - .ge { font-style: italic } // Generic.Emph - .gr { color: #a00 } // Generic.Error - .gh { color: #999 } // Generic.Heading - .gi { color: #000; background-color: #dfd } // Generic.Inserted - .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific - .go { color: #888 } // Generic.Output - .gp { color: #555 } // Generic.Prompt - .gs { font-weight: bold } // Generic.Strong - .gu { color: #aaa } // Generic.Subheading - .gt { color: #a00 } // Generic.Traceback - .kc { font-weight: bold } // Keyword.Constant - .kd { font-weight: bold } // Keyword.Declaration - .kp { font-weight: bold } // Keyword.Pseudo - .kr { font-weight: bold } // Keyword.Reserved - .kt { color: #458; font-weight: bold } // Keyword.Type - .m { color: #099 } // Literal.Number - .s { color: #d14 } // Literal.String - .na { color: #008080 } // Name.Attribute - .nb { color: #0086B3 } // Name.Builtin - .nc { color: #458; font-weight: bold } // Name.Class - .no { color: #008080 } // Name.Constant - .ni { color: #800080 } // Name.Entity - .ne { color: #900; font-weight: bold } // Name.Exception - .nf { color: #900; font-weight: bold } // Name.Function - .nn { color: #555 } // Name.Namespace - .nt { color: #000080 } // Name.Tag - .nv { color: #008080 } // Name.Variable - .ow { font-weight: bold } // Operator.Word - .w { color: #bbb } // Text.Whitespace - .mf { color: #099 } // Literal.Number.Float - .mh { color: #099 } // Literal.Number.Hex - .mi { color: #099 } // Literal.Number.Integer - .mo { color: #099 } // Literal.Number.Oct - .sb { color: #d14 } // Literal.String.Backtick - .sc { color: #d14 } // Literal.String.Char - .sd { color: #d14 } // Literal.String.Doc - .s2 { color: #d14 } // Literal.String.Double - .se { color: #d14 } // Literal.String.Escape - .sh { color: #d14 } // Literal.String.Heredoc - .si { color: #d14 } // Literal.String.Interpol - .sx { color: #d14 } // Literal.String.Other - .sr { color: #009926 } // Literal.String.Regex - .s1 { color: #d14 } // Literal.String.Single - .ss { color: #990073 } // Literal.String.Symbol - .bp { color: #999 } // Name.Builtin.Pseudo - .vc { color: #008080 } // Name.Variable.Class - .vg { color: #008080 } // Name.Variable.Global - .vi { color: #008080 } // Name.Variable.Instance - .il { color: #099 } // Literal.Number.Integer.Long -} diff --git a/lib/site_template/css/main.scss b/lib/site_template/css/main.scss index f2e566e2a19..c91fac8d134 100644 --- a/lib/site_template/css/main.scss +++ b/lib/site_template/css/main.scss @@ -3,8 +3,6 @@ --- @charset "utf-8"; - - // Our variables $base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; $base-font-size: 16px; @@ -28,8 +26,7 @@ $content-width: 800px; $on-palm: 600px; $on-laptop: 800px; - - +// Minima also includes a mixin for defining media queries. // Use media queries like this: // @include media-query($on-palm) { // .wrapper { @@ -37,17 +34,6 @@ $on-laptop: 800px; // padding-left: $spacing-unit / 2; // } // } -@mixin media-query($device) { - @media screen and (max-width: $device) { - @content; - } -} - - -// Import partials from `sass_dir` (defaults to `_sass`) -@import - "base", - "layout", - "syntax-highlighting" -; +// Import partials from the `minima` theme. +@import "minima"; From 51c415291932502ea7f1bfb2867a1bf5c047b3a2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 20 May 2016 19:19:21 -0700 Subject: [PATCH 0828/4996] Release a beta. --- lib/jekyll/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 65a1431d673..e482bd23564 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.1.6' + VERSION = '3.2.0.pre.beta1' end From 498324bbffc282ca0503c6a0f18ca63df7a2db8a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 20 May 2016 19:19:26 -0700 Subject: [PATCH 0829/4996] Release :gem: 3.2.0.pre.beta1 From 013e2f159d583cf635448e6cdf8fc050d572b7a1 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Thu, 19 May 2016 20:32:56 -0500 Subject: [PATCH 0830/4996] Rubocop fixes for test/test_url.rb --- .rubocop.yml | 1 - test/test_url.rb | 46 ++++++++++++++++++++++------------------------ 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index ac3c83008eb..020e4f92ea3 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -84,7 +84,6 @@ AllCops: - test/test_static_file.rb - test/test_tags.rb - test/test_theme.rb - - test/test_url.rb - test/test_utils.rb - bin/**/* - benchmark/**/* diff --git a/test/test_url.rb b/test/test_url.rb index 99ee5e6125e..fc9a46eb0a3 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -1,8 +1,7 @@ -require 'helper' +require "helper" class TestURL < JekyllUnitTest context "The URL class" do - should "throw an exception if neither permalink or template is specified" do assert_raises ArgumentError do URL.new(:placeholders => {}) @@ -11,46 +10,46 @@ class TestURL < JekyllUnitTest should "replace placeholders in templates" do assert_equal "/foo/bar", URL.new( - :template => "/:x/:y", - :placeholders => {:x => "foo", :y => "bar"} + :template => "/:x/:y", + :placeholders => { :x => "foo", :y => "bar" } ).to_s end should "handle multiple of the same key in the template" do - assert_equal '/foo/bar/foo/', URL.new( - :template => "/:x/:y/:x/", - :placeholders => {:x => "foo", :y => "bar"} + assert_equal "/foo/bar/foo/", URL.new( + :template => "/:x/:y/:x/", + :placeholders => { :x => "foo", :y => "bar" } ).to_s end should "use permalink if given" do assert_equal "/le/perma/link", URL.new( - :template => "/:x/:y", - :placeholders => {:x => "foo", :y => "bar"}, - :permalink => "/le/perma/link" + :template => "/:x/:y", + :placeholders => { :x => "foo", :y => "bar" }, + :permalink => "/le/perma/link" ).to_s end should "replace placeholders in permalinks" do assert_equal "/foo/bar", URL.new( - :template => "/baz", - :permalink => "/:x/:y", - :placeholders => {:x => "foo", :y => "bar"} + :template => "/baz", + :permalink => "/:x/:y", + :placeholders => { :x => "foo", :y => "bar" } ).to_s end should "handle multiple of the same key in the permalink" do - assert_equal '/foo/bar/foo/', URL.new( - :template => "/baz", - :permalink => "/:x/:y/:x/", - :placeholders => {:x => "foo", :y => "bar"} + assert_equal "/foo/bar/foo/", URL.new( + :template => "/baz", + :permalink => "/:x/:y/:x/", + :placeholders => { :x => "foo", :y => "bar" } ).to_s end should "handle nil values for keys in the template" do - assert_equal '/foo/bar/', URL.new( - :template => "/:x/:y/:z/", - :placeholders => {:x => "foo", :y => "bar", :z => nil} + assert_equal "/foo/bar/", URL.new( + :template => "/:x/:y/:z/", + :placeholders => { :x => "foo", :y => "bar", :z => nil } ).to_s end @@ -60,17 +59,16 @@ class TestURL < JekyllUnitTest "methods" => { "output" => true } - }, + } }) site.read matching_doc = site.collections["methods"].docs.find do |doc| doc.relative_path == "_methods/escape-+ #%20[].md" end - assert_equal '/methods/escape-+-20/escape-20.html', URL.new( - :template => '/methods/:title/:name:output_ext', + assert_equal "/methods/escape-+-20/escape-20.html", URL.new( + :template => "/methods/:title/:name:output_ext", :placeholders => matching_doc.url_placeholders ).to_s end - end end From 1380836a4bf5a3e8be8eb2ddf74318718f3979d2 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Thu, 19 May 2016 20:36:07 -0500 Subject: [PATCH 0831/4996] Rubocop fixes for test/test_theme.rb --- .rubocop.yml | 1 - test/test_theme.rb | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 020e4f92ea3..47ad23534db 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -83,7 +83,6 @@ AllCops: - test/test_site.rb - test/test_static_file.rb - test/test_tags.rb - - test/test_theme.rb - test/test_utils.rb - bin/**/* - benchmark/**/* diff --git a/test/test_theme.rb b/test/test_theme.rb index 9767946ef11..a448ce30735 100644 --- a/test/test_theme.rb +++ b/test/test_theme.rb @@ -1,14 +1,14 @@ -require 'helper' +require "helper" class TestTheme < JekyllUnitTest def setup - @theme = Theme.new('test-theme') + @theme = Theme.new("test-theme") @expected_root = File.expand_path "./fixtures/test-theme", File.dirname(__FILE__) end context "initializing" do should "normalize the theme name" do - theme = Theme.new(' Test-Theme ') + theme = Theme.new(" Test-Theme ") assert_equal "test-theme", theme.name end @@ -28,7 +28,8 @@ def setup should "add itself to sass's load path" do @theme.configure_sass - assert Sass.load_paths.include?(@theme.sass_path), "Sass load paths should include the theme sass dir" + message = "Sass load paths should include the theme sass dir" + assert Sass.load_paths.include?(@theme.sass_path), message end end From 16c1146b4f55f2047367a28946b02015adca3e6e Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Thu, 19 May 2016 20:48:30 -0500 Subject: [PATCH 0832/4996] Rubocop fixes for test/test_static_file.rb --- .rubocop.yml | 1 - test/test_static_file.rb | 42 ++++++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 47ad23534db..24816dc7daf 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -81,7 +81,6 @@ AllCops: - test/test_related_posts.rb - test/test_sass.rb - test/test_site.rb - - test/test_static_file.rb - test/test_tags.rb - test/test_utils.rb - bin/**/* diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 85512ab449b..b705ff05666 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestStaticFile < JekyllUnitTest def make_dummy_file(filename) @@ -6,7 +6,8 @@ def make_dummy_file(filename) end def modify_dummy_file(filename) - offset = "some content".size + string = "some content" + offset = string.size File.write(source_dir(filename), "more content", offset) end @@ -18,13 +19,13 @@ def setup_static_file(base, dir, name) 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]) + def setup_static_file_with_collection(base, dir, name, metadata) + site = fixture_site("collections" => { "foo" => metadata }) + StaticFile.new(site, base, dir, name, site.collections["foo"]) end def setup_static_file_with_defaults(base, dir, name, defaults) - site = fixture_site('defaults' => defaults) + site = fixture_site("defaults" => defaults) StaticFile.new(site, base, dir, name) end @@ -62,17 +63,16 @@ def setup_static_file_with_defaults(base, dir, name, defaults) 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}) + static_file = setup_static_file_with_collection("root", "_foo/dir/subdir", + "file.html", { "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/"}) + should "use its collection's permalink template for destination relative directory" do + static_file = setup_static_file_with_collection("root", "_foo/dir/subdir", + "file.html", { "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 @@ -86,13 +86,13 @@ def setup_static_file_with_defaults(base, dir, name, defaults) should "use the _config.yml defaults to determine writability" do defaults = [{ - "scope" => {"path" => "private"}, - "values" => {"published" => false} + "scope" => { "path" => "private" }, + "values" => { "published" => false } }] - static_file = setup_static_file_with_defaults( - "root", "private/dir/subdir", "file.html", defaults) + 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 " + + "static_file.write? should return false when _config.yml sets " \ "`published: false`") end @@ -116,15 +116,15 @@ def setup_static_file_with_defaults(base, dir, name, defaults) assert @static_file.write?, "always true, with current implementation" end - should "be able to write itself to the desitination direcotry" do + should "be able to write itself to the desitination directory" do assert @static_file.write(dest_dir) end should "be able to convert to liquid" do expected = { - "extname" => ".txt", - "modified_time" => @static_file.modified_time, - "path" => "/static_file.txt", + "extname" => ".txt", + "modified_time" => @static_file.modified_time, + "path" => "/static_file.txt" } assert_equal expected, @static_file.to_liquid end From a9f110b861bed10cc3f01e145956aa6343e00d0a Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Thu, 19 May 2016 20:51:58 -0500 Subject: [PATCH 0833/4996] Rubocop fixes for test/test_sass.rb --- .rubocop.yml | 1 - test/test_sass.rb | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 24816dc7daf..9680ee72a05 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -79,7 +79,6 @@ AllCops: - test/test_page.rb - test/test_regenerator.rb - test/test_related_posts.rb - - test/test_sass.rb - test/test_site.rb - test/test_tags.rb - test/test_utils.rb diff --git a/test/test_sass.rb b/test/test_sass.rb index 153c339af1c..f5241790497 100644 --- a/test/test_sass.rb +++ b/test/test_sass.rb @@ -1,10 +1,10 @@ -require 'helper' +require "helper" class TestSass < JekyllUnitTest context "importing partials" do setup do @site = Jekyll::Site.new(Jekyll.configuration({ - "source" => source_dir, + "source" => source_dir, "destination" => dest_dir })) @site.process @@ -16,11 +16,13 @@ class TestSass < JekyllUnitTest end should "register the SCSS converter" do - assert !!@site.find_converter_instance(Jekyll::Converters::Scss), "SCSS converter implementation should exist." + message = "SCSS converter implementation should exist." + assert !!@site.find_converter_instance(Jekyll::Converters::Scss), message end should "register the Sass converter" do - assert !!@site.find_converter_instance(Jekyll::Converters::Sass), "Sass converter implementation should exist." + message = "Sass converter implementation should exist." + assert !!@site.find_converter_instance(Jekyll::Converters::Sass), message end end end From 8f07affe2ad162ea72c7074c627223c53dad925e Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Thu, 19 May 2016 20:55:44 -0500 Subject: [PATCH 0834/4996] Rubocop fixes for test/test_related_posts.rb --- .rubocop.yml | 1 - test/test_related_posts.rb | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 9680ee72a05..9aeca7021f9 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -78,7 +78,6 @@ AllCops: - test/test_liquid_renderer.rb - test/test_page.rb - test/test_regenerator.rb - - test/test_related_posts.rb - test/test_site.rb - test/test_tags.rb - test/test_utils.rb diff --git a/test/test_related_posts.rb b/test/test_related_posts.rb index cd114c044f2..cda18dfcb3b 100644 --- a/test/test_related_posts.rb +++ b/test/test_related_posts.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestRelatedPosts < JekyllUnitTest context "building related posts without lsi" do @@ -33,26 +33,29 @@ class TestRelatedPosts < JekyllUnitTest @site.reset @site.read - require 'classifier-reborn' + require "classifier-reborn" Jekyll::RelatedPosts.lsi = nil end should "index Jekyll::Post objects" do @site.posts.docs = @site.posts.docs.first(1) - expect_any_instance_of(::ClassifierReborn::LSI).to receive(:add_item).with(kind_of(Jekyll::Document)) + expect_any_instance_of(::ClassifierReborn::LSI).to \ + receive(:add_item).with(kind_of(Jekyll::Document)) Jekyll::RelatedPosts.new(@site.posts.last).build_index end should "find related Jekyll::Post objects, given a Jekyll::Post object" do post = @site.posts.last allow_any_instance_of(::ClassifierReborn::LSI).to receive(:build_index) - expect_any_instance_of(::ClassifierReborn::LSI).to receive(:find_related).with(post, 11).and_return(@site.posts[-1..-9]) + expect_any_instance_of(::ClassifierReborn::LSI).to \ + receive(:find_related).with(post, 11).and_return(@site.posts[-1..-9]) Jekyll::RelatedPosts.new(post).build end should "use lsi for the related posts" do - allow_any_instance_of(::ClassifierReborn::LSI).to receive(:find_related).and_return(@site.posts[-1..-9]) + allow_any_instance_of(::ClassifierReborn::LSI).to \ + receive(:find_related).and_return(@site.posts[-1..-9]) allow_any_instance_of(::ClassifierReborn::LSI).to receive(:build_index) assert_equal @site.posts[-1..-9], Jekyll::RelatedPosts.new(@site.posts.last).build From e85f2a0ee9be3cfe7805976541280c4b93d97a1c Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Thu, 19 May 2016 20:58:09 -0500 Subject: [PATCH 0835/4996] Rubocop fixes for lib/jekyll/version.rb --- .rubocop.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index 9aeca7021f9..0e65424cc0e 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -65,7 +65,6 @@ AllCops: - lib/jekyll/utils/ansi.rb - lib/jekyll/utils/platforms.rb - lib/jekyll/utils.rb - - lib/jekyll/version.rb - lib/jekyll.rb - features/step_definitions.rb - features/support/formatter.rb From d743c8035793ea0ddf87e4849a617db179da6fc9 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Thu, 19 May 2016 21:06:35 -0500 Subject: [PATCH 0836/4996] Rubocop fixes for lib/jekyll/utils/ansi.rb --- .rubocop.yml | 1 - lib/jekyll/utils/ansi.rb | 18 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 0e65424cc0e..56b29b9c92f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -62,7 +62,6 @@ AllCops: - lib/jekyll/tags/post_url.rb - lib/jekyll/theme.rb - lib/jekyll/url.rb - - lib/jekyll/utils/ansi.rb - lib/jekyll/utils/platforms.rb - lib/jekyll/utils.rb - lib/jekyll.rb diff --git a/lib/jekyll/utils/ansi.rb b/lib/jekyll/utils/ansi.rb index 933b4323018..715cb277c59 100644 --- a/lib/jekyll/utils/ansi.rb +++ b/lib/jekyll/utils/ansi.rb @@ -8,17 +8,17 @@ module Ansi extend self ESCAPE = format("%c", 27) - MATCH = /#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m/ix.freeze + MATCH = /#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m/ix COLORS = { - :red => 31, - :green => 32, - :black => 30, + :red => 31, + :green => 32, + :black => 30, :magenta => 35, - :yellow => 33, - :white => 37, - :blue => 34, - :cyan => 36 - } + :yellow => 33, + :white => 37, + :blue => 34, + :cyan => 36 + }.freeze # Strip ANSI from the current string. It also strips cursor stuff, # well some of it, and it also strips some other stuff that a lot of From 281a873c7156f9700c3c143e8deba37c0f528d49 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Thu, 19 May 2016 21:07:44 -0500 Subject: [PATCH 0837/4996] lib/jekyll/utils/platforms.rb didn't have any rubocop errors --- .rubocop.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index 56b29b9c92f..4189be7bb14 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -62,7 +62,6 @@ AllCops: - lib/jekyll/tags/post_url.rb - lib/jekyll/theme.rb - lib/jekyll/url.rb - - lib/jekyll/utils/platforms.rb - lib/jekyll/utils.rb - lib/jekyll.rb - features/step_definitions.rb From 6db52725288b35bedb6a4442b9f1c2c13e28aae3 Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Fri, 20 May 2016 20:36:49 -0500 Subject: [PATCH 0838/4996] Splitting args onto own lines in test/test_static_file.rb For functions where the character limit was exceeded and line wrapping was needed, this commit just splits each arg into it's own line. --- test/test_static_file.rb | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/test/test_static_file.rb b/test/test_static_file.rb index b705ff05666..7019a1073b3 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -63,16 +63,24 @@ def setup_static_file_with_defaults(base, dir, name, defaults) end should "have a destination relative directory with a collection" do - static_file = setup_static_file_with_collection("root", "_foo/dir/subdir", - "file.html", { "output" => true }) + static_file = setup_static_file_with_collection( + "root", + "_foo/dir/subdir", + "file.html", + { "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 destination relative directory" do - static_file = setup_static_file_with_collection("root", "_foo/dir/subdir", - "file.html", { "output" => true, "permalink" => "/:path/" }) + static_file = setup_static_file_with_collection( + "root", + "_foo/dir/subdir", + "file.html", + { "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 @@ -89,8 +97,12 @@ def setup_static_file_with_defaults(base, dir, name, defaults) "scope" => { "path" => "private" }, "values" => { "published" => false } }] - static_file = setup_static_file_with_defaults("root", "private/dir/subdir", - "file.html", defaults) + 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`") From dbda462c2f001f0d69e581f3c4664696b43e96ba Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Fri, 20 May 2016 21:51:16 -0500 Subject: [PATCH 0839/4996] Adding double quotes & freeze back to version after rebase --- lib/jekyll/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index e482bd23564..a8d86cb3320 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = '3.2.0.pre.beta1' + VERSION = "3.2.0.pre.beta1".freeze end From e02049727b8414a8a1e7b6baeebd306f1384566e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 23 May 2016 13:44:00 -0700 Subject: [PATCH 0840/4996] Update history to reflect merge of #4916 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2d2494c1d7c..8bf867494a4 100644 --- a/History.markdown +++ b/History.markdown @@ -59,6 +59,7 @@ * Fixing rubocop offenses in lib/jekyll/cleaner.rb (#4892) * Update `jekyll/commands*` to pass rubocop rules (#4888) * Clean up many test files to pass Rubocop rules (#4902) + * Rubocop cleanup for some utils and further test files (#4916) ### Site Enhancements From a8d27e5788c67504908e392c5cf6a53f1492254e Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 23 May 2016 22:10:49 -0500 Subject: [PATCH 0841/4996] Rubocop: Low hanging fruit --- .rubocop.yml | 23 ---------- .../converters/markdown/rdiscount_parser.rb | 8 ++-- lib/jekyll/drops/document_drop.rb | 6 +-- lib/jekyll/drops/drop.rb | 12 +++--- lib/jekyll/drops/url_drop.rb | 8 ++-- lib/jekyll/excerpt.rb | 4 +- lib/jekyll/external.rb | 6 +-- lib/jekyll/hooks.rb | 42 +++++++++---------- lib/jekyll/liquid_renderer/file.rb | 2 +- lib/jekyll/log_adapter.rb | 4 +- lib/jekyll/plugin.rb | 10 ++--- lib/jekyll/publisher.rb | 2 +- lib/jekyll/readers/data_reader.rb | 16 +++---- lib/jekyll/related_posts.rb | 2 +- 14 files changed, 61 insertions(+), 84 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 4189be7bb14..198cb1e6e34 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -7,51 +7,28 @@ AllCops: - lib/jekyll/collection.rb - lib/jekyll/command.rb - lib/jekyll/configuration.rb - - lib/jekyll/converter.rb - lib/jekyll/converters/identity.rb - - lib/jekyll/converters/markdown - lib/jekyll/converters/markdown/kramdown_parser.rb - - lib/jekyll/converters/markdown/rdiscount_parser.rb - lib/jekyll/converters/markdown/redcarpet_parser.rb - lib/jekyll/converters/markdown.rb - - lib/jekyll/converters/smartypants.rb - lib/jekyll/convertible.rb - lib/jekyll/deprecator.rb - lib/jekyll/document.rb - - lib/jekyll/drops/collection_drop.rb - - lib/jekyll/drops/document_drop.rb - - lib/jekyll/drops/drop.rb - - lib/jekyll/drops/jekyll_drop.rb - lib/jekyll/drops/site_drop.rb - - lib/jekyll/drops/unified_payload_drop.rb - - lib/jekyll/drops/url_drop.rb - lib/jekyll/entry_filter.rb - - lib/jekyll/errors.rb - - lib/jekyll/excerpt.rb - - lib/jekyll/external.rb - lib/jekyll/filters.rb - lib/jekyll/frontmatter_defaults.rb - - lib/jekyll/generator.rb - - lib/jekyll/hooks.rb - lib/jekyll/layout.rb - - lib/jekyll/liquid_extensions.rb - - lib/jekyll/liquid_renderer/file.rb - lib/jekyll/liquid_renderer/table.rb - lib/jekyll/liquid_renderer.rb - - lib/jekyll/log_adapter.rb - lib/jekyll/page.rb - - lib/jekyll/plugin.rb - lib/jekyll/plugin_manager.rb - - lib/jekyll/publisher.rb - lib/jekyll/reader.rb - - lib/jekyll/readers/collection_reader.rb - - lib/jekyll/readers/data_reader.rb - lib/jekyll/readers/layout_reader.rb - lib/jekyll/readers/page_reader.rb - lib/jekyll/readers/post_reader.rb - lib/jekyll/readers/static_file_reader.rb - lib/jekyll/regenerator.rb - - lib/jekyll/related_posts.rb - lib/jekyll/renderer.rb - lib/jekyll/site.rb - lib/jekyll/static_file.rb diff --git a/lib/jekyll/converters/markdown/rdiscount_parser.rb b/lib/jekyll/converters/markdown/rdiscount_parser.rb index daf8874edd6..f1679e796c4 100644 --- a/lib/jekyll/converters/markdown/rdiscount_parser.rb +++ b/lib/jekyll/converters/markdown/rdiscount_parser.rb @@ -5,14 +5,14 @@ class RDiscountParser def initialize(config) Jekyll::External.require_with_graceful_fail "rdiscount" @config = config - @rdiscount_extensions = @config['rdiscount']['extensions'].map(&:to_sym) + @rdiscount_extensions = @config["rdiscount"]["extensions"].map(&:to_sym) end def convert(content) rd = RDiscount.new(content, *@rdiscount_extensions) html = rd.to_html - if @config['rdiscount']['toc_token'] - html = replace_generated_toc(rd, html, @config['rdiscount']['toc_token']) + if @config["rdiscount"]["toc_token"] + html = replace_generated_toc(rd, html, @config["rdiscount"]["toc_token"]) end html end @@ -21,7 +21,7 @@ def convert(content) def replace_generated_toc(rd, html, toc_token) if rd.generate_toc && html.include?(toc_token) utf8_toc = rd.toc_content - utf8_toc.force_encoding('utf-8') if utf8_toc.respond_to?(:force_encoding) + utf8_toc.force_encoding("utf-8") if utf8_toc.respond_to?(:force_encoding) html.gsub(toc_token, utf8_toc) else html diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index 4eb9e50c1dd..6ec840f56eb 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -17,13 +17,13 @@ def collection end def excerpt - fallback_data['excerpt'].to_s + fallback_data["excerpt"].to_s end def <=>(other) return nil unless other.is_a? DocumentDrop - cmp = self['date'] <=> other['date'] - cmp = self['path'] <=> other['path'] if cmp.nil? || cmp == 0 + cmp = self["date"] <=> other["date"] + cmp = self["path"] <=> other["path"] if cmp.nil? || cmp == 0 cmp end diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index d1bffcc5abd..817143098cd 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -13,11 +13,11 @@ class Drop < Liquid::Drop # # Returns the mutability of the class def self.mutable(is_mutable = nil) - if is_mutable - @is_mutable = is_mutable - else - @is_mutable = false - end + @is_mutable = if is_mutable + is_mutable + else + false + end end def self.mutable? @@ -134,7 +134,7 @@ def to_h # # Returns a pretty generation of the hash representation of the Drop. def inspect - require 'json' + require "json" JSON.pretty_generate to_h end diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb index 2815edf7557..04e48a206d8 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -19,20 +19,20 @@ def name end def title - Utils.slugify(@obj.data['slug'], :mode => "pretty", :cased => true) || + Utils.slugify(@obj.data["slug"], :mode => "pretty", :cased => true) || Utils.slugify(@obj.basename_without_ext, :mode => "pretty", :cased => true) end def slug - Utils.slugify(@obj.data['slug']) || Utils.slugify(@obj.basename_without_ext) + Utils.slugify(@obj.data["slug"]) || Utils.slugify(@obj.basename_without_ext) end def categories category_set = Set.new - Array(@obj.data['categories']).each do |category| + Array(@obj.data["categories"]).each do |category| category_set << category.to_s.downcase end - category_set.to_a.join('/') + category_set.to_a.join("/") end def year diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index f5884d682d8..f642589223b 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -59,9 +59,9 @@ def to_s end def to_liquid - doc.data['excerpt'] = nil + doc.data["excerpt"] = nil @to_liquid ||= doc.to_liquid - doc.data['excerpt'] = self + doc.data["excerpt"] = self @to_liquid end diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index 69b8d1eb391..561cbb4d299 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -23,7 +23,7 @@ def require_if_present(names, &block) require name rescue LoadError Jekyll.logger.debug "Couldn't load #{name}. Skipping." - block.call(name) if block + yield(name) if block false end end @@ -39,7 +39,7 @@ def require_if_present(names, &block) def require_with_graceful_fail(names) Array(names).each do |name| begin - Jekyll.logger.debug "Requiring:", "#{name}" + Jekyll.logger.debug "Requiring:", name.to_s require name rescue LoadError => e Jekyll.logger.error "Dependency Error:", <<-MSG @@ -50,7 +50,7 @@ def require_with_graceful_fail(names) If you run into trouble, you can find helpful resources at http://jekyllrb.com/help/! MSG - raise Jekyll::Errors::MissingDependencyException.new(name) + raise Jekyll::Errors::MissingDependencyException, name end end end diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index 6d8fcd8ddd3..c9a4f79439a 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -4,38 +4,38 @@ module Hooks # compatibility layer for octopress-hooks users PRIORITY_MAP = { - :low => 10, + :low => 10, :normal => 20, - :high => 30 + :high => 30 }.freeze # initial empty hooks @registry = { - :site => { - :after_init => [], + :site => { + :after_init => [], :after_reset => [], - :post_read => [], - :pre_render => [], + :post_read => [], + :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [] }, - :pages => { - :post_init => [], - :pre_render => [], + :pages => { + :post_init => [], + :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [] }, - :posts => { - :post_init => [], - :pre_render => [], + :posts => { + :post_init => [], + :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [] }, :documents => { - :post_init => [], - :pre_render => [], + :post_init => [], + :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [] } } @@ -61,10 +61,10 @@ def self.priority_value(priority) # register a single hook to be called later, internal API def self.register_one(owner, event, priority, &block) @registry[owner] ||={ - :post_init => [], - :pre_render => [], + :post_init => [], + :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [] } unless @registry[owner][event] diff --git a/lib/jekyll/liquid_renderer/file.rb b/lib/jekyll/liquid_renderer/file.rb index 7dcca1b62a1..63686d8f9ec 100644 --- a/lib/jekyll/liquid_renderer/file.rb +++ b/lib/jekyll/liquid_renderer/file.rb @@ -8,7 +8,7 @@ def initialize(renderer, filename) def parse(content) measure_time do - @template = Liquid::Template.parse(content, line_numbers: true) + @template = Liquid::Template.parse(content, :line_numbers => true) end self diff --git a/lib/jekyll/log_adapter.rb b/lib/jekyll/log_adapter.rb index df0cfdc4b10..8ac674514f6 100644 --- a/lib/jekyll/log_adapter.rb +++ b/lib/jekyll/log_adapter.rb @@ -7,7 +7,7 @@ class LogAdapter :info => ::Logger::INFO, :warn => ::Logger::WARN, :error => ::Logger::ERROR - } + }.freeze # Public: Create a new instance of a log writer # @@ -98,7 +98,7 @@ def abort_with(topic, message = nil) # # Returns the formatted message def message(topic, message) - msg = formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ') + msg = formatted_topic(topic) + message.to_s.gsub(/\s+/, " ") messages << msg msg end diff --git a/lib/jekyll/plugin.rb b/lib/jekyll/plugin.rb index 1fb91058f03..bcc1bf7e990 100644 --- a/lib/jekyll/plugin.rb +++ b/lib/jekyll/plugin.rb @@ -1,12 +1,12 @@ module Jekyll class Plugin PRIORITIES = { - :low => -10, + :low => -10, :highest => 100, - :lowest => -100, - :normal => 0, - :high => 10 - } + :lowest => -100, + :normal => 0, + :high => 10 + }.freeze # diff --git a/lib/jekyll/publisher.rb b/lib/jekyll/publisher.rb index cc739627d96..0b67b8c6025 100644 --- a/lib/jekyll/publisher.rb +++ b/lib/jekyll/publisher.rb @@ -15,7 +15,7 @@ def hidden_in_the_future?(thing) private def can_be_published?(thing) - thing.data.fetch('published', true) || @site.unpublished + thing.data.fetch("published", true) || @site.unpublished end end end diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index 796c0d2979e..e7e46bdc346 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -30,14 +30,14 @@ def read_data_to(dir, data) return unless File.directory?(dir) && !@entry_filter.symlink?(dir) entries = Dir.chdir(dir) do - Dir['*.{yaml,yml,json,csv}'] + Dir['*'].select { |fn| File.directory?(fn) } + Dir["*.{yaml,yml,json,csv}"] + Dir["*"].select { |fn| File.directory?(fn) } end entries.each do |entry| path = @site.in_source_dir(dir, entry) next if @entry_filter.symlink?(path) - key = sanitize_filename(File.basename(entry, '.*')) + key = sanitize_filename(File.basename(entry, ".*")) if File.directory?(path) read_data_to(path, data[key] = {}) else @@ -51,20 +51,20 @@ def read_data_to(dir, data) # Returns the contents of the data file. def read_data_file(path) case File.extname(path).downcase - when '.csv' + when ".csv" CSV.read(path, { - :headers => true, - :encoding => site.config['encoding'] - }).map(&:to_hash) + :headers => true, + :encoding => site.config["encoding"] + }).map(&:to_hash) else SafeYAML.load_file(path) end end def sanitize_filename(name) - name.gsub!(/[^\w\s-]+/, '') + name.gsub!(/[^\w\s-]+/, "") name.gsub!(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2') - name.gsub(/\s+/, '_') + name.gsub(/\s+/, "_") end end end diff --git a/lib/jekyll/related_posts.rb b/lib/jekyll/related_posts.rb index 51ae8d8f4af..cde1742c081 100644 --- a/lib/jekyll/related_posts.rb +++ b/lib/jekyll/related_posts.rb @@ -9,7 +9,7 @@ class << self def initialize(post) @post = post @site = post.site - Jekyll::External.require_with_graceful_fail('classifier-reborn') if site.lsi + Jekyll::External.require_with_graceful_fail("classifier-reborn") if site.lsi end def build From 41a8b10780e7f41e05f8b2ef24a20dae29a979cc Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Tue, 24 May 2016 17:03:06 +0300 Subject: [PATCH 0842/4996] rubocop: fix highlight tag code style --- .rubocop.yml | 1 - lib/jekyll/tags/highlight.rb | 82 +++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 4189be7bb14..50e89d45ef0 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -56,7 +56,6 @@ AllCops: - lib/jekyll/site.rb - lib/jekyll/static_file.rb - lib/jekyll/stevenson.rb - - lib/jekyll/tags/highlight.rb - lib/jekyll/tags/include.rb - lib/jekyll/tags/link.rb - lib/jekyll/tags/post_url.rb diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index a7dbd5193bc..550b3522e26 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -14,22 +14,9 @@ def initialize(tag_name, markup, tokens) super if markup.strip =~ SYNTAX @lang = Regexp.last_match(1).downcase - @highlight_options = {} - if defined?(Regexp.last_match(2)) && Regexp.last_match(2) != '' - # Split along 3 possible forms -- key="", key=value, or key - Regexp.last_match(2).scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt| - key, value = opt.split('=') - # If a quoted list, convert to array - if value && value.include?("\"") - value.delete!('"') - value = value.split - end - @highlight_options[key.to_sym] = value || true - end - end - @highlight_options[:linenos] = "inline" if @highlight_options.key?(:linenos) && @highlight_options[:linenos] == true + @highlight_options = parse_options(Regexp.last_match(2)) else - raise SyntaxError.new <<-eos + raise SyntaxError, <<-eos Syntax Error in tag 'highlight' while parsing the following markup: #{markup} @@ -42,15 +29,15 @@ def initialize(tag_name, markup, tokens) def render(context) prefix = context["highlighter_prefix"] || "" suffix = context["highlighter_suffix"] || "" - code = super.to_s.gsub(/\A(\n|\r)+|(\n|\r)+\z/, '') + code = super.to_s.gsub(/\A(\n|\r)+|(\n|\r)+\z/, "") is_safe = !!context.registers[:site].safe output = case context.registers[:site].highlighter - when 'pygments' + when "pygments" render_pygments(code, is_safe) - when 'rouge' + when "rouge" render_rouge(code) else render_codehighlighter(code) @@ -66,7 +53,7 @@ def sanitized_opts(opts, is_safe) [:startinline, opts.fetch(:startinline, nil)], [:hl_lines, opts.fetch(:hl_lines, nil)], [:linenos, opts.fetch(:linenos, nil)], - [:encoding, opts.fetch(:encoding, 'utf-8')], + [:encoding, opts.fetch(:encoding, "utf-8")], [:cssclass, opts.fetch(:cssclass, nil)] ].reject { |f| f.last.nil? }] else @@ -74,8 +61,30 @@ def sanitized_opts(opts, is_safe) end end + private + + def parse_options(input) + options = {} + if defined?(input) && input != "" + # Split along 3 possible forms -- key="", key=value, or key + input.scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt| + key, value = opt.split("=") + # If a quoted list, convert to array + if value && value.include?("\"") + value.delete!('"') + value = value.split + end + options[key.to_sym] = value || true + end + end + if options.key?(:linenos) && options[:linenos] == true + options[:linenos] = "inline" + end + options + end + def render_pygments(code, is_safe) - Jekyll::External.require_with_graceful_fail('pygments') + Jekyll::External.require_with_graceful_fail("pygments") highlighted_code = Pygments.highlight( code, @@ -84,22 +93,26 @@ def render_pygments(code, is_safe) ) if highlighted_code.nil? - Jekyll.logger.error "There was an error highlighting your code:" - puts - Jekyll.logger.error code - puts - Jekyll.logger.error "While attempting to convert the above code, Pygments.rb" \ - " returned an unacceptable value." - Jekyll.logger.error "This is usually a timeout problem solved by running `jekyll build` again." - raise ArgumentError.new("Pygments.rb returned an unacceptable value when attempting to highlight some code.") + Jekyll.logger.error <<-eos +There was an error highlighting your code: + +#{code} + +While attempting to convert the above code, Pygments.rb returned an unacceptable value. +This is usually a timeout problem solved by running `jekyll build` again. +eos + raise ArgumentError, "Pygments.rb returned an unacceptable value "\ + "when attempting to highlight some code." end - highlighted_code.sub('
    ', '').sub('
    ', '') + highlighted_code.sub('
    ', "").sub("
    ", "") end def render_rouge(code) - Jekyll::External.require_with_graceful_fail('rouge') - formatter = Rouge::Formatters::HTML.new(:line_numbers => @highlight_options[:linenos], :wrap => false) + Jekyll::External.require_with_graceful_fail("rouge") + formatter = Rouge::Formatters::HTML.new( + :line_numbers => @highlight_options[:linenos], :wrap => false + ) lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText formatter.format(lexer.lex(code)) end @@ -110,13 +123,14 @@ def render_codehighlighter(code) def add_code_tag(code) code_attributes = [ - "class=\"language-#{@lang.to_s.tr('+', '-')}\"", + "class=\"language-#{@lang.to_s.tr("+", "-")}\"", "data-lang=\"#{@lang}\"" ].join(" ") - "
    #{code.chomp}
    " + "
    "\
    +        "#{code.chomp}
    " end end end end -Liquid::Template.register_tag('highlight', Jekyll::Tags::HighlightBlock) +Liquid::Template.register_tag("highlight", Jekyll::Tags::HighlightBlock) From 0d1151191437e0da82a6a2cae7282cb8e137945a Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Tue, 24 May 2016 17:13:54 +0300 Subject: [PATCH 0843/4996] rubocop: fix link tag code style --- .rubocop.yml | 1 - lib/jekyll/tags/link.rb | 12 ++++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 50e89d45ef0..2dd1e114ff9 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -57,7 +57,6 @@ AllCops: - lib/jekyll/static_file.rb - lib/jekyll/stevenson.rb - lib/jekyll/tags/include.rb - - lib/jekyll/tags/link.rb - lib/jekyll/tags/post_url.rb - lib/jekyll/theme.rb - lib/jekyll/url.rb diff --git a/lib/jekyll/tags/link.rb b/lib/jekyll/tags/link.rb index f81e43b4fd1..b2be119942b 100644 --- a/lib/jekyll/tags/link.rb +++ b/lib/jekyll/tags/link.rb @@ -1,7 +1,7 @@ module Jekyll module Tags class Link < Liquid::Tag - TagName = 'link' + TAG_NAME = "link".freeze def initialize(tag_name, relative_path, tokens) super @@ -16,11 +16,15 @@ def render(context) return document.url if document.relative_path == @relative_path end - raise ArgumentError, "Could not find document '#{@relative_path}' in tag '#{TagName}'.\n\n" \ - "Make sure the document exists and the path is correct." + raise ArgumentError, < Date: Tue, 24 May 2016 17:23:25 +0300 Subject: [PATCH 0844/4996] rubocop: fix post URL tag code style --- .rubocop.yml | 1 - lib/jekyll/tags/post_url.rb | 13 +++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 2dd1e114ff9..f5dcc93aa73 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -57,7 +57,6 @@ AllCops: - lib/jekyll/static_file.rb - lib/jekyll/stevenson.rb - lib/jekyll/tags/include.rb - - lib/jekyll/tags/post_url.rb - lib/jekyll/theme.rb - lib/jekyll/url.rb - lib/jekyll/utils.rb diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index b05d056b848..2154c0cd961 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -1,14 +1,14 @@ module Jekyll module Tags class PostComparer - MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)$/ + MATCHER = %r!^(.+/)*(\d+-\d+-\d+)-(.*)$! attr_reader :path, :date, :slug, :name def initialize(name) @name = name - all, @path, @date, @slug = *name.sub(/^\//, "").match(MATCHER) + all, @path, @date, @slug = *name.sub(%r!^/!, "").match(MATCHER) unless all raise Jekyll::Errors::InvalidPostNameError, "'#{name}' does not contain valid date and/or title." @@ -42,9 +42,9 @@ def deprecated_equality(other) def post_slug(other) path = other.basename.split("/")[0...-1].join("/") if path.nil? || path == "" - other.data['slug'] + other.data["slug"] else - path + '/' + other.data['slug'] + path + "/" + other.data["slug"] end end end @@ -78,7 +78,8 @@ def render(context) site.posts.docs.each do |p| next unless @post.deprecated_equality p - Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{@post.name} }}' did not match " \ + Jekyll::Deprecator.deprecation_message "A call to "\ + "'{{ post_url #{@post.name} }}' did not match " \ "a post using the new matching method of checking name " \ "(path-date-slug) equality. Please make sure that you " \ "change this tag to match the post's name exactly." @@ -95,4 +96,4 @@ def render(context) end end -Liquid::Template.register_tag('post_url', Jekyll::Tags::PostUrl) +Liquid::Template.register_tag("post_url", Jekyll::Tags::PostUrl) From 2c567a6dc358221b810355807a7f4df3adf3f8c1 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 24 May 2016 16:36:50 -0500 Subject: [PATCH 0845/4996] Document normalize_whitepace filter --- site/_docs/templates.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 1c09cab0787..d46911e5e95 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -256,6 +256,17 @@ common tasks easier.

    + + +

    Normalize Whitespace

    +

    Replace any occurance of whitespace with a single space.

    + + +

    + {% raw %}{{ "a \n b" | normalize_whitepace }}{% endraw %} +

    + +

    Sort

    From b0192340074805e97ef63160ebaa95d8dcd76ec8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 May 2016 14:38:15 -0700 Subject: [PATCH 0846/4996] Add ExcerptDrop and remove excerpt's ability to refer to itself in Liquid --- lib/jekyll/drops/drop.rb | 2 +- lib/jekyll/drops/excerpt_drop.rb | 11 +++++++++++ lib/jekyll/excerpt.rb | 7 ++----- test/test_excerpt_drop.rb | 31 +++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 lib/jekyll/drops/excerpt_drop.rb create mode 100644 test/test_excerpt_drop.rb diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index d1bffcc5abd..6694595374f 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -3,7 +3,7 @@ module Jekyll module Drops class Drop < Liquid::Drop - NON_CONTENT_METHODS = [:[], :[]=, :inspect, :to_h, :fallback_data].freeze + NON_CONTENT_METHODS = [:[], :[]=, :inspect, :to_h, :fallback_data, :to_s].freeze # Get or set whether the drop class is mutable. # Mutability determines whether or not pre-defined fields may be diff --git a/lib/jekyll/drops/excerpt_drop.rb b/lib/jekyll/drops/excerpt_drop.rb new file mode 100644 index 00000000000..9c95a3550df --- /dev/null +++ b/lib/jekyll/drops/excerpt_drop.rb @@ -0,0 +1,11 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class ExcerptDrop < DocumentDrop + def excerpt + nil + end + end + end +end diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index f5884d682d8..8fef70ed944 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -7,7 +7,7 @@ class Excerpt attr_writer :output def_delegators :@doc, :site, :name, :ext, :relative_path, :extname, - :render_with_liquid?, :collection, :related_posts + :render_with_liquid?, :collection, :related_posts, :url # Initialize this Excerpt instance. # @@ -59,10 +59,7 @@ def to_s end def to_liquid - doc.data['excerpt'] = nil - @to_liquid ||= doc.to_liquid - doc.data['excerpt'] = self - @to_liquid + Jekyll::Drops::ExcerptDrop.new(self) end # Returns the shorthand String identifier of this doc. diff --git a/test/test_excerpt_drop.rb b/test/test_excerpt_drop.rb new file mode 100644 index 00000000000..2ca0f353586 --- /dev/null +++ b/test/test_excerpt_drop.rb @@ -0,0 +1,31 @@ +require 'helper' + +class TestExcerptDrop < JekyllUnitTest + context "an excerpt drop" do + setup do + @site = fixture_site + @site.read + @doc = @site.docs_to_write.first + @doc_drop = @doc.to_liquid + @excerpt = @doc.data['excerpt'] + @excerpt_drop = @excerpt.to_liquid + end + + should "have the right thing" do + assert @doc.is_a? Jekyll::Document + assert @doc_drop.is_a? Jekyll::Drops::DocumentDrop + assert @excerpt.is_a? Jekyll::Excerpt + assert @excerpt_drop.is_a? Jekyll::Drops::ExcerptDrop + end + + should "not have an excerpt" do + assert_nil @excerpt.data['excerpt'] + assert @excerpt_drop.class.invokable? 'excerpt' + assert_nil @excerpt_drop['excerpt'] + end + + should "inherit values from the document" do + assert_equal @excerpt_drop.keys, @doc_drop.keys + end + end +end From 3896f6d5d8929f3f9e14428703a769912cacb317 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 May 2016 16:42:35 -0700 Subject: [PATCH 0847/4996] Use require_relative --- test/helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/helper.rb b/test/helper.rb index 3a3dafa27ae..6904894f56f 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -28,7 +28,7 @@ def jruby? require "minitest/reporters" require "minitest/profile" require "rspec/mocks" -require "jekyll" +require_relative "../lib/jekyll.rb" Jekyll.logger = Logger.new(StringIO.new) From c0910f2bc553d45debf50c2438c77f009f547a9e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 May 2016 16:58:06 -0700 Subject: [PATCH 0848/4996] look up the content methods for drops in a smarter way --- lib/jekyll/drops/drop.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 6694595374f..b798c27a01c 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -3,7 +3,7 @@ module Jekyll module Drops class Drop < Liquid::Drop - NON_CONTENT_METHODS = [:[], :[]=, :inspect, :to_h, :fallback_data, :to_s].freeze + NON_CONTENT_METHODS = [:fallback_data].freeze # Get or set whether the drop class is mutable. # Mutability determines whether or not pre-defined fields may be @@ -86,7 +86,7 @@ def []=(key, val) # Returns an Array of strings which represent method-specific keys. def content_methods @content_methods ||= ( - self.class.instance_methods(false) - NON_CONTENT_METHODS + self.class.instance_methods - Jekyll::Drops::Drop.instance_methods - NON_CONTENT_METHODS ).map(&:to_s).reject do |method| method.end_with?("=") end From 7d3f8ac75dcb3274375c5a619d3c727f4305f1ca Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 May 2016 16:58:26 -0700 Subject: [PATCH 0849/4996] excerpt drop should give access to document's layout --- lib/jekyll/drops/excerpt_drop.rb | 4 ++++ test/test_excerpt_drop.rb | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/drops/excerpt_drop.rb b/lib/jekyll/drops/excerpt_drop.rb index 9c95a3550df..c70712fcf19 100644 --- a/lib/jekyll/drops/excerpt_drop.rb +++ b/lib/jekyll/drops/excerpt_drop.rb @@ -3,6 +3,10 @@ module Jekyll module Drops class ExcerptDrop < DocumentDrop + def layout + @obj.doc.data['layout'] + end + def excerpt nil end diff --git a/test/test_excerpt_drop.rb b/test/test_excerpt_drop.rb index 2ca0f353586..769aef06786 100644 --- a/test/test_excerpt_drop.rb +++ b/test/test_excerpt_drop.rb @@ -5,7 +5,7 @@ class TestExcerptDrop < JekyllUnitTest setup do @site = fixture_site @site.read - @doc = @site.docs_to_write.first + @doc = @site.docs_to_write.find { |d| !d.data['layout'].nil? } @doc_drop = @doc.to_liquid @excerpt = @doc.data['excerpt'] @excerpt_drop = @excerpt.to_liquid @@ -24,8 +24,13 @@ class TestExcerptDrop < JekyllUnitTest assert_nil @excerpt_drop['excerpt'] end + should "inherit the layout for the drop but not the excerpt" do + assert_nil @excerpt.data['layout'] + assert_equal @excerpt_drop['layout'], @doc_drop['layout'] + end + should "inherit values from the document" do - assert_equal @excerpt_drop.keys, @doc_drop.keys + assert_equal @excerpt_drop.keys.sort, @doc_drop.keys.sort end end end From 48f16974ce35c173f1c34adecba902a775b47069 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 24 May 2016 18:27:37 -0500 Subject: [PATCH 0850/4996] Rubocop fixes --- lib/jekyll/drops/excerpt_drop.rb | 2 +- test/test_excerpt_drop.rb | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/drops/excerpt_drop.rb b/lib/jekyll/drops/excerpt_drop.rb index c70712fcf19..5d61aeb1b2d 100644 --- a/lib/jekyll/drops/excerpt_drop.rb +++ b/lib/jekyll/drops/excerpt_drop.rb @@ -4,7 +4,7 @@ module Jekyll module Drops class ExcerptDrop < DocumentDrop def layout - @obj.doc.data['layout'] + @obj.doc.data["layout"] end def excerpt diff --git a/test/test_excerpt_drop.rb b/test/test_excerpt_drop.rb index 769aef06786..f8c75f9a47c 100644 --- a/test/test_excerpt_drop.rb +++ b/test/test_excerpt_drop.rb @@ -1,13 +1,13 @@ -require 'helper' +require "helper" class TestExcerptDrop < JekyllUnitTest context "an excerpt drop" do setup do @site = fixture_site @site.read - @doc = @site.docs_to_write.find { |d| !d.data['layout'].nil? } + @doc = @site.docs_to_write.find { |d| !d.data["layout"].nil? } @doc_drop = @doc.to_liquid - @excerpt = @doc.data['excerpt'] + @excerpt = @doc.data["excerpt"] @excerpt_drop = @excerpt.to_liquid end @@ -19,14 +19,14 @@ class TestExcerptDrop < JekyllUnitTest end should "not have an excerpt" do - assert_nil @excerpt.data['excerpt'] - assert @excerpt_drop.class.invokable? 'excerpt' - assert_nil @excerpt_drop['excerpt'] + assert_nil @excerpt.data["excerpt"] + assert @excerpt_drop.class.invokable? "excerpt" + assert_nil @excerpt_drop["excerpt"] end should "inherit the layout for the drop but not the excerpt" do - assert_nil @excerpt.data['layout'] - assert_equal @excerpt_drop['layout'], @doc_drop['layout'] + assert_nil @excerpt.data["layout"] + assert_equal @excerpt_drop["layout"], @doc_drop["layout"] end should "inherit values from the document" do From c69ca4c11eac808a3cc8ec28286fea8a9ce7d7f8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Apr 2016 11:49:10 -0700 Subject: [PATCH 0851/4996] Test#build_configs shouldn't overwrite default collections --- test/helper.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index 3a3dafa27ae..37c51d580a8 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -85,9 +85,12 @@ def fixture_site(overrides = {}) Jekyll::Site.new(site_configuration(overrides)) end - def build_configs(overrides, base_hash = Jekyll::Configuration::DEFAULTS) + def default_configuration + Marshal.load(Marshal.dump(Jekyll::Configuration::DEFAULTS)) + end + + def build_configs(overrides, base_hash = default_configuration) Utils.deep_merge_hashes(base_hash, overrides) - .fix_common_issues.backwards_compatibilize.add_default_collections end def site_configuration(overrides = {}) @@ -97,7 +100,10 @@ def site_configuration(overrides = {}) })) build_configs({ "source" => source_dir - }, full_overrides) + }, full_overrides). + fix_common_issues. + backwards_compatibilize. + add_default_collections end def dest_dir(*subdirs) From f2263a11b73091f0b94b8c6fe6f467e0a96b2d3d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Apr 2016 11:49:24 -0700 Subject: [PATCH 0852/4996] Only write collections.posts.permalink if permalink is set. --- lib/jekyll/configuration.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 87bfeb46015..5b5bb2dfad0 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -72,7 +72,7 @@ class Configuration < Hash 'hard_wrap' => false, 'footnote_nr' => 1 } - }] + }].freeze # Public: Turn all keys into string # @@ -271,14 +271,20 @@ def fix_common_issues def add_default_collections config = clone + # It defaults to `{}`, so this is only if someone sets it to null manually. return config if config['collections'].nil? + # Ensure we have a hash. if config['collections'].is_a?(Array) config['collections'] = Hash[config['collections'].map { |c| [c, {}] }] end + + # Add posts. config['collections']['posts'] ||= {} config['collections']['posts']['output'] = true - config['collections']['posts']['permalink'] = style_to_permalink(config['permalink']) + if config['permalink'] + config['collections']['posts']['permalink'] ||= style_to_permalink(config['permalink']) + end config end From dbcbf809ff6cc7b0a33f231a42523f480acd1a90 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Apr 2016 13:12:30 -0700 Subject: [PATCH 0853/4996] Refactor some tests to prevent manipulation of Jekyll::Config::DEFAULTS --- test/helper.rb | 33 +++++++++----- test/test_configuration.rb | 40 +++++++++++------ test/test_front_matter_defaults.rb | 70 +++++++++++++----------------- test/test_generated_site.rb | 17 ++------ test/test_site.rb | 14 +++--- 5 files changed, 87 insertions(+), 87 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index 37c51d580a8..90c806a02c6 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -58,11 +58,32 @@ def assert_exist(filename, msg = nil) def refute_exist(filename, msg = nil) msg = message(msg) { "Expected '#{filename}' not to exist" } refute File.exist?(filename), msg +end + +module DirectoryHelpers + def dest_dir(*subdirs) + test_dir('dest', *subdirs) + end + + def source_dir(*subdirs) + test_dir('source', *subdirs) + end + + def test_dir(*subdirs) + File.join(File.dirname(__FILE__), *subdirs) end end class JekyllUnitTest < Minitest::Test include ::RSpec::Mocks::ExampleMethods + include DirectoryHelpers + extend DirectoryHelpers + + def mu_pp obj + s = obj.is_a?(Hash) ? JSON.pretty_generate(obj) : obj.inspect + s = s.encode Encoding.default_external if defined? Encoding + s + end def mocks_expect(*args) RSpec::Mocks::ExampleMethods::ExpectHost.instance_method(:expect)\ @@ -106,23 +127,11 @@ def site_configuration(overrides = {}) add_default_collections end - def dest_dir(*subdirs) - test_dir("dest", *subdirs) - end - - def source_dir(*subdirs) - test_dir("source", *subdirs) - end - def clear_dest FileUtils.rm_rf(dest_dir) FileUtils.rm_rf(source_dir(".jekyll-metadata")) end - def test_dir(*subdirs) - File.join(File.dirname(__FILE__), *subdirs) - end - def directory_with_contents(path) FileUtils.rm_rf(path) FileUtils.mkdir(path) diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 608dfef0c07..33800d2f13d 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -1,7 +1,10 @@ require 'helper' class TestConfiguration < JekyllUnitTest - @@defaults = Jekyll::Configuration::DEFAULTS.add_default_collections.freeze + @@test_config = { + "source" => new(nil).source_dir, + "destination" => dest_dir + } context "#stringify_keys" do setup do @@ -154,27 +157,27 @@ class TestConfiguration < JekyllUnitTest end context "loading configuration" do setup do - @path = File.join(Dir.pwd, '_config.yml') + @path = source_dir('_config.yml') @user_config = File.join(Dir.pwd, "my_config_file.yml") end should "fire warning with no _config.yml" do allow(SafeYAML).to receive(:load_file).with(@path) { raise SystemCallError, "No such file or directory - #{@path}" } allow($stderr).to receive(:puts).with("Configuration file: none".yellow) - assert_equal @@defaults, Jekyll.configuration({}) + assert_equal site_configuration, Jekyll.configuration(@@test_config) end should "load configuration as hash" do allow(SafeYAML).to receive(:load_file).with(@path).and_return(Hash.new) allow($stdout).to receive(:puts).with("Configuration file: #{@path}") - assert_equal @@defaults, Jekyll.configuration({}) + assert_equal site_configuration, Jekyll.configuration(@@test_config) end should "fire warning with bad config" do allow(SafeYAML).to receive(:load_file).with(@path).and_return(Array.new) allow($stderr).to receive(:puts).and_return(("WARNING: ".rjust(20) + "Error reading configuration. Using defaults (and options).").yellow) allow($stderr).to receive(:puts).and_return("Configuration file: (INVALID) #{@path}".yellow) - assert_equal @@defaults, Jekyll.configuration({}) + assert_equal site_configuration, Jekyll.configuration(@@test_config) end should "fire warning when user-specified config file isn't there" do @@ -193,8 +196,8 @@ class TestConfiguration < JekyllUnitTest context "loading config from external file" do setup do @paths = { - :default => File.join(Dir.pwd, '_config.yml'), - :other => File.join(Dir.pwd, '_config.live.yml'), + :default => source_dir('_config.yml'), + :other => source_dir('_config.live.yml'), :toml => source_dir('_config.dev.toml'), :empty => "" } @@ -203,24 +206,31 @@ class TestConfiguration < JekyllUnitTest should "load default plus posts config if no config_file is set" do allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") - assert_equal @@defaults, Jekyll.configuration({}) + assert_equal site_configuration, Jekyll.configuration(@@test_config) end should "load different config if specified" do allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return({"baseurl" => "http://wahoo.dev"}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") - assert_equal Utils.deep_merge_hashes(@@defaults, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => @paths[:other] }) + Jekyll.configuration({ "config" => @paths[:other] }) + assert_equal \ + site_configuration({ "baseurl" => "http://wahoo.dev" }), + Jekyll.configuration(@@test_config.merge({ "config" => @paths[:other] })) end should "load default config if path passed is empty" do allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") - assert_equal @@defaults, Jekyll.configuration({ "config" => @paths[:empty] }) + assert_equal \ + site_configuration, + Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:empty]] })) end should "successfully load a TOML file" do Jekyll.logger.log_level = :warn - assert_equal @@defaults.clone.merge({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), Jekyll.configuration({ "config" => [@paths[:toml]] }) + assert_equal \ + site_configuration({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), + Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:toml]] })) Jekyll.logger.log_level = :info end @@ -233,7 +243,9 @@ class TestConfiguration < JekyllUnitTest allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:toml]}") - assert_equal @@defaults, Jekyll.configuration({ "config" => [@paths[:default], @paths[:other], @paths[:toml]] }) + assert_equal \ + site_configuration, + Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:default], @paths[:other], @paths[:toml]] })) end should "load multiple config files and last config should win" do @@ -241,7 +253,9 @@ class TestConfiguration < JekyllUnitTest allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return({"baseurl" => "http://wahoo.dev"}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") - assert_equal Utils.deep_merge_hashes(@@defaults, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] }) + assert_equal \ + site_configuration({ "baseurl" => "http://wahoo.dev" }), + Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:default], @paths[:other]] })) end end end diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index f1b55ac164c..c85314d21c1 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -3,11 +3,9 @@ class TestFrontMatterDefaults < JekyllUnitTest context "A site with full front matter defaults" do setup do - @site = Site.new(Jekyll.configuration({ - "source" => source_dir, - "destination" => dest_dir, - "defaults" => [{ - "scope" => { + @site = fixture_site({ + "defaults" => [{ + "scope" => { "path" => "contacts", "type" => "page" }, @@ -15,7 +13,7 @@ class TestFrontMatterDefaults < JekyllUnitTest "key" => "val" } }] - })) + }) @site.process @affected = @site.pages.find { |page| page.relative_path == "/contacts/bar.html" } @not_affected = @site.pages.find { |page| page.relative_path == "about.html" } @@ -29,18 +27,16 @@ class TestFrontMatterDefaults < JekyllUnitTest context "A site with front matter type pages and an extension" do setup do - @site = Site.new(Jekyll.configuration({ - "source" => source_dir, - "destination" => dest_dir, - "defaults" => [{ - "scope" => { + @site = fixture_site({ + "defaults" => [{ + "scope" => { "path" => "index.html" }, "values" => { "key" => "val" } }] - })) + }) @site.process @affected = @site.pages.find { |page| page.relative_path == "index.html" } @@ -55,18 +51,17 @@ class TestFrontMatterDefaults < JekyllUnitTest context "A site with front matter defaults with no type" do setup do - @site = Site.new(Jekyll.configuration({ - "source" => source_dir, - "destination" => dest_dir, - "defaults" => [{ - "scope" => { + @site = fixture_site({ + "defaults" => [{ + "scope" => { "path" => "win" }, "values" => { "key" => "val" } }] - })) + }) + @site.process @affected = @site.posts.docs.find { |page| page.relative_path =~ %r!win\/! } @not_affected = @site.pages.find { |page| page.relative_path == "about.html" } @@ -80,18 +75,17 @@ class TestFrontMatterDefaults < JekyllUnitTest context "A site with front matter defaults with no path and a deprecated type" do setup do - @site = Site.new(Jekyll.configuration({ - "source" => source_dir, - "destination" => dest_dir, - "defaults" => [{ - "scope" => { + @site = fixture_site({ + "defaults" => [{ + "scope" => { "type" => "page" }, "values" => { "key" => "val" } }] - })) + }) + @site.process @affected = @site.pages @not_affected = @site.posts.docs @@ -106,18 +100,16 @@ class TestFrontMatterDefaults < JekyllUnitTest context "A site with front matter defaults with no path" do setup do - @site = Site.new(Jekyll.configuration({ - "source" => source_dir, - "destination" => dest_dir, - "defaults" => [{ - "scope" => { + @site = fixture_site({ + "defaults" => [{ + "scope" => { "type" => "pages" }, "values" => { "key" => "val" } }] - })) + }) @site.process @affected = @site.pages @not_affected = @site.posts.docs @@ -132,17 +124,15 @@ class TestFrontMatterDefaults < JekyllUnitTest context "A site with front matter defaults with no path or type" do setup do - @site = Site.new(Jekyll.configuration({ - "source" => source_dir, - "destination" => dest_dir, - "defaults" => [{ - "scope" => { + @site = fixture_site({ + "defaults" => [{ + "scope" => { }, "values" => { "key" => "val" } }] - })) + }) @site.process @affected = @site.pages @not_affected = @site.posts @@ -156,15 +146,13 @@ class TestFrontMatterDefaults < JekyllUnitTest context "A site with front matter defaults with no scope" do setup do - @site = Site.new(Jekyll.configuration({ - "source" => source_dir, - "destination" => dest_dir, - "defaults" => [{ + @site = fixture_site({ + "defaults" => [{ "values" => { "key" => "val" } }] - })) + }) @site.process @affected = @site.pages @not_affected = @site.posts diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 0a24172c468..6b676d936f6 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -4,8 +4,6 @@ class TestGeneratedSite < JekyllUnitTest context "generated sites" do setup do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, - "destination" => dest_dir }) @site = fixture_site(config) @site.process @@ -80,24 +78,15 @@ class TestGeneratedSite < JekyllUnitTest should "ensure limit posts is 0 or more" do assert_raises ArgumentError do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({ - "source" => source_dir, - "destination" => dest_dir, - "limit_posts" => -1 - }) - @site = fixture_site(config) + + @site = fixture_site("limit_posts" => -1) end end should "acceptable limit post is 0" do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({ - "source" => source_dir, - "destination" => dest_dir, - "limit_posts" => 0 - }) - assert Site.new(config), "Couldn't create a site with the given limit_posts." + assert fixture_site("limit_posts" => 0), "Couldn't create a site with limit_posts=0." end end end diff --git a/test/test_site.rb b/test/test_site.rb index bce20bfa304..89f646ed2bb 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -3,7 +3,7 @@ class TestSite < JekyllUnitTest context "configuring sites" do should "have an array for plugins by default" do - site = Site.new(Jekyll::Configuration::DEFAULTS) + site = Site.new default_configuration assert_equal [File.join(Dir.pwd, '_plugins')], site.plugins end @@ -13,32 +13,32 @@ class TestSite < JekyllUnitTest end should "have an array for plugins if passed as a string" do - site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins_dir' => '/tmp/plugins'})) + site = Site.new(build_configs({ 'plugins_dir' => '/tmp/plugins' })) assert_equal ['/tmp/plugins'], site.plugins end should "have an array for plugins if passed as an array" do - site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins_dir' => ['/tmp/plugins', '/tmp/otherplugins']})) + site = Site.new(build_configs({ 'plugins_dir' => ['/tmp/plugins', '/tmp/otherplugins'] })) assert_equal ['/tmp/plugins', '/tmp/otherplugins'], site.plugins end should "have an empty array for plugins if nothing is passed" do - site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins_dir' => []})) + site = Site.new(build_configs({ 'plugins_dir' => [] })) assert_equal [], site.plugins end should "have an empty array for plugins if nil is passed" do - site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins_dir' => nil})) + site = Site.new(build_configs({ 'plugins_dir' => nil })) assert_equal [], site.plugins end should "expose default baseurl" do - site = Site.new(Jekyll::Configuration::DEFAULTS) + site = Site.new(default_configuration) assert_equal Jekyll::Configuration::DEFAULTS['baseurl'], site.baseurl end should "expose baseurl passed in from config" do - site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'baseurl' => '/blog'})) + site = Site.new(build_configs({ 'baseurl' => '/blog' })) assert_equal '/blog', site.baseurl end end From 04d44731190ea19afe5547ac5b0f7928d4af1381 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Apr 2016 13:13:06 -0700 Subject: [PATCH 0854/4996] Use Marshal to duplicate configuration defaults to prevent manipulation --- lib/jekyll.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index e9f4547b3c6..cee9905d4f1 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -99,7 +99,7 @@ def env # # Returns the final configuration Hash. def configuration(override = {}) - config = Configuration[Configuration::DEFAULTS] + config = Configuration[Marshal.load(Marshal.dump(Configuration::DEFAULTS))] override = Configuration[override].stringify_keys unless override.delete('skip_config_files') config = config.read_config_files(config.config_files(override)) From 6eaa8e90f8fe8fff5bac0853b5a13690745b0cdd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Apr 2016 13:13:23 -0700 Subject: [PATCH 0855/4996] Don't read a config file if the filename is empty. --- lib/jekyll/configuration.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 5b5bb2dfad0..4c36341d12c 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -169,6 +169,7 @@ def read_config_files(files) begin files.each do |config_file| + next if config_file.nil? or config_file.empty? new_config = read_config_file(config_file) configuration = Utils.deep_merge_hashes(configuration, new_config) end From 4e06f07ad436badfbc031175041c61319ba3da2e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Apr 2016 13:56:40 -0700 Subject: [PATCH 0856/4996] Add tests for Configuration#add_default_collections --- test/test_configuration.rb | 54 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 33800d2f13d..fb545629f15 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -258,4 +258,58 @@ class TestConfiguration < JekyllUnitTest Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:default], @paths[:other]] })) end end + + context "#add_default_collections" do + should "not do anything if collections is nil" do + conf = Configuration[default_configuration].tap {|c| c['collections'] = nil } + assert_equal conf.add_default_collections, conf + assert_nil conf.add_default_collections['collections'] + end + + should "converts collections to a hash if an array" do + conf = Configuration[default_configuration].tap {|c| c['collections'] = ['docs'] } + assert_equal conf.add_default_collections, conf.merge({ + "collections" => { + "docs" => {}, + "posts" => { + "output" => true, + "permalink" => "/:categories/:year/:month/:day/:title.html" + }}}) + end + + should "force collections.posts.output = true" do + conf = Configuration[default_configuration].tap {|c| c['collections'] = {'posts' => {'output' => false}} } + assert_equal conf.add_default_collections, conf.merge({ + "collections" => { + "posts" => { + "output" => true, + "permalink" => "/:categories/:year/:month/:day/:title.html" + }}}) + end + + should "set collections.posts.permalink if it's not set" do + conf = Configuration[default_configuration] + assert_equal conf.add_default_collections, conf.merge({ + "collections" => { + "posts" => { + "output" => true, + "permalink" => "/:categories/:year/:month/:day/:title.html" + }}}) + end + + should "leave collections.posts.permalink alone if it is set" do + posts_permalink = "/:year/:title/" + conf = Configuration[default_configuration].tap do |c| + c['collections'] = { + "posts" => { "permalink" => posts_permalink } + } + end + assert_equal conf.add_default_collections, conf.merge({ + "collections" => { + "posts" => { + "output" => true, + "permalink" => posts_permalink + }}}) + end + end end From fab092fcece39345b090b7301511df4bbc16591a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 4 Apr 2016 14:45:09 -0700 Subject: [PATCH 0857/4996] Remove use of Marshal in runtime code. --- lib/jekyll.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index cee9905d4f1..e9f4547b3c6 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -99,7 +99,7 @@ def env # # Returns the final configuration Hash. def configuration(override = {}) - config = Configuration[Marshal.load(Marshal.dump(Configuration::DEFAULTS))] + config = Configuration[Configuration::DEFAULTS] override = Configuration[override].stringify_keys unless override.delete('skip_config_files') config = config.read_config_files(config.config_files(override)) From d01f7943debf08dee645990ddb0e00d59cf846bb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 8 Apr 2016 10:00:03 -0700 Subject: [PATCH 0858/4996] Add Configuration.from & use in Jekyll.configuration. This process streamlines the creation of new configurations. Creating a new site will choke if not all the correct options are given. Configuration.from will ensure the overrides have all string keys and ensures all the common issues & defaults are in place so a Site can be created. A common use: config = Configuration.from({ 'permalink' => '/:title/' }) # etc site = Jekyll::Site.new(config) --- lib/jekyll.rb | 7 +++---- lib/jekyll/configuration.rb | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index e9f4547b3c6..0d680842f0f 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -98,15 +98,14 @@ def env # list of option names and their defaults. # # Returns the final configuration Hash. - def configuration(override = {}) - config = Configuration[Configuration::DEFAULTS] - override = Configuration[override].stringify_keys + def configuration(override = Hash.new) + config = Configuration.new unless override.delete('skip_config_files') config = config.read_config_files(config.config_files(override)) end # Merge DEFAULTS < _config.yml < override - config = Utils.deep_merge_hashes(config, override).stringify_keys + config = Configuration.from Utils.deep_merge_hashes(config, override).stringify_keys set_timezone(config['timezone']) if config['timezone'] config diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 4c36341d12c..4af19a63fb2 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -74,6 +74,23 @@ class Configuration < Hash } }].freeze + class << self + # Static: Produce a Configuration ready for use in a Site. + # It takes the input, fills in the defaults where values do not + # exist, and patches common issues including migrating options for + # backwards compatiblity. Except where a key or value is being fixed, + # the user configuration will override the defaults. + # + # user_config - a Hash or Configuration of overrides. + # + # Returns a Configuration filled with defaults and fixed for common + # problems and backwards-compatibility. + def from(user_config) + Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys). + fix_common_issues.backwards_compatibilize.add_default_collections + end + end + # Public: Turn all keys into string # # Return a copy of the hash where all its keys are strings @@ -237,7 +254,7 @@ def backwards_compatibilize " as a list of comma-separated values." config[option] = csv_to_array(config[option]) end - config[option].map!(&:to_s) + config[option].map!(&:to_s) if config[option] end if (config['kramdown'] || {}).key?('use_coderay') From f52a0e7200957362d8078adc3c15cda303543e43 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 8 Apr 2016 10:49:08 -0700 Subject: [PATCH 0859/4996] Configuration#add_default_collections: fix bug where DEFAULTS['collections'] is modified --- lib/jekyll/configuration.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 4af19a63fb2..03547604d3e 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -297,11 +297,13 @@ def add_default_collections config['collections'] = Hash[config['collections'].map { |c| [c, {}] }] end - # Add posts. - config['collections']['posts'] ||= {} - config['collections']['posts']['output'] = true - if config['permalink'] - config['collections']['posts']['permalink'] ||= style_to_permalink(config['permalink']) + config['collections'] = Utils.deep_merge_hashes( + { 'posts' => {} }, config['collections'] + ).tap do |collections| + collections['posts']['output'] = true + if config['permalink'] + collections['posts']['permalink'] ||= style_to_permalink(config['permalink']) + end end config From 8af77643c5d63eb5b241f410e34e728eeeef71b2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 8 Apr 2016 10:50:58 -0700 Subject: [PATCH 0860/4996] Site#site_payload: sort collections by label --- lib/jekyll/drops/site_drop.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index 4d07ebe8f4a..7b083126a2f 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -28,7 +28,7 @@ def html_pages end def collections - @site_collections ||= @obj.collections.values.map(&:to_liquid) + @site_collections ||= @obj.collections.values.sort_by(&:label).map(&:to_liquid) end private From 59346eb2285e9b122c0efabbbe03e715382b7723 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 26 Apr 2016 17:02:16 -0700 Subject: [PATCH 0861/4996] Remove call to #backwards_compatibilize in Configuration.from --- lib/jekyll/configuration.rb | 2 +- test/test_configuration.rb | 52 +++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 03547604d3e..a08c284c635 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -87,7 +87,7 @@ class << self # problems and backwards-compatibility. def from(user_config) Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys). - fix_common_issues.backwards_compatibilize.add_default_collections + fix_common_issues.add_default_collections end end diff --git a/test/test_configuration.rb b/test/test_configuration.rb index fb545629f15..6322835d552 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -6,6 +6,58 @@ class TestConfiguration < JekyllUnitTest "destination" => dest_dir } + context ".from" do + should "create a Configuration object" do + assert_instance_of Configuration, Configuration.from({}) + end + + should "merge input over defaults" do + result = Configuration.from({"source" => "blah"}) + refute_equal result["source"], Configuration::DEFAULTS["source"] + assert_equal result["source"], "blah" + end + + should "fix common mistakes" do + result = Configuration.from({"paginate" => 0}) + assert_nil result["paginate"], "Expected 'paginate' to be corrected to 'nil', but was #{result["paginate"].inspect}" + end + + should "add default collections" do + result = Configuration.from({}) + assert_equal result["collections"], {"posts" => {"output" => true, "permalink" => "/:categories/:year/:month/:day/:title.html"}} + end + + should "NOT backwards-compatibilize" do + assert Configuration.from("watch" => true)["watch"], "Expected the 'watch' key to not be removed." + end + end + + context "#add_default_collections" do + should "no-op if collections is nil" do + result = Configuration[{"collections" => nil}].add_default_collections + assert_nil result["collections"] + end + + should "turn an array into a hash" do + result = Configuration[{"collections" => %w{methods}}].add_default_collections + assert_instance_of Hash, result["collections"] + assert_equal result["collections"], {"posts" => {"output" => true}, "methods" => {}} + end + + should "only assign collections.posts.permalink if a permalink is specified" do + result = Configuration[{"permalink" => "pretty", "collections" => {}}].add_default_collections + assert_equal result["collections"], {"posts" => {"output" => true, "permalink" => "/:categories/:year/:month/:day/:title/"}} + + result = Configuration[{"permalink" => nil, "collections" => {}}].add_default_collections + assert_equal result["collections"], {"posts" => {"output" => true}} + end + + should "forces posts to output" do + result = Configuration[{"collections" => {"posts" => {"output" => false}}}].add_default_collections + assert_equal result["collections"]["posts"]["output"], true + end + end + context "#stringify_keys" do setup do @mixed_keys = Configuration[{ From 37b93f10dd880d6561037c916bf5571f3296f4d3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 11:31:22 -0700 Subject: [PATCH 0862/4996] Add missing 'end' to test/helper.rb --- test/helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/helper.rb b/test/helper.rb index 90c806a02c6..5668f2ec890 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -58,6 +58,7 @@ def assert_exist(filename, msg = nil) def refute_exist(filename, msg = nil) msg = message(msg) { "Expected '#{filename}' not to exist" } refute File.exist?(filename), msg + end end module DirectoryHelpers From ad59b6e62a68219ee82f3df4f45b8cb375e77457 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 11:36:57 -0700 Subject: [PATCH 0863/4996] Remove merge conflicts I forgot to fix. --- test/test_generated_site.rb | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 6b676d936f6..0b425b130e6 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -5,7 +5,7 @@ class TestGeneratedSite < JekyllUnitTest setup do clear_dest - @site = fixture_site(config) + @site = fixture_site @site.process @index = File.read(dest_dir("index.html")) end @@ -63,10 +63,7 @@ class TestGeneratedSite < JekyllUnitTest context "generating limited posts" do setup do clear_dest - config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, - "destination" => dest_dir, - "limit_posts" => 5 }) - @site = fixture_site(config) + @site = fixture_site("limit_posts" => 5) @site.process @index = File.read(dest_dir("index.html")) end @@ -78,14 +75,12 @@ class TestGeneratedSite < JekyllUnitTest should "ensure limit posts is 0 or more" do assert_raises ArgumentError do clear_dest - @site = fixture_site("limit_posts" => -1) end end should "acceptable limit post is 0" do clear_dest - assert fixture_site("limit_posts" => 0), "Couldn't create a site with limit_posts=0." end end From d84844c2230948082de7a9270023f732a4542bb0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 12:48:42 -0700 Subject: [PATCH 0864/4996] Freeze configuration defaults & duplicate in deep_merge_hashes if need be. --- lib/jekyll/configuration.rb | 2 +- lib/jekyll/utils.rb | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index a08c284c635..475aa4e6dc8 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -72,7 +72,7 @@ class Configuration < Hash 'hard_wrap' => false, 'footnote_nr' => 1 } - }].freeze + }.map { |k, v| [k, v.freeze] }].freeze class << self # Static: Produce a Configuration ready for use in a Site. diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 179981ec83c..a70a7916739 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -54,6 +54,10 @@ def deep_merge_hashes!(target, overwrite) target.default_proc = overwrite.default_proc end + target.each do |key, val| + target[key] = val.dup if val.frozen? && duplicable?(val) + end + target end @@ -61,6 +65,15 @@ def mergable?(value) value.is_a?(Hash) || value.is_a?(Drops::Drop) end + def duplicable?(obj) + case obj + when nil, false, true, Symbol, Numeric + false + else + true + end + end + # Read array from the supplied hash favouring the singular key # and then the plural key, and handling any nil entries. # From de5970ae55503b0c6fb6bf72464d7fe093b306e3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 12:49:06 -0700 Subject: [PATCH 0865/4996] Fix some minor things in the tests --- lib/jekyll.rb | 7 +++---- test/test_configuration.rb | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 0d680842f0f..0786351737c 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -105,10 +105,9 @@ def configuration(override = Hash.new) end # Merge DEFAULTS < _config.yml < override - config = Configuration.from Utils.deep_merge_hashes(config, override).stringify_keys - set_timezone(config['timezone']) if config['timezone'] - - config + Configuration.from(Utils.deep_merge_hashes(config, override)).tap do |config| + set_timezone(config['timezone']) if config['timezone'] + end end # Public: Set the TZ environment variable to use the timezone specified diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 6322835d552..08cc3bd9bfd 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -24,7 +24,7 @@ class TestConfiguration < JekyllUnitTest should "add default collections" do result = Configuration.from({}) - assert_equal result["collections"], {"posts" => {"output" => true, "permalink" => "/:categories/:year/:month/:day/:title.html"}} + assert_equal result["collections"], {"posts" => {"output" => true, "permalink" => "/:categories/:year/:month/:day/:title:output_ext"}} end should "NOT backwards-compatibilize" do @@ -325,7 +325,7 @@ class TestConfiguration < JekyllUnitTest "docs" => {}, "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title.html" + "permalink" => "/:categories/:year/:month/:day/:title:output_ext" }}}) end @@ -335,7 +335,7 @@ class TestConfiguration < JekyllUnitTest "collections" => { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title.html" + "permalink" => "/:categories/:year/:month/:day/:title:output_ext" }}}) end @@ -345,7 +345,7 @@ class TestConfiguration < JekyllUnitTest "collections" => { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title.html" + "permalink" => "/:categories/:year/:month/:day/:title:output_ext" }}}) end From d5c3785d293bd739c9439c35eada422442c3e4e4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 12:49:23 -0700 Subject: [PATCH 0866/4996] Don't default 'include' and 'exclude' to an empty array --- lib/jekyll/configuration.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 475aa4e6dc8..a88272cc393 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -246,7 +246,6 @@ def backwards_compatibilize end %w(include exclude).each do |option| - config[option] ||= [] if config[option].is_a?(String) Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" \ " must now be specified as an array, but you specified" \ From 48274244e39c5574a8df24648a911fe672e3dcee Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 12:53:08 -0700 Subject: [PATCH 0867/4996] Define Drop#each so we can use the new frozen/duping behavior --- lib/jekyll/drops/drop.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index d1bffcc5abd..7dc829d7d78 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -147,6 +147,12 @@ def each_key(&block) keys.each(&block) end + def each(&block) + each_key.each do |key| + yield key, self[key] + end + end + def merge(other, &block) self.dup.tap do |me| if block.nil? From 7641971d7e355a8041bec96b8ce843b89f5daebc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 14:49:21 -0700 Subject: [PATCH 0868/4996] Fix tests for plugins in configuration. --- lib/jekyll/plugin_manager.rb | 2 +- test/test_site.rb | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index 45eeaa79506..5acd0e46e57 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -76,7 +76,7 @@ def require_plugin_files # # Returns an Array of plugin search paths def plugins_path - if site.config['plugins_dir'] == Jekyll::Configuration::DEFAULTS['plugins_dir'] + if site.config['plugins_dir'].eql? Jekyll::Configuration::DEFAULTS['plugins_dir'] [site.in_source_dir(site.config['plugins_dir'])] else Array(site.config['plugins_dir']).map { |d| File.expand_path(d) } diff --git a/test/test_site.rb b/test/test_site.rb index 89f646ed2bb..5e52a7c9405 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -9,27 +9,27 @@ class TestSite < JekyllUnitTest should "look for plugins under the site directory by default" do site = Site.new(site_configuration) - assert_equal [File.join(source_dir, '_plugins')], site.plugins + assert_equal [source_dir('_plugins')], site.plugins end should "have an array for plugins if passed as a string" do - site = Site.new(build_configs({ 'plugins_dir' => '/tmp/plugins' })) + site = Site.new(site_configuration({ 'plugins_dir' => '/tmp/plugins' })) assert_equal ['/tmp/plugins'], site.plugins end should "have an array for plugins if passed as an array" do - site = Site.new(build_configs({ 'plugins_dir' => ['/tmp/plugins', '/tmp/otherplugins'] })) + site = Site.new(site_configuration({ 'plugins_dir' => ['/tmp/plugins', '/tmp/otherplugins'] })) assert_equal ['/tmp/plugins', '/tmp/otherplugins'], site.plugins end should "have an empty array for plugins if nothing is passed" do - site = Site.new(build_configs({ 'plugins_dir' => [] })) + site = Site.new(site_configuration({ 'plugins_dir' => [] })) assert_equal [], site.plugins end - should "have an empty array for plugins if nil is passed" do - site = Site.new(build_configs({ 'plugins_dir' => nil })) - assert_equal [], site.plugins + should "have the default for plugins if nil is passed" do + site = Site.new(site_configuration({ 'plugins_dir' => nil })) + assert_equal [source_dir('_plugins')], site.plugins end should "expose default baseurl" do @@ -38,7 +38,7 @@ class TestSite < JekyllUnitTest end should "expose baseurl passed in from config" do - site = Site.new(build_configs({ 'baseurl' => '/blog' })) + site = Site.new(site_configuration({ 'baseurl' => '/blog' })) assert_equal '/blog', site.baseurl end end From a99adcafaa01fecd4f3bda1a781b538be720084c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 09:48:09 -0700 Subject: [PATCH 0869/4996] Add failing test for layout bug (#4897) --- features/layout_data.feature | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/features/layout_data.feature b/features/layout_data.feature index 789986651b4..8f085777565 100644 --- a/features/layout_data.feature +++ b/features/layout_data.feature @@ -35,3 +35,31 @@ Feature: Layout data When I run jekyll build Then the "_site/index.html" file should exist And I should see "page content\n foo: my custom data" in "_site/index.html" + + Scenario: Inherit custom layout data + Given I have a _layouts directory + And I have a "_layouts/default.html" file with content: + """ + {{ content }} foo: '{{ layout.foo }}' + """ + And I have a "_layouts/special.html" file with content: + """ + --- + layout: default + foo: my special data + --- + {{ content }} + """ + And I have a "_layouts/page.html" file with content: + """ + --- + layout: default + --- + {{ content }} + """ + And I have an "index.html" page with layout "special" that contains "page content" + And I have an "jekyll.html" page with layout "page" that contains "page content" + When I run jekyll build + Then the "_site/index.html" file should exist + And I should see "page content\n foo: 'my special data'" in "_site/index.html" + And I should see "page content\n foo: ''" in "_site/jekyll.html" From 8e939cd86e67b81ecc97108684928b4ca553dd4c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 09:58:20 -0700 Subject: [PATCH 0870/4996] Add failing test for layout data inheritance bug (#4433) --- features/layout_data.feature | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/features/layout_data.feature b/features/layout_data.feature index 8f085777565..c2af5b70ebe 100644 --- a/features/layout_data.feature +++ b/features/layout_data.feature @@ -36,17 +36,21 @@ Feature: Layout data Then the "_site/index.html" file should exist And I should see "page content\n foo: my custom data" in "_site/index.html" - Scenario: Inherit custom layout data + Scenario: Inherit custom layout data and clear when not present Given I have a _layouts directory And I have a "_layouts/default.html" file with content: """ - {{ content }} foo: '{{ layout.foo }}' + --- + bar: i'm default + --- + {{ content }} foo: '{{ layout.foo }}' bar: '{{ layout.bar }}' """ And I have a "_layouts/special.html" file with content: """ --- layout: default foo: my special data + bar: im special --- {{ content }} """ @@ -54,6 +58,7 @@ Feature: Layout data """ --- layout: default + bar: im page --- {{ content }} """ @@ -61,5 +66,5 @@ Feature: Layout data And I have an "jekyll.html" page with layout "page" that contains "page content" When I run jekyll build Then the "_site/index.html" file should exist - And I should see "page content\n foo: 'my special data'" in "_site/index.html" - And I should see "page content\n foo: ''" in "_site/jekyll.html" + And I should see "page content\n foo: 'my special data' bar: 'im special'" in "_site/index.html" + And I should see "page content\n foo: '' bar: 'im page'" in "_site/jekyll.html" From db7cd6f61203b77d4b7e5e13d2c01e3afc5ed0b6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 09:58:48 -0700 Subject: [PATCH 0871/4996] Reset {{ layout }} between each render & merge layout data properly --- lib/jekyll/convertible.rb | 5 ++++- lib/jekyll/renderer.rb | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index a473b183a4a..a5d356071f1 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -209,10 +209,13 @@ def render_all_layouts(layouts, payload, info) used = Set.new([layout]) + # Reset the payload layout data to ensure it starts fresh for each page. + payload["layout"] = nil + while layout Jekyll.logger.debug "Rendering Layout:", path payload["content"] = output - payload["layout"] = Utils.deep_merge_hashes(payload["layout"] || {}, layout.data) + payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) self.output = render_liquid(layout.content, payload, diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index f116cf60151..f9eb94beceb 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -136,10 +136,13 @@ def place_in_layouts(content, payload, info) used = Set.new([layout]) + # Reset the payload layout data to ensure it starts fresh for each page. + payload["layout"] = nil + while layout payload['content'] = output payload['page'] = document.to_liquid - payload['layout'] = Utils.deep_merge_hashes(payload['layout'] || {}, layout.data) + payload['layout'] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) output = render_liquid( layout.content, From cc0c5ea19e8fa1e8bd3e46f09a2063adc277d79a Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 24 May 2016 19:01:35 -0500 Subject: [PATCH 0872/4996] Rubocop fixes --- test/helper.rb | 14 +++++++------- test/test_front_matter_defaults.rb | 12 ++++++------ test/test_generated_site.rb | 5 ++++- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index 5668f2ec890..751a14b1c25 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -63,11 +63,11 @@ def refute_exist(filename, msg = nil) module DirectoryHelpers def dest_dir(*subdirs) - test_dir('dest', *subdirs) + test_dir("dest", *subdirs) end def source_dir(*subdirs) - test_dir('source', *subdirs) + test_dir("source", *subdirs) end def test_dir(*subdirs) @@ -80,7 +80,7 @@ class JekyllUnitTest < Minitest::Test include DirectoryHelpers extend DirectoryHelpers - def mu_pp obj + def mu_pp(obj) s = obj.is_a?(Hash) ? JSON.pretty_generate(obj) : obj.inspect s = s.encode Encoding.default_external if defined? Encoding s @@ -122,10 +122,10 @@ def site_configuration(overrides = {}) })) build_configs({ "source" => source_dir - }, full_overrides). - fix_common_issues. - backwards_compatibilize. - add_default_collections + }, full_overrides) + .fix_common_issues + .backwards_compatibilize + .add_default_collections end def clear_dest diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index c85314d21c1..fdad0930bb2 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -5,7 +5,7 @@ class TestFrontMatterDefaults < JekyllUnitTest setup do @site = fixture_site({ "defaults" => [{ - "scope" => { + "scope" => { "path" => "contacts", "type" => "page" }, @@ -29,7 +29,7 @@ class TestFrontMatterDefaults < JekyllUnitTest setup do @site = fixture_site({ "defaults" => [{ - "scope" => { + "scope" => { "path" => "index.html" }, "values" => { @@ -53,7 +53,7 @@ class TestFrontMatterDefaults < JekyllUnitTest setup do @site = fixture_site({ "defaults" => [{ - "scope" => { + "scope" => { "path" => "win" }, "values" => { @@ -77,7 +77,7 @@ class TestFrontMatterDefaults < JekyllUnitTest setup do @site = fixture_site({ "defaults" => [{ - "scope" => { + "scope" => { "type" => "page" }, "values" => { @@ -102,7 +102,7 @@ class TestFrontMatterDefaults < JekyllUnitTest setup do @site = fixture_site({ "defaults" => [{ - "scope" => { + "scope" => { "type" => "pages" }, "values" => { @@ -126,7 +126,7 @@ class TestFrontMatterDefaults < JekyllUnitTest setup do @site = fixture_site({ "defaults" => [{ - "scope" => { + "scope" => { }, "values" => { "key" => "val" diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 0b425b130e6..8373f0fc848 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -81,7 +81,10 @@ class TestGeneratedSite < JekyllUnitTest should "acceptable limit post is 0" do clear_dest - assert fixture_site("limit_posts" => 0), "Couldn't create a site with limit_posts=0." + assert( + fixture_site("limit_posts" => 0), + "Couldn't create a site with limit_posts=0." + ) end end end From 1a05483a6304f59bff8d30f26f53ed7a51fa3ad9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 18:54:49 -0700 Subject: [PATCH 0873/4996] Sort the results of the require_all glob. Filesystems behave differently when performing glob listings. In my environment, they are listed alphabetically. On my Mac, when asking for a list of files in a directory, those files are returned as a nicely sorted list. Alphabetized, like you'd want them to be. Like you'd expect them to be. In some environments, quite different from my own, the return of a similar operation is quite random. Perhaps q comes before a, or e before d; the filesystem will choose its order of the day and you, the fare user, tired and weary from work, must bare the brunt of this. And so, with this commit, I do hereby request that the noble makers of Dir[] provide for us, the downtrodden and ravaged users, some consistency. As a user of Ruby, I shouldn't have to know or consider the behaviour of an individual filesystem here; it should function the same for all filesystems. Truly yours, Parker --- lib/jekyll.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index e9f4547b3c6..16cedc68379 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -7,7 +7,7 @@ # Returns nothing. def require_all(path) glob = File.join(File.dirname(__FILE__), path, '*.rb') - Dir[glob].each do |f| + Dir[glob].sort.each do |f| require f end end From ad7bd8409810e361417b14ea7434a0fc12483f31 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 May 2016 21:11:14 -0700 Subject: [PATCH 0874/4996] lib/jekyll.rb: require document_drop to ease our pain --- lib/jekyll.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 16cedc68379..9530b2d16b2 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -173,6 +173,7 @@ def sanitized_path(base_directory, questionable_path) end require "jekyll/drops/drop" +require "jekyll/drops/document_drop" require_all 'jekyll/commands' require_all 'jekyll/converters' require_all 'jekyll/converters/markdown' From 17d8c96a630bf4c9ea932622269443a56e82a375 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 11:01:09 -0700 Subject: [PATCH 0875/4996] Add ability to render drops as JSON Previously you could do, e.g. {{ site | jsonify }}, but with the introduction of Liquid Drops, this didn't work anymore. This PR adds the ability to render drops as JSON. You can safely run drop.to_json and it should Do the Right Thing. --- lib/jekyll/drops/document_drop.rb | 37 ++++++++++++++++++++++++++-- lib/jekyll/drops/drop.rb | 20 +++++++++++++++- lib/jekyll/drops/jekyll_drop.rb | 12 ++++++++++ lib/jekyll/site.rb | 1 + test/test_document.rb | 40 +++++++++++++++++++++++++++++++ test/test_filters.rb | 38 +++++++++++++++++++++++++++++ 6 files changed, 145 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index 4eb9e50c1dd..b8a0d3e535f 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -5,10 +5,12 @@ module Drops class DocumentDrop < Drop extend Forwardable + NESTED_OBJECT_FIELD_BLACKLIST = %w{ + content output excerpt next previous + }.freeze + mutable false - def_delegator :@obj, :next_doc, :next - def_delegator :@obj, :previous_doc, :previous def_delegator :@obj, :relative_path, :path def_delegators :@obj, :id, :output, :content, :to_s, :relative_path, :url @@ -27,6 +29,37 @@ def <=>(other) cmp end + def previous + @obj.previous_doc.to_liquid + end + + def next + @obj.next_doc.to_liquid + end + + # Generate a Hash for use in generating JSON. + # This is useful if fields need to be cleared before the JSON can generate. + # + # Returns a Hash ready for JSON generation. + def hash_for_json(state = nil) + to_h.tap do |hash| + if state && state.depth >= 2 + hash["previous"] = collapse_document(hash["previous"]) if hash["previous"] + hash["next"] = collapse_document(hash["next"]) if hash["next"] + end + end + end + + # Generate a Hash which breaks the recursive chain. + # Certain fields which are normally available are omitted. + # + # Returns a Hash with only non-recursive fields present. + def collapse_document(doc) + doc.keys.each_with_object({}) do |(key, _), result| + result[key] = doc[key] unless NESTED_OBJECT_FIELD_BLACKLIST.include?(key) + end + end + private def_delegator :@obj, :data, :fallback_data end diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index d1bffcc5abd..23ebeb4b6bb 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -3,7 +3,9 @@ module Jekyll module Drops class Drop < Liquid::Drop - NON_CONTENT_METHODS = [:[], :[]=, :inspect, :to_h, :fallback_data].freeze + include Enumerable + + NON_CONTENT_METHODS = [:[], :[]=, :inspect, :to_h, :fallback_data, :collapse_document].freeze # Get or set whether the drop class is mutable. # Mutability determines whether or not pre-defined fields may be @@ -138,6 +140,22 @@ def inspect JSON.pretty_generate to_h end + # Generate a Hash for use in generating JSON. + # This is useful if fields need to be cleared before the JSON can generate. + # + # Returns a Hash ready for JSON generation. + def hash_for_json(state = nil) + to_h + end + + # Generate a JSON representation of the Drop. + # + # Returns a JSON representation of the Drop in a String. + def to_json(state = nil) + require 'json' + JSON.generate(hash_for_json(state), state) + end + # Collects all the keys and passes each to the block in turn. # # block - a block which accepts one argument, the key diff --git a/lib/jekyll/drops/jekyll_drop.rb b/lib/jekyll/drops/jekyll_drop.rb index c4009da01bb..7ff19f9a3b2 100644 --- a/lib/jekyll/drops/jekyll_drop.rb +++ b/lib/jekyll/drops/jekyll_drop.rb @@ -16,6 +16,18 @@ def version def environment Jekyll.env end + + def to_h + @to_h ||= { + "version" => version, + "environment" => environment + } + end + + def to_json(state = nil) + require 'json' + JSON.generate(to_h, state) + end end end end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 9afdbde3bd2..f2025c13a78 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -279,6 +279,7 @@ def site_data def site_payload Drops::UnifiedPayloadDrop.new self end + alias_method :to_liquid, :site_payload # Get the implementation class for the given Converter. # Returns the Converter instance implementing the given Converter. diff --git a/test/test_document.rb b/test/test_document.rb index b9e69a7d7c6..c0b6311ceb9 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -44,6 +44,46 @@ def assert_equal_value(key, one, other) assert_equal "foo.bar", @document.data["whatever"] end + should "be jsonify-able" do + page_json = @document.to_liquid.to_json + parsed = JSON.parse(page_json) + + assert_equal "Jekyll.configuration", parsed["title"] + assert_equal "foo.bar", parsed["whatever"] + assert_equal nil, parsed["previous"] + + next_doc = parsed["next"] + assert_equal "_methods/escape-+ #%20[].md", next_doc["path"] + assert_equal "Jekyll.escape", next_doc["title"] + + next_prev_doc = next_doc["previous"] + assert_equal "Jekyll.configuration", next_prev_doc["title"] + assert_equal "_methods/configuration.md", next_prev_doc["path"] + assert_equal "_methods/escape-+ #%20[].md", next_prev_doc["next"]["path"] + assert_nil next_prev_doc["previous"] # nothing before Jekyll.configuration + assert_nil next_prev_doc["next"]["next"] + assert_nil next_prev_doc["next"]["previous"] + assert_nil next_prev_doc["next"]["content"] + assert_nil next_prev_doc["next"]["excerpt"] + assert_nil next_prev_doc["next"]["output"] + + next_next_doc = next_doc["next"] + assert_equal "Jekyll.sanitized_path", next_next_doc["title"] + assert_equal "_methods/sanitized_path.md", next_next_doc["path"] + assert_equal "_methods/escape-+ #%20[].md", next_next_doc["previous"]["path"] + assert_equal "_methods/site/generate.md", next_next_doc["next"]["path"] + assert_nil next_next_doc["next"]["next"] + assert_nil next_next_doc["next"]["previous"] + assert_nil next_next_doc["next"]["content"] + assert_nil next_next_doc["next"]["excerpt"] + assert_nil next_next_doc["next"]["output"] + assert_nil next_next_doc["previous"]["next"] + assert_nil next_next_doc["previous"]["previous"] + assert_nil next_next_doc["previous"]["content"] + assert_nil next_next_doc["previous"]["excerpt"] + assert_nil next_next_doc["previous"]["output"] + end + context "with YAML ending in three dots" do setup do diff --git a/test/test_filters.rb b/test/test_filters.rb index 565e82089b8..5015184d83d 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -198,6 +198,44 @@ def initialize(opts = {}) assert_equal "[{\"name\":\"Jack\"},{\"name\":\"Smith\"}]", @filter.jsonify([{:name => 'Jack'}, {:name => 'Smith'}]) end + should "convert drop to json" do + @filter.site.read + expected = { + "next" => "Categories _should_ work", + "path" => "_posts/2008-02-02-published.markdown", + "output" => nil, + "previous" => nil, + "content" => "This should be published.\n", + "id" => "/publish_test/2008/02/02/published", + "url" => "/publish_test/2008/02/02/published.html", + "relative_path" => "_posts/2008-02-02-published.markdown", + "collection" => "posts", + "excerpt" => "

    This should be published.

    \n", + "draft" => false, + "categories" => [ + "publish_test" + ], + "layout" => "default", + "title" => "Publish", + "category" => "publish_test", + "date" => "2008-02-02 00:00:00 +0000", + "slug" => "published", + "ext" => ".markdown", + "tags" => [] + } + actual = @filter.jsonify(@filter.site.docs_to_write.first.to_liquid) + assert_equal expected, JSON.parse(actual) + end + + should "convert drop with drops to json" do + @filter.site.read + actual = @filter.jsonify(@filter.site.to_liquid) + assert_equal JSON.parse(actual)["jekyll"], { + "environment" => "development", + "version" => Jekyll::VERSION + } + end + class M < Struct.new(:message) def to_liquid [message] From f8c708ffec903c9778c3568582a75a9780aa81ba Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 11:40:58 -0700 Subject: [PATCH 0876/4996] Fix test to simply ensure next is an object in jsonify --- test/test_filters.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index 5015184d83d..eb8170fceb8 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -201,10 +201,9 @@ def initialize(opts = {}) should "convert drop to json" do @filter.site.read expected = { - "next" => "Categories _should_ work", "path" => "_posts/2008-02-02-published.markdown", - "output" => nil, "previous" => nil, + "output" => nil, "content" => "This should be published.\n", "id" => "/publish_test/2008/02/02/published", "url" => "/publish_test/2008/02/02/published.html", @@ -223,8 +222,13 @@ def initialize(opts = {}) "ext" => ".markdown", "tags" => [] } - actual = @filter.jsonify(@filter.site.docs_to_write.first.to_liquid) - assert_equal expected, JSON.parse(actual) + actual = JSON.parse(@filter.jsonify(@filter.site.docs_to_write.first.to_liquid)) + + next_doc = actual.delete("next") + refute_nil next_doc + assert next_doc.is_a?(Hash), "doc.next should be an object" + + assert_equal expected, actual end should "convert drop with drops to json" do From 2ca80920dcf0ae72cec37c714cc158c568402989 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Wed, 25 May 2016 13:15:04 +0300 Subject: [PATCH 0877/4996] rubocop: fix include tag code style --- .rubocop.yml | 1 - lib/jekyll/tags/include.rb | 69 ++++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index f5dcc93aa73..d57fefd1920 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -56,7 +56,6 @@ AllCops: - lib/jekyll/site.rb - lib/jekyll/static_file.rb - lib/jekyll/stevenson.rb - - lib/jekyll/tags/include.rb - lib/jekyll/theme.rb - lib/jekyll/url.rb - lib/jekyll/utils.rb diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index d4f31f2a05b..4c4c38a3ef6 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -12,17 +12,23 @@ def initialize(msg, path) end class IncludeTag < Liquid::Tag - VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/ - VARIABLE_SYNTAX = /(?[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+)(?.*)/ + VALID_SYNTAX = / + ([\w-]+)\s*=\s* + (?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+)) + /x + VARIABLE_SYNTAX = / + (?[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+) + (?.*) + /x def initialize(tag_name, markup, tokens) super matched = markup.strip.match(VARIABLE_SYNTAX) if matched - @file = matched['variable'].strip - @params = matched['params'].strip + @file = matched["variable"].strip + @params = matched["params"].strip else - @file, @params = markup.strip.split(' ', 2) + @file, @params = markup.strip.split(" ", 2) end validate_params if @params @tag_name = tag_name @@ -36,7 +42,7 @@ def parse_params(context) params = {} markup = @params - while match = VALID_SYNTAX.match(markup) do + while (match = VALID_SYNTAX.match(markup)) markup = markup[match.end(0)..-1] value = if match[2] @@ -53,8 +59,8 @@ def parse_params(context) end def validate_file_name(file) - if file !~ /^[a-zA-Z0-9_\/\.-]+$/ || file =~ /\.\// || file =~ /\/\./ - raise ArgumentError.new <<-eos + if file !~ %r!^[a-zA-Z0-9_/\.-]+$! || file =~ %r!\./! || file =~ %r!/\.! + raise ArgumentError, <<-eos Invalid syntax for include tag. File contains invalid characters or sequences: #{file} @@ -68,9 +74,9 @@ def validate_file_name(file) end def validate_params - full_valid_syntax = Regexp.compile('\A\s*(?:' + VALID_SYNTAX.to_s + '(?=\s|\z)\s*)*\z') + full_valid_syntax = /\A\s*(?:#{VALID_SYNTAX}(?=\s|\z)\s*)*\z/ unless @params =~ full_valid_syntax - raise ArgumentError.new <<-eos + raise ArgumentError, <<-eos Invalid syntax for include tag: #{@params} @@ -91,7 +97,10 @@ def file_read_opts(context) # Render the variable if required def render_variable(context) if @file.match(VARIABLE_SYNTAX) - partial = context.registers[:site].liquid_renderer.file("(variable)").parse(@file) + partial = context.registers[:site] + .liquid_renderer + .file("(variable)") + .parse(@file) partial.render!(context) end end @@ -106,9 +115,9 @@ def locate_include_file(context, file, safe) path = File.join(dir, file) return path if valid_include_file?(path, dir, safe) end - raise IOError, "Could not locate the included file '#{file}' in any of #{includes_dirs}." \ - " Ensure it exists in one of those directories and, if it is a symlink, " \ - "does not point outside your site source." + raise IOError, "Could not locate the included file '#{file}' in any of "\ + "#{includes_dirs}. Ensure it exists in one of those directories and, "\ + "if it is a symlink, does not point outside your site source." end def render(context) @@ -120,24 +129,23 @@ def render(context) path = locate_include_file(context, file, site.safe) return unless path - # Add include to dependency tree + add_include_to_dependency(site, path, context) + + partial = load_cached_partial(path, context) + + context.stack do + context["include"] = parse_params(context) if @params + partial.render!(context) + end + end + + def add_include_to_dependency(site, path, context) if context.registers[:page] && context.registers[:page].key?("path") site.regenerator.add_dependency( site.in_source_dir(context.registers[:page]["path"]), path ) end - - #begin - partial = load_cached_partial(path, context) - - context.stack do - context['include'] = parse_params(context) if @params - partial.render!(context) - end - #rescue => e - #raise IncludeTagError.new e.message, path - #end end def load_cached_partial(path, context) @@ -147,7 +155,10 @@ def load_cached_partial(path, context) if cached_partial.key?(path) cached_partial[path] else - cached_partial[path] = context.registers[:site].liquid_renderer.file(path).parse(read_file(path, context)) + cached_partial[path] = context.registers[:site] + .liquid_renderer + .file(path) + .parse(read_file(path, context)) end end @@ -188,5 +199,5 @@ def page_path(context) end end -Liquid::Template.register_tag('include', Jekyll::Tags::IncludeTag) -Liquid::Template.register_tag('include_relative', Jekyll::Tags::IncludeRelativeTag) +Liquid::Template.register_tag("include", Jekyll::Tags::IncludeTag) +Liquid::Template.register_tag("include_relative", Jekyll::Tags::IncludeRelativeTag) From 1c937013fdf702864f8ac6f75a1ff6dd784e2f88 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 25 May 2016 08:53:40 -0700 Subject: [PATCH 0878/4996] Update history to reflect merge of #4936 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8bf867494a4..98c7e64f365 100644 --- a/History.markdown +++ b/History.markdown @@ -60,6 +60,7 @@ * Update `jekyll/commands*` to pass rubocop rules (#4888) * Clean up many test files to pass Rubocop rules (#4902) * Rubocop cleanup for some utils and further test files (#4916) + * Rubocop: Low hanging fruit (#4936) ### Site Enhancements From 733c56a65e8844a565f8734cb352deb997cbd655 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 08:55:12 -0700 Subject: [PATCH 0879/4996] External: remove &block arg, use block_given? Addresses my comment in https://github.com/jekyll/jekyll/pull/4936#discussion_r64598949 --- lib/jekyll/external.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index 561cbb4d299..e84d0857bfe 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -17,13 +17,13 @@ def blessed_gems # # names - a string gem name or array of gem names # - def require_if_present(names, &block) + def require_if_present(names) Array(names).each do |name| begin require name rescue LoadError Jekyll.logger.debug "Couldn't load #{name}. Skipping." - yield(name) if block + yield(name) if block_given? false end end From 3a04093e5113751bbc4907c01f49412b6f94cbbd Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Mon, 23 May 2016 20:58:28 -0500 Subject: [PATCH 0880/4996] Rubocop cleanup for lib/jekyll/page.rb --- .rubocop.yml | 1 - lib/jekyll/page.rb | 16 ++++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 198cb1e6e34..0fdff6160ff 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -21,7 +21,6 @@ AllCops: - lib/jekyll/layout.rb - lib/jekyll/liquid_renderer/table.rb - lib/jekyll/liquid_renderer.rb - - lib/jekyll/page.rb - lib/jekyll/plugin_manager.rb - lib/jekyll/reader.rb - lib/jekyll/readers/layout_reader.rb diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 2bdcdf6f203..3f984709d09 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -9,7 +9,7 @@ class Page alias_method :extname, :ext - FORWARD_SLASH = '/'.freeze + FORWARD_SLASH = "/".freeze # Attributes for Liquid templates ATTRIBUTES_FOR_LIQUID = %w( @@ -18,7 +18,7 @@ class Page name path url - ) + ).freeze # A set of extensions that are considered HTML or HTML-like so we # should not alter them, this includes .xhtml through XHTM5. @@ -27,7 +27,7 @@ class Page .html .xhtml .htm - ) + ).freeze # Initialize a new Page. # @@ -71,7 +71,7 @@ def dir # # Returns the String permalink or nil if none has been set. def permalink - data.nil? ? nil : data['permalink'] + data.nil? ? nil : data["permalink"] end # The template of the permalink. @@ -92,9 +92,9 @@ def template # Returns the String url. def url @url ||= URL.new({ - :template => template, + :template => template, :placeholders => url_placeholders, - :permalink => permalink + :permalink => permalink }).to_s end @@ -135,7 +135,7 @@ def render(layouts, site_payload) # # Returns the path to the source file def path - data.fetch('path') { relative_path.sub(/\A\//, '') } + data.fetch("path") { relative_path.sub(%r{!\A\/!}, "") } end # The path to the page source file, relative to the site source @@ -167,7 +167,7 @@ def html? # Returns the Boolean of whether this Page is an index file or not. def index? - basename == 'index' + basename == "index" end def trigger_hooks(hook_name, *args) From 65e78b3280dc861a3560cfa1bfd7450ee965402c Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Mon, 23 May 2016 21:07:24 -0500 Subject: [PATCH 0881/4996] Rubocop cleanup for lib/jekyll/plugin_manager.rb --- .rubocop.yml | 1 - lib/jekyll/plugin_manager.rb | 20 ++++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 0fdff6160ff..51f96642fa8 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -21,7 +21,6 @@ AllCops: - lib/jekyll/layout.rb - lib/jekyll/liquid_renderer/table.rb - lib/jekyll/liquid_renderer.rb - - lib/jekyll/plugin_manager.rb - lib/jekyll/reader.rb - lib/jekyll/readers/layout_reader.rb - lib/jekyll/readers/page_reader.rb diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index 45eeaa79506..ff8def487fd 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -24,7 +24,9 @@ def conscientious_require # # Returns nothing. def require_gems - Jekyll::External.require_with_graceful_fail(site.gems.select { |gem| plugin_allowed?(gem) }) + Jekyll::External.require_with_graceful_fail( + site.gems.select { |gem| plugin_allowed?(gem) } + ) end def self.require_from_bundler @@ -33,7 +35,8 @@ def self.require_from_bundler Bundler.setup required_gems = Bundler.require(:jekyll_plugins) - Jekyll.logger.debug("PluginManager:", "Required #{required_gems.map(&:name).join(', ')}") + message = "Required #{required_gems.map(&:name).join(", ")}" + Jekyll.logger.debug("PluginManager:", message) ENV["JEKYLL_NO_BUNDLER_REQUIRE"] = "true" true @@ -57,7 +60,7 @@ def plugin_allowed?(gem_name) # Returns an array of strings, each string being the name of a gem name # that is allowed to be used. def whitelist - @whitelist ||= Array[site.config['whitelist']].flatten + @whitelist ||= Array[site.config["whitelist"]].flatten end # Require all .rb files if safe mode is off @@ -76,16 +79,17 @@ def require_plugin_files # # Returns an Array of plugin search paths def plugins_path - if site.config['plugins_dir'] == Jekyll::Configuration::DEFAULTS['plugins_dir'] - [site.in_source_dir(site.config['plugins_dir'])] + if site.config["plugins_dir"] == Jekyll::Configuration::DEFAULTS["plugins_dir"] + [site.in_source_dir(site.config["plugins_dir"])] else - Array(site.config['plugins_dir']).map { |d| File.expand_path(d) } + Array(site.config["plugins_dir"]).map { |d| File.expand_path(d) } end end def deprecation_checks - pagination_included = (site.config['gems'] || []).include?('jekyll-paginate') || defined?(Jekyll::Paginate) - if site.config['paginate'] && !pagination_included + pagination_included = (site.config["gems"] || []).include?("jekyll-paginate") || + defined?(Jekyll::Paginate) + if site.config["paginate"] && !pagination_included Jekyll::Deprecator.deprecation_message "You appear to have pagination " \ "turned on, but you haven't included the `jekyll-paginate` gem. " \ "Ensure you have `gems: [jekyll-paginate]` in your configuration file." From de39107c76f6b769ce81203c71c6931eb904176c Mon Sep 17 00:00:00 2001 From: Brint O'Hearn Date: Mon, 23 May 2016 21:12:31 -0500 Subject: [PATCH 0882/4996] Rubocop cleanup for lib/jekyll/layout.rb --- .rubocop.yml | 1 - lib/jekyll/layout.rb | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 51f96642fa8..b7dd25301e9 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -18,7 +18,6 @@ AllCops: - lib/jekyll/entry_filter.rb - lib/jekyll/filters.rb - lib/jekyll/frontmatter_defaults.rb - - lib/jekyll/layout.rb - lib/jekyll/liquid_renderer/table.rb - lib/jekyll/liquid_renderer.rb - lib/jekyll/reader.rb diff --git a/lib/jekyll/layout.rb b/lib/jekyll/layout.rb index 7200527738a..690d86fbd20 100644 --- a/lib/jekyll/layout.rb +++ b/lib/jekyll/layout.rb @@ -58,7 +58,9 @@ def process(name) # Returns a String path which represents the relative path # from the site source to this layout def relative_path - @relative_path ||= Pathname.new(path).relative_path_from(Pathname.new(@base_dir)).to_s + @relative_path ||= Pathname.new(path).relative_path_from( + Pathname.new(@base_dir) + ).to_s end end end From 757233754eb0d1848bb934087a9615a9ca2efe46 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 09:32:51 -0700 Subject: [PATCH 0883/4996] Update history to reflect merge of #4941 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 98c7e64f365..62b5bee466b 100644 --- a/History.markdown +++ b/History.markdown @@ -43,6 +43,10 @@ * 3.2.x/master: Fix defaults for Documents (posts/collection docs) (#4808) * Don't rescue LoadError or bundler load errors for Bundler. (#4857) +### Forward Ports + + * From v3.1.4: Add ExcerptDrop and remove excerpt's ability to refer to itself in Liquid (#4941) + ### Development Fixes * Add project maintainer profile links (#4591) From 5c036cf3c4933f51f6a13221f11e424f862578c7 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Wed, 25 May 2016 20:24:19 +0300 Subject: [PATCH 0884/4996] rubocop: fix code style --- lib/jekyll/tags/highlight.rb | 5 +++-- lib/jekyll/tags/link.rb | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 550b3522e26..afbadb8553e 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -93,7 +93,7 @@ def render_pygments(code, is_safe) ) if highlighted_code.nil? - Jekyll.logger.error <<-eos + Jekyll.logger.error < @highlight_options[:linenos], :wrap => false + :line_numbers => @highlight_options[:linenos], + :wrap => false ) lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText formatter.format(lexer.lex(code)) diff --git a/lib/jekyll/tags/link.rb b/lib/jekyll/tags/link.rb index b2be119942b..e6dcde610c0 100644 --- a/lib/jekyll/tags/link.rb +++ b/lib/jekyll/tags/link.rb @@ -19,7 +19,6 @@ def render(context) raise ArgumentError, < Date: Wed, 25 May 2016 21:48:21 +0300 Subject: [PATCH 0885/4996] rubocop: fix spacing in code style --- lib/jekyll/tags/highlight.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index afbadb8553e..b22001d3b14 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -112,7 +112,7 @@ def render_rouge(code) Jekyll::External.require_with_graceful_fail("rouge") formatter = Rouge::Formatters::HTML.new( :line_numbers => @highlight_options[:linenos], - :wrap => false + :wrap => false ) lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText formatter.format(lexer.lex(code)) From a7cbb89dfca8fe367301b444e1bcbf806c3c92c3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 25 May 2016 15:42:05 -0700 Subject: [PATCH 0886/4996] Update history to reflect merge of #4942 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 62b5bee466b..39d43f9cc38 100644 --- a/History.markdown +++ b/History.markdown @@ -46,6 +46,7 @@ ### Forward Ports * From v3.1.4: Add ExcerptDrop and remove excerpt's ability to refer to itself in Liquid (#4941) + * Forward-port: Configuration permalink fix and addition of Configuration.from and sorting `site.collections` by label (#4942) ### Development Fixes From 3c0d1a18bfff7924adabcb65b0ca39b9850f2ed9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 15:43:13 -0700 Subject: [PATCH 0887/4996] Mention where it came from. [ci skip] --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 39d43f9cc38..96a3fb47aa9 100644 --- a/History.markdown +++ b/History.markdown @@ -46,7 +46,7 @@ ### Forward Ports * From v3.1.4: Add ExcerptDrop and remove excerpt's ability to refer to itself in Liquid (#4941) - * Forward-port: Configuration permalink fix and addition of Configuration.from and sorting `site.collections` by label (#4942) + * From v3.1.4: Configuration permalink fix and addition of Configuration.from and sorting `site.collections` by label (#4942) ### Development Fixes From 1502d0006331969736c68f74a2f08d618a453db5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 25 May 2016 15:44:24 -0700 Subject: [PATCH 0888/4996] Update history to reflect merge of #4943 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 96a3fb47aa9..8a5098e2853 100644 --- a/History.markdown +++ b/History.markdown @@ -47,6 +47,7 @@ * From v3.1.4: Add ExcerptDrop and remove excerpt's ability to refer to itself in Liquid (#4941) * From v3.1.4: Configuration permalink fix and addition of Configuration.from and sorting `site.collections` by label (#4942) + * From v3.1.4: Fix `{{ layout }}` oddities (proper inheritance & fixing overflow of old data) (#4943) ### Development Fixes From d9c9e0238ac202a273d7526d4eb50aecb57c2378 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 25 May 2016 15:46:50 -0700 Subject: [PATCH 0889/4996] Update history to reflect merge of #4944 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8a5098e2853..e57519174fd 100644 --- a/History.markdown +++ b/History.markdown @@ -48,6 +48,7 @@ * From v3.1.4: Add ExcerptDrop and remove excerpt's ability to refer to itself in Liquid (#4941) * From v3.1.4: Configuration permalink fix and addition of Configuration.from and sorting `site.collections` by label (#4942) * From v3.1.4: Fix `{{ layout }}` oddities (proper inheritance & fixing overflow of old data) (#4943) + * Forward-port: Sort the results of the require_all glob (#4944) ### Development Fixes From 02bf4f1032217c0a93bc38c2f937a88ebfe243de Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 15:49:30 -0700 Subject: [PATCH 0890/4996] Mention where it came from. [ci skip] --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index e57519174fd..4d6f779b90a 100644 --- a/History.markdown +++ b/History.markdown @@ -48,7 +48,7 @@ * From v3.1.4: Add ExcerptDrop and remove excerpt's ability to refer to itself in Liquid (#4941) * From v3.1.4: Configuration permalink fix and addition of Configuration.from and sorting `site.collections` by label (#4942) * From v3.1.4: Fix `{{ layout }}` oddities (proper inheritance & fixing overflow of old data) (#4943) - * Forward-port: Sort the results of the require_all glob (#4944) + * From v3.1.5: Sort the results of the `require_all` glob (#4944) ### Development Fixes From aff1430608e7ddfcb73d211606c20119ec062437 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 16:04:16 -0700 Subject: [PATCH 0891/4996] Fix tests for document drop JSONification based on master updates. /cc #4914 --- test/test_document.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/test_document.rb b/test/test_document.rb index c0b6311ceb9..fb503dccedb 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -50,7 +50,8 @@ def assert_equal_value(key, one, other) assert_equal "Jekyll.configuration", parsed["title"] assert_equal "foo.bar", parsed["whatever"] - assert_equal nil, parsed["previous"] + assert_equal "_methods/collection/entries", parsed["previous"]["path"] + assert_equal "Collection#entries", parsed["previous"]["title"] next_doc = parsed["next"] assert_equal "_methods/escape-+ #%20[].md", next_doc["path"] @@ -60,7 +61,7 @@ def assert_equal_value(key, one, other) assert_equal "Jekyll.configuration", next_prev_doc["title"] assert_equal "_methods/configuration.md", next_prev_doc["path"] assert_equal "_methods/escape-+ #%20[].md", next_prev_doc["next"]["path"] - assert_nil next_prev_doc["previous"] # nothing before Jekyll.configuration + assert_equal "_methods/collection/entries", next_prev_doc["previous"]["path"] assert_nil next_prev_doc["next"]["next"] assert_nil next_prev_doc["next"]["previous"] assert_nil next_prev_doc["next"]["content"] From b353e181c1ad7fb51a70829725e964c156f7e0c0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 16:05:31 -0700 Subject: [PATCH 0892/4996] Update history to reflect merge of #4945 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4d6f779b90a..95262dca657 100644 --- a/History.markdown +++ b/History.markdown @@ -49,6 +49,7 @@ * From v3.1.4: Configuration permalink fix and addition of Configuration.from and sorting `site.collections` by label (#4942) * From v3.1.4: Fix `{{ layout }}` oddities (proper inheritance & fixing overflow of old data) (#4943) * From v3.1.5: Sort the results of the `require_all` glob (#4944) + * From v3.1.6: Add ability to render drops as JSON (#4945) ### Development Fixes From 6f1e1d80cdfd4d279bc4ac7446b3152788170110 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 16:10:11 -0700 Subject: [PATCH 0893/4996] Rubocop: drop changes from v3.1 forward-ports --- lib/jekyll/drops/document_drop.rb | 6 ++++-- lib/jekyll/drops/drop.rb | 12 ++++++++---- lib/jekyll/drops/jekyll_drop.rb | 4 ++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index 10e069ac0d9..2600baa55a2 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -5,9 +5,9 @@ module Drops class DocumentDrop < Drop extend Forwardable - NESTED_OBJECT_FIELD_BLACKLIST = %w{ + NESTED_OBJECT_FIELD_BLACKLIST = %w( content output excerpt next previous - }.freeze + ).freeze mutable false @@ -40,6 +40,8 @@ def next # Generate a Hash for use in generating JSON. # This is useful if fields need to be cleared before the JSON can generate. # + # state - the JSON::State object which determines the state of current processing. + # # Returns a Hash ready for JSON generation. def hash_for_json(state = nil) to_h.tap do |hash| diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index dcabb190276..ebd3b4d2e37 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -88,7 +88,9 @@ def []=(key, val) # Returns an Array of strings which represent method-specific keys. def content_methods @content_methods ||= ( - self.class.instance_methods - Jekyll::Drops::Drop.instance_methods - NON_CONTENT_METHODS + self.class.instance_methods \ + - Jekyll::Drops::Drop.instance_methods \ + - NON_CONTENT_METHODS ).map(&:to_s).reject do |method| method.end_with?("=") end @@ -144,15 +146,17 @@ def inspect # This is useful if fields need to be cleared before the JSON can generate. # # Returns a Hash ready for JSON generation. - def hash_for_json(state = nil) + def hash_for_json(*) to_h end # Generate a JSON representation of the Drop. # + # state - the JSON::State object which determines the state of current processing. + # # Returns a JSON representation of the Drop in a String. def to_json(state = nil) - require 'json' + require "json" JSON.generate(hash_for_json(state), state) end @@ -165,7 +169,7 @@ def each_key(&block) keys.each(&block) end - def each(&block) + def each each_key.each do |key| yield key, self[key] end diff --git a/lib/jekyll/drops/jekyll_drop.rb b/lib/jekyll/drops/jekyll_drop.rb index 7ff19f9a3b2..50163d7461b 100644 --- a/lib/jekyll/drops/jekyll_drop.rb +++ b/lib/jekyll/drops/jekyll_drop.rb @@ -19,13 +19,13 @@ def environment def to_h @to_h ||= { - "version" => version, + "version" => version, "environment" => environment } end def to_json(state = nil) - require 'json' + require "json" JSON.generate(to_h, state) end end From cceb8c58769d3facddf1e9be5dee9b208c6d2543 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 25 May 2016 16:24:30 -0700 Subject: [PATCH 0894/4996] Update history to reflect merge of #4949 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 95262dca657..a6f5405f0c9 100644 --- a/History.markdown +++ b/History.markdown @@ -69,6 +69,7 @@ * Clean up many test files to pass Rubocop rules (#4902) * Rubocop cleanup for some utils and further test files (#4916) * Rubocop: Low hanging fruit (#4936) + * Rubocop: `Drop` changes from v3.1 forward-ports (#4949) ### Site Enhancements From 4fbbeddae20fa52732f30ef001bb1f80258bc5d7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 17:57:09 -0700 Subject: [PATCH 0895/4996] Fix Page#relative_path so that it consistently does NOT have the prepending slash (previously inconsistent) Fixes for #4946 --- lib/jekyll/page.rb | 4 ++-- test/test_front_matter_defaults.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 3f984709d09..1542e986e3b 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -135,12 +135,12 @@ def render(layouts, site_payload) # # Returns the path to the source file def path - data.fetch("path") { relative_path.sub(%r{!\A\/!}, "") } + data.fetch("path") { relative_path } end # The path to the page source file, relative to the site source def relative_path - File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)) + File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r{\A\/}, "") end # Obtain destination path. diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index f1b55ac164c..51308016019 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -17,7 +17,7 @@ class TestFrontMatterDefaults < JekyllUnitTest }] })) @site.process - @affected = @site.pages.find { |page| page.relative_path == "/contacts/bar.html" } + @affected = @site.pages.find { |page| page.relative_path == "contacts/bar.html" } @not_affected = @site.pages.find { |page| page.relative_path == "about.html" } end From b950e7dd90c4a2c289893b21aff7d32d16597fa4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 17:58:32 -0700 Subject: [PATCH 0896/4996] Update history to reflect merge of #4946 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a6f5405f0c9..0d8ee320ce4 100644 --- a/History.markdown +++ b/History.markdown @@ -70,6 +70,7 @@ * Rubocop cleanup for some utils and further test files (#4916) * Rubocop: Low hanging fruit (#4936) * Rubocop: `Drop` changes from v3.1 forward-ports (#4949) + * Rubocop: cleanup for misc files (#4946) ### Site Enhancements From 746e360c63d47a34bbe9d36be25d8370ab25f53a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 25 May 2016 18:03:25 -0700 Subject: [PATCH 0897/4996] Delimeters, delimeters, delimeters. --- lib/jekyll/page.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 1542e986e3b..aa773ebfb7d 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -140,7 +140,7 @@ def path # The path to the page source file, relative to the site source def relative_path - File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r{\A\/}, "") + File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r!\A\/!, "") end # Obtain destination path. From 6ef2bcb29a930de0eeced78ef8e88f504080ef98 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 21:59:11 -0500 Subject: [PATCH 0898/4996] Rubocop: test/test_filters.rb --- test/test_filters.rb | 278 ++++++++++++++++++++++++++++++------------- 1 file changed, 192 insertions(+), 86 deletions(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index eb8170fceb8..a2184c371d7 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -1,6 +1,6 @@ # coding: utf-8 -require 'helper' +require "helper" class TestFilters < JekyllUnitTest class JekyllFilter @@ -8,18 +8,24 @@ class JekyllFilter attr_accessor :site, :context def initialize(opts = {}) - @site = Jekyll::Site.new(Jekyll.configuration(opts.merge('skip_config_files' => true))) + @site = Jekyll::Site.new( + Jekyll.configuration(opts.merge("skip_config_files" => true)) + ) @context = Liquid::Context.new({}, {}, { :site => @site }) end end context "filters" do setup do - @filter = JekyllFilter.new({"source" => source_dir, "destination" => dest_dir, "timezone" => "UTC"}) + @filter = JekyllFilter.new({ + "source" => source_dir, + "destination" => dest_dir, + "timezone" => "UTC" + }) @sample_time = Time.utc(2013, 03, 27, 11, 22, 33) @sample_date = Date.parse("2013-03-27") @time_as_string = "September 11, 2001 12:46:30 -0000" - @time_as_numeric = 1399680607 + @time_as_numeric = 1_399_680_607 @array_of_objects = [ { "color" => "red", "size" => "large" }, { "color" => "red", "size" => "medium" }, @@ -28,18 +34,30 @@ def initialize(opts = {}) end should "markdownify with simple string" do - assert_equal "

    something really simple

    \n", @filter.markdownify("something **really** simple") + assert_equal( + "

    something really simple

    \n", + @filter.markdownify("something **really** simple") + ) end context "smartify filter" do should "convert quotes and typographic characters" do - assert_equal "SmartyPants is *not* Markdown", @filter.smartify("SmartyPants is *not* Markdown") - assert_equal "“This filter’s test…”", @filter.smartify(%q{"This filter's test..."}) + assert_equal( + "SmartyPants is *not* Markdown", + @filter.smartify("SmartyPants is *not* Markdown") + ) + assert_equal( + "“This filter’s test…”", + @filter.smartify(%q{"This filter's test..."}) + ) end should "escapes special characters when configured to do so" do - kramdown = JekyllFilter.new({:kramdown => {:entity_output => :symbolic}}) - assert_equal "“This filter’s test…”", kramdown.smartify(%q{"This filter's test..."}) + kramdown = JekyllFilter.new({ :kramdown => { :entity_output => :symbolic } }) + assert_equal( + "“This filter’s test…”", + kramdown.smartify(%q{"This filter's test..."}) + ) end should "convert HTML entities to unicode characters" do @@ -48,8 +66,14 @@ def initialize(opts = {}) end should "allow raw HTML passthrough" do - assert_equal "Span HTML is not escaped", @filter.smartify("Span HTML is not escaped") - assert_equal "
    Block HTML is not escaped
    ", @filter.smartify("
    Block HTML is not escaped
    ") + assert_equal( + "Span HTML is not escaped", + @filter.smartify("Span HTML is not escaped") + ) + assert_equal( + "
    Block HTML is not escaped
    ", + @filter.smartify("
    Block HTML is not escaped
    ") + ) end should "escape special characters" do @@ -60,11 +84,17 @@ def initialize(opts = {}) end should "sassify with simple string" do - assert_equal "p {\n color: #123456; }\n", @filter.sassify("$blue:#123456\np\n color: $blue") + assert_equal( + "p {\n color: #123456; }\n", + @filter.sassify("$blue:#123456\np\n color: $blue") + ) end should "scssify with simple string" do - assert_equal "p {\n color: #123456; }\n", @filter.scssify("$blue:#123456; p{color: $blue}") + assert_equal( + "p {\n color: #123456; }\n", + @filter.scssify("$blue:#123456; p{color: $blue}") + ) end should "convert array to sentence string with no args" do @@ -78,12 +108,15 @@ def initialize(opts = {}) should "convert array to sentence string with two args" do assert_equal "1 and 2", @filter.array_to_sentence_string([1, 2]) - assert_equal "chunky and bacon", @filter.array_to_sentence_string(["chunky", "bacon"]) + assert_equal "chunky and bacon", @filter.array_to_sentence_string(%w(chunky bacon)) end should "convert array to sentence string with multiple args" do assert_equal "1, 2, 3, and 4", @filter.array_to_sentence_string([1, 2, 3, 4]) - assert_equal "chunky, bacon, bits, and pieces", @filter.array_to_sentence_string(["chunky", "bacon", "bits", "pieces"]) + assert_equal( + "chunky, bacon, bits, and pieces", + @filter.array_to_sentence_string(%w(chunky bacon bits pieces)) + ) end context "date filters" do @@ -97,11 +130,17 @@ def initialize(opts = {}) end should "format a time with xmlschema" do - assert_equal "2013-03-27T11:22:33+00:00", @filter.date_to_xmlschema(@sample_time) + assert_equal( + "2013-03-27T11:22:33+00:00", + @filter.date_to_xmlschema(@sample_time) + ) end should "format a time according to RFC-822" do - assert_equal "Wed, 27 Mar 2013 11:22:33 +0000", @filter.date_to_rfc822(@sample_time) + assert_equal( + "Wed, 27 Mar 2013 11:22:33 +0000", + @filter.date_to_rfc822(@sample_time) + ) end should "not modify a time in-place when using filters" do @@ -122,11 +161,17 @@ def initialize(opts = {}) end should "format a time with xmlschema" do - assert_equal "2013-03-27T00:00:00+00:00", @filter.date_to_xmlschema(@sample_date) + assert_equal( + "2013-03-27T00:00:00+00:00", + @filter.date_to_xmlschema(@sample_date) + ) end should "format a time according to RFC-822" do - assert_equal "Wed, 27 Mar 2013 00:00:00 +0000", @filter.date_to_rfc822(@sample_date) + assert_equal( + "Wed, 27 Mar 2013 00:00:00 +0000", + @filter.date_to_rfc822(@sample_date) + ) end end @@ -140,11 +185,17 @@ def initialize(opts = {}) end should "format a time with xmlschema" do - assert_equal "2001-09-11T12:46:30+00:00", @filter.date_to_xmlschema(@time_as_string) + assert_equal( + "2001-09-11T12:46:30+00:00", + @filter.date_to_xmlschema(@time_as_string) + ) end should "format a time according to RFC-822" do - assert_equal "Tue, 11 Sep 2001 12:46:30 +0000", @filter.date_to_rfc822(@time_as_string) + assert_equal( + "Tue, 11 Sep 2001 12:46:30 +0000", + @filter.date_to_rfc822(@time_as_string) + ) end end @@ -158,18 +209,27 @@ def initialize(opts = {}) end should "format a time with xmlschema" do - assert_match(/2014-05-10T00:10:07/, @filter.date_to_xmlschema(@time_as_numeric)) + assert_match( + "2014-05-10T00:10:07", + @filter.date_to_xmlschema(@time_as_numeric) + ) end should "format a time according to RFC-822" do - assert_equal "Sat, 10 May 2014 00:10:07 +0000", @filter.date_to_rfc822(@time_as_numeric) + assert_equal( + "Sat, 10 May 2014 00:10:07 +0000", + @filter.date_to_rfc822(@time_as_numeric) + ) end end end should "escape xml with ampersands" do assert_equal "AT&T", @filter.xml_escape("AT&T") - assert_equal "<code>command &lt;filename&gt;</code>", @filter.xml_escape("command <filename>") + assert_equal( + "<code>command &lt;filename&gt;</code>", + @filter.xml_escape("command <filename>") + ) end should "not error when xml escaping nil" do @@ -190,37 +250,40 @@ def initialize(opts = {}) context "jsonify filter" do should "convert hash to json" do - assert_equal "{\"age\":18}", @filter.jsonify({:age => 18}) + assert_equal "{\"age\":18}", @filter.jsonify({ :age => 18 }) end should "convert array to json" do assert_equal "[1,2]", @filter.jsonify([1, 2]) - assert_equal "[{\"name\":\"Jack\"},{\"name\":\"Smith\"}]", @filter.jsonify([{:name => 'Jack'}, {:name => 'Smith'}]) + assert_equal( + "[{\"name\":\"Jack\"},{\"name\":\"Smith\"}]", + @filter.jsonify([{ :name => "Jack" }, { :name => "Smith" }]) + ) end should "convert drop to json" do @filter.site.read expected = { - "path" => "_posts/2008-02-02-published.markdown", - "previous" => nil, - "output" => nil, - "content" => "This should be published.\n", - "id" => "/publish_test/2008/02/02/published", - "url" => "/publish_test/2008/02/02/published.html", + "path" => "_posts/2008-02-02-published.markdown", + "previous" => nil, + "output" => nil, + "content" => "This should be published.\n", + "id" => "/publish_test/2008/02/02/published", + "url" => "/publish_test/2008/02/02/published.html", "relative_path" => "_posts/2008-02-02-published.markdown", - "collection" => "posts", - "excerpt" => "

    This should be published.

    \n", - "draft" => false, - "categories" => [ + "collection" => "posts", + "excerpt" => "

    This should be published.

    \n", + "draft" => false, + "categories" => [ "publish_test" ], - "layout" => "default", - "title" => "Publish", - "category" => "publish_test", - "date" => "2008-02-02 00:00:00 +0000", - "slug" => "published", - "ext" => ".markdown", - "tags" => [] + "layout" => "default", + "title" => "Publish", + "category" => "publish_test", + "date" => "2008-02-02 00:00:00 +0000", + "slug" => "published", + "ext" => ".markdown", + "tags" => [] } actual = JSON.parse(@filter.jsonify(@filter.site.docs_to_write.first.to_liquid)) @@ -236,10 +299,11 @@ def initialize(opts = {}) actual = @filter.jsonify(@filter.site.to_liquid) assert_equal JSON.parse(actual)["jekyll"], { "environment" => "development", - "version" => Jekyll::VERSION + "version" => Jekyll::VERSION } end + # rubocop:disable Style/StructInheritance class M < Struct.new(:message) def to_liquid [message] @@ -247,7 +311,12 @@ def to_liquid end class T < Struct.new(:name) def to_liquid - { "name" => name, :v => 1, :thing => M.new({:kay => "jewelers"}), :stuff => true } + { + "name" => name, + :v => 1, + :thing => M.new({ :kay => "jewelers" }), + :stuff => true + } end end @@ -277,6 +346,7 @@ def to_liquid result = @filter.jsonify([T.new("Jeremiah"), T.new("Smathers")]) assert_equal expected, JSON.parse(result) end + # rubocop:enable Style/StructInheritance should "handle hashes with all sorts of weird keys and values" do my_hash = { "posts" => Array.new(3) { |i| T.new(i) } } @@ -324,16 +394,28 @@ def to_liquid @filter.site.process grouping = @filter.group_by(@filter.site.pages, "layout") grouping.each do |g| - assert ["default", "nil", ""].include?(g["name"]), "#{g['name']} isn't a valid grouping." + assert( + ["default", "nil", ""].include?(g["name"]), + "#{g["name"]} isn't a valid grouping." + ) case g["name"] when "default" - assert g["items"].is_a?(Array), "The list of grouped items for 'default' is not an Array." + assert( + g["items"].is_a?(Array), + "The list of grouped items for 'default' is not an Array." + ) assert_equal 5, g["items"].size when "nil" - assert g["items"].is_a?(Array), "The list of grouped items for 'nil' is not an Array." + assert( + g["items"].is_a?(Array), + "The list of grouped items for 'nil' is not an Array." + ) assert_equal 2, g["items"].size when "" - assert g["items"].is_a?(Array), "The list of grouped items for '' is not an Array." + assert( + g["items"].is_a?(Array), + "The list of grouped items for '' is not an Array." + ) assert_equal 13, g["items"].size end end @@ -343,7 +425,11 @@ def to_liquid grouping = @filter.group_by(@filter.site.pages, "layout") grouping.each do |g| p g - assert_equal g["items"].size, g["size"], "The size property for '#{g["name"]}' doesn't match the size of the Array." + assert_equal( + g["items"].size, + g["size"], + "The size property for '#{g["name"]}' doesn't match the size of the Array." + ) end end end @@ -354,9 +440,9 @@ def to_liquid end should "filter objects in a hash appropriately" do - hash = {"a"=>{"color"=>"red"}, "b"=>{"color"=>"blue"}} + hash = { "a"=>{ "color"=>"red" }, "b"=>{ "color"=>"blue" } } assert_equal 1, @filter.where(hash, "color", "red").length - assert_equal [{"color"=>"red"}], @filter.where(hash, "color", "red") + assert_equal [{ "color"=>"red" }], @filter.where(hash, "color", "red") end should "filter objects appropriately" do @@ -364,25 +450,37 @@ def to_liquid end should "filter array properties appropriately" do - hash = {"a"=>{"tags"=>["x","y"]}, "b"=>{"tags"=>["x"]}, "c"=>{"tags"=>["y","z"]}} + hash = { + "a" => { "tags"=>%w(x y) }, + "b" => { "tags"=>["x"] }, + "c" => { "tags"=>%w(y z) } + } assert_equal 2, @filter.where(hash, "tags", "x").length end should "filter array properties alongside string properties" do - hash = {"a"=>{"tags"=>["x","y"]}, "b"=>{"tags"=>"x"}, "c"=>{"tags"=>["y","z"]}} + hash = { + "a" => { "tags"=>%w(x y) }, + "b" => { "tags"=>"x" }, + "c" => { "tags"=>%w(y z) } + } assert_equal 2, @filter.where(hash, "tags", "x").length end should "not match substrings" do - hash = {"a"=>{"category"=>"bear"}, "b"=>{"category"=>"wolf"}, "c"=>{"category"=>["bear","lion"]}} + hash = { + "a" => { "category"=>"bear" }, + "b" => { "category"=>"wolf" }, + "c" => { "category"=>%w(bear lion) } + } assert_equal 0, @filter.where(hash, "category", "ear").length end should "stringify during comparison for compatibility with liquid parsing" do hash = { - "The Words" => {"rating" => 1.2, "featured" => false}, - "Limitless" => {"rating" => 9.2, "featured" => true}, - "Hustle" => {"rating" => 4.7, "featured" => true}, + "The Words" => { "rating" => 1.2, "featured" => false }, + "Limitless" => { "rating" => 9.2, "featured" => true }, + "Hustle" => { "rating" => 4.7, "featured" => true } } results = @filter.where(hash, "featured", "true") @@ -402,20 +500,26 @@ def to_liquid end should "filter objects in a hash appropriately" do - hash = {"a"=>{"color"=>"red"}, "b"=>{"color"=>"blue"}} + hash = { "a"=>{ "color"=>"red" }, "b"=>{ "color"=>"blue" } } assert_equal 1, @filter.where_exp(hash, "item", "item.color == 'red'").length - assert_equal [{"color"=>"red"}], @filter.where_exp(hash, "item", "item.color == 'red'") + assert_equal( + [{ "color"=>"red" }], + @filter.where_exp(hash, "item", "item.color == 'red'") + ) end should "filter objects appropriately" do - assert_equal 2, @filter.where_exp(@array_of_objects, "item", "item.color == 'red'").length + assert_equal( + 2, + @filter.where_exp(@array_of_objects, "item", "item.color == 'red'").length + ) end should "stringify during comparison for compatibility with liquid parsing" do hash = { - "The Words" => {"rating" => 1.2, "featured" => false}, - "Limitless" => {"rating" => 9.2, "featured" => true}, - "Hustle" => {"rating" => 4.7, "featured" => true}, + "The Words" => { "rating" => 1.2, "featured" => false }, + "Limitless" => { "rating" => 9.2, "featured" => true }, + "Hustle" => { "rating" => 4.7, "featured" => true } } results = @filter.where_exp(hash, "item", "item.featured == true") @@ -465,28 +569,31 @@ def to_liquid assert_equal [1, 2, 2.2, 3], @filter.sort([3, 2.2, 2, 1]) end should "return sorted strings" do - assert_equal ["10", "2"], @filter.sort(["10", "2"]) - assert_equal [{"a" => "10"}, {"a" => "2"}], @filter.sort([{"a" => "10"}, {"a" => "2"}], "a") - assert_equal ["FOO", "Foo", "foo"], @filter.sort(["foo", "Foo", "FOO"]) - assert_equal ["_foo", "foo", "foo_"], @filter.sort(["foo_", "_foo", "foo"]) + assert_equal %w(10 2), @filter.sort(%w(10 2)) + assert_equal( + [{ "a" => "10" }, { "a" => "2" }], + @filter.sort([{ "a" => "10" }, { "a" => "2" }], "a") + ) + assert_equal %w(FOO Foo foo), @filter.sort(%w(foo Foo FOO)) + assert_equal %w(_foo foo foo_), @filter.sort(%w(foo_ _foo foo)) # Cyrillic - assert_equal ["ВУЗ", "Вуз", "вуз"], @filter.sort(["Вуз", "вуз", "ВУЗ"]) - assert_equal ["_вуз", "вуз", "вуз_"], @filter.sort(["вуз_", "_вуз", "вуз"]) + assert_equal %w(ВУЗ Вуз вуз), @filter.sort(%w(Вуз вуз ВУЗ)) + assert_equal %w(_вуз вуз вуз_), @filter.sort(%w(вуз_ _вуз вуз)) # Hebrew - assert_equal ["אלף", "בית"], @filter.sort(["בית", "אלף"]) + assert_equal %w(אלף בית), @filter.sort(%w(בית אלף)) end should "return sorted by property array" do - assert_equal [{"a" => 1}, {"a" => 2}, {"a" => 3}, {"a" => 4}], - @filter.sort([{"a" => 4}, {"a" => 3}, {"a" => 1}, {"a" => 2}], "a") + assert_equal [{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], + @filter.sort([{ "a" => 4 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a") end should "return sorted by property array with nils first" do - ary = [{"a" => 2}, {"b" => 1}, {"a" => 1}] - assert_equal [{"b" => 1}, {"a" => 1}, {"a" => 2}], @filter.sort(ary, "a") + ary = [{ "a" => 2 }, { "b" => 1 }, { "a" => 1 }] + assert_equal [{ "b" => 1 }, { "a" => 1 }, { "a" => 2 }], @filter.sort(ary, "a") assert_equal @filter.sort(ary, "a"), @filter.sort(ary, "a", "first") end should "return sorted by property array with nils last" do - assert_equal [{"a" => 1}, {"a" => 2}, {"b" => 1}], - @filter.sort([{"a" => 2}, {"b" => 1}, {"a" => 1}], "a", "last") + assert_equal [{ "a" => 1 }, { "a" => 2 }, { "b" => 1 }], + @filter.sort([{ "a" => 2 }, { "b" => 1 }, { "a" => 1 }], "a", "last") end end @@ -512,41 +619,41 @@ def to_liquid context "push filter" do should "return a new array with the element pushed to the end" do - assert_equal %w{hi there bernie}, @filter.push(%w{hi there}, "bernie") + assert_equal %w(hi there bernie), @filter.push(%w(hi there), "bernie") end end context "pop filter" do should "return a new array with the last element popped" do - assert_equal %w{hi there}, @filter.pop(%w{hi there bernie}) + assert_equal %w(hi there), @filter.pop(%w(hi there bernie)) end should "allow multiple els to be popped" do - assert_equal %w{hi there bert}, @filter.pop(%w{hi there bert and ernie}, 2) + assert_equal %w(hi there bert), @filter.pop(%w(hi there bert and ernie), 2) end should "cast string inputs for # into nums" do - assert_equal %w{hi there bert}, @filter.pop(%w{hi there bert and ernie}, "2") + assert_equal %w(hi there bert), @filter.pop(%w(hi there bert and ernie), "2") end end context "shift filter" do should "return a new array with the element removed from the front" do - assert_equal %w{a friendly greeting}, @filter.shift(%w{just a friendly greeting}) + assert_equal %w(a friendly greeting), @filter.shift(%w(just a friendly greeting)) end should "allow multiple els to be shifted" do - assert_equal %w{bert and ernie}, @filter.shift(%w{hi there bert and ernie}, 2) + assert_equal %w(bert and ernie), @filter.shift(%w(hi there bert and ernie), 2) end should "cast string inputs for # into nums" do - assert_equal %w{bert and ernie}, @filter.shift(%w{hi there bert and ernie}, "2") + assert_equal %w(bert and ernie), @filter.shift(%w(hi there bert and ernie), "2") end end context "unshift filter" do should "return a new array with the element put at the front" do - assert_equal %w{aloha there bernie}, @filter.unshift(%w{there bernie}, "aloha") + assert_equal %w(aloha there bernie), @filter.unshift(%w(there bernie), "aloha") end end @@ -563,6 +670,5 @@ def to_liquid end end end - end end From fd75f0f7b15880fdb13199d508074cd0ea414ccf Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 21:59:23 -0500 Subject: [PATCH 0899/4996] Rubocop: test/test_configuration.rb --- test/test_configuration.rb | 297 ++++++++++++++++++++++++------------- 1 file changed, 195 insertions(+), 102 deletions(-) diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 08cc3bd9bfd..eddb2c96d0d 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -1,8 +1,8 @@ -require 'helper' +require "helper" class TestConfiguration < JekyllUnitTest - @@test_config = { - "source" => new(nil).source_dir, + test_config = { + "source" => new(nil).source_dir, "destination" => dest_dir } @@ -12,48 +12,77 @@ class TestConfiguration < JekyllUnitTest end should "merge input over defaults" do - result = Configuration.from({"source" => "blah"}) + result = Configuration.from({ "source" => "blah" }) refute_equal result["source"], Configuration::DEFAULTS["source"] assert_equal result["source"], "blah" end should "fix common mistakes" do - result = Configuration.from({"paginate" => 0}) - assert_nil result["paginate"], "Expected 'paginate' to be corrected to 'nil', but was #{result["paginate"].inspect}" + result = Configuration.from({ "paginate" => 0 }) + assert_nil( + result["paginate"], + "Expected 'paginate' to be corrected to 'nil', " \ + "but was #{result["paginate"].inspect}" + ) end should "add default collections" do result = Configuration.from({}) - assert_equal result["collections"], {"posts" => {"output" => true, "permalink" => "/:categories/:year/:month/:day/:title:output_ext"}} + assert_equal( + result["collections"], + { + "posts" => { + "output" => true, + "permalink" => "/:categories/:year/:month/:day/:title:output_ext" + } + } + ) end should "NOT backwards-compatibilize" do - assert Configuration.from("watch" => true)["watch"], "Expected the 'watch' key to not be removed." + assert( + Configuration.from("watch" => true)["watch"], + "Expected the 'watch' key to not be removed." + ) end end context "#add_default_collections" do should "no-op if collections is nil" do - result = Configuration[{"collections" => nil}].add_default_collections + result = Configuration[{ "collections" => nil }].add_default_collections assert_nil result["collections"] end should "turn an array into a hash" do - result = Configuration[{"collections" => %w{methods}}].add_default_collections + result = Configuration[{ "collections" => %w(methods) }].add_default_collections assert_instance_of Hash, result["collections"] - assert_equal result["collections"], {"posts" => {"output" => true}, "methods" => {}} + assert_equal( + result["collections"], + { "posts" => { "output" => true }, "methods" => {} } + ) end should "only assign collections.posts.permalink if a permalink is specified" do - result = Configuration[{"permalink" => "pretty", "collections" => {}}].add_default_collections - assert_equal result["collections"], {"posts" => {"output" => true, "permalink" => "/:categories/:year/:month/:day/:title/"}} + result = Configuration[{ "permalink" => "pretty", "collections" => {} }] + .add_default_collections + assert_equal( + result["collections"], + { + "posts" => { + "output" => true, + "permalink" => "/:categories/:year/:month/:day/:title/" + } + } + ) - result = Configuration[{"permalink" => nil, "collections" => {}}].add_default_collections - assert_equal result["collections"], {"posts" => {"output" => true}} + result = Configuration[{ "permalink" => nil, "collections" => {} }] + .add_default_collections + assert_equal result["collections"], { "posts" => { "output" => true } } end should "forces posts to output" do - result = Configuration[{"collections" => {"posts" => {"output" => false}}}].add_default_collections + result = Configuration[{ "collections" => { "posts" => { "output" => false } } }] + .add_default_collections assert_equal result["collections"]["posts"]["output"], true end end @@ -61,18 +90,18 @@ class TestConfiguration < JekyllUnitTest context "#stringify_keys" do setup do @mixed_keys = Configuration[{ - 'markdown' => 'kramdown', - :permalink => 'date', - 'baseurl' => '/', - :include => ['.htaccess'], - :source => './' + "markdown" => "kramdown", + :permalink => "date", + "baseurl" => "/", + :include => [".htaccess"], + :source => "./" }] @string_keys = Configuration[{ - 'markdown' => 'kramdown', - 'permalink' => 'date', - 'baseurl' => '/', - 'include' => ['.htaccess'], - 'source' => './' + "markdown" => "kramdown", + "permalink" => "date", + "baseurl" => "/", + "include" => [".htaccess"], + "source" => "./" }] end should "stringify symbol keys" do @@ -84,10 +113,12 @@ class TestConfiguration < JekyllUnitTest end context "#config_files" do setup do - @config = Configuration[{"source" => source_dir}] + @config = Configuration[{ "source" => source_dir }] @no_override = {} - @one_config_file = {"config" => "config.yml"} - @multiple_files = {"config" => %w[config/site.yml config/deploy.toml configuration.yml]} + @one_config_file = { "config" => "config.yml" } + @multiple_files = { + "config" => %w(config/site.yml config/deploy.toml configuration.yml) + } end should "always return an array" do @@ -108,52 +139,58 @@ class TestConfiguration < JekyllUnitTest assert_equal [source_dir("_config.yml")], @config.config_files(@no_override) end should "return the config if given one config file" do - assert_equal %w[config.yml], @config.config_files(@one_config_file) + assert_equal %w(config.yml), @config.config_files(@one_config_file) end should "return an array of the config files if given many config files" do - assert_equal %w[config/site.yml config/deploy.toml configuration.yml], @config.config_files(@multiple_files) + assert_equal( + %w(config/site.yml config/deploy.toml configuration.yml), + @config.config_files(@multiple_files) + ) end end context "#read_config_file" do setup do - @config = Configuration[{"source" => source_dir('empty.yml')}] + @config = Configuration[{ "source" => source_dir("empty.yml") }] end should "not raise an error on empty files" do - allow(SafeYAML).to receive(:load_file).with('empty.yml').and_return(false) + allow(SafeYAML).to receive(:load_file).with("empty.yml").and_return(false) Jekyll.logger.log_level = :warn - @config.read_config_file('empty.yml') + @config.read_config_file("empty.yml") Jekyll.logger.log_level = :info end end context "#read_config_files" do setup do - @config = Configuration[{"source" => source_dir}] + @config = Configuration[{ "source" => source_dir }] end should "continue to read config files if one is empty" do - allow(SafeYAML).to receive(:load_file).with('empty.yml').and_return(false) - allow(SafeYAML).to receive(:load_file).with('not_empty.yml').and_return({'foo' => 'bar', 'include' => '', 'exclude' => ''}) + allow(SafeYAML).to receive(:load_file).with("empty.yml").and_return(false) + allow(SafeYAML) + .to receive(:load_file) + .with("not_empty.yml") + .and_return({ "foo" => "bar", "include" => "", "exclude" => "" }) Jekyll.logger.log_level = :warn - read_config = @config.read_config_files(['empty.yml', 'not_empty.yml']) + read_config = @config.read_config_files(["empty.yml", "not_empty.yml"]) Jekyll.logger.log_level = :info - assert_equal 'bar', read_config['foo'] + assert_equal "bar", read_config["foo"] end end context "#backwards_compatibilize" do setup do @config = Configuration[{ - "auto" => true, - "watch" => true, - "server" => true, - "exclude" => "READ-ME.md, Gemfile,CONTRIBUTING.hello.markdown", - "include" => "STOP_THE_PRESSES.txt,.heloses, .git", - "pygments" => true, - "plugins" => true, - "layouts" => true, - "data_source" => true, + "auto" => true, + "watch" => true, + "server" => true, + "exclude" => "READ-ME.md, Gemfile,CONTRIBUTING.hello.markdown", + "include" => "STOP_THE_PRESSES.txt,.heloses, .git", + "pygments" => true, + "plugins" => true, + "layouts" => true, + "data_source" => true }] end should "unset 'auto' and 'watch'" do @@ -169,12 +206,18 @@ class TestConfiguration < JekyllUnitTest should "transform string exclude into an array" do assert @config.key?("exclude") assert @config.backwards_compatibilize.key?("exclude") - assert_equal @config.backwards_compatibilize["exclude"], %w[READ-ME.md Gemfile CONTRIBUTING.hello.markdown] + assert_equal( + @config.backwards_compatibilize["exclude"], + %w(READ-ME.md Gemfile CONTRIBUTING.hello.markdown) + ) end should "transform string include into an array" do assert @config.key?("include") assert @config.backwards_compatibilize.key?("include") - assert_equal @config.backwards_compatibilize["include"], %w[STOP_THE_PRESSES.txt .heloses .git] + assert_equal( + @config.backwards_compatibilize["include"], + %w(STOP_THE_PRESSES.txt .heloses .git) + ) end should "set highlighter to pygments" do assert @config.key?("pygments") @@ -195,62 +238,79 @@ class TestConfiguration < JekyllUnitTest end context "#fix_common_issues" do setup do - @config = Proc.new do |val| + @config = proc do |val| Configuration[{ - 'paginate' => val + "paginate" => val }] end end should "sets an invalid 'paginate' value to nil" do - assert_nil @config.call(0).fix_common_issues['paginate'] - assert_nil @config.call(-1).fix_common_issues['paginate'] - assert_nil @config.call(true).fix_common_issues['paginate'] + assert_nil @config.call(0).fix_common_issues["paginate"] + assert_nil @config.call(-1).fix_common_issues["paginate"] + assert_nil @config.call(true).fix_common_issues["paginate"] end end context "loading configuration" do setup do - @path = source_dir('_config.yml') + @path = source_dir("_config.yml") @user_config = File.join(Dir.pwd, "my_config_file.yml") end should "fire warning with no _config.yml" do - allow(SafeYAML).to receive(:load_file).with(@path) { raise SystemCallError, "No such file or directory - #{@path}" } + allow(SafeYAML).to receive(:load_file).with(@path) do + raise SystemCallError, "No such file or directory - #{@path}" + end allow($stderr).to receive(:puts).with("Configuration file: none".yellow) - assert_equal site_configuration, Jekyll.configuration(@@test_config) + assert_equal site_configuration, Jekyll.configuration(test_config) end should "load configuration as hash" do - allow(SafeYAML).to receive(:load_file).with(@path).and_return(Hash.new) + allow(SafeYAML).to receive(:load_file).with(@path).and_return({}) allow($stdout).to receive(:puts).with("Configuration file: #{@path}") - assert_equal site_configuration, Jekyll.configuration(@@test_config) + assert_equal site_configuration, Jekyll.configuration(test_config) end should "fire warning with bad config" do - allow(SafeYAML).to receive(:load_file).with(@path).and_return(Array.new) - allow($stderr).to receive(:puts).and_return(("WARNING: ".rjust(20) + "Error reading configuration. Using defaults (and options).").yellow) - allow($stderr).to receive(:puts).and_return("Configuration file: (INVALID) #{@path}".yellow) - assert_equal site_configuration, Jekyll.configuration(@@test_config) + allow(SafeYAML).to receive(:load_file).with(@path).and_return([]) + allow($stderr) + .to receive(:puts) + .and_return( + ("WARNING: " + .rjust(20) + "Error reading configuration. Using defaults (and options).") + .yellow + ) + allow($stderr) + .to receive(:puts) + .and_return("Configuration file: (INVALID) #{@path}".yellow) + assert_equal site_configuration, Jekyll.configuration(test_config) end should "fire warning when user-specified config file isn't there" do - allow(SafeYAML).to receive(:load_file).with(@user_config) { raise SystemCallError, "No such file or directory - #{@user_config}" } - allow($stderr).to receive(:puts).with(("Fatal: ".rjust(20) + "The configuration file '#{@user_config}' could not be found.").red) + allow(SafeYAML).to receive(:load_file).with(@user_config) do + raise SystemCallError, "No such file or directory - #{@user_config}" + end + allow($stderr) + .to receive(:puts) + .with(( + "Fatal: ".rjust(20) + \ + "The configuration file '#{@user_config}' could not be found." + ).red) assert_raises LoadError do - Jekyll.configuration({'config' => [@user_config]}) + Jekyll.configuration({ "config" => [@user_config] }) end end should "not clobber YAML.load to the dismay of other libraries" do - assert_equal :foo, YAML.load(':foo') + assert_equal :foo, YAML.load(":foo") # as opposed to: assert_equal ':foo', SafeYAML.load(':foo') end end context "loading config from external file" do setup do @paths = { - :default => source_dir('_config.yml'), - :other => source_dir('_config.live.yml'), - :toml => source_dir('_config.dev.toml'), + :default => source_dir("_config.yml"), + :other => source_dir("_config.live.yml"), + :toml => source_dir("_config.dev.toml"), :empty => "" } end @@ -258,16 +318,19 @@ class TestConfiguration < JekyllUnitTest should "load default plus posts config if no config_file is set" do allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") - assert_equal site_configuration, Jekyll.configuration(@@test_config) + assert_equal site_configuration, Jekyll.configuration(test_config) end should "load different config if specified" do - allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return({"baseurl" => "http://wahoo.dev"}) + allow(SafeYAML) + .to receive(:load_file) + .with(@paths[:other]) + .and_return({ "baseurl" => "http://wahoo.dev" }) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") Jekyll.configuration({ "config" => @paths[:other] }) assert_equal \ site_configuration({ "baseurl" => "http://wahoo.dev" }), - Jekyll.configuration(@@test_config.merge({ "config" => @paths[:other] })) + Jekyll.configuration(test_config.merge({ "config" => @paths[:other] })) end should "load default config if path passed is empty" do @@ -275,68 +338,94 @@ class TestConfiguration < JekyllUnitTest allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") assert_equal \ site_configuration, - Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:empty]] })) + Jekyll.configuration(test_config.merge({ "config" => [@paths[:empty]] })) end should "successfully load a TOML file" do Jekyll.logger.log_level = :warn assert_equal \ - site_configuration({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), - Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:toml]] })) + site_configuration({ "baseurl" => "/you-beautiful-blog-you", + "title" => "My magnificent site, wut" }), + Jekyll.configuration(test_config.merge({ "config" => [@paths[:toml]] })) Jekyll.logger.log_level = :info end should "load multiple config files" do - External.require_with_graceful_fail('toml') + External.require_with_graceful_fail("toml") - allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return(Hash.new) - allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return(Hash.new) - allow(TOML).to receive(:load_file).with(@paths[:toml]).and_return(Hash.new) + allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({}) + allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return({}) + allow(TOML).to receive(:load_file).with(@paths[:toml]).and_return({}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:toml]}") - assert_equal \ + assert_equal( site_configuration, - Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:default], @paths[:other], @paths[:toml]] })) + Jekyll.configuration( + test_config.merge( + { "config" => [@paths[:default], @paths[:other], @paths[:toml]] } + ) + ) + ) end should "load multiple config files and last config should win" do - allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({"baseurl" => "http://example.dev"}) - allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return({"baseurl" => "http://wahoo.dev"}) - allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") - allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") + allow(SafeYAML) + .to receive(:load_file) + .with(@paths[:default]) + .and_return({ "baseurl" => "http://example.dev" }) + allow(SafeYAML) + .to receive(:load_file) + .with(@paths[:other]) + .and_return({ "baseurl" => "http://wahoo.dev" }) + allow($stdout) + .to receive(:puts) + .with("Configuration file: #{@paths[:default]}") + allow($stdout) + .to receive(:puts) + .with("Configuration file: #{@paths[:other]}") assert_equal \ site_configuration({ "baseurl" => "http://wahoo.dev" }), - Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:default], @paths[:other]] })) + Jekyll.configuration( + test_config.merge({ "config" => [@paths[:default], @paths[:other]] }) + ) end end context "#add_default_collections" do should "not do anything if collections is nil" do - conf = Configuration[default_configuration].tap {|c| c['collections'] = nil } + conf = Configuration[default_configuration].tap { |c| c["collections"] = nil } assert_equal conf.add_default_collections, conf - assert_nil conf.add_default_collections['collections'] + assert_nil conf.add_default_collections["collections"] end should "converts collections to a hash if an array" do - conf = Configuration[default_configuration].tap {|c| c['collections'] = ['docs'] } + conf = Configuration[default_configuration].tap do |c| + c["collections"] = ["docs"] + end assert_equal conf.add_default_collections, conf.merge({ "collections" => { - "docs" => {}, + "docs" => {}, "posts" => { - "output" => true, + "output" => true, "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - }}}) + } + } + }) end should "force collections.posts.output = true" do - conf = Configuration[default_configuration].tap {|c| c['collections'] = {'posts' => {'output' => false}} } + conf = Configuration[default_configuration].tap do |c| + c["collections"] = { "posts" => { "output" => false } } + end assert_equal conf.add_default_collections, conf.merge({ "collections" => { "posts" => { - "output" => true, + "output" => true, "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - }}}) + } + } + }) end should "set collections.posts.permalink if it's not set" do @@ -344,24 +433,28 @@ class TestConfiguration < JekyllUnitTest assert_equal conf.add_default_collections, conf.merge({ "collections" => { "posts" => { - "output" => true, + "output" => true, "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - }}}) + } + } + }) end should "leave collections.posts.permalink alone if it is set" do posts_permalink = "/:year/:title/" conf = Configuration[default_configuration].tap do |c| - c['collections'] = { + c["collections"] = { "posts" => { "permalink" => posts_permalink } } end assert_equal conf.add_default_collections, conf.merge({ "collections" => { "posts" => { - "output" => true, + "output" => true, "permalink" => posts_permalink - }}}) + } + } + }) end end end From 5291bd0498a34da19f99e11469411c930a461e12 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 21:59:33 -0500 Subject: [PATCH 0900/4996] Rubocop: test/test_document.rb --- test/test_document.rb | 115 +++++++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 51 deletions(-) diff --git a/test/test_document.rb b/test/test_document.rb index fb503dccedb..808ef2e7d56 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -1,7 +1,6 @@ -require 'helper' +require "helper" class TestDocument < JekyllUnitTest - def assert_equal_value(key, one, other) assert_equal(one[key], other[key]) end @@ -12,7 +11,9 @@ def assert_equal_value(key, one, other) "collections" => ["methods"] }) @site.process - @document = @site.collections["methods"].docs.detect {|d| d.relative_path == "_methods/configuration.md" } + @document = @site.collections["methods"].docs.detect do |d| + d.relative_path == "_methods/configuration.md" + end end should "exist" do @@ -86,11 +87,12 @@ def assert_equal_value(key, one, other) end context "with YAML ending in three dots" do - setup do - @site = fixture_site({"collections" => ["methods"]}) + @site = fixture_site({ "collections" => ["methods"] }) @site.process - @document = @site.collections["methods"].docs.detect {|d| d.relative_path == "_methods/yaml_with_dots.md" } + @document = @site.collections["methods"].docs.detect do |d| + d.relative_path == "_methods/yaml_with_dots.md" + end end should "know its data" do @@ -100,36 +102,35 @@ def assert_equal_value(key, one, other) end should "output the collection name in the #to_liquid method" do - assert_equal @document.to_liquid['collection'], "methods" + assert_equal @document.to_liquid["collection"], "methods" end should "output its relative path as path in Liquid" do - assert_equal @document.to_liquid['path'], "_methods/configuration.md" + assert_equal @document.to_liquid["path"], "_methods/configuration.md" end - end context "a document as part of a collection with frontmatter defaults" do setup do @site = fixture_site({ "collections" => ["slides"], - "defaults" => [{ - "scope"=> {"path"=>"", "type"=>"slides"}, - "values"=> { - "nested"=> { - "key"=>"myval", + "defaults" => [{ + "scope" => { "path"=>"", "type"=>"slides" }, + "values" => { + "nested" => { + "key" => "myval" } } }] }) @site.process - @document = @site.collections["slides"].docs.select{|d| d.is_a?(Document) }.first + @document = @site.collections["slides"].docs.select { |d| d.is_a?(Document) }.first end should "know the frontmatter defaults" do assert_equal "Example slide", @document.data["title"] assert_equal "slide", @document.data["layout"] - assert_equal({"key"=>"myval"}, @document.data["nested"]) + assert_equal({ "key"=>"myval" }, @document.data["nested"]) end end @@ -137,12 +138,12 @@ def assert_equal_value(key, one, other) setup do @site = fixture_site({ "collections" => ["slides"], - "defaults" => [{ - "scope"=> {"path"=>"", "type"=>"slides"}, - "values"=> { - "nested"=> { - "test1"=>"default1", - "test2"=>"default1" + "defaults" => [{ + "scope" => { "path"=>"", "type"=>"slides" }, + "values" => { + "nested" => { + "test1" => "default1", + "test2" => "default1" } } }] @@ -154,7 +155,10 @@ def assert_equal_value(key, one, other) should "override default values in the document frontmatter" do assert_equal "Override title", @document.data["title"] assert_equal "slide", @document.data["layout"] - assert_equal({"test1"=>"override1","test2"=>"override2"}, @document.data["nested"]) + assert_equal( + { "test1"=>"override1", "test2"=>"override2" }, + @document.data["nested"] + ) end end @@ -162,11 +166,11 @@ def assert_equal_value(key, one, other) setup do @site = fixture_site({ "collections" => ["slides"], - "defaults" => [{ - "scope"=> {"path"=>"_slides", "type"=>"slides"}, - "values"=> { - "nested"=> { - "key"=>"value123", + "defaults" => [{ + "scope" => { "path"=>"_slides", "type"=>"slides" }, + "values" => { + "nested" => { + "key" => "value123" } } }] @@ -178,7 +182,7 @@ def assert_equal_value(key, one, other) should "know the frontmatter defaults" do assert_equal "Example slide", @document.data["title"] assert_equal "slide", @document.data["layout"] - assert_equal({"key"=>"value123"}, @document.data["nested"]) + assert_equal({ "key"=>"value123" }, @document.data["nested"]) end end @@ -186,11 +190,11 @@ def assert_equal_value(key, one, other) setup do @site = fixture_site({ "collections" => ["slides"], - "defaults" => [{ - "scope"=> {"path"=>"somepath", "type"=>"slides"}, - "values"=> { - "nested"=> { - "key"=>"myval", + "defaults" => [{ + "scope" => { "path"=>"somepath", "type"=>"slides" }, + "values" => { + "nested" => { + "key" => "myval" } } }] @@ -234,7 +238,7 @@ def assert_equal_value(key, one, other) "permalink" => "/slides/test/:name" } }, - "permalink" => "pretty" + "permalink" => "pretty" }) @site.process @document = @site.collections["slides"].docs[0] @@ -259,9 +263,9 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => { "slides" => { - "output" => true, + "output" => true } - }, + } }) @site.permalink_style = :pretty @site.process @@ -283,9 +287,9 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => { "slides" => { - "output" => true, + "output" => true } - }, + } }) @site.permalink_style = :pretty @site.process @@ -337,7 +341,7 @@ def assert_equal_value(key, one, other) "output" => true, "permalink" => "/slides/:title" } - }, + } }) @site.process @document = @site.collections["slides"].docs[3] @@ -363,7 +367,10 @@ def assert_equal_value(key, one, other) end should "produce the right URL if they have a wild slug" do - assert_equal "/slides/Well,-so-what-is-Jekyll,-then", @document_with_strange_slug.url + assert_equal( + "/slides/Well,-so-what-is-Jekyll,-then", + @document_with_strange_slug.url + ) end should "produce the right destination file if they have a wild slug" do dest_file = dest_dir("/slides/Well,-so-what-is-Jekyll,-then.html") @@ -373,9 +380,9 @@ def assert_equal_value(key, one, other) context "document with a permalink with dots & a trailing slash" do setup do - @site = fixture_site({"collections" => { + @site = fixture_site({ "collections" => { "with.dots" => { "output" => true } - }}) + } }) @site.process @document = @site.collections["with.dots"].docs.last @dest_file = dest_dir("with.dots", "permalink.with.slash.tho", "index.html") @@ -401,7 +408,7 @@ def assert_equal_value(key, one, other) "slides" => { "output" => true } - }, + } }) @site.process @files = @site.collections["slides"].docs @@ -409,13 +416,17 @@ def assert_equal_value(key, one, other) context "without output overrides" do should "be output according to collection defaults" do - refute_nil @files.find { |doc| doc.relative_path == "_slides/example-slide-4.html" } + refute_nil @files.find do |doc| + doc.relative_path == "_slides/example-slide-4.html" + end end end context "with output overrides" do should "be output according its front matter" do - assert_nil @files.find { |doc| doc.relative_path == "_slides/non-outputted-slide.html" } + assert_nil @files.find { |doc| + doc.relative_path == "_slides/non-outputted-slide.html" + } end end end @@ -430,7 +441,9 @@ def assert_equal_value(key, one, other) } }) @site.process - @document = @site.collections["slides"].files.find { |doc| doc.relative_path == "_slides/octojekyll.png" } + @document = @site.collections["slides"].files.find do |doc| + doc.relative_path == "_slides/octojekyll.png" + end @dest_file = dest_dir("slides/octojekyll.png") end @@ -458,10 +471,12 @@ def assert_equal_value(key, one, other) "methods" => { "output" => true } - }, + } }) @site.process - @document = @site.collections["methods"].docs.find { |doc| doc.relative_path == "_methods/escape-+ #%20[].md" } + @document = @site.collections["methods"].docs.find do |doc| + doc.relative_path == "_methods/escape-+ #%20[].md" + end @dest_file = dest_dir("methods/escape-+ #%20[].html") end @@ -476,7 +491,5 @@ def assert_equal_value(key, one, other) should "be output in the correct place" do assert_equal true, File.file?(@dest_file) end - end - end From c00c761e1d277139ce4a493cfebb39c8e2fbb042 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 21:59:43 -0500 Subject: [PATCH 0901/4996] Rubocop: test/test_entry_filter.rb --- test/test_entry_filter.rb | 60 +++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb index d9e38300bca..0b1d7134a4d 100644 --- a/test/test_entry_filter.rb +++ b/test/test_entry_filter.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestEntryFilter < JekyllUnitTest context "Filtering entries" do @@ -7,16 +7,16 @@ class TestEntryFilter < JekyllUnitTest end should "filter entries" do - ent1 = %w[foo.markdown bar.markdown baz.markdown #baz.markdown# - .baz.markdow foo.markdown~ .htaccess _posts _pages ~$benbalter.docx] + ent1 = %w(foo.markdown bar.markdown baz.markdown #baz.markdown# + .baz.markdow foo.markdown~ .htaccess _posts _pages ~$benbalter.docx) entries = EntryFilter.new(@site).filter(ent1) - assert_equal %w[foo.markdown bar.markdown baz.markdown .htaccess], entries + assert_equal %w(foo.markdown bar.markdown baz.markdown .htaccess), entries end should "allow regexp filtering" do files = %w(README.md) - @site.exclude = excludes = [ + @site.exclude = [ /README/ ] @@ -26,63 +26,69 @@ class TestEntryFilter < JekyllUnitTest end should "filter entries with exclude" do - excludes = %w[README TODO vendor/bundle] - files = %w[index.html site.css .htaccess vendor] + excludes = %w(README TODO vendor/bundle) + files = %w(index.html site.css .htaccess vendor) @site.exclude = excludes + ["exclude*"] assert_equal files, @site.reader.filter_entries(excludes + files + ["excludeA"]) end should "filter entries with exclude relative to site source" do - excludes = %w[README TODO css] - files = %w[index.html vendor/css .htaccess] + excludes = %w(README TODO css) + files = %w(index.html vendor/css .htaccess) @site.exclude = excludes assert_equal files, @site.reader.filter_entries(excludes + files + ["css"]) end should "filter excluded directory and contained files" do - excludes = %w[README TODO css] - files = %w[index.html .htaccess] + excludes = %w(README TODO css) + files = %w(index.html .htaccess) @site.exclude = excludes - assert_equal files, @site.reader.filter_entries(excludes + files + ["css", "css/main.css", "css/vendor.css"]) + assert_equal( + files, + @site.reader.filter_entries( + excludes + files + ["css", "css/main.css", "css/vendor.css"] + ) + ) end should "not filter entries within include" do - includes = %w[_index.html .htaccess include*] - files = %w[index.html _index.html .htaccess includeA] + includes = %w(_index.html .htaccess include*) + files = %w(index.html _index.html .htaccess includeA) @site.include = includes assert_equal files, @site.reader.filter_entries(files) end should "keep safe symlink entries when safe mode enabled" do - site = Site.new(site_configuration('safe' => true)) - allow(File).to receive(:symlink?).with('symlink.js').and_return(true) - files = %w[symlink.js] + allow(File).to receive(:symlink?).with("symlink.js").and_return(true) + files = %w(symlink.js) assert_equal files, @site.reader.filter_entries(files) end should "not filter symlink entries when safe mode disabled" do - allow(File).to receive(:symlink?).with('symlink.js').and_return(true) - files = %w[symlink.js] + allow(File).to receive(:symlink?).with("symlink.js").and_return(true) + files = %w(symlink.js) assert_equal files, @site.reader.filter_entries(files) end should "filter symlink pointing outside site source" do - ent1 = %w[_includes/tmp] + ent1 = %w(_includes/tmp) entries = EntryFilter.new(@site).filter(ent1) - assert_equal %w[], entries + assert_equal %w(), entries end + # rubocop:disable Performance/FixedSize should "include only safe symlinks in safe mode" do - site = Site.new(site_configuration('safe' => true)) - + site = Site.new(site_configuration("safe" => true)) site.reader.read_directories("symlink-test") - assert_equal %w[main.scss symlinked-file].length, site.pages.length + + assert_equal %w(main.scss symlinked-file).length, site.pages.length refute_equal [], site.static_files end + # rubocop:enable Performance/FixedSize should "include symlinks in unsafe mode" do site = Site.new(site_configuration) @@ -118,9 +124,9 @@ class TestEntryFilter < JekyllUnitTest end should "match even if there is no leading slash" do - data = ['vendor/bundle'] - assert @filter.glob_include?(data, '/vendor/bundle') - assert @filter.glob_include?(data, 'vendor/bundle') + data = ["vendor/bundle"] + assert @filter.glob_include?(data, "/vendor/bundle") + assert @filter.glob_include?(data, "vendor/bundle") end end end From 23646549c44f80e3549b44b52fb512b1c0f01d78 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 21:59:54 -0500 Subject: [PATCH 0902/4996] Rubocop: test/test_kramdown.rb --- test/test_kramdown.rb | 53 +++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index c9316936b13..e8d494ae217 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -1,22 +1,22 @@ # encoding: UTF-8 -require 'helper' +require "helper" class TestKramdown < JekyllUnitTest context "kramdown" do setup do @config = { - 'markdown' => 'kramdown', - 'kramdown' => { - 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo', - 'entity_output' => 'as_char', - 'toc_levels' => '1..6', - 'auto_ids' => false, - 'footnote_nr' => 1, - - 'syntax_highlighter' => 'rouge', - 'syntax_highlighter_opts' => { - 'bold_every' => 8, 'css' => :class + "markdown" => "kramdown", + "kramdown" => { + "smart_quotes" => "lsquo,rsquo,ldquo,rdquo", + "entity_output" => "as_char", + "toc_levels" => "1..6", + "auto_ids" => false, + "footnote_nr" => 1, + + "syntax_highlighter" => "rouge", + "syntax_highlighter_opts" => { + "bold_every" => 8, "css" => :class } } } @@ -33,25 +33,28 @@ class TestKramdown < JekyllUnitTest context "when asked to convert smart quotes" do should "convert" do - assert_match %r!

    (“|“)Pit(’|’)hy(”|”)<\/p>!, @markdown.convert(%{"Pit'hy"}).strip + assert_match( + %r!

    (“|“)Pit(’|’)hy(”|”)<\/p>!, + @markdown.convert(%("Pit'hy")).strip + ) end should "support custom types" do override = { "highlighter" => nil, - 'kramdown' => { - 'smart_quotes' => 'lsaquo,rsaquo,laquo,raquo' + "kramdown" => { + "smart_quotes" => "lsaquo,rsaquo,laquo,raquo" } } markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) assert_match %r!

    («|«)Pit(›|›)hy(»|»)<\/p>!, \ - markdown.convert(%{"Pit'hy"}).strip + markdown.convert(%("Pit'hy")).strip end end should "render fenced code blocks with syntax highlighting" do - result = nokogiri_fragment(@markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) + result = nokogiri_fragment(@markdown.convert(Utils.strip_heredoc(<<-MARKDOWN))) ~~~ruby puts "Hello World" ~~~ @@ -65,14 +68,14 @@ class TestKramdown < JekyllUnitTest should "use the chosen highlighter if it's available" do override = { "highlighter" => nil, - "markdown" => "kramdown", - "kramdown" => { + "markdown" => "kramdown", + "kramdown" => { "syntax_highlighter" => :coderay } } markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) - result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) + result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc(<<-MARKDOWN))) ~~~ruby puts "Hello World" ~~~ @@ -86,14 +89,14 @@ class TestKramdown < JekyllUnitTest override = { "markdown" => "kramdown", "kramdown" => { - "enable_coderay" => true, + "enable_coderay" => true } } @config.delete("highlighter") @config["kramdown"].delete("syntax_highlighter") markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) - result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) + result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc(<<-MARKDOWN))) ~~~ruby puts "Hello World" ~~~ @@ -108,10 +111,10 @@ class TestKramdown < JekyllUnitTest original = Kramdown::Document.method(:new) markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, { "higlighter" => nil, - "markdown" => "kramdown", - "kramdown" => { + "markdown" => "kramdown", + "kramdown" => { "syntax_highlighter" => "coderay", - "coderay" => { + "coderay" => { "hello" => "world" } } From 7537b01e746170cae91ca416d12cf4691ff6c9fd Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 22:00:05 -0500 Subject: [PATCH 0903/4996] Rubocop: test/test_liquid_renderer.rb --- test/test_liquid_renderer.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/test_liquid_renderer.rb b/test/test_liquid_renderer.rb index d727fac03cf..f6ab34d2cac 100644 --- a/test/test_liquid_renderer.rb +++ b/test/test_liquid_renderer.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestLiquidRenderer < JekyllUnitTest context "profiler" do @@ -12,11 +12,13 @@ class TestLiquidRenderer < JekyllUnitTest output = @renderer.stats_table + # rubocop:disable Metrics/LineLength 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}$/, + %r!^_posts/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$! ] + # rubocop:enable Metrics/LineLength expected.each do |regexp| assert_match regexp, output From 474fc0a9a8a3ed90d8e7b51c3f10161d1bf2a2e5 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 22:00:15 -0500 Subject: [PATCH 0904/4996] Rubocop: test/test_page.rb --- test/test_page.rb | 148 +++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 73 deletions(-) diff --git a/test/test_page.rb b/test/test_page.rb index 8930095db87..5b4aabebe30 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -1,15 +1,18 @@ -require 'helper' +require "helper" class TestPage < JekyllUnitTest def setup_page(*args) dir, file = args - dir, file = ['', dir] if file.nil? + if file.nil? + file = dir + dir = "" + end @page = Page.new(@site, source_dir, dir, file) end def do_render(page) layouts = { - "default" => Layout.new(@site, source_dir('_layouts'), "simple.html") + "default" => Layout.new(@site, source_dir("_layouts"), "simple.html") } page.render(layouts, @site.site_payload) end @@ -18,15 +21,15 @@ def do_render(page) setup do clear_dest @site = Site.new(Jekyll.configuration({ - "source" => source_dir, - "destination" => dest_dir, + "source" => source_dir, + "destination" => dest_dir, "skip_config_files" => true })) end context "processing pages" do should "create url based on filename" do - @page = setup_page('contacts.html') + @page = setup_page("contacts.html") assert_equal "/contacts.html", @page.url end @@ -36,29 +39,29 @@ def do_render(page) end should "create url with non-alphabetic characters" do - @page = setup_page('+', '%# +.md') + @page = setup_page("+", '%# +.md') assert_equal "/+/%25%23%20+.html", @page.url end context "in a directory hierarchy" do should "create url based on filename" do - @page = setup_page('/contacts', 'bar.html') + @page = setup_page("/contacts", "bar.html") assert_equal "/contacts/bar.html", @page.url end should "create index url based on filename" do - @page = setup_page('/contacts', 'index.html') + @page = setup_page("/contacts", "index.html") assert_equal "/contacts/", @page.url end end should "deal properly with extensions" do - @page = setup_page('deal.with.dots.html') + @page = setup_page("deal.with.dots.html") assert_equal ".html", @page.ext end should "deal properly with non-html extensions" do - @page = setup_page('dynamic_page.php') + @page = setup_page("dynamic_page.php") @dest_file = dest_dir("dynamic_page.php") assert_equal ".php", @page.ext assert_equal "dynamic_page", @page.basename @@ -67,7 +70,7 @@ def do_render(page) end should "deal properly with dots" do - @page = setup_page('deal.with.dots.html') + @page = setup_page("deal.with.dots.html") @dest_file = dest_dir("deal.with.dots.html") assert_equal "deal.with.dots", @page.basename @@ -75,19 +78,19 @@ def do_render(page) end should "make properties accessible through #[]" do - page = setup_page('properties.html') + page = setup_page("properties.html") attrs = { - content: "All the properties.\n", - dir: "/properties/", - excerpt: nil, - foo: 'bar', - layout: 'default', - name: "properties.html", - path: "properties.html", - permalink: '/properties/', - published: nil, - title: 'Properties Page', - url: "/properties/" + :content => "All the properties.\n", + :dir => "/properties/", + :excerpt => nil, + :foo => "bar", + :layout => "default", + :name => "properties.html", + :path => "properties.html", + :permalink => "/properties/", + :published => nil, + :title => "Properties Page", + :url => "/properties/" } attrs.each do |attr, val| @@ -103,38 +106,38 @@ def do_render(page) end should "return dir, url, and destination correctly" do - @page = setup_page('contacts.html') + @page = setup_page("contacts.html") @dest_file = dest_dir("contacts/index.html") - assert_equal '/contacts/', @page.dir - assert_equal '/contacts/', @page.url + assert_equal "/contacts/", @page.dir + assert_equal "/contacts/", @page.url assert_equal @dest_file, @page.destination(dest_dir) end should "return dir correctly for index page" do - @page = setup_page('index.html') - assert_equal '/', @page.dir + @page = setup_page("index.html") + assert_equal "/", @page.dir end context "in a directory hierarchy" do should "create url based on filename" do - @page = setup_page('/contacts', 'bar.html') + @page = setup_page("/contacts", "bar.html") assert_equal "/contacts/bar/", @page.url end should "create index url based on filename" do - @page = setup_page('/contacts', 'index.html') + @page = setup_page("/contacts", "index.html") assert_equal "/contacts/", @page.url end should "return dir correctly" do - @page = setup_page('/contacts', 'bar.html') - assert_equal '/contacts/bar/', @page.dir + @page = setup_page("/contacts", "bar.html") + assert_equal "/contacts/bar/", @page.dir end should "return dir correctly for index page" do - @page = setup_page('/contacts', 'index.html') - assert_equal '/contacts/', @page.dir + @page = setup_page("/contacts", "index.html") + assert_equal "/contacts/", @page.dir end end end @@ -145,16 +148,16 @@ def do_render(page) end should "return url and destination correctly" do - @page = setup_page('contacts.html') + @page = setup_page("contacts.html") @dest_file = dest_dir("contacts.html") - assert_equal '/contacts.html', @page.url + assert_equal "/contacts.html", @page.url assert_equal @dest_file, @page.destination(dest_dir) end should "return dir correctly" do - assert_equal '/', setup_page('contacts.html').dir - assert_equal '/contacts/', setup_page('contacts/bar.html').dir - assert_equal '/contacts/', setup_page('contacts/index.html').dir + assert_equal "/", setup_page("contacts.html").dir + assert_equal "/contacts/", setup_page("contacts/bar.html").dir + assert_equal "/contacts/", setup_page("contacts/index.html").dir end end @@ -164,9 +167,9 @@ def do_render(page) end should "return url and destination correctly" do - @page = setup_page('contacts.html') + @page = setup_page("contacts.html") @dest_file = dest_dir("contacts/index.html") - assert_equal '/contacts/', @page.url + assert_equal "/contacts/", @page.url assert_equal @dest_file, @page.destination(dest_dir) end end @@ -177,9 +180,9 @@ def do_render(page) end should "return url and destination correctly" do - @page = setup_page('contacts.html') + @page = setup_page("contacts.html") @dest_file = dest_dir("contacts.html") - assert_equal '/contacts.html', @page.url + assert_equal "/contacts.html", @page.url assert_equal @dest_file, @page.destination(dest_dir) end end @@ -190,9 +193,9 @@ def do_render(page) end should "return url and destination correctly" do - @page = setup_page('contacts.html') + @page = setup_page("contacts.html") @dest_file = dest_dir("contacts.html") - assert_equal '/contacts', @page.url + assert_equal "/contacts", @page.url assert_equal @dest_file, @page.destination(dest_dir) end end @@ -200,9 +203,9 @@ def do_render(page) context "with any other permalink style" do should "return dir correctly" do @site.permalink_style = nil - assert_equal '/', setup_page('contacts.html').dir - assert_equal '/contacts/', setup_page('contacts/index.html').dir - assert_equal '/contacts/', setup_page('contacts/bar.html').dir + assert_equal "/", setup_page("contacts.html").dir + assert_equal "/contacts/", setup_page("contacts/index.html").dir + assert_equal "/contacts/", setup_page("contacts/bar.html").dir end end @@ -216,7 +219,7 @@ def do_render(page) end should "return nil permalink if no permalink exists" do - @page = setup_page('') + @page = setup_page("") assert_equal nil, @page.permalink end @@ -233,7 +236,7 @@ def do_render(page) context "with specified layout of nil" do setup do - @page = setup_page('sitemap.xml') + @page = setup_page("sitemap.xml") end should "layout of nil is respected" do @@ -247,60 +250,60 @@ def do_render(page) end should "write properly" do - page = setup_page('contacts.html') + page = setup_page("contacts.html") do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir('contacts.html') + assert_exist dest_dir("contacts.html") end should "write even when the folder name is plus and permalink has +" do - page = setup_page('+', 'foo.md') + page = setup_page("+", "foo.md") do_render(page) page.write(dest_dir) assert File.directory?(dest_dir), "#{dest_dir} should be a directory" - assert_exist dest_dir('+', 'plus+in+url.html') + assert_exist dest_dir("+", "plus+in+url.html") end should "write even when permalink has '%# +'" do - page = setup_page('+', '%# +.md') + page = setup_page("+", '%# +.md') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir('+', '%# +.html') + assert_exist dest_dir("+", '%# +.html') end should "write properly without html extension" do - page = setup_page('contacts.html') + page = setup_page("contacts.html") page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir('contacts', 'index.html') + assert_exist dest_dir("contacts", "index.html") end should "support .htm extension and respects that" do - page = setup_page('contacts.htm') + page = setup_page("contacts.htm") page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir('contacts', 'index.htm') + assert_exist dest_dir("contacts", "index.htm") end should "support .xhtml extension and respects that" do - page = setup_page('contacts.xhtml') + page = setup_page("contacts.xhtml") page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir('contacts', 'index.xhtml') + assert_exist dest_dir("contacts", "index.xhtml") end should "write properly with extension different from html" do @@ -312,48 +315,47 @@ def do_render(page) assert_equal "/sitemap.xml", page.url assert_nil page.url[/\.html$/] assert File.directory?(dest_dir) - assert_exist dest_dir('sitemap.xml') + assert_exist dest_dir("sitemap.xml") end should "write dotfiles properly" do - page = setup_page('.htaccess') + page = setup_page(".htaccess") do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir('.htaccess') + assert_exist dest_dir(".htaccess") end context "in a directory hierarchy" do should "write properly the index" do - page = setup_page('/contacts', 'index.html') + page = setup_page("/contacts", "index.html") do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir('contacts', 'index.html') + assert_exist dest_dir("contacts", "index.html") end should "write properly" do - page = setup_page('/contacts', 'bar.html') + page = setup_page("/contacts", "bar.html") do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir('contacts', 'bar.html') + assert_exist dest_dir("contacts", "bar.html") end should "write properly without html extension" do - page = setup_page('/contacts', 'bar.html') + page = setup_page("/contacts", "bar.html") page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir('contacts', 'bar', 'index.html') + assert_exist dest_dir("contacts", "bar", "index.html") end end end - end end From 98262b73d5609fbdcdb66db6055e3097d19ed47b Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 22:00:29 -0500 Subject: [PATCH 0905/4996] Rubocop: test/test_regenerator.rb --- test/test_regenerator.rb | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index 1ed212110d5..36b15949591 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestRegenerator < JekyllUnitTest context "The site regenerator" do @@ -39,11 +39,10 @@ class TestRegenerator < JekyllUnitTest # we need to create the destinations for these files, # because regenerate? checks if the destination exists [@page, @post, @document, @asset_file].each do |item| - if item.respond_to?(:destination) - dest = item.destination(@site.dest) - FileUtils.mkdir_p(File.dirname(dest)) - FileUtils.touch(dest) - end + next unless item.respond_to?(:destination) + dest = item.destination(@site.dest) + FileUtils.mkdir_p(File.dirname(dest)) + FileUtils.touch(dest) end @regenerator.write_metadata @regenerator = Regenerator.new(@site) @@ -69,7 +68,7 @@ class TestRegenerator < JekyllUnitTest [@page, @post, @document, @asset_file].each do |item| if item.respond_to?(:destination) dest = item.destination(@site.dest) - File.unlink(dest) unless !File.exist?(dest) + File.unlink(dest) if File.exist?(dest) end end @@ -128,7 +127,7 @@ class TestRegenerator < JekyllUnitTest FileUtils.rm_rf(source_dir(".jekyll-metadata")) @site = Site.new(Jekyll.configuration({ - "source" => source_dir, + "source" => source_dir, "destination" => dest_dir, "incremental" => true })) @@ -152,7 +151,7 @@ class TestRegenerator < JekyllUnitTest assert @regenerator.cache[@path] @regenerator.clear_cache - assert_equal @regenerator.cache, {} + assert_equal @regenerator.cache, {} end should "write to the metadata file" do @@ -171,7 +170,7 @@ class TestRegenerator < JekyllUnitTest metadata_file = source_dir(".jekyll-metadata") @regenerator = Regenerator.new(@site) - File.open(metadata_file, 'w') do |f| + File.open(metadata_file, "w") do |f| f.write(@regenerator.metadata.to_yaml) end @@ -182,7 +181,7 @@ class TestRegenerator < JekyllUnitTest should "not crash when reading corrupted marshal file" do metadata_file = source_dir(".jekyll-metadata") File.open(metadata_file, "w") do |file| - file.puts Marshal.dump({ foo: 'bar' })[0,5] + file.puts Marshal.dump({ :foo => "bar" })[0, 5] end @regenerator = Regenerator.new(@site) @@ -282,7 +281,7 @@ class TestRegenerator < JekyllUnitTest end should "not regenerate again if multiple dependencies" do - multi_deps = @regenerator.metadata.select {|k,v| v['deps'].length > 2} + multi_deps = @regenerator.metadata.select { |_k, v| v["deps"].length > 2 } multi_dep_path = multi_deps.keys.first assert @regenerator.metadata[multi_dep_path]["deps"].length > 2 @@ -310,7 +309,7 @@ class TestRegenerator < JekyllUnitTest setup do FileUtils.rm_rf(source_dir(".jekyll-metadata")) @site = Site.new(Jekyll.configuration({ - "source" => source_dir, + "source" => source_dir, "destination" => dest_dir, "incremental" => false })) From 8fbeb5231478602c6db03f06fb781b8b8db5b7f1 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 22:00:58 -0500 Subject: [PATCH 0906/4996] Rubocop: test/test_tags.rb --- test/test_tags.rb | 498 +++++++++++++++++++++++++++++++++------------- 1 file changed, 358 insertions(+), 140 deletions(-) diff --git a/test/test_tags.rb b/test/test_tags.rb index 1dab0feb151..736d60d649e 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -1,18 +1,17 @@ # coding: utf-8 - -require 'helper' +require "helper" class TestTags < JekyllUnitTest - def setup FileUtils.mkdir_p("tmp") end + # rubocop:disable Metrics/AbcSize def create_post(content, override = {}, converter_class = Jekyll::Converters::Markdown) - site = fixture_site({"highlighter" => "rouge"}.merge(override)) + site = fixture_site({ "highlighter" => "rouge" }.merge(override)) - site.posts.docs.concat(PostReader.new(site).read_posts('')) if override['read_posts'] - CollectionReader.new(site).read if override['read_collections'] + site.posts.docs.concat(PostReader.new(site).read_posts("")) if override["read_posts"] + CollectionReader.new(site).read if override["read_collections"] info = { :filters => [Jekyll::Filters], :registers => { :site => site } } @converter = site.converters.find { |c| c.class == converter_class } @@ -22,6 +21,7 @@ def create_post(content, override = {}, converter_class = Jekyll::Converters::Ma @result = Liquid::Template.parse(content).render!(payload, info) @result = @converter.convert(@result) end + # rubocop:enable Metrics/AbcSize def fill_post(code, override = {}) content = < 'inline' }, tag.instance_variable_get(:@highlight_options)) + tag = highlight_block_with_opts("ruby linenos ") + assert_equal( + { :linenos => "inline" }, + tag.instance_variable_get(:@highlight_options) + ) end - should "set the linenos option to 'table' if the linenos key is given the table value" do - tag = highlight_block_with_opts('ruby linenos=table ') - assert_equal({ :linenos => 'table' }, tag.instance_variable_get(:@highlight_options)) + should "set the linenos option to 'table' " \ + "if the linenos key is given the table value" do + tag = highlight_block_with_opts("ruby linenos=table ") + assert_equal( + { :linenos => "table" }, + tag.instance_variable_get(:@highlight_options) + ) end should "recognize nowrap option with linenos set" do - tag = highlight_block_with_opts('ruby linenos=table nowrap ') - assert_equal({ :linenos => 'table', :nowrap => true }, tag.instance_variable_get(:@highlight_options)) + tag = highlight_block_with_opts("ruby linenos=table nowrap ") + assert_equal( + { :linenos => "table", :nowrap => true }, + tag.instance_variable_get(:@highlight_options) + ) end should "recognize the cssclass option" do - tag = highlight_block_with_opts('ruby linenos=table cssclass=hl ') - assert_equal({ :cssclass => 'hl', :linenos => 'table' }, tag.instance_variable_get(:@highlight_options)) + tag = highlight_block_with_opts("ruby linenos=table cssclass=hl ") + assert_equal( + { :cssclass => "hl", :linenos => "table" }, + tag.instance_variable_get(:@highlight_options) + ) end should "recognize the hl_linenos option and its value" do - tag = highlight_block_with_opts('ruby linenos=table cssclass=hl hl_linenos=3 ') - assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => '3' }, tag.instance_variable_get(:@highlight_options)) + tag = highlight_block_with_opts("ruby linenos=table cssclass=hl hl_linenos=3 ") + assert_equal( + { :cssclass => "hl", :linenos => "table", :hl_linenos => "3" }, + tag.instance_variable_get(:@highlight_options) + ) end should "recognize multiple values of hl_linenos" do - tag = highlight_block_with_opts('ruby linenos=table cssclass=hl hl_linenos="3 5 6" ') - assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => ['3', '5', '6'] }, tag.instance_variable_get(:@highlight_options)) + tag = highlight_block_with_opts 'ruby linenos=table cssclass=hl hl_linenos="3 5 6" ' + assert_equal( + { :cssclass => "hl", :linenos => "table", :hl_linenos => %w(3 5 6) }, + tag.instance_variable_get(:@highlight_options) + ) end should "treat language name as case insensitive" do - tag = highlight_block_with_opts('Ruby ') - assert_equal "ruby", tag.instance_variable_get(:@lang), "lexers should be case insensitive" + tag = highlight_block_with_opts("Ruby ") + assert_equal( + "ruby", + tag.instance_variable_get(:@lang), + "lexers should be case insensitive" + ) end end context "in safe mode" do setup do - @tag = highlight_block_with_opts('text ') + @tag = highlight_block_with_opts("text ") end should "allow linenos" do - sanitized = @tag.sanitized_opts({:linenos => true}, true) + sanitized = @tag.sanitized_opts({ :linenos => true }, true) assert_equal true, sanitized[:linenos] end 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] + 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 - sanitized = @tag.sanitized_opts({:cssclass => "ahoy"}, true) + sanitized = @tag.sanitized_opts({ :cssclass => "ahoy" }, true) assert_equal "ahoy", sanitized[:cssclass] end should "allow startinline" do - sanitized = @tag.sanitized_opts({:startinline => true}, true) + sanitized = @tag.sanitized_opts({ :startinline => true }, true) assert_equal true, sanitized[:startinline] end should "strip unknown options" do - sanitized = @tag.sanitized_opts({:light => true}, true) + sanitized = @tag.sanitized_opts({ :light => true }, true) assert_nil sanitized[:light] end end @@ -145,7 +173,7 @@ def highlight_block_with_opts(options_string) context "post content has highlight tag" do setup do - fill_post("test", {'highlighter' => 'pygments'}) + fill_post("test", { "highlighter" => "pygments" }) end should "not cause a markdown error" do @@ -153,31 +181,45 @@ def highlight_block_with_opts(options_string) end should "render markdown with pygments" do - assert_match %{

    test
    }, @result + assert_match( + %(
    test
    ), + @result + ) end should "render markdown with pygments with line numbers" do - assert_match %{
    1 test
    }, @result + assert_match( + %(
    ) +
    +          %(1 test
    ), + @result + ) end end context "post content has highlight with file reference" do setup do - fill_post("./jekyll.gemspec", {'highlighter' => 'pygments'}) + fill_post("./jekyll.gemspec", { "highlighter" => "pygments" }) end should "not embed the file" do - assert_match %{
    ./jekyll.gemspec
    }, @result + assert_match( + %(
    ) +
    +          %(./jekyll.gemspec
    ), + @result + ) end end context "post content has highlight tag with UTF character" do setup do - fill_post("Æ", {'highlighter' => 'pygments'}) + fill_post("Æ", { "highlighter" => "pygments" }) end should "render markdown with pygments line handling" do - assert_match %{
    Æ
    }, @result + assert_match( + %(
    Æ
    ), + @result + ) end end @@ -190,15 +232,19 @@ def highlight_block_with_opts(options_string) [1,] FALSE TRUE [2,] FALSE TRUE EOS - fill_post(code, {'highlighter' => 'pygments'}) + fill_post(code, { "highlighter" => "pygments" }) end should "only strip the preceding newlines" do - assert_match %{
         [,1] [,2]}, @result
    +        assert_match(
    +          %(
         [,1] [,2]),
    +          @result
    +        )
           end
         end
     
    -    context "post content has highlight tag with preceding spaces & lines in several places" do
    +    context "post content has highlight tag " \
    +            "with preceding spaces & lines in several places" do
           setup do
             code = <<-EOS
     
    @@ -211,21 +257,29 @@ def highlight_block_with_opts(options_string)
     
     
     EOS
    -        fill_post(code, {'highlighter' => 'pygments'})
    +        fill_post(code, { "highlighter" => "pygments" })
           end
     
           should "only strip the newlines which precede and succeed the entire block" do
    -        assert_match "
         [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE
    ", @result + assert_match( + "
    " \
    +          "     [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE
    ", + @result + ) end end - context "post content has highlight tag with preceding spaces & Windows-style newlines" do + context "post content has highlight tag with " \ + "preceding spaces & Windows-style newlines" do setup do - fill_post "\r\n\r\n\r\n [,1] [,2]", {'highlighter' => 'pygments'} + fill_post "\r\n\r\n\r\n [,1] [,2]", { "highlighter" => "pygments" } end should "only strip the preceding newlines" do - assert_match %{
         [,1] [,2]}, @result
    +        assert_match(
    +          %(
         [,1] [,2]),
    +          @result
    +        )
           end
         end
     
    @@ -236,11 +290,14 @@ def highlight_block_with_opts(options_string)
     [1,] FALSE TRUE
     [2,] FALSE TRUE
     EOS
    -        fill_post(code, {'highlighter' => 'pygments'})
    +        fill_post(code, { "highlighter" => "pygments" })
           end
     
           should "only strip the preceding newlines" do
    -        assert_match %{
         [,1] [,2]}, @result
    +        assert_match(
    +          %(
         [,1] [,2]),
    +          @result
    +        )
           end
         end
       end
    @@ -252,11 +309,21 @@ def highlight_block_with_opts(options_string)
           end
     
           should "render markdown with rouge" do
    -        assert_match %{
    test
    }, @result + assert_match( + %(
    test
    ), + @result + ) end should "render markdown with rouge with line numbers" do - assert_match %{
    1
    test\n
    }, @result + assert_match( + %() + + %() + + %() + + %(
    ) + + %(
    1
    test\n
    ), + @result + ) end end @@ -266,7 +333,11 @@ def highlight_block_with_opts(options_string) end should "not embed the file" do - assert_match %{
    ./jekyll.gemspec
    }, @result + assert_match( + '
    ' \
    +          "./jekyll.gemspec
    ", + @result + ) end end @@ -276,7 +347,10 @@ def highlight_block_with_opts(options_string) end should "render markdown with pygments line handling" do - assert_match %{
    Æ
    }, @result + assert_match( + '
    Æ
    ', + @result + ) end end @@ -292,11 +366,15 @@ def highlight_block_with_opts(options_string) end should "only strip the preceding newlines" do - assert_match %{
         [,1] [,2]}, @result
    +        assert_match(
    +          '
         [,1] [,2]',
    +          @result
    +        )
           end
         end
     
    -    context "post content has highlight tag with preceding spaces & lines in several places" do
    +    context "post content has highlight tag with " \
    +            "preceding spaces & lines in several places" do
           setup do
             fill_post <<-EOS
     
    @@ -312,7 +390,11 @@ def highlight_block_with_opts(options_string)
           end
     
           should "only strip the newlines which precede and succeed the entire block" do
    -        assert_match "
         [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE
    ", @result + assert_match( + "
         [,1] [,2]\n\n\n" \
    +          "[1,] FALSE TRUE\n[2,] FALSE TRUE
    ", + @result + ) end end @@ -333,17 +415,29 @@ def highlight_block_with_opts(options_string) end should "should stop highlighting at boundary" do - assert_match "

    This is not yet highlighted

    \n\n
    1
    test\n
    \n\n

    This should not be highlighted, right?

    ", @result + expected = <<-EOS +

    This is not yet highlighted

    + +
    1
    test
    +
    + +

    This should not be highlighted, right?

    +EOS + assert_match(expected, @result) end end - context "post content has highlight tag with preceding spaces & Windows-style newlines" do + context "post content has highlight tag with " \ + "preceding spaces & Windows-style newlines" do setup do fill_post "\r\n\r\n\r\n [,1] [,2]" end should "only strip the preceding newlines" do - assert_match %{
         [,1] [,2]}, @result
    +        assert_match(
    +          '
         [,1] [,2]',
    +          @result
    +        )
           end
         end
     
    @@ -357,7 +451,10 @@ def highlight_block_with_opts(options_string)
           end
     
           should "only strip the preceding newlines" do
    -        assert_match %{
         [,1] [,2]}, @result
    +        assert_match(
    +          '
         [,1] [,2]',
    +          @result
    +        )
           end
         end
       end
    @@ -388,24 +485,24 @@ def highlight_block_with_opts(options_string)
             end
     
             create_post(@content, {
    -          'markdown' => 'rdiscount'
    +          "markdown" => "rdiscount"
             })
           end
     
           should "parse correctly" do
             assert_match %r{FIGHT!}, @result
    -        assert_match %r{FINISH HIM}, @result
    +        assert_match %r!FINISH HIM!, @result
           end
         end
     
         context "using Kramdown" do
           setup do
    -        create_post(@content, 'markdown' => 'kramdown')
    +        create_post(@content, "markdown" => "kramdown")
           end
     
           should "parse correctly" do
             assert_match %r{FIGHT!}, @result
    -        assert_match %r{FINISH HIM}, @result
    +        assert_match %r!FINISH HIM!, @result
           end
         end
     
    @@ -418,13 +515,13 @@ def highlight_block_with_opts(options_string)
             end
     
             create_post(@content, {
    -          'markdown' => 'redcarpet'
    +          "markdown" => "redcarpet"
             })
           end
     
           should "parse correctly" do
             assert_match %r{FIGHT!}, @result
    -        assert_match %r{FINISH HIM}, @result
    +        assert_match %r!FINISH HIM!, @result
           end
         end
       end
    @@ -438,7 +535,12 @@ def highlight_block_with_opts(options_string)
     
     {% post_url 2008-11-21-complex %}
     CONTENT
    -      create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
    +      create_post(content, {
    +        "permalink"   => "pretty",
    +        "source"      => source_dir,
    +        "destination" => dest_dir,
    +        "read_posts"  => true
    +      })
         end
     
         should "not cause an error" do
    @@ -446,7 +548,7 @@ def highlight_block_with_opts(options_string)
         end
     
         should "have the url to the \"complex\" post from 2008-11-21" do
    -      assert_match %r{/2008/11/21/complex/}, @result
    +      assert_match %r!/2008/11/21/complex/!, @result
         end
       end
     
    @@ -462,7 +564,12 @@ def highlight_block_with_opts(options_string)
     - 3 {% post_url es/2008-11-21-nested %}
     - 4 {% post_url /es/2008-11-21-nested %}
     CONTENT
    -      create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
    +      create_post(content, {
    +        "permalink"   => "pretty",
    +        "source"      => source_dir,
    +        "destination" => dest_dir,
    +        "read_posts"  => true
    +      })
         end
     
         should "not cause an error" do
    @@ -470,13 +577,13 @@ def highlight_block_with_opts(options_string)
         end
     
         should "have the url to the \"complex\" post from 2008-11-21" do
    -      assert_match %r{1\s/2008/11/21/complex/}, @result
    -      assert_match %r{2\s/2008/11/21/complex/}, @result
    +      assert_match %r!1\s/2008/11/21/complex/!, @result
    +      assert_match %r!2\s/2008/11/21/complex/!, @result
         end
     
         should "have the url to the \"nested\" post from 2008-11-21" do
    -      assert_match %r{3\s/2008/11/21/nested/}, @result
    -      assert_match %r{4\s/2008/11/21/nested/}, @result
    +      assert_match %r!3\s/2008/11/21/nested/!, @result
    +      assert_match %r!4\s/2008/11/21/nested/!, @result
         end
       end
     
    @@ -492,10 +599,10 @@ def highlight_block_with_opts(options_string)
     
           assert_raises Jekyll::Errors::PostURLError do
             create_post(content, {
    -          'permalink' => 'pretty',
    -          'source' => source_dir,
    -          'destination' => dest_dir,
    -          'read_posts' => true
    +          "permalink"   => "pretty",
    +          "source"      => source_dir,
    +          "destination" => dest_dir,
    +          "read_posts"  => true
             })
           end
         end
    @@ -511,10 +618,10 @@ def highlight_block_with_opts(options_string)
     
           assert_raises Jekyll::Errors::InvalidDateError do
             create_post(content, {
    -          'permalink' => 'pretty',
    -          'source' => source_dir,
    -          'destination' => dest_dir,
    -          'read_posts' => true
    +          "permalink"   => "pretty",
    +          "source"      => source_dir,
    +          "destination" => dest_dir,
    +          "read_posts"  => true
             })
           end
         end
    @@ -529,15 +636,20 @@ def highlight_block_with_opts(options_string)
     
     {% link _methods/yaml_with_dots.md %}
     CONTENT
    -      create_post(content, {'source' => source_dir, 'destination' => dest_dir, 'collections' => { 'methods' => { 'output' => true }}, 'read_collections' => true})
    +      create_post(content, {
    +        "source"           => source_dir,
    +        "destination"      => dest_dir,
    +        "collections"      => { "methods" => { "output" => true } },
    +        "read_collections" => true
    +      })
         end
     
         should "not cause an error" do
    -      refute_match /markdown\-html\-error/, @result
    +      refute_match(/markdown\-html\-error/, @result)
         end
     
         should "have the url to the \"yaml_with_dots\" item" do
    -      assert_match %r{/methods/yaml_with_dots\.html}, @result
    +      assert_match(%r!/methods/yaml_with_dots\.html!, @result)
         end
       end
     
    @@ -551,19 +663,24 @@ def highlight_block_with_opts(options_string)
     - 1 {% link _methods/sanitized_path.md %}
     - 2 {% link _methods/site/generate.md %}
     CONTENT
    -      create_post(content, {'source' => source_dir, 'destination' => dest_dir, 'collections' => { 'methods' => { 'output' => true }}, 'read_collections' => true})
    +      create_post(content, {
    +        "source"           => source_dir,
    +        "destination"      => dest_dir,
    +        "collections"      => { "methods" => { "output" => true } },
    +        "read_collections" => true
    +      })
         end
     
         should "not cause an error" do
    -      refute_match /markdown\-html\-error/, @result
    +      refute_match(/markdown\-html\-error/, @result)
         end
     
         should "have the url to the \"sanitized_path\" item" do
    -      assert_match %r{1\s/methods/sanitized_path\.html}, @result
    +      assert_match %r!1\s/methods/sanitized_path\.html!, @result
         end
     
         should "have the url to the \"site/generate\" item" do
    -      assert_match %r{2\s/methods/site/generate\.html}, @result
    +      assert_match %r!2\s/methods/site/generate\.html!, @result
         end
       end
     
    @@ -578,17 +695,20 @@ def highlight_block_with_opts(options_string)
     CONTENT
     
           assert_raises ArgumentError do
    -        create_post(content, {'source' => source_dir, 'destination' => dest_dir, 'collections' => { 'methods' => { 'output' => true }}, 'read_collections' => true})
    +        create_post(content, {
    +          "source"           => source_dir,
    +          "destination"      => dest_dir,
    +          "collections"      => { "methods" => { "output" => true } },
    +          "read_collections" => true
    +        })
           end
         end
       end
     
       context "include tag with parameters" do
    -
         context "with symlink'd include" do
    -
           should "not allow symlink includes" do
    -        File.open("tmp/pages-test", 'w') { |file| file.write("SYMLINK TEST") }
    +        File.open("tmp/pages-test", "w") { |file| file.write("SYMLINK TEST") }
             assert_raises IOError do
               content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true, 'safe' => true })
    +          create_post(content, {
    +            "permalink"   => "pretty",
    +            "source"      => source_dir,
    +            "destination" => dest_dir,
    +            "read_posts"  => true,
    +            "safe"        => true
    +          })
             end
    -        @result ||= ''
    +        @result ||= ""
             refute_match(/SYMLINK TEST/, @result)
           end
     
    @@ -614,9 +740,19 @@ def highlight_block_with_opts(options_string)
     {% include tmp/pages-test-does-not-exist %}
     
     CONTENT
    -          create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true, 'safe' => true })
    +          create_post(content, {
    +            "permalink"   => "pretty",
    +            "source"      => source_dir,
    +            "destination" => dest_dir,
    +            "read_posts"  => true,
    +            "safe"        => true
    +          })
             end
    -        assert_match "Could not locate the included file 'tmp/pages-test-does-not-exist' in any of [\"#{source_dir}/_includes\"].", ex.message
    +        assert_match(
    +          "Could not locate the included file 'tmp/pages-test-does-not-exist' " \
    +          "in any of [\"#{source_dir}/_includes\"].",
    +          ex.message
    +        )
           end
         end
     
    @@ -631,7 +767,12 @@ def highlight_block_with_opts(options_string)
     
     {% include params.html param="value" %}
     CONTENT
    -        create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
    +        create_post(content, {
    +          "permalink"   => "pretty",
    +          "source"      => source_dir,
    +          "destination" => dest_dir,
    +          "read_posts"  => true
    +        })
           end
     
           should "correctly output include variable" do
    @@ -652,8 +793,14 @@ def highlight_block_with_opts(options_string)
     
     {% include params.html param s="value" %}
     CONTENT
    -        assert_raises ArgumentError, 'Did not raise exception on invalid "include" syntax' do
    -          create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
    +        assert_raises ArgumentError, "Did not raise exception on invalid " \
    +                                     '"include" syntax' do
    +          create_post(content, {
    +            "permalink"   => "pretty",
    +            "source"      => source_dir,
    +            "destination" => dest_dir,
    +            "read_posts"  => true
    +          })
             end
     
             content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
    +        assert_raises ArgumentError, "Did not raise exception on invalid " \
    +                                     '"include" syntax' do
    +          create_post(content, {
    +            "permalink"   => "pretty",
    +            "source"      => source_dir,
    +            "destination" => dest_dir,
    +            "read_posts"  => true
    +          })
             end
           end
         end
    @@ -678,12 +831,17 @@ def highlight_block_with_opts(options_string)
     
     {% include params.html param1="new_value" param2="another" %}
     CONTENT
    -        create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
    +        create_post(content, {
    +          "permalink"   => "pretty",
    +          "source"      => source_dir,
    +          "destination" => dest_dir,
    +          "read_posts"  => true
    +        })
           end
     
           should "list all parameters" do
    -        assert_match '
  • param1 = new_value
  • ', @result - assert_match '
  • param2 = another
  • ', @result + assert_match "
  • param1 = new_value
  • ", @result + assert_match "
  • param2 = another
  • ", @result end should "not include previously used parameters" do @@ -700,7 +858,12 @@ def highlight_block_with_opts(options_string) {% include params.html %} CONTENT - create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) + create_post(content, { + "permalink" => "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true + }) end should "include file with empty parameters" do @@ -717,7 +880,13 @@ def highlight_block_with_opts(options_string) {% include custom.html %} CONTENT - create_post(content, {'includes_dir' => '_includes_custom', 'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) + create_post(content, { + "includes_dir" => "_includes_custom", + "permalink" => "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true + }) end should "include file from custom directory" do @@ -734,7 +903,12 @@ def highlight_block_with_opts(options_string) {% if true %}{% include params.html %}{% endif %} CONTENT - create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) + create_post(content, { + "permalink" => "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true + }) end should "include file with empty parameters within if statement" do @@ -755,72 +929,85 @@ def highlight_block_with_opts(options_string) should "raise error relative to source directory" do exception = assert_raises IOError do - create_post(@content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) + create_post(@content, { + "permalink" => "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true + }) end - assert_match "Could not locate the included file 'missing.html' in any of [\"#{source_dir}/_includes\"].", exception.message + assert_match( + "Could not locate the included file 'missing.html' in any of " \ + "[\"#{source_dir}/_includes\"].", + exception.message + ) end end context "include tag with variable and liquid filters" do setup do - site = fixture_site({'pygments' => true}).tap(&:read).tap(&:render) - post = site.posts.docs.find {|p| p.basename.eql? "2013-12-17-include-variable-filters.markdown" } + site = fixture_site({ "pygments" => true }).tap(&:read).tap(&:render) + post = site.posts.docs.find do |p| + p.basename.eql? "2013-12-17-include-variable-filters.markdown" + end @content = post.output end should "include file as variable with liquid filters" do - assert_match %r{1 included}, @content - assert_match %r{2 included}, @content - assert_match %r{3 included}, @content + assert_match(/1 included/, @content) + assert_match(/2 included/, @content) + assert_match(/3 included/, @content) end should "include file as variable and liquid filters with arbitrary whitespace" do - assert_match %r{4 included}, @content - assert_match %r{5 included}, @content - assert_match %r{6 included}, @content + assert_match(/4 included/, @content) + assert_match(/5 included/, @content) + assert_match(/6 included/, @content) end should "include file as variable and filters with additional parameters" do - assert_match '
  • var1 = foo
  • ', @content - assert_match '
  • var2 = bar
  • ', @content + assert_match("
  • var1 = foo
  • ", @content) + assert_match("
  • var2 = bar
  • ", @content) end should "include file as partial variable" do - assert_match %r{8 included}, @content + assert_match(/8 included/, @content) end end end context "relative include tag with variable and liquid filters" do setup do - site = fixture_site({'pygments' => true}).tap(&:read).tap(&:render) - post = site.posts.docs.find {|p| p.basename.eql? "2014-09-02-relative-includes.markdown" } + site = fixture_site({ "pygments" => true }).tap(&:read).tap(&:render) + post = site.posts.docs.find do |p| + p.basename.eql? "2014-09-02-relative-includes.markdown" + end @content = post.output end should "include file as variable with liquid filters" do - assert_match %r{1 relative_include}, @content - assert_match %r{2 relative_include}, @content - assert_match %r{3 relative_include}, @content + assert_match(/1 relative_include/, @content) + assert_match(/2 relative_include/, @content) + assert_match(/3 relative_include/, @content) end should "include file as variable and liquid filters with arbitrary whitespace" do - assert_match %r{4 relative_include}, @content - assert_match %r{5 relative_include}, @content - assert_match %r{6 relative_include}, @content + assert_match(/4 relative_include/, @content) + assert_match(/5 relative_include/, @content) + assert_match(/6 relative_include/, @content) end should "include file as variable and filters with additional parameters" do - assert_match '
  • var1 = foo
  • ', @content - assert_match '
  • var2 = bar
  • ', @content + assert_match("
  • var1 = foo
  • ", @content) + assert_match("
  • var2 = bar
  • ", @content) end should "include file as partial variable" do - assert_match %r{8 relative_include}, @content + assert_match(/8 relative_include/, @content) end should "include files relative to self" do - assert_match %r{9 —\ntitle: Test Post Where YAML}, @content + assert_match(/9 —\ntitle: Test Post Where YAML/, @content) end context "trying to do bad stuff" do @@ -837,9 +1024,15 @@ def highlight_block_with_opts(options_string) should "raise error relative to source directory" do exception = assert_raises IOError do - create_post(@content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) + create_post(@content, { + "permalink" => "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true + }) end - assert_match "Could not locate the included file 'missing.html' in any of [\"#{source_dir}\"].", exception.message + assert_match "Could not locate the included file 'missing.html' in any of " \ + "[\"#{source_dir}\"].", exception.message end end @@ -856,17 +1049,26 @@ def highlight_block_with_opts(options_string) should "raise error relative to source directory" do exception = assert_raises ArgumentError do - create_post(@content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) + create_post(@content, { + "permalink" => "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true + }) end - assert_equal "Invalid syntax for include tag. File contains invalid characters or sequences:\n\n ../README.markdown\n\nValid syntax:\n\n {% include_relative file.ext param='value' param2='value' %}\n\n", exception.message + assert_equal( + "Invalid syntax for include tag. File contains invalid characters or " \ + "sequences:\n\n ../README.markdown\n\nValid syntax:\n\n " \ + "{% include_relative file.ext param='value' param2='value' %}\n\n", + exception.message + ) end end end context "with symlink'd include" do - should "not allow symlink includes" do - File.open("tmp/pages-test", 'w') { |file| file.write("SYMLINK TEST") } + File.open("tmp/pages-test", "w") { |file| file.write("SYMLINK TEST") } assert_raises IOError do content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true, 'safe' => true }) + create_post(content, { + "permalink" => "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true, + "safe" => true + }) end - @result ||= '' + @result ||= "" refute_match(/SYMLINK TEST/, @result) end @@ -892,9 +1100,19 @@ def highlight_block_with_opts(options_string) {% include_relative tmp/pages-test-does-not-exist %} CONTENT - create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true, 'safe' => true }) + create_post(content, { + "permalink" => "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true, + "safe" => true + }) end - assert_match /Ensure it exists in one of those directories and, if it is a symlink, does not point outside your site source./, ex.message + assert_match( + "Ensure it exists in one of those directories and, if it is a symlink, does " \ + "not point outside your site source.", + ex.message + ) end end end From 5a23b130cee6d403846f2066920e1ca3e3dea2aa Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Wed, 25 May 2016 22:01:10 -0500 Subject: [PATCH 0907/4996] Rubocop: test/test_utils.rb --- test/test_utils.rb | 214 ++++++++++++++++++++++++++++++++------------- 1 file changed, 151 insertions(+), 63 deletions(-) diff --git a/test/test_utils.rb b/test/test_utils.rb index f102b7a6d11..e2a50c58332 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -1,4 +1,4 @@ -require 'helper' +require "helper" class TestUtils < JekyllUnitTest context "The \`Utils.deep_merge_hashes\` method" do @@ -9,7 +9,7 @@ class TestUtils < JekyllUnitTest end should "merge a drop into a hash" do - data = {"page" => {}} + data = { "page" => {} } merged = Utils.deep_merge_hashes(data, @site.site_payload) assert merged.is_a? Hash assert merged["site"].is_a? Drops::SiteDrop @@ -17,7 +17,7 @@ class TestUtils < JekyllUnitTest end should "merge a hash into a drop" do - data = {"page" => {}} + data = { "page" => {} } assert_nil @site.site_payload["page"] merged = Utils.deep_merge_hashes(@site.site_payload, data) assert merged.is_a? Drops::UnifiedPayloadDrop @@ -27,66 +27,64 @@ class TestUtils < JekyllUnitTest end context "hash" do - context "pluralized_array" do - should "return empty array with no values" do data = {} - assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + assert_equal [], Utils.pluralized_array_from_hash(data, "tag", "tags") end should "return empty array with no matching values" do - data = { 'foo' => 'bar' } - assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + data = { "foo" => "bar" } + assert_equal [], Utils.pluralized_array_from_hash(data, "tag", "tags") end should "return plural array with nil singular" do - data = { 'foo' => 'bar', 'tag' => nil, 'tags' => ['dog', 'cat'] } - assert_equal ['dog', 'cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + data = { "foo" => "bar", "tag" => nil, "tags" => %w(dog cat) } + assert_equal %w(dog cat), Utils.pluralized_array_from_hash(data, "tag", "tags") end should "return single value array with matching singular" do - data = { 'foo' => 'bar', 'tag' => 'dog', 'tags' => ['dog', 'cat'] } - assert_equal ['dog'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + data = { "foo" => "bar", "tag" => "dog", "tags" => %w(dog cat) } + assert_equal ["dog"], Utils.pluralized_array_from_hash(data, "tag", "tags") end should "return single value array with matching singular with spaces" do - data = { 'foo' => 'bar', 'tag' => 'dog cat', 'tags' => ['dog', 'cat'] } - assert_equal ['dog cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + data = { "foo" => "bar", "tag" => "dog cat", "tags" => %w(dog cat) } + assert_equal ["dog cat"], Utils.pluralized_array_from_hash(data, "tag", "tags") end should "return empty array with matching nil plural" do - data = { 'foo' => 'bar', 'tags' => nil } - assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + data = { "foo" => "bar", "tags" => nil } + assert_equal [], Utils.pluralized_array_from_hash(data, "tag", "tags") end should "return empty array with matching empty array" do - data = { 'foo' => 'bar', 'tags' => [] } - assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + data = { "foo" => "bar", "tags" => [] } + assert_equal [], Utils.pluralized_array_from_hash(data, "tag", "tags") end should "return single value array with matching plural with single string value" do - data = { 'foo' => 'bar', 'tags' => 'dog' } - assert_equal ['dog'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + data = { "foo" => "bar", "tags" => "dog" } + assert_equal ["dog"], Utils.pluralized_array_from_hash(data, "tag", "tags") end - should "return multiple value array with matching plural with single string value with spaces" do - data = { 'foo' => 'bar', 'tags' => 'dog cat' } - assert_equal ['dog', 'cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + should "return multiple value array with matching plural with " \ + "single string value with spaces" do + data = { "foo" => "bar", "tags" => "dog cat" } + assert_equal %w(dog cat), Utils.pluralized_array_from_hash(data, "tag", "tags") end should "return single value array with matching plural with single value array" do - data = { 'foo' => 'bar', 'tags' => ['dog'] } - assert_equal ['dog'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + data = { "foo" => "bar", "tags" => ["dog"] } + assert_equal ["dog"], Utils.pluralized_array_from_hash(data, "tag", "tags") end - should "return multiple value array with matching plural with multiple value array" do - data = { 'foo' => 'bar', 'tags' => ['dog', 'cat'] } - assert_equal ['dog', 'cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') + should "return multiple value array with matching plural with " \ + "multiple value array" do + data = { "foo" => "bar", "tags" => %w(dog cat) } + assert_equal %w(dog cat), Utils.pluralized_array_from_hash(data, "tag", "tags") end - end - end context "The \`Utils.parse_date\` method" do @@ -108,7 +106,10 @@ class TestUtils < JekyllUnitTest should "throw an error with the default message if no message is passed in" do date = "Blah this is invalid" - assert_raises Jekyll::Errors::InvalidDateError, "Invalid date '#{date}': Input could not be parsed." do + assert_raises( + Jekyll::Errors::InvalidDateError, + "Invalid date '#{date}': Input could not be parsed." + ) do Utils.parse_date(date) end end @@ -116,7 +117,10 @@ class TestUtils < JekyllUnitTest should "throw an error with the provided message if a message is passed in" do date = "Blah this is invalid" message = "Aaaah, the world has exploded!" - assert_raises Jekyll::Errors::InvalidDateError, "Invalid date '#{date}': #{message}" do + assert_raises( + Jekyll::Errors::InvalidDateError, + "Invalid date '#{date}': #{message}" + ) do Utils.parse_date(date, message) end end @@ -144,7 +148,10 @@ class TestUtils < JekyllUnitTest end should "drop trailing punctuation" do - assert_equal "so-what-is-jekyll-exactly", Utils.slugify("So what is Jekyll, exactly?") + assert_equal( + "so-what-is-jekyll-exactly", + Utils.slugify("So what is Jekyll, exactly?") + ) assert_equal "كيف-حالك", Utils.slugify("كيف حالك؟") end @@ -157,7 +164,10 @@ class TestUtils < JekyllUnitTest end should "combine adjacent hyphens and spaces" do - assert_equal "customizing-git-git-hooks", Utils.slugify("Customizing Git - Git Hooks") + assert_equal( + "customizing-git-git-hooks", + Utils.slugify("Customizing Git - Git Hooks") + ) end should "replace punctuation in any scripts by hyphens" do @@ -171,7 +181,10 @@ class TestUtils < JekyllUnitTest end should "not change behaviour if mode is default" do - assert_equal "the-config-yml-file", Utils.slugify("The _config.yml file?", mode: "default") + assert_equal( + "the-config-yml-file", + Utils.slugify("The _config.yml file?", :mode => "default") + ) end should "not change behaviour if mode is nil" do @@ -179,53 +192,128 @@ class TestUtils < JekyllUnitTest end should "not replace period and underscore if mode is pretty" do - assert_equal "the-_config.yml-file", Utils.slugify("The _config.yml file?", mode: "pretty") + assert_equal( + "the-_config.yml-file", + Utils.slugify("The _config.yml file?", :mode => "pretty") + ) end should "only replace whitespace if mode is raw" do - assert_equal "the-_config.yml-file?", Utils.slugify("The _config.yml file?", mode: "raw") + assert_equal( + "the-_config.yml-file?", + Utils.slugify("The _config.yml file?", :mode => "raw") + ) end should "return the given string if mode is none" do - assert_equal "the _config.yml file?", Utils.slugify("The _config.yml file?", mode: "none") + assert_equal( + "the _config.yml file?", + Utils.slugify("The _config.yml file?", :mode => "none") + ) end should "Keep all uppercase letters if cased is true" do - assert_equal "Working-with-drafts", Utils.slugify("Working with drafts", cased: true) - assert_equal "Basic-Usage", Utils.slugify("Basic Usage", cased: true) - assert_equal "Working-with-drafts", Utils.slugify(" Working with drafts ", cased: true) - assert_equal "So-what-is-Jekyll-exactly", Utils.slugify("So what is Jekyll, exactly?", cased: true) - assert_equal "Pre-releases", Utils.slugify("Pre-releases", cased: true) - assert_equal "The-config-yml-file", Utils.slugify("The _config.yml file", cased: true) - assert_equal "Customizing-Git-Git-Hooks", Utils.slugify("Customizing Git - Git Hooks", cased: true) - assert_equal "The-config-yml-file", Utils.slugify("The _config.yml file?", mode: "default", cased: true) - assert_equal "The-config-yml-file", Utils.slugify("The _config.yml file?", cased: true) - assert_equal "The-_config.yml-file", Utils.slugify("The _config.yml file?", mode: "pretty", cased: true) - assert_equal "The-_config.yml-file?", Utils.slugify("The _config.yml file?", mode: "raw", cased: true) - assert_equal "The _config.yml file?", Utils.slugify("The _config.yml file?", mode: "none", cased: true) + assert_equal( + "Working-with-drafts", + Utils.slugify("Working with drafts", :cased => true) + ) + assert_equal( + "Basic-Usage", + Utils.slugify("Basic Usage", :cased => true) + ) + assert_equal( + "Working-with-drafts", + Utils.slugify(" Working with drafts ", :cased => true) + ) + assert_equal( + "So-what-is-Jekyll-exactly", + Utils.slugify("So what is Jekyll, exactly?", :cased => true) + ) + assert_equal( + "Pre-releases", + Utils.slugify("Pre-releases", :cased => true) + ) + assert_equal( + "The-config-yml-file", + Utils.slugify("The _config.yml file", :cased => true) + ) + assert_equal( + "Customizing-Git-Git-Hooks", + Utils.slugify("Customizing Git - Git Hooks", :cased => true) + ) + assert_equal( + "The-config-yml-file", + Utils.slugify("The _config.yml file?", :mode => "default", :cased => true) + ) + assert_equal( + "The-config-yml-file", + Utils.slugify("The _config.yml file?", :cased => true) + ) + assert_equal( + "The-_config.yml-file", + Utils.slugify("The _config.yml file?", :mode => "pretty", :cased => true) + ) + assert_equal( + "The-_config.yml-file?", + Utils.slugify("The _config.yml file?", :mode => "raw", :cased => true) + ) + assert_equal( + "The _config.yml file?", + Utils.slugify("The _config.yml file?", :mode => "none", :cased => true) + ) end end context "The \`Utils.titleize_slug\` method" do should "capitalize all words and not drop any words" do - assert_equal "This Is A Long Title With Mixed Capitalization", Utils.titleize_slug("This-is-a-Long-title-with-Mixed-capitalization") - assert_equal "This Is A Title With Just The Initial Word Capitalized", Utils.titleize_slug("This-is-a-title-with-just-the-initial-word-capitalized") - assert_equal "This Is A Title With No Capitalization", Utils.titleize_slug("this-is-a-title-with-no-capitalization") + assert_equal( + "This Is A Long Title With Mixed Capitalization", + Utils.titleize_slug("This-is-a-Long-title-with-Mixed-capitalization") + ) + assert_equal( + "This Is A Title With Just The Initial Word Capitalized", + Utils.titleize_slug("This-is-a-title-with-just-the-initial-word-capitalized") + ) + assert_equal( + "This Is A Title With No Capitalization", + Utils.titleize_slug("this-is-a-title-with-no-capitalization") + ) end end context "The \`Utils.add_permalink_suffix\` method" do should "handle built-in permalink styles" do - assert_equal "/:basename/", Utils.add_permalink_suffix("/:basename", :pretty) - assert_equal "/:basename:output_ext", Utils.add_permalink_suffix("/:basename", :date) - assert_equal "/:basename:output_ext", Utils.add_permalink_suffix("/:basename", :ordinal) - assert_equal "/:basename:output_ext", Utils.add_permalink_suffix("/:basename", :none) + assert_equal( + "/:basename/", + Utils.add_permalink_suffix("/:basename", :pretty) + ) + assert_equal( + "/:basename:output_ext", + Utils.add_permalink_suffix("/:basename", :date) + ) + assert_equal( + "/:basename:output_ext", + Utils.add_permalink_suffix("/:basename", :ordinal) + ) + assert_equal( + "/:basename:output_ext", + Utils.add_permalink_suffix("/:basename", :none) + ) end should "handle custom permalink styles" do - assert_equal "/:basename/", Utils.add_permalink_suffix("/:basename", "/:title/") - assert_equal "/:basename:output_ext", Utils.add_permalink_suffix("/:basename", "/:title:output_ext") - assert_equal "/:basename", Utils.add_permalink_suffix("/:basename", "/:title") + assert_equal( + "/:basename/", + Utils.add_permalink_suffix("/:basename", "/:title/") + ) + assert_equal( + "/:basename:output_ext", + Utils.add_permalink_suffix("/:basename", "/:title:output_ext") + ) + assert_equal( + "/:basename", + Utils.add_permalink_suffix("/:basename", "/:title") + ) end end @@ -270,17 +358,17 @@ class TestUtils < JekyllUnitTest context "The \`Utils.has_yaml_header?\` method" do should "accept files with yaml front matter" do file = source_dir("_posts", "2008-10-18-foo-bar.markdown") - assert_equal "---\n", File.open(file, 'rb') { |f| f.read(4) } + assert_equal "---\n", File.open(file, "rb") { |f| f.read(4) } assert Utils.has_yaml_header?(file) end should "accept files with extraneous spaces after yaml front matter" do file = source_dir("_posts", "2015-12-27-extra-spaces.markdown") - assert_equal "--- \n", File.open(file, 'rb') { |f| f.read(6) } + assert_equal "--- \n", File.open(file, "rb") { |f| f.read(6) } assert Utils.has_yaml_header?(file) end should "reject pgp files and the like which resemble front matter" do file = source_dir("pgp.key") - assert_equal "-----B", File.open(file, 'rb') { |f| f.read(6) } + assert_equal "-----B", File.open(file, "rb") { |f| f.read(6) } refute Utils.has_yaml_header?(file) end end From fbff506faa3d7542f7e5b80a31a2abe217355a55 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:00:08 -0500 Subject: [PATCH 0908/4996] Rubocop: test/test_site.rb --- test/test_site.rb | 254 +++++++++++++++++++++++++--------------------- 1 file changed, 140 insertions(+), 114 deletions(-) diff --git a/test/test_site.rb b/test/test_site.rb index 5e52a7c9405..4e9e18a57ab 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -1,45 +1,47 @@ -require 'helper' +require "helper" class TestSite < JekyllUnitTest context "configuring sites" do should "have an array for plugins by default" do site = Site.new default_configuration - assert_equal [File.join(Dir.pwd, '_plugins')], site.plugins + assert_equal [File.join(Dir.pwd, "_plugins")], site.plugins end should "look for plugins under the site directory by default" do site = Site.new(site_configuration) - assert_equal [source_dir('_plugins')], site.plugins + assert_equal [source_dir("_plugins")], site.plugins end should "have an array for plugins if passed as a string" do - site = Site.new(site_configuration({ 'plugins_dir' => '/tmp/plugins' })) - assert_equal ['/tmp/plugins'], site.plugins + site = Site.new(site_configuration({ "plugins_dir" => "/tmp/plugins" })) + assert_equal ["/tmp/plugins"], site.plugins end should "have an array for plugins if passed as an array" do - site = Site.new(site_configuration({ 'plugins_dir' => ['/tmp/plugins', '/tmp/otherplugins'] })) - assert_equal ['/tmp/plugins', '/tmp/otherplugins'], site.plugins + site = Site.new(site_configuration({ + "plugins_dir" => ["/tmp/plugins", "/tmp/otherplugins"] + })) + assert_equal ["/tmp/plugins", "/tmp/otherplugins"], site.plugins end should "have an empty array for plugins if nothing is passed" do - site = Site.new(site_configuration({ 'plugins_dir' => [] })) + site = Site.new(site_configuration({ "plugins_dir" => [] })) assert_equal [], site.plugins end should "have the default for plugins if nil is passed" do - site = Site.new(site_configuration({ 'plugins_dir' => nil })) - assert_equal [source_dir('_plugins')], site.plugins + site = Site.new(site_configuration({ "plugins_dir" => nil })) + assert_equal [source_dir("_plugins")], site.plugins end should "expose default baseurl" do site = Site.new(default_configuration) - assert_equal Jekyll::Configuration::DEFAULTS['baseurl'], site.baseurl + assert_equal Jekyll::Configuration::DEFAULTS["baseurl"], site.baseurl end should "expose baseurl passed in from config" do - site = Site.new(site_configuration({ 'baseurl' => '/blog' })) - assert_equal '/blog', site.baseurl + site = Site.new(site_configuration({ "baseurl" => "/blog" })) + assert_equal "/blog", site.baseurl end end context "creating sites" do @@ -55,7 +57,7 @@ class TestSite < JekyllUnitTest end should "have an empty tag hash by default" do - assert_equal Hash.new, @site.tags + assert_equal({}, @site.tags) end should "give site with parsed pages and posts to generators" do @@ -65,14 +67,14 @@ def generate(site) raise "#{page} isn't a page" unless page.is_a?(Page) raise "#{page} doesn't respond to :name" unless page.respond_to?(:name) end - site.file_read_opts[:secret_message] = 'hi' + site.file_read_opts[:secret_message] = "hi" end end @site = Site.new(site_configuration) @site.read @site.generate refute_equal 0, @site.pages.size - assert_equal 'hi', @site.file_read_opts[:secret_message] + assert_equal "hi", @site.file_read_opts[:secret_message] end should "reset data before processing" do @@ -157,13 +159,21 @@ def generate(site) end should "setup plugins in priority order" do - assert_equal @site.converters.sort_by(&:class).map{|c|c.class.priority}, @site.converters.map{|c|c.class.priority} - assert_equal @site.generators.sort_by(&:class).map{|g|g.class.priority}, @site.generators.map{|g|g.class.priority} + assert_equal( + @site.converters.sort_by(&:class).map { |c| c.class.priority }, + @site.converters.map { |c| c.class.priority } + ) + assert_equal( + @site.generators.sort_by(&:class).map { |g| g.class.priority }, + @site.generators.map { |g| g.class.priority } + ) end should "sort pages alphabetically" do method = Dir.method(:entries) - allow(Dir).to receive(:entries) { |*args, &block| method.call(*args, &block).reverse } + allow(Dir).to receive(:entries) do |*args, &block| + method.call(*args, &block).reverse + end @site.process # files in symlinked directories may appear twice sorted_pages = %w( @@ -192,9 +202,11 @@ def generate(site) end should "read posts" do - @site.posts.docs.concat(PostReader.new(@site).read_posts('')) - posts = Dir[source_dir('_posts', '**', '*')] - posts.delete_if { |post| File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) } + @site.posts.docs.concat(PostReader.new(@site).read_posts("")) + posts = Dir[source_dir("_posts", "**", "*")] + posts.delete_if do |post| + File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) + end assert_equal posts.size - @num_invalid_posts, @site.posts.size end @@ -209,11 +221,11 @@ def generate(site) end should "expose jekyll version to site payload" do - assert_equal Jekyll::VERSION, @site.site_payload['jekyll']['version'] + assert_equal Jekyll::VERSION, @site.site_payload["jekyll"]["version"] end should "expose list of static files to site payload" do - assert_equal @site.static_files, @site.site_payload['site']['static_files'] + assert_equal @site.static_files, @site.site_payload["site"]["static_files"] end should "deploy payload" do @@ -221,118 +233,125 @@ def generate(site) @site.process posts = Dir[source_dir("**", "_posts", "**", "*")] - posts.delete_if { |post| File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) } - categories = %w(2013 bar baz category foo z_category MixedCase Mixedcase publish_test win).sort + posts.delete_if do |post| + File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) + end + categories = %w( + 2013 bar baz category foo z_category MixedCase Mixedcase publish_test win + ).sort assert_equal posts.size - @num_invalid_posts, @site.posts.size assert_equal categories, @site.categories.keys.sort - assert_equal 5, @site.categories['foo'].size + assert_equal 5, @site.categories["foo"].size end - context 'error handling' do + context "error handling" do should "raise if destination is included in source" do assert_raises Jekyll::Errors::FatalException do - Site.new(site_configuration('destination' => source_dir)) + Site.new(site_configuration("destination" => source_dir)) end end should "raise if destination is source" do assert_raises Jekyll::Errors::FatalException do - Site.new(site_configuration('destination' => File.join(source_dir, ".."))) + Site.new(site_configuration("destination" => File.join(source_dir, ".."))) end end end - context 'with orphaned files in destination' do + context "with orphaned files in destination" do setup do clear_dest @site.regenerator.clear @site.process # generate some orphaned files: # single file - File.open(dest_dir('obsolete.html'), 'w') + File.open(dest_dir("obsolete.html"), "w") # single file in sub directory - FileUtils.mkdir(dest_dir('qux')) - File.open(dest_dir('qux/obsolete.html'), 'w') + FileUtils.mkdir(dest_dir("qux")) + File.open(dest_dir("qux/obsolete.html"), "w") # empty directory - FileUtils.mkdir(dest_dir('quux')) - FileUtils.mkdir(dest_dir('.git')) - FileUtils.mkdir(dest_dir('.svn')) - FileUtils.mkdir(dest_dir('.hg')) + FileUtils.mkdir(dest_dir("quux")) + FileUtils.mkdir(dest_dir(".git")) + FileUtils.mkdir(dest_dir(".svn")) + FileUtils.mkdir(dest_dir(".hg")) # single file in repository - File.open(dest_dir('.git/HEAD'), 'w') - File.open(dest_dir('.svn/HEAD'), 'w') - File.open(dest_dir('.hg/HEAD'), 'w') + File.open(dest_dir(".git/HEAD"), "w") + File.open(dest_dir(".svn/HEAD"), "w") + File.open(dest_dir(".hg/HEAD"), "w") end teardown do - FileUtils.rm_f(dest_dir('obsolete.html')) - FileUtils.rm_rf(dest_dir('qux')) - FileUtils.rm_f(dest_dir('quux')) - FileUtils.rm_rf(dest_dir('.git')) - FileUtils.rm_rf(dest_dir('.svn')) - FileUtils.rm_rf(dest_dir('.hg')) + FileUtils.rm_f(dest_dir("obsolete.html")) + FileUtils.rm_rf(dest_dir("qux")) + FileUtils.rm_f(dest_dir("quux")) + FileUtils.rm_rf(dest_dir(".git")) + FileUtils.rm_rf(dest_dir(".svn")) + FileUtils.rm_rf(dest_dir(".hg")) end - should 'remove orphaned files in destination' do + should "remove orphaned files in destination" do @site.process - refute_exist dest_dir('obsolete.html') - refute_exist dest_dir('qux') - refute_exist dest_dir('quux') - assert_exist dest_dir('.git') - assert_exist dest_dir('.git', 'HEAD') + refute_exist dest_dir("obsolete.html") + refute_exist dest_dir("qux") + refute_exist dest_dir("quux") + assert_exist dest_dir(".git") + assert_exist dest_dir(".git", "HEAD") end - should 'remove orphaned files in destination - keep_files .svn' do - config = site_configuration('keep_files' => %w{.svn}) + should "remove orphaned files in destination - keep_files .svn" do + config = site_configuration("keep_files" => %w(.svn)) @site = Site.new(config) @site.process - refute_exist dest_dir('.htpasswd') - refute_exist dest_dir('obsolete.html') - refute_exist dest_dir('qux') - refute_exist dest_dir('quux') - refute_exist dest_dir('.git') - refute_exist dest_dir('.git', 'HEAD') - assert_exist dest_dir('.svn') - assert_exist dest_dir('.svn', 'HEAD') + refute_exist dest_dir(".htpasswd") + refute_exist dest_dir("obsolete.html") + refute_exist dest_dir("qux") + refute_exist dest_dir("quux") + refute_exist dest_dir(".git") + refute_exist dest_dir(".git", "HEAD") + assert_exist dest_dir(".svn") + assert_exist dest_dir(".svn", "HEAD") end end - context 'using a non-default markdown processor in the configuration' do - should 'use the non-default markdown processor' do + context "using a non-default markdown processor in the configuration" do + should "use the non-default markdown processor" do class Jekyll::Converters::Markdown::CustomMarkdown def initialize(*args) @args = args end - def convert(*args) + def convert(*_args) "" end end custom_processor = "CustomMarkdown" - s = Site.new(site_configuration('markdown' => custom_processor)) + s = Site.new(site_configuration("markdown" => custom_processor)) s.process # Do some cleanup, we don't like straggling stuff's. Jekyll::Converters::Markdown.send(:remove_const, :CustomMarkdown) end - should 'ignore, if there are any bad characters in the class name' do + should "ignore, if there are any bad characters in the class name" do module Jekyll::Converters::Markdown::Custom class Markdown def initialize(*args) @args = args end - def convert(*args) + def convert(*_args) "" end end end bad_processor = "Custom::Markdown" - s = Site.new(site_configuration('markdown' => bad_processor, 'incremental' => false)) + s = Site.new(site_configuration( + "markdown" => bad_processor, + "incremental" => false + )) assert_raises Jekyll::Errors::FatalException do s.process end @@ -342,96 +361,105 @@ def convert(*args) end end - context 'with an invalid markdown processor in the configuration' do - should 'not throw an error at initialization time' do - bad_processor = 'not a processor name' - assert Site.new(site_configuration('markdown' => bad_processor)) + context "with an invalid markdown processor in the configuration" do + should "not throw an error at initialization time" do + bad_processor = "not a processor name" + assert Site.new(site_configuration("markdown" => bad_processor)) end - should 'throw FatalException at process time' do - bad_processor = 'not a processor name' - s = Site.new(site_configuration('markdown' => bad_processor, 'incremental' => false)) + should "throw FatalException at process time" do + bad_processor = "not a processor name" + s = Site.new(site_configuration( + "markdown" => bad_processor, + "incremental" => false + )) assert_raises Jekyll::Errors::FatalException do s.process end end end - context 'data directory' do - should 'auto load yaml files' do + context "data directory" do + should "auto load yaml files" do site = Site.new(site_configuration) site.process - file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'members.yaml')) + file_content = SafeYAML.load_file(File.join(source_dir, "_data", "members.yaml")) - assert_equal site.data['members'], file_content - assert_equal site.site_payload['site']['data']['members'], file_content + assert_equal site.data["members"], file_content + assert_equal site.site_payload["site"]["data"]["members"], file_content end - should 'load yaml files from extracted method' do + should "load yaml files from extracted method" do site = Site.new(site_configuration) site.process - file_content = DataReader.new(site).read_data_file(source_dir('_data', 'members.yaml')) + file_content = DataReader.new(site) + .read_data_file(source_dir("_data", "members.yaml")) - assert_equal site.data['members'], file_content - assert_equal site.site_payload['site']['data']['members'], file_content + assert_equal site.data["members"], file_content + assert_equal site.site_payload["site"]["data"]["members"], file_content end - should 'auto load yml files' do + should "auto load yml files" do site = Site.new(site_configuration) site.process - file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'languages.yml')) + file_content = SafeYAML.load_file(File.join(source_dir, "_data", "languages.yml")) - assert_equal site.data['languages'], file_content - assert_equal site.site_payload['site']['data']['languages'], file_content + assert_equal site.data["languages"], file_content + assert_equal site.site_payload["site"]["data"]["languages"], file_content end - should 'auto load json files' do + should "auto load json files" do site = Site.new(site_configuration) site.process - file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'members.json')) + file_content = SafeYAML.load_file(File.join(source_dir, "_data", "members.json")) - assert_equal site.data['members'], file_content - assert_equal site.site_payload['site']['data']['members'], file_content + assert_equal site.data["members"], file_content + assert_equal site.site_payload["site"]["data"]["members"], file_content end - should 'auto load yaml files in subdirectory' do + should "auto load yaml files in subdirectory" do site = Site.new(site_configuration) site.process - file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'categories', 'dairy.yaml')) + file_content = SafeYAML.load_file(File.join( + source_dir, "_data", "categories", "dairy.yaml" + )) - assert_equal site.data['categories']['dairy'], file_content - assert_equal site.site_payload['site']['data']['categories']['dairy'], file_content + assert_equal site.data["categories"]["dairy"], file_content + assert_equal( + site.site_payload["site"]["data"]["categories"]["dairy"], + file_content + ) end should "load symlink files in unsafe mode" do - site = Site.new(site_configuration('safe' => false)) + site = Site.new(site_configuration("safe" => false)) site.process - file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'products.yml')) + file_content = SafeYAML.load_file(File.join(source_dir, "_data", "products.yml")) - assert_equal site.data['products'], file_content - assert_equal site.site_payload['site']['data']['products'], file_content + assert_equal site.data["products"], file_content + assert_equal site.site_payload["site"]["data"]["products"], file_content end - should "load the symlink files in safe mode, as they resolve to inside site.source" do - site = Site.new(site_configuration('safe' => true)) + should "load the symlink files in safe mode, " \ + "as they resolve to inside site.source" do + site = Site.new(site_configuration("safe" => true)) site.process - file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'products.yml')) - assert_equal site.data['products'], file_content - assert_equal site.site_payload['site']['data']['products'], file_content + file_content = SafeYAML.load_file(File.join(source_dir, "_data", "products.yml")) + assert_equal site.data["products"], file_content + assert_equal site.site_payload["site"]["data"]["products"], file_content end - end context "manipulating the Jekyll environment" do setup do @site = Site.new(site_configuration({ - 'incremental' => false + "incremental" => false })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } @@ -445,7 +473,7 @@ def convert(*args) setup do ENV["JEKYLL_ENV"] = "production" @site = Site.new(site_configuration({ - 'incremental' => false + "incremental" => false })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } @@ -463,7 +491,7 @@ def convert(*args) context "with liquid profiling" do setup do - @site = Site.new(site_configuration('profile' => true)) + @site = Site.new(site_configuration("profile" => true)) end # Suppress output while testing @@ -483,7 +511,7 @@ def convert(*args) context "incremental build" do setup do @site = Site.new(site_configuration({ - 'incremental' => true + "incremental" => true })) @site.read end @@ -533,8 +561,6 @@ def convert(*args) mtime2 = File.stat(dest).mtime.to_i refute_equal mtime1, mtime2 # must be regenerated end - end - end end From 1cec82062892eac3546ca1935ddd1c770b44f162 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:00:22 -0500 Subject: [PATCH 0909/4996] Rubocop: Tests --- .rubocop.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b7dd25301e9..be4b52290f9 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -41,17 +41,6 @@ AllCops: - features/step_definitions.rb - features/support/formatter.rb - features/support/helpers.rb - - test/test_configuration.rb - - test/test_document.rb - - test/test_entry_filter.rb - - test/test_filters.rb - - test/test_kramdown.rb - - test/test_liquid_renderer.rb - - test/test_page.rb - - test/test_regenerator.rb - - test/test_site.rb - - test/test_tags.rb - - test/test_utils.rb - bin/**/* - benchmark/**/* - script/**/* @@ -68,6 +57,7 @@ Metrics/ClassLength: Max: 240 Exclude: - !ruby/regexp /features\/.*.rb$/ + - !ruby/regexp /test\/.*.rb$/ Metrics/CyclomaticComplexity: Max: 8 Metrics/LineLength: From 3e42e6d4615b91f8014bcd802a756c24fd52308d Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:07:43 -0500 Subject: [PATCH 0910/4996] Rubocop: lib/jekyll/liquid_renderer.rb --- lib/jekyll/liquid_renderer.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/liquid_renderer.rb b/lib/jekyll/liquid_renderer.rb index 70f7b0d194e..30f798bc185 100644 --- a/lib/jekyll/liquid_renderer.rb +++ b/lib/jekyll/liquid_renderer.rb @@ -1,5 +1,5 @@ -require 'jekyll/liquid_renderer/file' -require 'jekyll/liquid_renderer/table' +require "jekyll/liquid_renderer/file" +require "jekyll/liquid_renderer/table" module Jekyll class LiquidRenderer @@ -13,7 +13,10 @@ def reset end def file(filename) - filename = @site.in_source_dir(filename).sub(/\A#{Regexp.escape(@site.source)}\//, '') + filename = @site.in_source_dir(filename).sub( + %r!\A#{Regexp.escape(@site.source)}/!, + "" + ) LiquidRenderer::File.new(self, filename).tap do @stats[filename] ||= {} From 4c35d15a3bea5f357e62067fe52b18b30416104c Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:07:52 -0500 Subject: [PATCH 0911/4996] Rubocop: lib/jekyll/liquid_renderer/table.rb --- lib/jekyll/liquid_renderer/table.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/jekyll/liquid_renderer/table.rb b/lib/jekyll/liquid_renderer/table.rb index e3e0c8af09f..d3859647711 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -31,8 +31,8 @@ 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 + str << "-" * widths[cell_index] + str << "-+-" unless cell_index == row_data.length-1 end str << "\n" @@ -40,16 +40,16 @@ def generate_table_head_border(row_data, widths) end def generate_row(row_data, widths) - str = '' + 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 << if cell_index == 0 + cell_data.ljust(widths[cell_index], " ") + else + cell_data.rjust(widths[cell_index], " ") + end - str << ' | ' unless cell_index == row_data.length-1 + str << " | " unless cell_index == row_data.length-1 end str << "\n" @@ -79,7 +79,7 @@ def data_for_table(n) row << filename row << file_stats[:count].to_s row << format_bytes(file_stats[:bytes]) - row << "%.3f" % file_stats[:time] + row << format("%.3f", file_stats[:time]) table << row end @@ -88,7 +88,7 @@ def data_for_table(n) def format_bytes(bytes) bytes /= 1024.0 - "%.2fK" % bytes + format("%.2fK", bytes) end end end From 40ec84cf61e0a9a618127e209619fca63bd80d7c Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:08:00 -0500 Subject: [PATCH 0912/4996] Rubocop: Liquid Renderer --- .rubocop.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b7dd25301e9..26505b33708 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -18,8 +18,6 @@ AllCops: - lib/jekyll/entry_filter.rb - lib/jekyll/filters.rb - lib/jekyll/frontmatter_defaults.rb - - lib/jekyll/liquid_renderer/table.rb - - lib/jekyll/liquid_renderer.rb - lib/jekyll/reader.rb - lib/jekyll/readers/layout_reader.rb - lib/jekyll/readers/page_reader.rb From 795bcdef686d9be7d0ec9c19c2ea3d42014a5793 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:09:46 -0500 Subject: [PATCH 0913/4996] Rubocop: lib/jekyll/reader.rb --- lib/jekyll/reader.rb | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index c9ded560936..abbe923f6c4 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -1,5 +1,5 @@ # encoding: UTF-8 -require 'csv' +require "csv" module Jekyll class Reader @@ -16,7 +16,7 @@ def read @site.layouts = LayoutReader.new(site).read read_directories sort_files! - @site.data = DataReader.new(site).read(site.config['data_dir']) + @site.data = DataReader.new(site).read(site.config["data_dir"]) CollectionReader.new(site).read end @@ -34,13 +34,15 @@ def sort_files! # dir - The String relative path of the directory to read. Default: ''. # # Returns nothing. - def read_directories(dir = '') + def read_directories(dir = "") base = site.in_source_dir(dir) - dot = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) } + dot = Dir.chdir(base) { filter_entries(Dir.entries("."), base) } dot_dirs = dot.select { |file| File.directory?(@site.in_source_dir(base, file)) } dot_files = (dot - dot_dirs) - dot_pages = dot_files.select { |file| Utils.has_yaml_header?(@site.in_source_dir(base, file)) } + dot_pages = dot_files.select do |file| + Utils.has_yaml_header?(@site.in_source_dir(base, file)) + end dot_static_files = dot_files - dot_pages retrieve_posts(dir) @@ -71,7 +73,9 @@ def retrieve_dirs(_base, dir, dot_dirs) dot_dirs.map do |file| dir_path = site.in_source_dir(dir, file) rel_path = File.join(dir, file) - @site.reader.read_directories(rel_path) unless @site.dest.sub(/\/$/, '') == dir_path + unless @site.dest.sub(%r!/$!, "") == dir_path + @site.reader.read_directories(rel_path) + end end end @@ -119,7 +123,7 @@ def filter_entries(entries, base_directory = nil) def get_entries(dir, subfolder) base = site.in_source_dir(dir, subfolder) return [] unless File.exist?(base) - entries = Dir.chdir(base) { filter_entries(Dir['**/*'], base) } + entries = Dir.chdir(base) { filter_entries(Dir["**/*"], base) } entries.delete_if { |e| File.directory?(site.in_source_dir(base, e)) } end end From e85690a61f13703da22c609d3a16f05f03c6e5d4 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:10:09 -0500 Subject: [PATCH 0914/4996] Rubocop: lib/jekyll/readers/layout_reader.rb --- lib/jekyll/readers/layout_reader.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/readers/layout_reader.rb b/lib/jekyll/readers/layout_reader.rb index df8931cb1da..985491c67a7 100644 --- a/lib/jekyll/readers/layout_reader.rb +++ b/lib/jekyll/readers/layout_reader.rb @@ -8,11 +8,13 @@ def initialize(site) def read layout_entries.each do |layout_file| - @layouts[layout_name(layout_file)] = Layout.new(site, layout_directory, layout_file) + @layouts[layout_name(layout_file)] = \ + Layout.new(site, layout_directory, layout_file) end theme_layout_entries.each do |layout_file| - @layouts[layout_name(layout_file)] ||= Layout.new(site, theme_layout_directory, layout_file) + @layouts[layout_name(layout_file)] ||= \ + Layout.new(site, theme_layout_directory, layout_file) end @layouts @@ -39,7 +41,7 @@ def theme_layout_entries def entries_in(dir) entries = [] within(dir) do - entries = EntryFilter.new(site).filter(Dir['**/*.*']) + entries = EntryFilter.new(site).filter(Dir["**/*.*"]) end entries end @@ -54,15 +56,13 @@ def within(directory) end def layout_directory_inside_source - site.in_source_dir(site.config['layouts_dir']) + site.in_source_dir(site.config["layouts_dir"]) end def layout_directory_in_cwd - dir = Jekyll.sanitized_path(Dir.pwd, site.config['layouts_dir']) + dir = Jekyll.sanitized_path(Dir.pwd, site.config["layouts_dir"]) if File.directory?(dir) && !site.safe dir - else - nil end end end From 615a9ee9ac971668f203db76955a247b08926509 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:10:20 -0500 Subject: [PATCH 0915/4996] Rubocop: lib/jekyll/readers/page_reader.rb --- lib/jekyll/readers/page_reader.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/readers/page_reader.rb b/lib/jekyll/readers/page_reader.rb index 97748c01e58..507c609e507 100644 --- a/lib/jekyll/readers/page_reader.rb +++ b/lib/jekyll/readers/page_reader.rb @@ -14,7 +14,9 @@ def initialize(site, dir) # # Returns an array of static pages. def read(files) - files.map { |page| @unfiltered_content << Page.new(@site, @site.source, @dir, page) } + files.map do |page| + @unfiltered_content << Page.new(@site, @site.source, @dir, page) + end @unfiltered_content.select { |page| site.publisher.publish?(page) } end end From 0696e6c169ddd8643689386b3470a6130906e3a8 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:10:31 -0500 Subject: [PATCH 0916/4996] Rubocop: lib/jekyll/readers/post_reader.rb --- lib/jekyll/readers/post_reader.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index f7a44ca7131..ec5bc7ad8b9 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -12,7 +12,7 @@ def initialize(site) # # Returns nothing. def read_drafts(dir) - read_publishable(dir, '_drafts', Document::DATELESS_FILENAME_MATCHER) + read_publishable(dir, "_drafts", Document::DATELESS_FILENAME_MATCHER) end # Read all the files in /
    /_posts and create a new Document @@ -22,7 +22,7 @@ def read_drafts(dir) # # Returns nothing. def read_posts(dir) - read_publishable(dir, '_posts', Document::DATE_FILENAME_MATCHER) + read_publishable(dir, "_posts", Document::DATE_FILENAME_MATCHER) end # Read all the files in // and create a new @@ -32,9 +32,10 @@ def read_posts(dir) # # Returns nothing. def read_publishable(dir, magic_dir, matcher) - read_content(dir, magic_dir, matcher).tap do |docs| + documents = read_content(dir, magic_dir, matcher).tap do |docs| docs.each(&:read) - end.select do |doc| + end + documents.select do |doc| site.publisher.publish?(doc).tap do |will_publish| if !will_publish && site.publisher.hidden_in_the_future?(doc) Jekyll.logger.debug "Skipping:", "#{doc.relative_path} has a future date" @@ -57,7 +58,7 @@ def read_content(dir, magic_dir, matcher) next unless entry =~ matcher path = @site.in_source_dir(File.join(dir, magic_dir, entry)) Document.new(path, { - :site => @site, + :site => @site, :collection => @site.posts }) end.reject(&:nil?) From 382be191aed931174e19da4f9edd000665532933 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:10:43 -0500 Subject: [PATCH 0917/4996] Rubocop: lib/jekyll/readers/static_file_reader.rb --- lib/jekyll/readers/static_file_reader.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/readers/static_file_reader.rb b/lib/jekyll/readers/static_file_reader.rb index 8def1365ab0..1d43d69c659 100644 --- a/lib/jekyll/readers/static_file_reader.rb +++ b/lib/jekyll/readers/static_file_reader.rb @@ -14,7 +14,9 @@ def initialize(site, dir) # # Returns an array of static files. def read(files) - files.map { |file| @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file) } + files.map do |file| + @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file) + end @unfiltered_content end end From 0d0ed561fdf2baa837367d04366388088dab0846 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:11:37 -0500 Subject: [PATCH 0918/4996] Rubocop: Readers --- .rubocop.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b7dd25301e9..e4d97d3bf29 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -20,11 +20,6 @@ AllCops: - lib/jekyll/frontmatter_defaults.rb - lib/jekyll/liquid_renderer/table.rb - lib/jekyll/liquid_renderer.rb - - lib/jekyll/reader.rb - - lib/jekyll/readers/layout_reader.rb - - lib/jekyll/readers/page_reader.rb - - lib/jekyll/readers/post_reader.rb - - lib/jekyll/readers/static_file_reader.rb - lib/jekyll/regenerator.rb - lib/jekyll/renderer.rb - lib/jekyll/site.rb From d58c986b2b1832a9d50b9a9d96ebc07b2176f1a2 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:45:54 -0500 Subject: [PATCH 0919/4996] Rubocop: lib/jekyll/entry_filter.rb --- .rubocop.yml | 1 - lib/jekyll/entry_filter.rb | 15 +++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b7dd25301e9..0b70ad53488 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -15,7 +15,6 @@ AllCops: - lib/jekyll/deprecator.rb - lib/jekyll/document.rb - lib/jekyll/drops/site_drop.rb - - lib/jekyll/entry_filter.rb - lib/jekyll/filters.rb - lib/jekyll/frontmatter_defaults.rb - lib/jekyll/liquid_renderer/table.rb diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index 496bf56f2ad..9ec02dd4b09 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -2,7 +2,7 @@ module Jekyll class EntryFilter attr_reader :site SPECIAL_LEADING_CHARACTERS = [ - '.', '_', '#', '~' + ".", "_", '#', "~" ].freeze def initialize(site, base_directory = nil) @@ -37,8 +37,7 @@ def filter(entries) def included?(entry) glob_include?(site.include, - entry - ) + entry) end def special?(entry) @@ -47,12 +46,17 @@ def special?(entry) end def backup?(entry) - entry[-1..-1] == '~' + entry[-1..-1] == "~" end def excluded?(entry) excluded = glob_include?(site.exclude, relative_to_source(entry)) - Jekyll.logger.debug "EntryFilter:", "excluded #{relative_to_source(entry)}" if excluded + if excluded + Jekyll.logger.debug( + "EntryFilter:", + "excluded #{relative_to_source(entry)}" + ) + end excluded end @@ -83,7 +87,6 @@ def symlink_outside_site_source?(entry) def glob_include?(enum, e) entry = Pathutil.new(site.in_source_dir).join(e) enum.any? do |exp| - # Users who send a Regexp knows what they want to # exclude, so let them send a Regexp to exclude files, # we will not bother caring if it works or not, it's From 38eb326b7f3d5e847e7a67274e3cc33207c36169 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:53:15 -0500 Subject: [PATCH 0920/4996] Rubocop: lib/jekyll/converters/markdown.rb --- lib/jekyll/converters/markdown.rb | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 6e44b3b2f8c..ab886d06e98 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -9,23 +9,33 @@ def setup return if @setup ||= false unless (@parser = get_processor) Jekyll.logger.error "Invalid Markdown processor given:", @config["markdown"] - Jekyll.logger.info "", "Custom processors are not loaded in safe mode" if @config["safe"] - Jekyll.logger.error "", "Available processors are: #{valid_processors.join(", ")}" + if @config["safe"] + Jekyll.logger.info "", "Custom processors are not loaded in safe mode" + end + Jekyll.logger.error( + "", + "Available processors are: #{valid_processors.join(", ")}" + ) raise Errors::FatalException, "Bailing out; invalid Markdown processor." end @setup = true end + # Rubocop does not allow reader methods to have names starting with `get_` + # To ensure compatibility, this check has been disabled on this method + # + # rubocop:disable Style/AccessorMethodName def get_processor case @config["markdown"].downcase when "redcarpet" then return RedcarpetParser.new(@config) when "kramdown" then return KramdownParser.new(@config) when "rdiscount" then return RDiscountParser.new(@config) else - get_custom_processor + custom_processor end end + # rubocop:enable Style/AccessorMethodName # Public: Provides you with a list of processors, the ones we # support internally and the ones that you have provided to us (if you @@ -41,13 +51,13 @@ def valid_processors def third_party_processors self.class.constants - \ - %w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map( - &:to_sym - ) + %w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map( + &:to_sym + ) end def extname_list - @extname_list ||= @config['markdown_ext'].split(',').map do |e| + @extname_list ||= @config["markdown_ext"].split(",").map do |e| ".#{e.downcase}" end end @@ -66,7 +76,7 @@ def convert(content) end private - def get_custom_processor + def custom_processor converter_name = @config["markdown"] if custom_class_allowed?(converter_name) self.class.const_get(converter_name).new(@config) From 0880dc097f21b3ffd7091d4295dec174b6dde35d Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:53:26 -0500 Subject: [PATCH 0921/4996] Rubocop: lib/jekyll/converters/markdown/kramdown_parser.rb --- lib/jekyll/converters/markdown/kramdown_parser.rb | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index 4d84a5bcb60..6e65d43c79f 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -24,7 +24,8 @@ def initialize(config) # Setup and normalize the configuration: # * Create Kramdown if it doesn't exist. - # * Set syntax_highlighter, detecting enable_coderay and merging highlighter if none. + # * Set syntax_highlighter, detecting enable_coderay and merging + # highlighter if none. # * Merge kramdown[coderay] into syntax_highlighter_opts stripping coderay_. # * Make sure `syntax_highlighter_opts` exists. @@ -52,7 +53,9 @@ def make_accessible(hash = @config) end end - # config[kramdown][syntax_higlighter] > config[kramdown][enable_coderay] > config[highlighter] + # config[kramdown][syntax_higlighter] > + # config[kramdown][enable_coderay] > + # config[highlighter] # Where `enable_coderay` is now deprecated because Kramdown # supports Rouge now too. @@ -68,8 +71,10 @@ def highlighter @highlighter = begin if @config.key?("enable_coderay") && @config["enable_coderay"] - Jekyll::Deprecator.deprecation_message "You are using 'enable_coderay', " \ + Jekyll::Deprecator.deprecation_message( + "You are using 'enable_coderay', " \ "use syntax_highlighter: coderay in your configuration file." + ) "coderay" else @@ -100,8 +105,10 @@ def strip_coderay_prefix(hash) private def modernize_coderay_config if highlighter == "coderay" - Jekyll::Deprecator.deprecation_message "You are using 'kramdown.coderay' in your configuration, " \ + Jekyll::Deprecator.deprecation_message( + "You are using 'kramdown.coderay' in your configuration, " \ "please use 'syntax_highlighter_opts' instead." + ) @config["syntax_highlighter_opts"] = begin strip_coderay_prefix( From d855ec03bace66336e1068f77500b0a94d928ceb Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:53:38 -0500 Subject: [PATCH 0922/4996] Rubocop: lib/jekyll/converters/markdown/redcarpet_parser.rb --- .../converters/markdown/redcarpet_parser.rb | 174 +++++++++--------- 1 file changed, 90 insertions(+), 84 deletions(-) diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index 79133a2abcf..8e7593856e8 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -1,102 +1,108 @@ -module Jekyll - module Converters - class Markdown - class RedcarpetParser - module CommonMethods - def add_code_tags(code, lang) - code = code.to_s - code = code.sub(/
    /, "
    ")
    -            code = code.sub(/<\/pre>/, "
    ") - code - end - end - - module WithPygments - include CommonMethods - def block_code(code, lang) - Jekyll::External.require_with_graceful_fail("pygments") - lang = lang && lang.split.first || "text" - add_code_tags( - Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }), - lang - ) - end - end +class Jekyll::Converters::Markdown::RedcarpetParser + module CommonMethods + def add_code_tags(code, lang) + code = code.to_s + code = code.sub( + /
    /,
    +        "
    "
    +      )
    +      code = code.sub(%r!
    !, "
    ") + code + end + end - module WithoutHighlighting - require 'cgi' + module WithPygments + include CommonMethods + def block_code(code, lang) + Jekyll::External.require_with_graceful_fail("pygments") + lang = lang && lang.split.first || "text" + add_code_tags( + Pygments.highlight( + code, + { + :lexer => lang, + :options => { :encoding => "utf-8" } + } + ), + lang + ) + end + end - include CommonMethods + module WithoutHighlighting + require "cgi" - def code_wrap(code) - "
    #{CGI::escapeHTML(code)}
    " - end + include CommonMethods - def block_code(code, lang) - lang = lang && lang.split.first || "text" - add_code_tags(code_wrap(code), lang) - end - end + def code_wrap(code) + "
    #{CGI.escapeHTML(code)}
    " + end - module WithRouge - def block_code(code, lang) - code = "
    #{super}
    " + def block_code(code, lang) + lang = lang && lang.split.first || "text" + add_code_tags(code_wrap(code), lang) + end + end - output = "
    " - output << add_code_tags(code, lang) - output << "
    " - end + module WithRouge + def block_code(code, lang) + code = "
    #{super}
    " - protected - def rouge_formatter(_lexer) - Rouge::Formatters::HTML.new(:wrap => false) - end - end + output = "
    " + output << add_code_tags(code, lang) + output << "
    " + end - def initialize(config) - External.require_with_graceful_fail("redcarpet") - @config = config - @redcarpet_extensions = {} - @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true } + protected + def rouge_formatter(_lexer) + Rouge::Formatters::HTML.new(:wrap => false) + end + end - @renderer ||= class_with_proper_highlighter(@config['highlighter']) - end + def initialize(config) + Jekyll::External.require_with_graceful_fail("redcarpet") + @config = config + @redcarpet_extensions = {} + @config["redcarpet"]["extensions"].each do |e| + @redcarpet_extensions[e.to_sym] = true + end - def class_with_proper_highlighter(highlighter) - case highlighter - when "pygments" - Class.new(Redcarpet::Render::HTML) do - include WithPygments - end - when "rouge" - Class.new(Redcarpet::Render::HTML) do - Jekyll::External.require_with_graceful_fail(%w( - rouge - rouge/plugins/redcarpet - )) + @renderer ||= class_with_proper_highlighter(@config["highlighter"]) + end - unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0") - abort "Please install Rouge 1.3.0 or greater and try running Jekyll again." - end + def class_with_proper_highlighter(highlighter) + Class.new(Redcarpet::Render::HTML) do + case highlighter + when "pygments" + include WithPygments + when "rouge" + Jekyll::External.require_with_graceful_fail(%w( + rouge rouge/plugins/redcarpet + )) - include Rouge::Plugins::Redcarpet - include CommonMethods - include WithRouge - end - else - Class.new(Redcarpet::Render::HTML) do - include WithoutHighlighting - end - end + unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0") + abort "Please install Rouge 1.3.0 or greater and try running Jekyll again." end - def convert(content) - @redcarpet_extensions[:fenced_code_blocks] = !@redcarpet_extensions[:no_fenced_code_blocks] - @renderer.send :include, Redcarpet::Render::SmartyPants if @redcarpet_extensions[:smart] - markdown = Redcarpet::Markdown.new(@renderer.new(@redcarpet_extensions), @redcarpet_extensions) - markdown.render(content) - end + include Rouge::Plugins::Redcarpet + include CommonMethods + include WithRouge + else + include WithoutHighlighting end end end + + def convert(content) + @redcarpet_extensions[:fenced_code_blocks] = \ + !@redcarpet_extensions[:no_fenced_code_blocks] + if @redcarpet_extensions[:smart] + @renderer.send :include, Redcarpet::Render::SmartyPants + end + markdown = Redcarpet::Markdown.new( + @renderer.new(@redcarpet_extensions), + @redcarpet_extensions + ) + markdown.render(content) + end end From acc9f511c547ceba7283ff9632e62ddb4a5da7c1 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 00:53:49 -0500 Subject: [PATCH 0923/4996] Rubocop: Converters --- .rubocop.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b7dd25301e9..ce51550b2c8 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -7,10 +7,6 @@ AllCops: - lib/jekyll/collection.rb - lib/jekyll/command.rb - lib/jekyll/configuration.rb - - lib/jekyll/converters/identity.rb - - lib/jekyll/converters/markdown/kramdown_parser.rb - - lib/jekyll/converters/markdown/redcarpet_parser.rb - - lib/jekyll/converters/markdown.rb - lib/jekyll/convertible.rb - lib/jekyll/deprecator.rb - lib/jekyll/document.rb From ae71db4693789e1863488cd6c7da8227bc29bfba Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 01:04:12 -0500 Subject: [PATCH 0924/4996] Rubocop: lib/jekyll/stevenson.rb --- .rubocop.yml | 1 - lib/jekyll/stevenson.rb | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b7dd25301e9..bc4cfb51609 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -29,7 +29,6 @@ AllCops: - lib/jekyll/renderer.rb - lib/jekyll/site.rb - lib/jekyll/static_file.rb - - lib/jekyll/stevenson.rb - lib/jekyll/tags/highlight.rb - lib/jekyll/tags/include.rb - lib/jekyll/tags/link.rb diff --git a/lib/jekyll/stevenson.rb b/lib/jekyll/stevenson.rb index d6dd5434fdb..bf20b22f752 100644 --- a/lib/jekyll/stevenson.rb +++ b/lib/jekyll/stevenson.rb @@ -6,13 +6,13 @@ def initialize @default_formatter = Formatter.new @logdev = $stdout @formatter = proc do |_, _, _, msg| - "#{msg}" + msg.to_s end end - def add(severity, message = nil, progname = nil, &block) + def add(severity, message = nil, progname = nil) severity ||= UNKNOWN - @logdev = set_logdevice(severity) + @logdev = logdevice(severity) if @logdev.nil? || severity < @level return true @@ -27,7 +27,8 @@ def add(severity, message = nil, progname = nil, &block) end end @logdev.puts( - format_message(format_severity(severity), Time.now, progname, message)) + format_message(format_severity(severity), Time.now, progname, message) + ) true end @@ -47,7 +48,7 @@ def close private - def set_logdevice(severity) + def logdevice(severity) if severity > INFO $stderr else From 001cbf2c073301fe3dc6ffd5100b4712fb78adaf Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 26 May 2016 12:17:31 +0300 Subject: [PATCH 0925/4996] rubocop: fix code style --- lib/jekyll/tags/highlight.rb | 2 +- lib/jekyll/tags/include.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index b22001d3b14..af2a1e107aa 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -65,7 +65,7 @@ def sanitized_opts(opts, is_safe) def parse_options(input) options = {} - if defined?(input) && input != "" + unless input.empty? # Split along 3 possible forms -- key="", key=value, or key input.scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt| key, value = opt.split("=") diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 4c4c38a3ef6..b1b02981140 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -28,7 +28,7 @@ def initialize(tag_name, markup, tokens) @file = matched["variable"].strip @params = matched["params"].strip else - @file, @params = markup.strip.split(" ", 2) + @file, @params = markup.strip.split(/\s+/, 2) end validate_params if @params @tag_name = tag_name From b5aafc31371dfcf0296d40094da0c2d124e9e0ee Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 May 2016 08:24:21 -0700 Subject: [PATCH 0926/4996] Update history to reflect merge of #4951 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0d8ee320ce4..b8759f8d6d4 100644 --- a/History.markdown +++ b/History.markdown @@ -71,6 +71,7 @@ * Rubocop: Low hanging fruit (#4936) * Rubocop: `Drop` changes from v3.1 forward-ports (#4949) * Rubocop: cleanup for misc files (#4946) + * Rubocop: Stevenson (#4951) ### Site Enhancements From 427e30c0f8a6812a71f1d907fedaf43a8af8992b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 May 2016 08:25:56 -0700 Subject: [PATCH 0927/4996] Update history to reflect merge of #4950 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b8759f8d6d4..f68994e5ab8 100644 --- a/History.markdown +++ b/History.markdown @@ -72,6 +72,7 @@ * Rubocop: `Drop` changes from v3.1 forward-ports (#4949) * Rubocop: cleanup for misc files (#4946) * Rubocop: Stevenson (#4951) + * Rubocop: lib/jekyll/entry_filter.rb (#4950) ### Site Enhancements From ff591dd5dcf362682c9e14509c49819f86f27d9c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 May 2016 08:26:43 -0700 Subject: [PATCH 0928/4996] Update history to reflect merge of #4947 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f68994e5ab8..45237811959 100644 --- a/History.markdown +++ b/History.markdown @@ -73,6 +73,7 @@ * Rubocop: cleanup for misc files (#4946) * Rubocop: Stevenson (#4951) * Rubocop: lib/jekyll/entry_filter.rb (#4950) + * Rubocop: test/* (#4947) ### Site Enhancements From ab3cda6e5838e16a782beb6745c481a256b68e98 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 12:00:01 -0500 Subject: [PATCH 0929/4996] Rubocop: features/support/formatter.rb --- features/support/formatter.rb | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/features/support/formatter.rb b/features/support/formatter.rb index 9e82a4e5c95..8ce03bd10d0 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -1,7 +1,7 @@ -require 'fileutils' -require 'colorator' -require 'cucumber/formatter/console' -require 'cucumber/formatter/io' +require "fileutils" +require "colorator" +require "cucumber/formatter/console" +require "cucumber/formatter/io" module Jekyll module Cucumber @@ -17,7 +17,7 @@ class Formatter :undefined => "\u2718".red, :passed => "\u2714".green, :skipped => "\u203D".blue - } + }.freeze # @@ -34,7 +34,7 @@ def initialize(runtime, path_or_io, options) # - def before_features(features) + def before_features(_features) print_profile_information end @@ -47,7 +47,7 @@ def after_features(features) # - def before_feature(feature) + def before_feature(_feature) @exceptions = [] @indent = 0 end @@ -55,20 +55,23 @@ def before_feature(feature) # def tag_name(tag_name); end + def comment_line(comment_line); end + def after_feature_element(feature_element); end + def after_tags(tags); end # - def before_feature_element(feature_element) + def before_feature_element(_feature_element) @indent = 2 @scenario_indent = 2 end # - def before_background(background) + def before_background(_background) @scenario_indent = 2 @in_background = true @indent = 2 @@ -76,7 +79,7 @@ def before_background(background) # - def after_background(background) + def after_background(_background) @in_background = nil end @@ -104,8 +107,9 @@ def before_step(step) # - def before_step_result(keyword, step_match, multiline_arg, status, exception, \ - source_indent, background, file_colon_line) + # rubocop:disable Metrics/ParameterLists + def before_step_result(_keyword, _step_match, _multiline_arg, status, exception, \ + _source_indent, background, _file_colon_line) @hide_this_step = false if exception @@ -127,10 +131,11 @@ def before_step_result(keyword, step_match, multiline_arg, status, exception, \ # - def step_name(keyword, step_match, status, source_indent, background, file_colon_line) + def step_name(_keyword, _step_match, status, _source_indent, _background, _file_colon_line) @io.print CHARS[status] @io.print " " end + # rubocop:enable Metrics/ParameterLists # @@ -153,7 +158,7 @@ def after_test_step(test_step, result) # private - def print_feature_element_name(keyword, name, source_line, indent) + def print_feature_element_name(keyword, name, source_line, _indent) @io.puts names = name.empty? ? [name] : name.each_line.to_a From 45a5a976f0a701021c505e46a54450f2b3522ed5 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 12:00:21 -0500 Subject: [PATCH 0930/4996] Rubocop: features/support/helpers.rb --- features/support/helpers.rb | 39 +++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/features/support/helpers.rb b/features/support/helpers.rb index b8334cfd619..29333075324 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -7,26 +7,31 @@ class Paths SOURCE_DIR = Pathname.new(File.expand_path("../..", __dir__)) def self.test_dir; source_dir.join("tmp", "jekyll"); end + def self.output_file; test_dir.join("jekyll_output.txt"); end + def self.status_file; test_dir.join("jekyll_status.txt"); end + def self.jekyll_bin; source_dir.join("bin", "jekyll"); end + def self.source_dir; SOURCE_DIR; end end # def file_content_from_hash(input_hash) - matter_hash = input_hash.reject { |k, v| k == "content" } - matter = matter_hash.map do |k, v| "#{k}: #{v}\n" + matter_hash = input_hash.reject { |k, _v| k == "content" } + matter = matter_hash.map do |k, v| + "#{k}: #{v}\n" end matter = matter.join.chomp content = \ - if !input_hash['input'] || !input_hash['filter'] - then input_hash['content'] - else "{{ #{input_hash['input']} | " \ - "#{input_hash['filter']} }}" - end + if !input_hash["input"] || !input_hash["filter"] + then input_hash["content"] + else "{{ #{input_hash["input"]} | " \ + "#{input_hash["filter"]} }}" + end Jekyll::Utils.strip_heredoc(<<-EOF) --- @@ -78,7 +83,7 @@ def jekyll_run_status # def run_bundle(args) - run_in_shell("bundle", *args.strip.split(' ')) + run_in_shell("bundle", *args.strip.split(" ")) end # @@ -91,14 +96,13 @@ def run_jekyll(args) # +# rubocop:disable Metrics/AbcSize def run_in_shell(*args) i, o, e, p = Open3.popen3(*args) out = o.read.strip err = e.read.strip - [i, o, e].each do |m| - m.close - end + [i, o, e].each(&:close) File.write(Paths.status_file, p.value.exitstatus) File.open(Paths.output_file, "wb") do |f| @@ -110,13 +114,14 @@ def run_in_shell(*args) p.value end +# rubocop:enable Metrics/AbcSize # def slug(title = nil) if !title then Time.now.strftime("%s%9N") # nanoseconds since the Epoch - else title.downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, '-') + else title.downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, "-") end end @@ -124,12 +129,12 @@ def slug(title = nil) def location(folder, direction) if folder - before = folder if direction == "in" + before = folder if direction == "in" after = folder if direction == "under" end - [before || '.', - after || '.'] + [before || ".", + after || "."] end # @@ -149,13 +154,13 @@ def seconds_agnostic_datetime(datetime = Time.now) "#{time}:\\d{2}", Regexp.escape(zone) ] \ - .join("\\ ") + .join("\\ ") end # def seconds_agnostic_time(time) time = time.strftime("%H:%M:%S") if time.is_a?(Time) - hour, minutes, _ = time.split(":") + hour, minutes, = time.split(":") "#{hour}:#{minutes}" end From 30eebaf5e04f3115b3417b30999368ace3c553e5 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 26 May 2016 12:04:28 -0500 Subject: [PATCH 0931/4996] Rubocop: lib/jekyll/drops/site_drop.rb --- .rubocop.yml | 1 - lib/jekyll/drops/site_drop.rb | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index b06c96248c8..0236b293c27 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -14,7 +14,6 @@ AllCops: - lib/jekyll/convertible.rb - lib/jekyll/deprecator.rb - lib/jekyll/document.rb - - lib/jekyll/drops/site_drop.rb - lib/jekyll/filters.rb - lib/jekyll/frontmatter_defaults.rb - lib/jekyll/liquid_renderer/table.rb diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index 7b083126a2f..66366810e62 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -24,7 +24,9 @@ def posts end def html_pages - @site_html_pages ||= @obj.pages.select { |page| page.html? || page.url.end_with?("/") } + @site_html_pages ||= @obj.pages.select do |page| + page.html? || page.url.end_with?("/") + end end def collections From 753ff9216c243e760f43ab8429594bd834350bd6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 May 2016 10:20:43 -0700 Subject: [PATCH 0932/4996] Update history to reflect merge of #4934 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 45237811959..57cb725b6dc 100644 --- a/History.markdown +++ b/History.markdown @@ -74,6 +74,7 @@ * Rubocop: Stevenson (#4951) * Rubocop: lib/jekyll/entry_filter.rb (#4950) * Rubocop: test/* (#4947) + * Rubocop: features (#4934) ### Site Enhancements From 0ac9c7fe706ba407fa693fac632281a0209cebb6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 May 2016 10:21:39 -0700 Subject: [PATCH 0933/4996] Update history to reflect merge of #4933 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 57cb725b6dc..21d94952aa9 100644 --- a/History.markdown +++ b/History.markdown @@ -75,6 +75,7 @@ * Rubocop: lib/jekyll/entry_filter.rb (#4950) * Rubocop: test/* (#4947) * Rubocop: features (#4934) + * Rubocop: Liquid renderer (#4933) ### Site Enhancements From 632f3fd8de0c63813f46240216cb12905d829968 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 May 2016 10:28:22 -0700 Subject: [PATCH 0934/4996] Update history to reflect merge of #4931 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 21d94952aa9..66738fd5bd7 100644 --- a/History.markdown +++ b/History.markdown @@ -76,6 +76,7 @@ * Rubocop: test/* (#4947) * Rubocop: features (#4934) * Rubocop: Liquid renderer (#4933) + * Rubocop: converters (#4931) ### Site Enhancements From 8c231ed50a22dc3344a4db955baea106d014d5f8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 May 2016 16:03:53 -0700 Subject: [PATCH 0935/4996] Update history to reflect merge of #4948 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 66738fd5bd7..32e353a1116 100644 --- a/History.markdown +++ b/History.markdown @@ -77,6 +77,7 @@ * Rubocop: features (#4934) * Rubocop: Liquid renderer (#4933) * Rubocop: converters (#4931) + * Rubocop: Site Drop (#4948) ### Site Enhancements From 7a02f29e705df9061744d5dc375fe6965ae353c4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 26 May 2016 16:06:04 -0700 Subject: [PATCH 0936/4996] Update history to reflect merge of #4938 [ci skip] --- History.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 32e353a1116..71f34765af6 100644 --- a/History.markdown +++ b/History.markdown @@ -73,11 +73,12 @@ * Rubocop: cleanup for misc files (#4946) * Rubocop: Stevenson (#4951) * Rubocop: lib/jekyll/entry_filter.rb (#4950) - * Rubocop: test/* (#4947) + * Rubocop: `test/*` (#4947) * Rubocop: features (#4934) * Rubocop: Liquid renderer (#4933) * Rubocop: converters (#4931) * Rubocop: Site Drop (#4948) + * Rubocop: tags (#4938) ### Site Enhancements From 3a3405fe51c8ae4510f6b50473557dd6c9ad6248 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 26 May 2016 16:09:56 -0700 Subject: [PATCH 0937/4996] I will chain blocks if I want to chain blocks. --- lib/jekyll/readers/post_reader.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index ec5bc7ad8b9..123709e7374 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -32,16 +32,14 @@ def read_posts(dir) # # Returns nothing. def read_publishable(dir, magic_dir, matcher) - documents = read_content(dir, magic_dir, matcher).tap do |docs| - docs.each(&:read) - end - documents.select do |doc| - site.publisher.publish?(doc).tap do |will_publish| - if !will_publish && site.publisher.hidden_in_the_future?(doc) - Jekyll.logger.debug "Skipping:", "#{doc.relative_path} has a future date" + read_content(dir, magic_dir, matcher).tap { |docs| docs.each(&:read) } + .select do |doc| + site.publisher.publish?(doc).tap do |will_publish| + if !will_publish && site.publisher.hidden_in_the_future?(doc) + Jekyll.logger.debug "Skipping:", "#{doc.relative_path} has a future date" + end end end - end end # Read all the content files from /
    /magic_dir From ca2abea08618c3ae66fea148c2012876d5e273eb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 26 May 2016 16:10:53 -0700 Subject: [PATCH 0938/4996] Update history to reflect merge of #4932 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 71f34765af6..6e3b8b31a72 100644 --- a/History.markdown +++ b/History.markdown @@ -79,6 +79,7 @@ * Rubocop: converters (#4931) * Rubocop: Site Drop (#4948) * Rubocop: tags (#4938) + * Rubocop: Readers (#4932) ### Site Enhancements From 14c1ac388f8fd324599e49ee4416fe5092265a6c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 26 May 2016 16:18:34 -0700 Subject: [PATCH 0939/4996] Remove extraneously-checked files. --- .rubocop.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index f3aae6feeee..84c8d1b7c09 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -21,8 +21,6 @@ AllCops: - lib/jekyll/utils.rb - lib/jekyll.rb - features/step_definitions.rb - - features/support/formatter.rb - - features/support/helpers.rb - bin/**/* - benchmark/**/* - script/**/* From f8c038566cd34f37373324401980159cf5735864 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Thu, 26 May 2016 22:24:04 +0200 Subject: [PATCH 0940/4996] `Serve.process` should receive same config as `Build.process` fixes #4850 --- lib/jekyll/commands/serve.rb | 2 ++ test/test_commands_serve.rb | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 134991b4616..6f1c4a40314 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -33,7 +33,9 @@ def init_with_program(prog) cmd.action do |_, opts| opts["serving"] = true opts["watch" ] = true unless opts.key?("watch") + config = opts["config"] Build.process(opts) + opts["config"] = config Serve.process(opts) end end diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 7ffd0a578cd..50fe9f8357e 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -74,6 +74,20 @@ def custom_opts(what) assert custom_opts(opts)[:DirectoryIndex].empty? end + should "keep config between build and serve" do + custom_options = { + "config" => %w(_config.yml _development.yml), + "serving" => true, + "watch" => false # for not having guard output when running the tests + } + allow(SafeYAML).to receive(:load_file).and_return({}) + allow(Jekyll::Commands::Build).to receive(:build).and_return("") + + expect(Jekyll::Commands::Serve).to receive(:process).with(custom_options) + @merc.execute(:serve, { "config" => %w(_config.yml _development.yml), + "watch" => false }) + end + context "verbose" do should "debug when verbose" do assert_equal custom_opts({ "verbose" => true })[:Logger].level, 5 From d5d2fd867473fe48702564932d73e58fd628a438 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Fri, 27 May 2016 13:34:45 +0300 Subject: [PATCH 0941/4996] rubocop: fix code style --- .rubocop.yml | 1 - features/step_definitions.rb | 80 ++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 84c8d1b7c09..d253804ba84 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -20,7 +20,6 @@ AllCops: - lib/jekyll/url.rb - lib/jekyll/utils.rb - lib/jekyll.rb - - features/step_definitions.rb - bin/**/* - benchmark/**/* - script/**/* diff --git a/features/step_definitions.rb b/features/step_definitions.rb index f609076d9b4..6b8c493ec6c 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -14,24 +14,24 @@ # -Given %r{^I have a blank site in "(.*)"$} do |path| - if !File.exist?(path) +Given(/^I have a blank site in "(.*)"$/) do |path| + unless File.exist?(path) then FileUtils.mkdir_p(path) end end # -Given %r{^I do not have a "(.*)" directory$} do |path| +Given(/^I do not have a "(.*)" directory$/) do |path| Paths.test_dir.join(path).directory? end # -Given %r{^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$} do |file, key, value, text| +Given(/^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$/) do |file, key, value, text| File.write(file, Jekyll::Utils.strip_heredoc(<<-DATA)) --- - #{key || 'layout'}: #{value || 'nil'} + #{key || "layout"}: #{value || "nil"} --- #{text} @@ -40,13 +40,13 @@ # -Given %r{^I have an? "(.*)" file that contains "(.*)"$} do |file, text| +Given(/^I have an? "(.*)" file that contains "(.*)"$/) do |file, text| File.write(file, text) end # -Given %r{^I have an? (.*) (layout|theme) that contains "(.*)"$} do |name, type, text| +Given(/^I have an? (.*) (layout|theme) that contains "(.*)"$/) do |name, type, text| folder = type == "layout" ? "_layouts" : "_theme" destination_file = Pathname.new(File.join(folder, "#{name}.html")) @@ -56,33 +56,33 @@ # -Given %r{^I have an? "(.*)" file with content:$} do |file, text| +Given(/^I have an? "(.*)" file with content:$/) do |file, text| File.write(file, text) end # -Given %r{^I have an? (.*) directory$} do |dir| - if !File.directory?(dir) +Given(/^I have an? (.*) directory$/) do |dir| + unless File.directory?(dir) then FileUtils.mkdir_p(dir) end end # -Given %r{^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$} do |status, direction, folder, table| +Given(/^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$/) do |status, direction, folder, table| table.hashes.each do |input_hash| title = slug(input_hash["title"]) ext = input_hash["type"] || "markdown" - filename = filename = "#{title}.#{ext}" if %w(draft page).include?(status) + filename = "#{title}.#{ext}" if %w(draft page).include?(status) before, after = location(folder, direction) dest_folder = "_drafts" if status == "draft" - dest_folder = "_posts" if status == "post" + dest_folder = "_posts" if status == "post" dest_folder = "" if status == "page" if status == "post" - parsed_date = Time.xmlschema(input_hash['date']) rescue Time.parse(input_hash['date']) - filename = "#{parsed_date.strftime('%Y-%m-%d')}-#{title}.#{ext}" + parsed_date = Time.xmlschema(input_hash["date"]) rescue Time.parse(input_hash["date"]) + filename = "#{parsed_date.strftime("%Y-%m-%d")}-#{title}.#{ext}" end path = File.join(before, dest_folder, after, filename) @@ -92,19 +92,19 @@ # -Given %r{^I have a configuration file with "(.*)" set to "(.*)"$} do |key, value| +Given(/^I have a configuration file with "(.*)" set to "(.*)"$/) do |key, value| config = if source_dir.join("_config.yml").exist? - SafeYAML.load_file(source_dir.join("_config.yml")) - else - {} - end + SafeYAML.load_file(source_dir.join("_config.yml")) + else + {} + end config[key] = YAML.load(value) File.write("_config.yml", YAML.dump(config)) end # -Given %r{^I have a configuration file with:$} do |table| +Given(/^I have a configuration file with:$/) do |table| table.hashes.each do |row| step %(I have a configuration file with "#{row["key"]}" set to "#{row["value"]}") end @@ -112,7 +112,7 @@ # -Given %r{^I have a configuration file with "([^\"]*)" set to:$} do |key, table| +Given(/^I have a configuration file with "([^\"]*)" set to:$/) do |key, table| File.open("_config.yml", "w") do |f| f.write("#{key}:\n") table.hashes.each do |row| @@ -123,20 +123,20 @@ # -Given %r{^I have fixture collections$} do +Given(/^I have fixture collections$/) do FileUtils.cp_r Paths.source_dir.join("test", "source", "_methods"), source_dir FileUtils.cp_r Paths.source_dir.join("test", "source", "_thanksgiving"), source_dir end # -Given %r{^I wait (\d+) second(s?)$} do |time, plural| +Given(/^I wait (\d+) second(s?)$/) do |time, _| sleep(time.to_f) end # -When %r{^I run jekyll(.*)$} do |args| +When(/^I run jekyll(.*)$/) do |args| run_jekyll(args) if args.include?("--verbose") || ENV["DEBUG"] $stderr.puts "\n#{jekyll_run_output}\n" @@ -145,16 +145,16 @@ # -When %r{^I run bundle(.*)$} do |args| +When(/^I run bundle(.*)$/) do |args| run_bundle(args) - if args.include?("--verbose") || ENV['DEBUG'] + if args.include?("--verbose") || ENV["DEBUG"] $stderr.puts "\n#{jekyll_run_output}\n" end end # -When %r{^I change "(.*)" to contain "(.*)"$} do |file, text| +When(/^I change "(.*)" to contain "(.*)"$/) do |file, text| File.open(file, "a") do |f| f.write(text) end @@ -162,13 +162,13 @@ # -When %r{^I delete the file "(.*)"$} do |file| +When(/^I delete the file "(.*)"$/) do |file| File.delete(file) end # -Then %r{^the (.*) directory should +(not )?exist$} do |dir, negative| +Then(/^the (.*) directory should +(not )?exist$/) do |dir, negative| if negative.nil? expect(Pathname.new(dir)).to exist else @@ -177,7 +177,7 @@ end # -Then %r{^I should (not )?see "(.*)" in "(.*)"$} do |negative, text, file| +Then(/^I should (not )?see "(.*)" in "(.*)"$/) do |negative, text, file| step %(the "#{file}" file should exist) regexp = Regexp.new(text, Regexp::MULTILINE) if negative.nil? || negative.empty? @@ -189,20 +189,20 @@ # -Then %r{^I should see exactly "(.*)" in "(.*)"$} do |text, file| +Then(/^I should see exactly "(.*)" in "(.*)"$/) do |text, file| step %(the "#{file}" file should exist) expect(file_contents(file).strip).to eq text end # -Then %r{^I should see escaped "(.*)" in "(.*)"$} do |text, file| +Then(/^I should see escaped "(.*)" in "(.*)"$/) do |text, file| step %(I should see "#{Regexp.escape(text)}" in "#{file}") end # -Then %r{^the "(.*)" file should +(not )?exist$} do |file, negative| +Then(/^the "(.*)" file should +(not )?exist$/) do |file, negative| if negative.nil? expect(Pathname.new(file)).to exist else @@ -212,19 +212,19 @@ # -Then %r{^I should see today's time in "(.*)"$} do |file| +Then(/^I should see today's time in "(.*)"$/) do |file| step %(I should see "#{seconds_agnostic_time(Time.now)}" in "#{file}") end # -Then %r{^I should see today's date in "(.*)"$} do |file| - step %(I should see "#{Date.today.to_s}" in "#{file}") +Then(/^I should see today's date in "(.*)"$/) do |file| + step %(I should see "#{Date.today}" in "#{file}") end # -Then %r{^I should (not )?see "(.*)" in the build output$} do |negative, text| +Then(/^I should (not )?see "(.*)" in the build output$/) do |negative, text| if negative.nil? || negative.empty? expect(jekyll_run_output).to match Regexp.new(text) else @@ -234,12 +234,12 @@ # -Then %r{^I should get a zero exit(?:\-| )status$} do +Then(/^I should get a zero exit(?:\-| )status$/) do step %(I should see "EXIT STATUS: 0" in the build output) end # -Then %r{^I should get a non-zero exit(?:\-| )status$} do +Then(/^I should get a non-zero exit(?:\-| )status$/) do step %(I should not see "EXIT STATUS: 0" in the build output) end From 22982ef79ea8a6c70bc64bb3c030011cc2d0b54b Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Fri, 27 May 2016 13:59:18 +0300 Subject: [PATCH 0942/4996] rubocop: fix over tabbed variable assignment --- features/step_definitions.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 6b8c493ec6c..ce42725dec2 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -93,11 +93,12 @@ # Given(/^I have a configuration file with "(.*)" set to "(.*)"$/) do |key, value| - config = if source_dir.join("_config.yml").exist? - SafeYAML.load_file(source_dir.join("_config.yml")) - else - {} - end + config = \ + if source_dir.join("_config.yml").exist? + SafeYAML.load_file(source_dir.join("_config.yml")) + else + {} + end config[key] = YAML.load(value) File.write("_config.yml", YAML.dump(config)) end From b5cec7d33569772b68d6148eb97894ac4b14ec81 Mon Sep 17 00:00:00 2001 From: Derek Gottlieb Date: Sat, 28 May 2016 13:51:13 -0500 Subject: [PATCH 0943/4996] lib/jekyll/theme.rb passing rubocop --- .rubocop.yml | 1 - lib/jekyll/theme.rb | 7 ++++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 84c8d1b7c09..2665a743c5f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -16,7 +16,6 @@ AllCops: - lib/jekyll/renderer.rb - lib/jekyll/site.rb - lib/jekyll/static_file.rb - - lib/jekyll/theme.rb - lib/jekyll/url.rb - lib/jekyll/utils.rb - lib/jekyll.rb diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index ed9cc68dd74..90536de7068 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -27,7 +27,7 @@ def sass_path def configure_sass return unless sass_path - require 'sass' + require "sass" Sass.load_paths << sass_path end @@ -38,7 +38,7 @@ def path_for(folder) return unless resolved_dir path = Jekyll.sanitized_path(root, resolved_dir) - path if Dir.exists?(path) + path if Dir.exist?(path) end def realpath_for(folder) @@ -50,7 +50,8 @@ def realpath_for(folder) def gemspec @gemspec ||= Gem::Specification.find_by_name(name) rescue Gem::LoadError - raise Jekyll::Errors::MissingDependencyException, "The #{name} theme could not be found." + raise Jekyll::Errors::MissingDependencyException, + "The #{name} theme could not be found." end end end From 5dfaa66d48b05fc4542804aece57b770389130e5 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sat, 28 May 2016 15:18:37 -0500 Subject: [PATCH 0944/4996] Failing test: markdownify a number --- test/test_filters.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/test_filters.rb b/test/test_filters.rb index a2184c371d7..66c7c55161a 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -40,6 +40,13 @@ def initialize(opts = {}) ) end + should "markdownify with a number" do + assert_equal( + "

    404

    \n", + @filter.markdownify(404) + ) + end + context "smartify filter" do should "convert quotes and typographic characters" do assert_equal( @@ -81,6 +88,13 @@ def initialize(opts = {}) assert_equal "5 > 4", @filter.smartify("5 > 4") assert_equal "This & that", @filter.smartify("This & that") end + + should "convert a number to a string" do + assert_equal( + "404", + @filter.smartify(404) + ) + end end should "sassify with simple string" do From 714c99b418b03d7b131ebbafaf5e2e580d6d377d Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sat, 28 May 2016 15:19:15 -0500 Subject: [PATCH 0945/4996] Convert input to string before markdownify or smartify --- lib/jekyll/filters.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 65fc7e41049..3c5d125d28b 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -13,7 +13,7 @@ module Filters def markdownify(input) site = @context.registers[:site] converter = site.find_converter_instance(Jekyll::Converters::Markdown) - converter.convert(input) + converter.convert(input.to_s) end # Convert quotes into smart quotes. @@ -24,7 +24,7 @@ def markdownify(input) def smartify(input) site = @context.registers[:site] converter = site.find_converter_instance(Jekyll::Converters::SmartyPants) - converter.convert(input) + converter.convert(input.to_s) end # Convert a Sass string into CSS output. From 03f7bc1a8c802e095aed58efe758bbc8b71e30ec Mon Sep 17 00:00:00 2001 From: Derek Gottlieb Date: Sat, 28 May 2016 17:15:33 -0500 Subject: [PATCH 0946/4996] lib/jekyll/url.rb passing rubocop --- .rubocop.yml | 1 - lib/jekyll/url.rb | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 2665a743c5f..8189e48e928 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -16,7 +16,6 @@ AllCops: - lib/jekyll/renderer.rb - lib/jekyll/site.rb - lib/jekyll/static_file.rb - - lib/jekyll/url.rb - lib/jekyll/utils.rb - lib/jekyll.rb - features/step_definitions.rb diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 09975e3d404..c736c0a689d 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -1,4 +1,4 @@ -require 'uri' +require "uri" # Public: Methods that generate a URL for a resource such as a Post or a Page. # @@ -67,10 +67,10 @@ def generate_url(template) def generate_url_from_hash(template) @placeholders.inject(template) do |result, token| - break result if result.index(':').nil? + break result if result.index(":").nil? if token.last.nil? - # Remove leading '/' to avoid generating urls with `//` - result.gsub(/\/:#{token.first}/, '') + # Remove leading "/" to avoid generating urls with `//` + result.gsub(%r!/:#{token.first}!, "") else result.gsub(/:#{token.first}/, self.class.escape_path(token.last)) end @@ -78,21 +78,21 @@ def generate_url_from_hash(template) end def generate_url_from_drop(template) - template.gsub(/:([a-z_]+)/.freeze) do |match| - replacement = @placeholders.public_send(match.sub(':'.freeze, ''.freeze)) + template.gsub(/:([a-z_]+)/) do |match| + replacement = @placeholders.public_send(match.sub(":".freeze, "".freeze)) if replacement.nil? - ''.freeze + "".freeze else self.class.escape_path(replacement) end - end.gsub(/\/\//.freeze, '/'.freeze) + end.gsub(%r!//!, "/".freeze) end # Returns a sanitized String URL, stripping "../../" and multiples of "/", # as well as the beginning "/" so we can enforce and ensure it. def sanitize_url(str) - "/" + str.gsub(/\/{2,}/, "/").gsub(/\.+\/|\A\/+/, "") + "/" + str.gsub(%r!/{2,}!, "/").gsub(%r!\.+\/|\A\/+!, "") end # Escapes a path to be a valid URL path segment @@ -106,7 +106,7 @@ def sanitize_url(str) # # Returns the escaped path. def self.escape_path(path) - # Because URI.escape doesn't escape '?', '[' and ']' by default, + # Because URI.escape doesn't escape "?", "[" and "]" by default, # specify unsafe string (except unreserved, sub-delims, ":", "@" and "/"). # # URI path segment is defined in RFC 3986 as follows: @@ -116,7 +116,7 @@ def self.escape_path(path) # pct-encoded = "%" HEXDIG HEXDIG # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" # / "*" / "+" / "," / ";" / "=" - URI.escape(path, /[^a-zA-Z\d\-._~!$&'()*+,;=:@\/]/).encode('utf-8') + URI.escape(path, %r{[^a-zA-Z\d\-._~!$&'()*+,;=:@\/]}).encode("utf-8") end # Unescapes a URL path segment @@ -130,7 +130,7 @@ def self.escape_path(path) # # Returns the unescaped path. def self.unescape_path(path) - URI.unescape(path.encode('utf-8')) + URI.unescape(path.encode("utf-8")) end end end From db6050768d461e3d340bb1f197a8e5716bfdf55b Mon Sep 17 00:00:00 2001 From: Derek Gottlieb Date: Sat, 28 May 2016 19:23:23 -0500 Subject: [PATCH 0947/4996] Feedback for flubbed regex and prefer File's directory check --- lib/jekyll/theme.rb | 2 +- lib/jekyll/url.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index 90536de7068..4cd2d1634c9 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -38,7 +38,7 @@ def path_for(folder) return unless resolved_dir path = Jekyll.sanitized_path(root, resolved_dir) - path if Dir.exist?(path) + path if File.directory?(path) end def realpath_for(folder) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index c736c0a689d..ba1abbd40a0 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -92,7 +92,7 @@ def generate_url_from_drop(template) # as well as the beginning "/" so we can enforce and ensure it. def sanitize_url(str) - "/" + str.gsub(%r!/{2,}!, "/").gsub(%r!\.+\/|\A\/+!, "") + "/" + str.gsub(%r!/{2,}!, "/").gsub(%r!\.+/|\A/+!, "") end # Escapes a path to be a valid URL path segment From 5acac4a9259bd25e24eaa59fec42d7f1f37fb65a Mon Sep 17 00:00:00 2001 From: Sam Dutton Date: Mon, 30 May 2016 09:20:42 +0100 Subject: [PATCH 0948/4996] Minor tweak to fix missing apostrophne --- site/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 1ff520de481..c125562dc09 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -462,7 +462,7 @@ defaults:

    -Here, we are scoping the `values` to any file that exists in the scopes path. Since the path is set as an empty string, it will apply to **all files** in your project. You probably don't want to set a layout on every file in your project - like css files, for example - so you can also specify a `type` value under the `scope` key. +Here, we are scoping the `values` to any file that exists in the path `scope`. Since the path is set as an empty string, it will apply to **all files** in your project. You probably don't want to set a layout on every file in your project - like css files, for example - so you can also specify a `type` value under the `scope` key. {% highlight yaml %} defaults: From 372f350a75459e0999d7e00c4b5a7ef49cb388dc Mon Sep 17 00:00:00 2001 From: Alex Kitchens Date: Tue, 31 May 2016 10:44:53 -0500 Subject: [PATCH 0949/4996] Remove a Broken Link for Refheap Plugin The refheap_tag repository no longer exists, and I am not able to find a duplicate repository to replace the link. --- site/_docs/plugins.md | 1 - 1 file changed, 1 deletion(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 053be71336e..18efecf4b57 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -827,7 +827,6 @@ LESS.js files during generation. - [Jekyll-citation](https://github.com/archome/jekyll-citation): Render BibTeX-formatted bibliographies/citations included in posts and pages (pure Ruby). - [Jekyll Dribbble Set Tag](https://github.com/ericdfields/Jekyll-Dribbble-Set-Tag): Builds Dribbble image galleries from any user. - [Debbugs](https://gist.github.com/2218470): Allows posting links to Debian BTS easily. -- [Refheap_tag](https://github.com/aburdette/refheap_tag): Liquid tag that allows embedding pastes from [refheap](https://www.refheap.com/). - [Jekyll-devonly_tag](https://gist.github.com/2403522): A block tag for including markup only during development. - [JekyllGalleryTag](https://github.com/redwallhp/JekyllGalleryTag) by [redwallhp](https://github.com/redwallhp): Generates thumbnails from a directory of images and displays them in a grid. - [Youku and Tudou Embed](https://gist.github.com/Yexiaoxing/5891929): Liquid plugin for embedding Youku and Tudou videos. From e97fd34479859f6c9e961700d93e57c8a4561d18 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 31 May 2016 08:50:28 -0700 Subject: [PATCH 0950/4996] Update history to reflect merge of #4971 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6e3b8b31a72..9b303995d79 100644 --- a/History.markdown +++ b/History.markdown @@ -122,6 +122,7 @@ * Removed extra `

    ` from `site/_docs/permalinks.md` (#4890) * Add pubstorm deployment instructions to docs (#4881) * Corrected pagination docs for hidden: true feature (#4903) + * Remove a Broken Link for Refheap Plugin (#4971) ## 3.1.6 / 2016-05-19 From 06cff8f781525d0e259e7297070cdd147dd525ea Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Wed, 1 Jun 2016 18:20:35 +0300 Subject: [PATCH 0951/4996] rubocop: fix code style --- .rubocop.yml | 3 +- lib/jekyll/site.rb | 135 +++++++++++++++++++++++++++++---------------- 2 files changed, 88 insertions(+), 50 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 84c8d1b7c09..a159185c8ff 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -14,7 +14,6 @@ AllCops: - lib/jekyll/frontmatter_defaults.rb - lib/jekyll/regenerator.rb - lib/jekyll/renderer.rb - - lib/jekyll/site.rb - lib/jekyll/static_file.rb - lib/jekyll/theme.rb - lib/jekyll/url.rb @@ -34,7 +33,7 @@ Lint/UselessAccessModifier: Metrics/AbcSize: Max: 20 Metrics/ClassLength: - Max: 240 + Max: 300 Exclude: - !ruby/regexp /features\/.*.rb$/ - !ruby/regexp /test\/.*.rb$/ diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index f2025c13a78..978f64a6afd 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -1,5 +1,5 @@ # encoding: UTF-8 -require 'csv' +require "csv" module Jekyll class Site @@ -18,8 +18,8 @@ class Site # config - A Hash containing site configuration details. def initialize(config) # Source and destination may not be changed after the site has been created. - @source = File.expand_path(config['source']).freeze - @dest = File.expand_path(config['destination']).freeze + @source = File.expand_path(config["source"]).freeze + @dest = File.expand_path(config["destination"]).freeze self.config = config @@ -49,19 +49,12 @@ def config=(config) self.send("#{opt}=", config[opt]) end - self.plugin_manager = Jekyll::PluginManager.new(self) - self.plugins = plugin_manager.plugins_path - - self.theme = nil - self.theme = Jekyll::Theme.new(config["theme"]) if config["theme"] - - @includes_load_paths = Array(in_source_dir(config["includes_dir"].to_s)) - @includes_load_paths << theme.includes_path if self.theme - - self.file_read_opts = {} - self.file_read_opts[:encoding] = config['encoding'] if config['encoding'] + configure_plugins + configure_theme + configure_include_paths + configure_file_read_opts - self.permalink_style = config['permalink'].to_sym + self.permalink_style = config["permalink"].to_sym @config end @@ -80,7 +73,7 @@ def process end def print_stats - if @config['profile'] + if @config["profile"] puts @liquid_renderer.stats_table end end @@ -89,7 +82,11 @@ def print_stats # # Returns nothing def reset - self.time = (config['time'] ? Utils.parse_date(config['time'].to_s, "Invalid time in _config.yml.") : Time.now) + if config["time"] + self.time = Utils.parse_date(config["time"].to_s, "Invalid time in _config.yml.") + else + self.time = Time.now + end self.layouts = {} self.pages = [] self.static_files = [] @@ -123,18 +120,23 @@ def ensure_not_in_dest dest_pathname = Pathname.new(dest) Pathname.new(source).ascend do |path| if path == dest_pathname - raise Errors::FatalException.new "Destination directory cannot be or contain the Source directory." + raise( + Errors::FatalException, + "Destination directory cannot be or contain the Source directory." + ) end end end # The list of collections and their corresponding Jekyll::Collection instances. - # If config['collections'] is set, a new instance is created for each item in the collection. - # If config['collections'] is not set, a new hash is returned. + # If config['collections'] is set, a new instance is created + # for each item in the collection, a new hash is returned otherwise. # # Returns a Hash containing collection name-to-instance pairs. def collections - @collections ||= Hash[collection_names.map { |coll| [coll, Jekyll::Collection.new(self, coll)] } ] + @collections ||= Hash[collection_names.map do |coll| + [coll, Jekyll::Collection.new(self, coll)] + end] end # The list of collection names. @@ -142,11 +144,11 @@ def collections # Returns an array of collection names from the configuration, # or an empty array if the `collections` key is not set. def collection_names - case config['collections'] + case config["collections"] when Hash - config['collections'].keys + config["collections"].keys when Array - config['collections'] + config["collections"] when nil [] else @@ -182,26 +184,15 @@ def render Jekyll::Hooks.trigger :site, :pre_render, self, payload - collections.each do |_, collection| - collection.docs.each do |document| - if regenerator.regenerate?(document) - document.output = Jekyll::Renderer.new(self, document, payload).run - document.trigger_hooks(:post_render) - end - end - end - - pages.flatten.each do |page| - if regenerator.regenerate?(page) - page.output = Jekyll::Renderer.new(self, page, payload).run - page.trigger_hooks(:post_render) - end - end + render_docs(payload) + render_pages(payload) Jekyll::Hooks.trigger :site, :post_render, self, payload + # rubocop: disable HandleExceptions rescue Errno::ENOENT # ignore missing layout dir end + # rubocop: enable HandleExceptions # Remove orphaned files and empty directories in destination. # @@ -222,7 +213,7 @@ def write end def posts - collections['posts'] ||= Collection.new(self, 'posts') + collections["posts"] ||= Collection.new(self, "posts") end # Construct a Hash of Posts indexed by the specified Post attribute. @@ -242,17 +233,19 @@ def post_attr_hash(post_attr) # Build a hash map based on the specified post attribute ( post attr => # array of posts ) then sort each array in reverse order. hash = Hash.new { |h, key| h[key] = [] } - posts.docs.each { |p| p.data[post_attr].each { |t| hash[t] << p } if p.data[post_attr] } + posts.docs.each do |p| + p.data[post_attr].each { |t| hash[t] << p } if p.data[post_attr] + end hash.values.each { |posts| posts.sort!.reverse! } hash end def tags - post_attr_hash('tags') + post_attr_hash("tags") end def categories - post_attr_hash('categories') + post_attr_hash("categories") end # Prepare site data for site payload. The method maintains backward compatibility @@ -260,7 +253,7 @@ def categories # # Returns the Hash to be hooked to site.data. def site_data - config['data'] || data + config["data"] || data end # The Hash payload containing site-wide data. @@ -306,7 +299,7 @@ def instantiate_subclasses(klass) # # Returns def relative_permalinks_are_deprecated - if config['relative_permalinks'] + if config["relative_permalinks"] Jekyll.logger.abort_with "Since v3.0, permalinks for pages" \ " in subfolders must be relative to the" \ " site source directory, not the parent" \ @@ -351,7 +344,7 @@ def frontmatter_defaults # # Returns a Boolean: true for a full rebuild, false for normal build def incremental?(override = {}) - override['incremental'] || config['incremental'] + override["incremental"] || config["incremental"] end # Returns the publisher or creates a new publisher if it doesn't @@ -399,11 +392,10 @@ def in_dest_dir(*paths) end end - private - # Limits the current posts; removes the posts which exceed the limit_posts # # Returns nothing + private def limit_posts! if limit_posts > 0 limit = posts.docs.length < limit_posts ? posts.docs.length : limit_posts @@ -415,8 +407,55 @@ def limit_posts! # already exist. # # Returns The Cleaner + private def site_cleaner @site_cleaner ||= Cleaner.new(self) end + + private + def configure_plugins + self.plugin_manager = Jekyll::PluginManager.new(self) + self.plugins = plugin_manager.plugins_path + end + + private + def configure_theme + self.theme = nil + self.theme = Jekyll::Theme.new(config["theme"]) if config["theme"] + end + + private + def configure_include_paths + @includes_load_paths = Array(in_source_dir(config["includes_dir"].to_s)) + @includes_load_paths << theme.includes_path if self.theme + end + + private + def configure_file_read_opts + self.file_read_opts = {} + self.file_read_opts[:encoding] = config["encoding"] if config["encoding"] + end + + private + def render_docs(payload) + collections.each do |_, collection| + collection.docs.each do |document| + if regenerator.regenerate?(document) + document.output = Jekyll::Renderer.new(self, document, payload).run + document.trigger_hooks(:post_render) + end + end + end + end + + private + def render_pages(payload) + pages.flatten.each do |page| + if regenerator.regenerate?(page) + page.output = Jekyll::Renderer.new(self, page, payload).run + page.trigger_hooks(:post_render) + end + end + end end end From 597e8ee5d553ec35a23d79eae392748220709520 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 2 Jun 2016 16:12:16 +0300 Subject: [PATCH 0952/4996] rubocop: fix code style --- .rubocop.yml | 1 - lib/jekyll/frontmatter_defaults.rb | 83 ++++++++++++++++-------------- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 84c8d1b7c09..b85e8b99725 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -11,7 +11,6 @@ AllCops: - lib/jekyll/deprecator.rb - lib/jekyll/document.rb - lib/jekyll/filters.rb - - lib/jekyll/frontmatter_defaults.rb - lib/jekyll/regenerator.rb - lib/jekyll/renderer.rb - lib/jekyll/site.rb diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index 22df50f2694..27dab903b07 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -11,37 +11,42 @@ def initialize(site) end def update_deprecated_types(set) - return set unless set.key?('scope') && set['scope'].key?('type') - - set['scope']['type'] = - case set['scope']['type'] - when 'page' - Deprecator.defaults_deprecate_type('page', 'pages') - 'pages' - when 'post' - Deprecator.defaults_deprecate_type('post', 'posts') - 'posts' - when 'draft' - Deprecator.defaults_deprecate_type('draft', 'drafts') - 'drafts' + return set unless set.key?("scope") && set["scope"].key?("type") + + set["scope"]["type"] = + case set["scope"]["type"] + when "page" + Deprecator.defaults_deprecate_type("page", "pages") + "pages" + when "post" + Deprecator.defaults_deprecate_type("post", "posts") + "posts" + when "draft" + Deprecator.defaults_deprecate_type("draft", "drafts") + "drafts" else - set['scope']['type'] + set["scope"]["type"] end set end def ensure_time!(set) - return set unless set.key?('values') && set['values'].key?('date') - return set if set['values']['date'].is_a?(Time) - set['values']['date'] = Utils.parse_date(set['values']['date'], "An invalid date format was found in a front-matter default set: #{set}") + return set unless set.key?("values") && set["values"].key?("date") + return set if set["values"]["date"].is_a?(Time) + set["values"]["date"] = Utils.parse_date( + set["values"]["date"], + "An invalid date format was found in a front-matter default set: #{set}" + ) set end # Finds a default value for a given setting, filtered by path and type # - # path - the path (relative to the source) of the page, post or :draft the default is used in - # type - a symbol indicating whether a :page, a :post or a :draft calls this method + # path - the path (relative to the source) of the page, + # post or :draft the default is used in + # type - a symbol indicating whether a :page, + # a :post or a :draft calls this method # # Returns the default value or nil if none was found def find(path, type, setting) @@ -49,9 +54,9 @@ def find(path, type, setting) old_scope = nil matching_sets(path, type).each do |set| - if set['values'].key?(setting) && has_precedence?(old_scope, set['scope']) - value = set['values'][setting] - old_scope = set['scope'] + if set["values"].key?(setting) && precedence?(old_scope, set["scope"]) + value = set["values"][setting] + old_scope = set["scope"] end end value @@ -67,11 +72,11 @@ def all(path, type) defaults = {} old_scope = nil matching_sets(path, type).each do |set| - if has_precedence?(old_scope, set['scope']) - defaults = Utils.deep_merge_hashes(defaults, set['values']) - old_scope = set['scope'] + if precedence?(old_scope, set["scope"]) + defaults = Utils.deep_merge_hashes(defaults, set["values"]) + old_scope = set["scope"] else - defaults = Utils.deep_merge_hashes(set['values'], defaults) + defaults = Utils.deep_merge_hashes(set["values"], defaults) end end defaults @@ -91,9 +96,9 @@ def applies?(scope, path, type) end def applies_path?(scope, path) - return true if !scope.key?('path') || scope['path'].empty? + return true if !scope.key?("path") || scope["path"].empty? - scope_path = Pathname.new(scope['path']) + scope_path = Pathname.new(scope["path"]) Pathname.new(sanitize_path(path)).ascend do |ascended_path| if ascended_path.to_s == scope_path.to_s return true @@ -113,7 +118,7 @@ def applies_path?(scope, path) # Returns true if either of the above conditions are satisfied, # otherwise returns false def applies_type?(scope, type) - !scope.key?('type') || scope['type'].eql?(type.to_s) + !scope.key?("type") || scope["type"].eql?(type.to_s) end # Checks if a given set of default values is valid @@ -122,7 +127,7 @@ def applies_type?(scope, type) # # Returns true if the set is valid and can be used in this class def valid?(set) - set.is_a?(Hash) && set['values'].is_a?(Hash) + set.is_a?(Hash) && set["values"].is_a?(Hash) end # Determines if a new scope has precedence over an old one @@ -131,18 +136,18 @@ def valid?(set) # new_scope - the new scope hash # # Returns true if the new scope has precedence over the older - def has_precedence?(old_scope, new_scope) + def precedence?(old_scope, new_scope) return true if old_scope.nil? - new_path = sanitize_path(new_scope['path']) - old_path = sanitize_path(old_scope['path']) + new_path = sanitize_path(new_scope["path"]) + old_path = sanitize_path(old_scope["path"]) if new_path.length != old_path.length new_path.length >= old_path.length - elsif new_scope.key? 'type' + elsif new_scope.key? "type" true else - !old_scope.key? 'type' + !old_scope.key? "type" end end @@ -151,7 +156,7 @@ def has_precedence?(old_scope, new_scope) # Returns an array of hashes def matching_sets(path, type) valid_sets.select do |set| - !set.key?('scope') || applies?(set['scope'], path, type) + !set.key?("scope") || applies?(set["scope"], path, type) end end @@ -162,7 +167,7 @@ def matching_sets(path, type) # # Returns an array of hashes def valid_sets - sets = @site.config['defaults'] + sets = @site.config["defaults"] return [] unless sets.is_a?(Array) sets.map do |set| @@ -170,7 +175,7 @@ def valid_sets ensure_time!(update_deprecated_types(set)) else Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:" - Jekyll.logger.warn "#{set}" + Jekyll.logger.warn set.to_s nil end end.compact @@ -181,7 +186,7 @@ def sanitize_path(path) if path.nil? || path.empty? "" else - path.gsub(/\A\//, '').gsub(/([^\/])\z/, '\1') + path.gsub(%r!\A/!, "").gsub(%r!([^/])\z!, '\1') end end end From 2bc8dc53ffbb413577464c997a3884ef91babb8b Mon Sep 17 00:00:00 2001 From: Jens Willmer Date: Thu, 2 Jun 2016 16:32:49 +0300 Subject: [PATCH 0953/4996] Added link to windows instructions --- site/_docs/github-pages.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/_docs/github-pages.md b/site/_docs/github-pages.md index cfe8822a220..e8c77aaa099 100644 --- a/site/_docs/github-pages.md +++ b/site/_docs/github-pages.md @@ -76,6 +76,8 @@ gem 'github-pages' {% endhighlight %} And be sure to run bundle update often. + + If you like to install pages-gem on Windows you can find instructions by Jens Willmer on how to install github-pages gem on Windows (x64).

    From 261bc8f467ce103246df78e2e91f7369715d2afc Mon Sep 17 00:00:00 2001 From: Jens Willmer Date: Thu, 2 Jun 2016 16:44:21 +0300 Subject: [PATCH 0954/4996] Added topic link in the URL --- site/_docs/github-pages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/github-pages.md b/site/_docs/github-pages.md index e8c77aaa099..b67d4873d1b 100644 --- a/site/_docs/github-pages.md +++ b/site/_docs/github-pages.md @@ -77,7 +77,7 @@ gem 'github-pages' And be sure to run bundle update often. - If you like to install pages-gem on Windows you can find instructions by Jens Willmer on how to install github-pages gem on Windows (x64). + If you like to install pages-gem on Windows you can find instructions by Jens Willmer on how to install github-pages gem on Windows (x64).

    From 899316f40134a69ccb2ace76495174b268cb4223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Guitton?= Date: Thu, 2 Jun 2016 18:43:57 +0200 Subject: [PATCH 0955/4996] Fix inaccurate HTTP response header field name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit § Custom WEBrick headers default settings Cf. ./lib/jekyll/commands/serve/servlet.rb --- site/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 1ff520de481..5fe13ddb1b8 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -397,7 +397,7 @@ webrick: ### Defaults -We only provide one default and that's a Content-Type header that disables +We only provide one default and that's a Cache-Control header that disables caching in development so that you don't have to fight with Chrome's aggressive caching when you are in development mode. From c642b84e8009a88bfa26236a436d5ae0255bb353 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Jun 2016 10:54:04 -0700 Subject: [PATCH 0956/4996] Update history to reflect merge of #4958 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9b303995d79..863dc76fb2d 100644 --- a/History.markdown +++ b/History.markdown @@ -80,6 +80,7 @@ * Rubocop: Site Drop (#4948) * Rubocop: tags (#4938) * Rubocop: Readers (#4932) + * markdownify and smartify should convert input to string before conversion (#4958) ### Site Enhancements From 97e196cb19cf11e0f79e7badf1345c783fae434c Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 2 Jun 2016 12:55:47 -0500 Subject: [PATCH 0957/4996] Correct placement of history entry for #4958. --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 863dc76fb2d..102853bde87 100644 --- a/History.markdown +++ b/History.markdown @@ -26,6 +26,7 @@ * Update colorator dependency to v1.x (#4855) * Move EntryFilter to use Pathutil & fix `glob_include?` (#4859) * Add 'jekyll new-theme' command to help users get up and running creating a theme (#4848) + * markdownify and smartify should convert input to string before conversion (#4958) ### Bug Fixes @@ -80,7 +81,6 @@ * Rubocop: Site Drop (#4948) * Rubocop: tags (#4938) * Rubocop: Readers (#4932) - * markdownify and smartify should convert input to string before conversion (#4958) ### Site Enhancements From e7677bdf515a61919cb7e8c11ebd1a3c205f882a Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 2 Jun 2016 21:25:50 +0300 Subject: [PATCH 0958/4996] rubocop: revert has_precedence method rename --- lib/jekyll/frontmatter_defaults.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index 27dab903b07..0614975ab00 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -54,7 +54,7 @@ def find(path, type, setting) old_scope = nil matching_sets(path, type).each do |set| - if set["values"].key?(setting) && precedence?(old_scope, set["scope"]) + if set["values"].key?(setting) && has_precedence?(old_scope, set["scope"]) value = set["values"][setting] old_scope = set["scope"] end @@ -72,7 +72,7 @@ def all(path, type) defaults = {} old_scope = nil matching_sets(path, type).each do |set| - if precedence?(old_scope, set["scope"]) + if has_precedence?(old_scope, set["scope"]) defaults = Utils.deep_merge_hashes(defaults, set["values"]) old_scope = set["scope"] else @@ -136,7 +136,8 @@ def valid?(set) # new_scope - the new scope hash # # Returns true if the new scope has precedence over the older - def precedence?(old_scope, new_scope) + # rubocop: disable PredicateName + def has_precedence?(old_scope, new_scope) return true if old_scope.nil? new_path = sanitize_path(new_scope["path"]) @@ -144,12 +145,13 @@ def precedence?(old_scope, new_scope) if new_path.length != old_path.length new_path.length >= old_path.length - elsif new_scope.key? "type" + elsif new_scope.key?("type") true else !old_scope.key? "type" end end + # rubocop: enable PredicateName # Collects a list of sets that match the given path and type # From 675c105e8551e0c86bf9f268dc4b5e12614dde62 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Jun 2016 12:06:56 -0700 Subject: [PATCH 0959/4996] Update history to reflect merge of #4974 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 102853bde87..b7252fe5006 100644 --- a/History.markdown +++ b/History.markdown @@ -81,6 +81,7 @@ * Rubocop: Site Drop (#4948) * Rubocop: tags (#4938) * Rubocop: Readers (#4932) + * rubocop: jekyll/lib/frontmatter_defaults.rb (#4974) ### Site Enhancements From c2ee828ad6cd23169ef13f279590f6e3e408cb88 Mon Sep 17 00:00:00 2001 From: Jens Willmer Date: Thu, 2 Jun 2016 22:19:40 +0300 Subject: [PATCH 0960/4996] Added link to windows doc page --- site/_docs/github-pages.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/site/_docs/github-pages.md b/site/_docs/github-pages.md index cfe8822a220..02ec1c8dba8 100644 --- a/site/_docs/github-pages.md +++ b/site/_docs/github-pages.md @@ -79,6 +79,16 @@ gem 'github-pages'

    +
    +
    Installing github-pages gem on Windows
    +

    + While Windows is not officially supported, it is possible + to install github-pages gem on Windows. + Special instructions can be found on our + Windows-specific docs page. +

    +
    + ### User and Organization Pages User and organization pages live in a special GitHub repository dedicated to From bbbbb2e7044611a62fc7ea9def275767f9a837be Mon Sep 17 00:00:00 2001 From: Jens Willmer Date: Thu, 2 Jun 2016 22:36:07 +0300 Subject: [PATCH 0961/4996] Installation instructions for github-pages gem --- site/_docs/windows.md | 71 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/site/_docs/windows.md b/site/_docs/windows.md index ec98dcdeda0..06935863b94 100644 --- a/site/_docs/windows.md +++ b/site/_docs/windows.md @@ -44,3 +44,74 @@ with Windows. Add the following to the Gemfile for your site: {% highlight ruby %} gem 'wdm', '~> 0.1.0' if Gem.win_platform? {% endhighlight %} + +### How to install github-gem + +This section is part of an article written by [Jens Willmer][jwillmerPost]. To follow the instructions you need to have [Chocolatey][] installed on your system. If you already have a version of Ruby installed you need to uninstall it before you can continue. + +#### Install Ruby and Ruby development kit + +Open a command prompt and execute the following commands: + + * `choco install ruby -version 2.2.4` + * `choco install ruby2.devkit` - _needed for compilation of json gem_ + +#### Configure Ruby development kit + +The development kit did not set the environment path for Ruby so we need to do it. + + * Open command prompt in `C:\tools\DevKit2` + * Execute `ruby dk.rb init` to create a file called `config.yml` + * Edit the `config.yml` file and include the path to Ruby `- C:/tools/ruby22` + * Execute the following command to set the path: `ruby dk.rb install` + +#### Nokogiri gem installation + +This gem is also needed in the github-gem and to get it running on Windows x64 we have to install a few things. + + +**Note:** In the current [pre release][nokogiriFails] it works out of the box with Windows x64 but this version is not referenced in the github-gem. + + +`cinst -Source "https://go.microsoft.com/fwlink/?LinkID=230477" libxml2`{:.language-ruby} + +`cinst -Source "https://go.microsoft.com/fwlink/?LinkID=230477" libxslt`{:.language-ruby} + +`cinst -Source "https://go.microsoft.com/fwlink/?LinkID=230477" libiconv`{:.language-ruby} + +```language-ruby + gem install nokogiri --^ + --with-xml2-include=C:\Chocolatey\lib\libxml2.2.7.8.7\build\native\include^ + --with-xml2-lib=C:\Chocolatey\lib\libxml2.redist.2.7.8.7\build\native\bin\v110\x64\Release\dynamic\cdecl^ + --with-iconv-include=C:\Chocolatey\lib\libiconv.1.14.0.11\build\native\include^ + --with-iconv-lib=C:\Chocolatey\lib\libiconv.redist.1.14.0.11\build\native\bin\v110\x64\Release\dynamic\cdecl^ + --with-xslt-include=C:\Chocolatey\lib\libxslt.1.1.28.0\build\native\include^ + --with-xslt-lib=C:\Chocolatey\lib\libxslt.redist.1.1.28.0\build\native\bin\v110\x64\Release\dynamic +``` + +#### Install github-gem + + * Open command prompt and install [Bundler][]: `gem install bundler` + * Create a file called `Gemfile` without any extension in your root directory of your blog + * Copy & past the two lines into the file: + + +```language-ruby +source 'http://rubygems.org' +gem 'github-pages' +``` + + * **Note:** We use an unsecure connection because SSL throws exceptions in the version of Ruby + * Open a command prompt and install github-pages: `bundle install` + + +After this process you should have github-pages installed on your system and you can host your blog again with `jekyll s`. \\ +There will be a warning on startup that you should include `gem 'wdm', '>= 0.1.0' if Gem.win_platform?` to your `Gemfile` but I could not get `jekyll s` working if I include that line so for the moment I ignore that warning. + +In the future the installation process of the github-gem should be as simple as the setup of the blog. But as long as the new version of the Nokogiri ([v1.6.8][nokogiriReleases]) is not stable and referenced, it is work to get it up and running on Windows. + +[jwillmerPost]: http://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46 "Installation instructions by Jens Willmer" +[Chocolatey]: https://chocolatey.org/install "Package manager for Windows" +[Bundler]: http://bundler.io/ "Ruby Dependencie Manager" +[nokogiriReleases]: https://github.com/sparklemotion/nokogiri/releases "Nokogiri Releases" +[nokogiriFails]: https://github.com/sparklemotion/nokogiri/issues/1456#issuecomment-206481794 "Nokogiri fails to install on Ruby 2.3 for Windows" From d68ddf9dace0a7ddb1a10ecf1059d6a6ab519da4 Mon Sep 17 00:00:00 2001 From: Jens Willmer Date: Thu, 2 Jun 2016 22:46:05 +0300 Subject: [PATCH 0962/4996] Included installation instructions --- site/_docs/windows.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/site/_docs/windows.md b/site/_docs/windows.md index 06935863b94..d3fd8254883 100644 --- a/site/_docs/windows.md +++ b/site/_docs/windows.md @@ -10,12 +10,14 @@ knowledge and lessons that have been unearthed by Windows users. ## Installation -Julian Thilo has written up instructions to get -[Jekyll running on Windows][windows-installation] and it seems to work for most -people. The instructions were written for Ruby 2.0.0, but should work for later -versions [prior to 2.2][hitimes-issue]. +A quick way to install Jekyll it to follow the [installation instructions by David Burela](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/): + + 1. Install a package manager for Windows called [Chocolatey](https://chocolatey.org/install) + 2. Install Ruby via Chocolatey: `choco install ruby -y` + 3. Reopen a command prompt and install Jekyll: `gem install jekyll` -Alternatively David Burela has written instructions on [how to install Jekyll via Chocolatey with 3 command prompt entries](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/). +For a more conventional way of installing Jekyll you can follow the [installation instruction by Julian Thilo][windows-installation]. The instructions were written for Ruby 2.0.0, but should work for later +versions [prior to 2.2][hitimes-issue]. ## Encoding From 0212c838145e153ea2cab71616eddb3c0bb8c687 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Jun 2016 12:55:15 -0700 Subject: [PATCH 0963/4996] Update history to reflect merge of #4975 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b7252fe5006..584d61a65d8 100644 --- a/History.markdown +++ b/History.markdown @@ -125,6 +125,7 @@ * Add pubstorm deployment instructions to docs (#4881) * Corrected pagination docs for hidden: true feature (#4903) * Remove a Broken Link for Refheap Plugin (#4971) + * Instructions on how to install github-gem on Windows (#4975) ## 3.1.6 / 2016-05-19 From 3a8025cb08ceb0b09c57780e0dee93cae18c199b Mon Sep 17 00:00:00 2001 From: Jens Willmer Date: Thu, 2 Jun 2016 23:33:20 +0300 Subject: [PATCH 0964/4996] Changed github-gem to github-pages The gem is technically called github-pages as noted by @parkr in the [pull request](https://github.com/jekyll/jekyll/pull/4977#discussion_r65610202) --- site/_docs/windows.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/site/_docs/windows.md b/site/_docs/windows.md index d3fd8254883..02ea233d685 100644 --- a/site/_docs/windows.md +++ b/site/_docs/windows.md @@ -47,7 +47,7 @@ with Windows. Add the following to the Gemfile for your site: gem 'wdm', '~> 0.1.0' if Gem.win_platform? {% endhighlight %} -### How to install github-gem +### How to install github-pages This section is part of an article written by [Jens Willmer][jwillmerPost]. To follow the instructions you need to have [Chocolatey][] installed on your system. If you already have a version of Ruby installed you need to uninstall it before you can continue. @@ -69,10 +69,10 @@ The development kit did not set the environment path for Ruby so we need to do i #### Nokogiri gem installation -This gem is also needed in the github-gem and to get it running on Windows x64 we have to install a few things. +This gem is also needed in the github-pages and to get it running on Windows x64 we have to install a few things. -**Note:** In the current [pre release][nokogiriFails] it works out of the box with Windows x64 but this version is not referenced in the github-gem. +**Note:** In the current [pre release][nokogiriFails] it works out of the box with Windows x64 but this version is not referenced in the github-pages. `cinst -Source "https://go.microsoft.com/fwlink/?LinkID=230477" libxml2`{:.language-ruby} @@ -91,7 +91,7 @@ This gem is also needed in the github-gem and to get it running on Windows x64 w --with-xslt-lib=C:\Chocolatey\lib\libxslt.redist.1.1.28.0\build\native\bin\v110\x64\Release\dynamic ``` -#### Install github-gem +#### Install github-pages * Open command prompt and install [Bundler][]: `gem install bundler` * Create a file called `Gemfile` without any extension in your root directory of your blog @@ -110,7 +110,7 @@ gem 'github-pages' After this process you should have github-pages installed on your system and you can host your blog again with `jekyll s`. \\ There will be a warning on startup that you should include `gem 'wdm', '>= 0.1.0' if Gem.win_platform?` to your `Gemfile` but I could not get `jekyll s` working if I include that line so for the moment I ignore that warning. -In the future the installation process of the github-gem should be as simple as the setup of the blog. But as long as the new version of the Nokogiri ([v1.6.8][nokogiriReleases]) is not stable and referenced, it is work to get it up and running on Windows. +In the future the installation process of the github-pages should be as simple as the setup of the blog. But as long as the new version of the Nokogiri ([v1.6.8][nokogiriReleases]) is not stable and referenced, it is work to get it up and running on Windows. [jwillmerPost]: http://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46 "Installation instructions by Jens Willmer" [Chocolatey]: https://chocolatey.org/install "Package manager for Windows" From d6e58623c6107e51d42b0642065a44a9913896d9 Mon Sep 17 00:00:00 2001 From: Jens Willmer Date: Fri, 3 Jun 2016 00:05:20 +0300 Subject: [PATCH 0965/4996] Fixed typo --- site/_docs/windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/windows.md b/site/_docs/windows.md index 02ea233d685..ea4c0359f58 100644 --- a/site/_docs/windows.md +++ b/site/_docs/windows.md @@ -10,7 +10,7 @@ knowledge and lessons that have been unearthed by Windows users. ## Installation -A quick way to install Jekyll it to follow the [installation instructions by David Burela](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/): +A quick way to install Jekyll is to follow the [installation instructions by David Burela](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/): 1. Install a package manager for Windows called [Chocolatey](https://chocolatey.org/install) 2. Install Ruby via Chocolatey: `choco install ruby -y` From b5cff52f024f0f50713efc1f1820f8b6bea56fa6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Jun 2016 14:20:29 -0700 Subject: [PATCH 0966/4996] Note that where_exp is only a v3.2 feature. Closes #4978. --- site/_docs/templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 1c09cab0787..c81e9f6c92e 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -91,7 +91,7 @@ common tasks easier.

    Where Expression

    -

    Select all the objects in an array where the expression is true.

    +

    Select all the objects in an array where the expression is true. Jekyll v3.2.0 & later.

    From 14b36aae388a96a54b7ac9493d9285fa0e1d90e9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 May 2016 17:29:21 -0700 Subject: [PATCH 0967/4996] Add timings for each scenario in cucumber --- features/support/formatter.rb | 39 ++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/features/support/formatter.rb b/features/support/formatter.rb index 8ce03bd10d0..b06d675fe97 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -30,6 +30,7 @@ def initialize(runtime, path_or_io, options) @options = options @exceptions = [] @indent = 0 + @timings = {} end # @@ -42,6 +43,7 @@ def before_features(_features) def after_features(features) @io.puts + print_worst_offenders print_summary(features) end @@ -54,23 +56,35 @@ def before_feature(_feature) # - def tag_name(tag_name); end - - def comment_line(comment_line); end - - def after_feature_element(feature_element); end - - def after_tags(tags); end + def feature_element_timing_key(feature_element) + "\"#{feature_element.name.to_s.sub("Scenario: ", "")}\" (#{feature_element.location})" + end # def before_feature_element(_feature_element) @indent = 2 @scenario_indent = 2 + @timings[feature_element_timing_key(feature_element)] = Time.now end # + def after_feature_element(feature_element) + @timings[feature_element_timing_key(feature_element)] = Time.now - @timings[feature_element_timing_key(feature_element)] + @io.print " (#{@timings[feature_element_timing_key(feature_element)]}s)" + end + + # + + def tag_name(tag_name); end + + def comment_line(comment_line); end + + def after_tags(tags); end + + # + def before_background(_background) @scenario_indent = 2 @in_background = true @@ -178,6 +192,17 @@ def cell_prefix(status) # + def print_worst_offenders + @io.puts + @io.puts "Worst offenders:" + @timings.sort_by { |_f, t| -t }.each do |(f, t)| + @io.puts " #{t}s for #{f}" + end + @io.puts + end + + # + def print_summary(features) @io.puts print_stats(features, @options) From 6355a07d4bcfb30cb9c2408e97fa12c1d7bb9f90 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 08:43:03 -0700 Subject: [PATCH 0968/4996] Only do top 10 worst offenders in cucumberland --- features/support/formatter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/support/formatter.rb b/features/support/formatter.rb index b06d675fe97..a075f18c1c2 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -195,7 +195,7 @@ def cell_prefix(status) def print_worst_offenders @io.puts @io.puts "Worst offenders:" - @timings.sort_by { |_f, t| -t }.each do |(f, t)| + @timings.sort_by { |_f, t| -t }.take_while { |i| i < 10 }.each do |(f, t)| @io.puts " #{t}s for #{f}" end @io.puts From 4b1012537f7b67c4e4c3a690003f5cb1f3cbfc48 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 19 May 2016 09:08:25 -0700 Subject: [PATCH 0969/4996] Use #take instead of #take_while --- features/support/formatter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/support/formatter.rb b/features/support/formatter.rb index a075f18c1c2..b216323f27b 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -195,7 +195,7 @@ def cell_prefix(status) def print_worst_offenders @io.puts @io.puts "Worst offenders:" - @timings.sort_by { |_f, t| -t }.take_while { |i| i < 10 }.each do |(f, t)| + @timings.sort_by { |_f, t| -t }.take(10).each do |(f, t)| @io.puts " #{t}s for #{f}" end @io.puts From 956495f4503d4c1f81d86c5498b9025477f16a54 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Jun 2016 16:47:14 -0700 Subject: [PATCH 0970/4996] Fix typo. --- features/support/formatter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/support/formatter.rb b/features/support/formatter.rb index b216323f27b..2223701012c 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -62,7 +62,7 @@ def feature_element_timing_key(feature_element) # - def before_feature_element(_feature_element) + def before_feature_element(feature_element) @indent = 2 @scenario_indent = 2 @timings[feature_element_timing_key(feature_element)] = Time.now From 7cd20261ab3016d4000cc73cd7ee351cdfe91450 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Jun 2016 16:59:52 -0700 Subject: [PATCH 0971/4996] Update history to reflect merge of #4953 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 584d61a65d8..d293994d7d8 100644 --- a/History.markdown +++ b/History.markdown @@ -43,6 +43,7 @@ * Example in the site template should be IANA-approved example.com (#4793) * 3.2.x/master: Fix defaults for Documents (posts/collection docs) (#4808) * Don't rescue LoadError or bundler load errors for Bundler. (#4857) + * `Serve.process` should receive same config as `Build.process` (#4953) ### Forward Ports From 52fcd6981ff3904e97419dff077d1417f8df75de Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Jun 2016 17:06:05 -0700 Subject: [PATCH 0972/4996] Update history to reflect merge of #4956 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d293994d7d8..3f63fda8262 100644 --- a/History.markdown +++ b/History.markdown @@ -83,6 +83,7 @@ * Rubocop: tags (#4938) * Rubocop: Readers (#4932) * rubocop: jekyll/lib/frontmatter_defaults.rb (#4974) + * rubocop: features/step_definitions.rb (#4956) ### Site Enhancements From 74d363f0808347f38320ddf30a114aa80f4a3a1d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Jun 2016 17:08:05 -0700 Subject: [PATCH 0973/4996] Update history to reflect merge of #4959 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3f63fda8262..15df2cd2c59 100644 --- a/History.markdown +++ b/History.markdown @@ -84,6 +84,7 @@ * Rubocop: Readers (#4932) * rubocop: jekyll/lib/frontmatter_defaults.rb (#4974) * rubocop: features/step_definitions.rb (#4956) + * Rubocop theme and url jekyll libs (#4959) ### Site Enhancements From f5a0db9dccb737d9ebd90a87e9d9a4e9a6b481f0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Jun 2016 17:08:21 -0700 Subject: [PATCH 0974/4996] Rubocop: use %r for all regular expressions. --- .rubocop.yml | 2 +- features/step_definitions.rb | 54 +++++++++---------- features/support/helpers.rb | 4 +- lib/jekyll/commands/doctor.rb | 2 +- lib/jekyll/commands/serve/servlet.rb | 4 +- lib/jekyll/converters/markdown.rb | 2 +- .../converters/markdown/kramdown_parser.rb | 2 +- .../converters/markdown/redcarpet_parser.rb | 2 +- lib/jekyll/excerpt.rb | 2 +- lib/jekyll/log_adapter.rb | 2 +- lib/jekyll/readers/data_reader.rb | 6 +-- lib/jekyll/tags/highlight.rb | 6 +-- lib/jekyll/tags/include.rb | 16 +++--- lib/jekyll/tags/post_url.rb | 2 +- lib/jekyll/theme_builder.rb | 2 +- lib/jekyll/utils/ansi.rb | 2 +- lib/jekyll/utils/platforms.rb | 4 +- test/test_convertible.rb | 10 ++-- test/test_entry_filter.rb | 2 +- test/test_liquid_renderer.rb | 4 +- test/test_new_command.rb | 6 +-- test/test_page.rb | 2 +- test/test_tags.rb | 44 +++++++-------- 23 files changed, 91 insertions(+), 91 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 982ec43c3f0..fbe07db35bc 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -121,7 +121,7 @@ Style/RedundantReturn: Style/RedundantSelf: Enabled: false Style/RegexpLiteral: - EnforcedStyle: slashes + EnforcedStyle: percent_r Style/RescueModifier: Enabled: false Style/SignalException: diff --git a/features/step_definitions.rb b/features/step_definitions.rb index ce42725dec2..731f8b7b942 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -14,7 +14,7 @@ # -Given(/^I have a blank site in "(.*)"$/) do |path| +Given(%r!^I have a blank site in "(.*)"$!) do |path| unless File.exist?(path) then FileUtils.mkdir_p(path) end @@ -22,13 +22,13 @@ # -Given(/^I do not have a "(.*)" directory$/) do |path| +Given(%r!^I do not have a "(.*)" directory$!) do |path| Paths.test_dir.join(path).directory? end # -Given(/^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$/) do |file, key, value, text| +Given(%r!^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$!) do |file, key, value, text| File.write(file, Jekyll::Utils.strip_heredoc(<<-DATA)) --- #{key || "layout"}: #{value || "nil"} @@ -40,13 +40,13 @@ # -Given(/^I have an? "(.*)" file that contains "(.*)"$/) do |file, text| +Given(%r!^I have an? "(.*)" file that contains "(.*)"$!) do |file, text| File.write(file, text) end # -Given(/^I have an? (.*) (layout|theme) that contains "(.*)"$/) do |name, type, text| +Given(%r!^I have an? (.*) (layout|theme) that contains "(.*)"$!) do |name, type, text| folder = type == "layout" ? "_layouts" : "_theme" destination_file = Pathname.new(File.join(folder, "#{name}.html")) @@ -56,13 +56,13 @@ # -Given(/^I have an? "(.*)" file with content:$/) do |file, text| +Given(%r!^I have an? "(.*)" file with content:$!) do |file, text| File.write(file, text) end # -Given(/^I have an? (.*) directory$/) do |dir| +Given(%r!^I have an? (.*) directory$!) do |dir| unless File.directory?(dir) then FileUtils.mkdir_p(dir) end @@ -70,7 +70,7 @@ # -Given(/^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$/) do |status, direction, folder, table| +Given(%r!^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$!) do |status, direction, folder, table| table.hashes.each do |input_hash| title = slug(input_hash["title"]) ext = input_hash["type"] || "markdown" @@ -92,7 +92,7 @@ # -Given(/^I have a configuration file with "(.*)" set to "(.*)"$/) do |key, value| +Given(%r!^I have a configuration file with "(.*)" set to "(.*)"$!) do |key, value| config = \ if source_dir.join("_config.yml").exist? SafeYAML.load_file(source_dir.join("_config.yml")) @@ -105,7 +105,7 @@ # -Given(/^I have a configuration file with:$/) do |table| +Given(%r!^I have a configuration file with:$!) do |table| table.hashes.each do |row| step %(I have a configuration file with "#{row["key"]}" set to "#{row["value"]}") end @@ -113,7 +113,7 @@ # -Given(/^I have a configuration file with "([^\"]*)" set to:$/) do |key, table| +Given(%r!^I have a configuration file with "([^\"]*)" set to:$!) do |key, table| File.open("_config.yml", "w") do |f| f.write("#{key}:\n") table.hashes.each do |row| @@ -124,20 +124,20 @@ # -Given(/^I have fixture collections$/) do +Given(%r!^I have fixture collections$!) do FileUtils.cp_r Paths.source_dir.join("test", "source", "_methods"), source_dir FileUtils.cp_r Paths.source_dir.join("test", "source", "_thanksgiving"), source_dir end # -Given(/^I wait (\d+) second(s?)$/) do |time, _| +Given(%r!^I wait (\d+) second(s?)$!) do |time, _| sleep(time.to_f) end # -When(/^I run jekyll(.*)$/) do |args| +When(%r!^I run jekyll(.*)$!) do |args| run_jekyll(args) if args.include?("--verbose") || ENV["DEBUG"] $stderr.puts "\n#{jekyll_run_output}\n" @@ -146,7 +146,7 @@ # -When(/^I run bundle(.*)$/) do |args| +When(%r!^I run bundle(.*)$!) do |args| run_bundle(args) if args.include?("--verbose") || ENV["DEBUG"] $stderr.puts "\n#{jekyll_run_output}\n" @@ -155,7 +155,7 @@ # -When(/^I change "(.*)" to contain "(.*)"$/) do |file, text| +When(%r!^I change "(.*)" to contain "(.*)"$!) do |file, text| File.open(file, "a") do |f| f.write(text) end @@ -163,13 +163,13 @@ # -When(/^I delete the file "(.*)"$/) do |file| +When(%r!^I delete the file "(.*)"$!) do |file| File.delete(file) end # -Then(/^the (.*) directory should +(not )?exist$/) do |dir, negative| +Then(%r!^the (.*) directory should +(not )?exist$!) do |dir, negative| if negative.nil? expect(Pathname.new(dir)).to exist else @@ -178,7 +178,7 @@ end # -Then(/^I should (not )?see "(.*)" in "(.*)"$/) do |negative, text, file| +Then(%r!^I should (not )?see "(.*)" in "(.*)"$!) do |negative, text, file| step %(the "#{file}" file should exist) regexp = Regexp.new(text, Regexp::MULTILINE) if negative.nil? || negative.empty? @@ -190,20 +190,20 @@ # -Then(/^I should see exactly "(.*)" in "(.*)"$/) do |text, file| +Then(%r!^I should see exactly "(.*)" in "(.*)"$!) do |text, file| step %(the "#{file}" file should exist) expect(file_contents(file).strip).to eq text end # -Then(/^I should see escaped "(.*)" in "(.*)"$/) do |text, file| +Then(%r!^I should see escaped "(.*)" in "(.*)"$!) do |text, file| step %(I should see "#{Regexp.escape(text)}" in "#{file}") end # -Then(/^the "(.*)" file should +(not )?exist$/) do |file, negative| +Then(%r!^the "(.*)" file should +(not )?exist$!) do |file, negative| if negative.nil? expect(Pathname.new(file)).to exist else @@ -213,19 +213,19 @@ # -Then(/^I should see today's time in "(.*)"$/) do |file| +Then(%r!^I should see today's time in "(.*)"$!) do |file| step %(I should see "#{seconds_agnostic_time(Time.now)}" in "#{file}") end # -Then(/^I should see today's date in "(.*)"$/) do |file| +Then(%r!^I should see today's date in "(.*)"$!) do |file| step %(I should see "#{Date.today}" in "#{file}") end # -Then(/^I should (not )?see "(.*)" in the build output$/) do |negative, text| +Then(%r!^I should (not )?see "(.*)" in the build output$!) do |negative, text| if negative.nil? || negative.empty? expect(jekyll_run_output).to match Regexp.new(text) else @@ -235,12 +235,12 @@ # -Then(/^I should get a zero exit(?:\-| )status$/) do +Then(%r!^I should get a zero exit(?:\-| )status$!) do step %(I should see "EXIT STATUS: 0" in the build output) end # -Then(/^I should get a non-zero exit(?:\-| )status$/) do +Then(%r!^I should get a non-zero exit(?:\-| )status$!) do step %(I should not see "EXIT STATUS: 0" in the build output) end diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 29333075324..e7381a36229 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -36,7 +36,7 @@ def file_content_from_hash(input_hash) Jekyll::Utils.strip_heredoc(<<-EOF) --- #{matter.gsub( - /\n/, "\n " + %r!\n!, "\n " )} --- #{content} @@ -121,7 +121,7 @@ def run_in_shell(*args) def slug(title = nil) if !title then Time.now.strftime("%s%9N") # nanoseconds since the Epoch - else title.downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, "-") + else title.downcase.gsub(%r![^\w]!, " ").strip.gsub(%r!\s+!, "-") end end diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 0c4f52f867e..4c750b1c5c5 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -63,7 +63,7 @@ def conflicting_urls(site) def fsnotify_buggy?(_site) return true unless Utils::Platforms.osx? if Dir.pwd != `pwd`.strip - Jekyll.logger.error " " + <<-STR.strip.gsub(/\n\s+/, "\n ") + Jekyll.logger.error " " + <<-STR.strip.gsub(%r!\n\s+!, "\n ") We have detected that there might be trouble using fsevent on your operating system, you can read https://github.com/thibaudgg/rb-fsevent/wiki/no-fsevents-fired-(OSX-bug) for possible work arounds or you can work around it immediately diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 5f258e6eda7..d0dd22af8d7 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -37,10 +37,10 @@ def do_GET(req, res) private def validate_and_ensure_charset(_req, res) - key = res.header.keys.grep(/content-type/i).first + key = res.header.keys.grep(%r!content-type!i).first typ = res.header[key] - unless typ =~ /;\s*charset=/ + unless typ =~ %r!;\s*charset=! res.header[key] = "#{typ}; charset=#{@jekyll_opts["encoding"]}" end end diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index ab886d06e98..c718d539b7c 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -93,7 +93,7 @@ def custom_processor private def custom_class_allowed?(parser_name) - parser_name !~ /[^A-Za-z0-9_]/ && self.class.constants.include?( + parser_name !~ %r![^A-Za-z0-9_]! && self.class.constants.include?( parser_name.to_sym ) end diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index 6e65d43c79f..932cf24e490 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -86,7 +86,7 @@ def highlighter private def strip_coderay_prefix(hash) hash.each_with_object({}) do |(key, val), hsh| - cleaned_key = key.gsub(/\Acoderay_/, "") + cleaned_key = key.gsub(%r!\Acoderay_!, "") if key != cleaned_key Jekyll::Deprecator.deprecation_message( diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index 8e7593856e8..b5ec99f55ce 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -3,7 +3,7 @@ module CommonMethods def add_code_tags(code, lang) code = code.to_s code = code.sub( - /

    /,
    +        %r!
    !,
             "
    "
           )
           code = code.sub(%r!
    !, "
    ") diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index 8fef70ed944..2d53307e312 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -117,7 +117,7 @@ def extract_excerpt(doc_content) if tail.empty? head else - "" << head << "\n\n" << tail.scan(/^\[[^\]]+\]:.+$/).join("\n") + "" << head << "\n\n" << tail.scan(%r!^\[[^\]]+\]:.+$!).join("\n") end end end diff --git a/lib/jekyll/log_adapter.rb b/lib/jekyll/log_adapter.rb index 8ac674514f6..70173b91b9a 100644 --- a/lib/jekyll/log_adapter.rb +++ b/lib/jekyll/log_adapter.rb @@ -98,7 +98,7 @@ def abort_with(topic, message = nil) # # Returns the formatted message def message(topic, message) - msg = formatted_topic(topic) + message.to_s.gsub(/\s+/, " ") + msg = formatted_topic(topic) + message.to_s.gsub(%r!\s+!, " ") messages << msg msg end diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index e7e46bdc346..4c6495fd697 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -62,9 +62,9 @@ def read_data_file(path) end def sanitize_filename(name) - name.gsub!(/[^\w\s-]+/, "") - name.gsub!(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2') - name.gsub(/\s+/, "_") + name.gsub!(%r![^\w\s-]+!, "") + name.gsub!(%r!(^|\b\s)\s+($|\s?\b)!, '\\1\\2') + name.gsub(%r!\s+!, "_") end end end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index af2a1e107aa..952fc9b46fd 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -8,7 +8,7 @@ class HighlightBlock < Liquid::Block # forms: name, name=value, or name="" # # is a space-separated list of numbers - SYNTAX = /^([a-zA-Z0-9.+#-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$/ + SYNTAX = %r!^([a-zA-Z0-9.+#-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$! def initialize(tag_name, markup, tokens) super @@ -29,7 +29,7 @@ def initialize(tag_name, markup, tokens) def render(context) prefix = context["highlighter_prefix"] || "" suffix = context["highlighter_suffix"] || "" - code = super.to_s.gsub(/\A(\n|\r)+|(\n|\r)+\z/, "") + code = super.to_s.gsub(%r!\A(\n|\r)+|(\n|\r)+\z!, "") is_safe = !!context.registers[:site].safe @@ -67,7 +67,7 @@ def parse_options(input) options = {} unless input.empty? # Split along 3 possible forms -- key="", key=value, or key - input.scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt| + input.scan(%r!(?:\w="[^"]*"|\w=\w|\w)+!) do |opt| key, value = opt.split("=") # If a quoted list, convert to array if value && value.include?("\"") diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index b1b02981140..674617507f2 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -12,14 +12,14 @@ def initialize(msg, path) end class IncludeTag < Liquid::Tag - VALID_SYNTAX = / + VALID_SYNTAX = %r! ([\w-]+)\s*=\s* (?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+)) - /x - VARIABLE_SYNTAX = / + !x + VARIABLE_SYNTAX = %r! (?[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+) (?.*) - /x + !x def initialize(tag_name, markup, tokens) super @@ -28,7 +28,7 @@ def initialize(tag_name, markup, tokens) @file = matched["variable"].strip @params = matched["params"].strip else - @file, @params = markup.strip.split(/\s+/, 2) + @file, @params = markup.strip.split(%r!\s+!, 2) end validate_params if @params @tag_name = tag_name @@ -46,9 +46,9 @@ def parse_params(context) markup = markup[match.end(0)..-1] value = if match[2] - match[2].gsub(/\\"/, '"') + match[2].gsub(%r!\\"!, '"') elsif match[3] - match[3].gsub(/\\'/, "'") + match[3].gsub(%r!\\'!, "'") elsif match[4] context[match[4]] end @@ -74,7 +74,7 @@ def validate_file_name(file) end def validate_params - full_valid_syntax = /\A\s*(?:#{VALID_SYNTAX}(?=\s|\z)\s*)*\z/ + full_valid_syntax = %r!\A\s*(?:#{VALID_SYNTAX}(?=\s|\z)\s*)*\z! unless @params =~ full_valid_syntax raise ArgumentError, <<-eos Invalid syntax for include tag: diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index 2154c0cd961..04c1ef2957b 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -14,7 +14,7 @@ def initialize(name) "'#{name}' does not contain valid date and/or title." end - @name_regex = /^#{path}#{date}-#{slug}\.[^.]+/ + @name_regex = %r!^#{path}#{date}-#{slug}\.[^.]+! end def post_date diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index 041faafe7bf..5f83425098e 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -6,7 +6,7 @@ class Jekyll::ThemeBuilder attr_reader :name, :path def initialize(theme_name) - @name = theme_name.to_s.tr(" ", "_").gsub(/_+/, "_") + @name = theme_name.to_s.tr(" ", "_").gsub(%r!_+!, "_") @path = Pathname.new(File.expand_path(name, Dir.pwd)) end diff --git a/lib/jekyll/utils/ansi.rb b/lib/jekyll/utils/ansi.rb index 715cb277c59..4be163c54ad 100644 --- a/lib/jekyll/utils/ansi.rb +++ b/lib/jekyll/utils/ansi.rb @@ -8,7 +8,7 @@ module Ansi extend self ESCAPE = format("%c", 27) - MATCH = /#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m/ix + MATCH = %r!#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m!ix COLORS = { :red => 31, :green => 32, diff --git a/lib/jekyll/utils/platforms.rb b/lib/jekyll/utils/platforms.rb index d431021f767..b9455936e90 100644 --- a/lib/jekyll/utils/platforms.rb +++ b/lib/jekyll/utils/platforms.rb @@ -17,8 +17,8 @@ module Platforms # platforms. This is mostly useful for `jekyll doctor` and for testing # where we kick off certain tests based on the platform. - { :windows? => /mswin|mingw|cygwin/, :linux? => /linux/, \ - :osx? => /darwin|mac os/, :unix? => /solaris|bsd/ }.each do |k, v| + { :windows? => %r!mswin|mingw|cygwin!, :linux? => %r!linux!, \ + :osx? => %r!darwin|mac os!, :unix? => %r!solaris|bsd! }.each do |k, v| define_method k do !!( RbConfig::CONFIG["host_os"] =~ v diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 4509ed36f0b..0280946f085 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -29,8 +29,8 @@ class TestConvertible < JekyllUnitTest ret = @convertible.read_yaml(@base, name) assert_equal({}, ret) end - assert_match(/YAML Exception|syntax error|Error reading file/, out) - assert_match(/#{File.join(@base, name)}/, out) + assert_match(%r!YAML Exception|syntax error|Error reading file!, out) + assert_match(%r!#{File.join(@base, name)}!, out) end should "not allow ruby objects in yaml" do @@ -46,8 +46,8 @@ class TestConvertible < JekyllUnitTest ret = @convertible.read_yaml(@base, name, :encoding => "utf-8") assert_equal({}, ret) end - assert_match(/invalid byte sequence in UTF-8/, out) - assert_match(/#{File.join(@base, name)}/, out) + assert_match(%r!invalid byte sequence in UTF-8!, out) + assert_match(%r!#{File.join(@base, name)}!, out) end should "parse the front-matter but show an error if permalink is empty" do @@ -61,7 +61,7 @@ class TestConvertible < JekyllUnitTest out = capture_stderr do @convertible.read_yaml(@base, "front_matter.erb") end - refute_match(/Invalid permalink/, out) + refute_match(%r!Invalid permalink!, out) end end end diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb index 0b1d7134a4d..eed245674a8 100644 --- a/test/test_entry_filter.rb +++ b/test/test_entry_filter.rb @@ -17,7 +17,7 @@ class TestEntryFilter < JekyllUnitTest should "allow regexp filtering" do files = %w(README.md) @site.exclude = [ - /README/ + %r!README! ] assert_empty @site.reader.filter_entries( diff --git a/test/test_liquid_renderer.rb b/test/test_liquid_renderer.rb index f6ab34d2cac..7d429c52a24 100644 --- a/test/test_liquid_renderer.rb +++ b/test/test_liquid_renderer.rb @@ -14,8 +14,8 @@ class TestLiquidRenderer < JekyllUnitTest # rubocop:disable Metrics/LineLength expected = [ - /^Filename\s+|\s+Count\s+|\s+Bytes\s+|\s+Time$/, - /^-+\++-+\++-+\++-+$/, + %r!^Filename\s+|\s+Count\s+|\s+Bytes\s+|\s+Time$!, + %r!^-+\++-+\++-+\++-+$!, %r!^_posts/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$! ] # rubocop:enable Metrics/LineLength diff --git a/test/test_new_command.rb b/test/test_new_command.rb index e020940086c..7ab638fd558 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -34,8 +34,8 @@ def site_template refute_exist @full_path capture_stdout { Jekyll::Commands::New.process(@args) } assert_exist gemfile - assert_match(/gem "jekyll", "#{Jekyll::VERSION}"/, File.read(gemfile)) - assert_match(/gem "github-pages"/, File.read(gemfile)) + assert_match(%r!gem "jekyll", "#{Jekyll::VERSION}"!, File.read(gemfile)) + assert_match(%r!gem "github-pages"!, File.read(gemfile)) end should "display a success message" do @@ -91,7 +91,7 @@ def site_template should "force created folder" do capture_stdout { Jekyll::Commands::New.process(@args) } output = capture_stdout { Jekyll::Commands::New.process(@args, "--force") } - assert_match(/New jekyll site installed in/, output) + assert_match(%r!New jekyll site installed in!, output) end end diff --git a/test/test_page.rb b/test/test_page.rb index 5b4aabebe30..9b27af7f13a 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -313,7 +313,7 @@ def do_render(page) page.write(dest_dir) assert_equal "/sitemap.xml", page.url - assert_nil page.url[/\.html$/] + assert_nil page.url[%r!\.html$!] assert File.directory?(dest_dir) assert_exist dest_dir("sitemap.xml") end diff --git a/test/test_tags.rb b/test/test_tags.rb index 736d60d649e..6b8fe8db78d 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -177,7 +177,7 @@ def highlight_block_with_opts(options_string) end should "not cause a markdown error" do - refute_match(/markdown\-html\-error/, @result) + refute_match(%r!markdown\-html\-error!, @result) end should "render markdown with pygments" do @@ -544,7 +544,7 @@ def highlight_block_with_opts(options_string) end should "not cause an error" do - refute_match(/markdown\-html\-error/, @result) + refute_match(%r!markdown\-html\-error!, @result) end should "have the url to the \"complex\" post from 2008-11-21" do @@ -573,7 +573,7 @@ def highlight_block_with_opts(options_string) end should "not cause an error" do - refute_match(/markdown\-html\-error/, @result) + refute_match(%r!markdown\-html\-error!, @result) end should "have the url to the \"complex\" post from 2008-11-21" do @@ -645,7 +645,7 @@ def highlight_block_with_opts(options_string) end should "not cause an error" do - refute_match(/markdown\-html\-error/, @result) + refute_match(%r!markdown\-html\-error!, @result) end should "have the url to the \"yaml_with_dots\" item" do @@ -672,7 +672,7 @@ def highlight_block_with_opts(options_string) end should "not cause an error" do - refute_match(/markdown\-html\-error/, @result) + refute_match(%r!markdown\-html\-error!, @result) end should "have the url to the \"sanitized_path\" item" do @@ -727,7 +727,7 @@ def highlight_block_with_opts(options_string) }) end @result ||= "" - refute_match(/SYMLINK TEST/, @result) + refute_match(%r!SYMLINK TEST!, @result) end should "not expose the existence of symlinked files" do @@ -954,15 +954,15 @@ def highlight_block_with_opts(options_string) end should "include file as variable with liquid filters" do - assert_match(/1 included/, @content) - assert_match(/2 included/, @content) - assert_match(/3 included/, @content) + assert_match(%r!1 included!, @content) + assert_match(%r!2 included!, @content) + assert_match(%r!3 included!, @content) end should "include file as variable and liquid filters with arbitrary whitespace" do - assert_match(/4 included/, @content) - assert_match(/5 included/, @content) - assert_match(/6 included/, @content) + assert_match(%r!4 included!, @content) + assert_match(%r!5 included!, @content) + assert_match(%r!6 included!, @content) end should "include file as variable and filters with additional parameters" do @@ -971,7 +971,7 @@ def highlight_block_with_opts(options_string) end should "include file as partial variable" do - assert_match(/8 included/, @content) + assert_match(%r!8 included!, @content) end end end @@ -986,15 +986,15 @@ def highlight_block_with_opts(options_string) end should "include file as variable with liquid filters" do - assert_match(/1 relative_include/, @content) - assert_match(/2 relative_include/, @content) - assert_match(/3 relative_include/, @content) + assert_match(%r!1 relative_include!, @content) + assert_match(%r!2 relative_include!, @content) + assert_match(%r!3 relative_include!, @content) end should "include file as variable and liquid filters with arbitrary whitespace" do - assert_match(/4 relative_include/, @content) - assert_match(/5 relative_include/, @content) - assert_match(/6 relative_include/, @content) + assert_match(%r!4 relative_include!, @content) + assert_match(%r!5 relative_include!, @content) + assert_match(%r!6 relative_include!, @content) end should "include file as variable and filters with additional parameters" do @@ -1003,11 +1003,11 @@ def highlight_block_with_opts(options_string) end should "include file as partial variable" do - assert_match(/8 relative_include/, @content) + assert_match(%r!8 relative_include!, @content) end should "include files relative to self" do - assert_match(/9 —\ntitle: Test Post Where YAML/, @content) + assert_match(%r!9 —\ntitle: Test Post Where YAML!, @content) end context "trying to do bad stuff" do @@ -1087,7 +1087,7 @@ def highlight_block_with_opts(options_string) }) end @result ||= "" - refute_match(/SYMLINK TEST/, @result) + refute_match(%r!SYMLINK TEST!, @result) end should "not expose the existence of symlinked files" do From d725991237b75eca7ff5bf95f5b4d25739381c8f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Jun 2016 17:12:35 -0700 Subject: [PATCH 0975/4996] Update history to reflect merge of #4962 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 15df2cd2c59..c203eb13bb1 100644 --- a/History.markdown +++ b/History.markdown @@ -129,6 +129,7 @@ * Corrected pagination docs for hidden: true feature (#4903) * Remove a Broken Link for Refheap Plugin (#4971) * Instructions on how to install github-gem on Windows (#4975) + * Minor tweak to fix missing apostrophne (#4962) ## 3.1.6 / 2016-05-19 From 6e504a0d2ea9803419c0ee16287072e8efcc1f39 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Jun 2016 18:01:55 -0700 Subject: [PATCH 0976/4996] Update history to reflect merge of #4977 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c203eb13bb1..99b5abe38fe 100644 --- a/History.markdown +++ b/History.markdown @@ -130,6 +130,7 @@ * Remove a Broken Link for Refheap Plugin (#4971) * Instructions on how to install github-gem on Windows (#4975) * Minor tweak to fix missing apostrophne (#4962) + * Instructions on how to install github-gem on Windows (v2) (#4977) ## 3.1.6 / 2016-05-19 From 712e77abd28c4c272aad8e1b604f06dd4a6be2c3 Mon Sep 17 00:00:00 2001 From: Praveen Kumar Date: Fri, 3 Jun 2016 00:28:45 +0530 Subject: [PATCH 0977/4996] lib/jekyll.rb - fix offenses reported by rubocop method set_timezone is ignored using rubocop:disable Style/AccessorMethodName --- lib/jekyll.rb | 149 +++++++++++++++++++++++++------------------------- 1 file changed, 76 insertions(+), 73 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 676f6e715ab..db1e40cd60b 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -6,79 +6,79 @@ # # Returns nothing. def require_all(path) - glob = File.join(File.dirname(__FILE__), path, '*.rb') + glob = File.join(File.dirname(__FILE__), path, "*.rb") Dir[glob].sort.each do |f| require f end end # rubygems -require 'rubygems' +require "rubygems" # stdlib require "pathutil" -require 'forwardable' -require 'fileutils' -require 'time' -require 'English' -require 'pathname' -require 'logger' -require 'set' +require "forwardable" +require "fileutils" +require "time" +require "English" +require "pathname" +require "logger" +require "set" # 3rd party -require 'safe_yaml/load' -require 'liquid' -require 'kramdown' -require 'colorator' +require "safe_yaml/load" +require "liquid" +require "kramdown" +require "colorator" SafeYAML::OPTIONS[:suppress_warnings] = true module Jekyll # internal requires - autoload :Cleaner, 'jekyll/cleaner' - autoload :Collection, 'jekyll/collection' - autoload :Configuration, 'jekyll/configuration' - autoload :Convertible, 'jekyll/convertible' - autoload :Deprecator, 'jekyll/deprecator' - autoload :Document, 'jekyll/document' - autoload :Draft, 'jekyll/draft' - autoload :EntryFilter, 'jekyll/entry_filter' - autoload :Errors, 'jekyll/errors' - autoload :Excerpt, 'jekyll/excerpt' - autoload :External, 'jekyll/external' - autoload :FrontmatterDefaults, 'jekyll/frontmatter_defaults' - autoload :Hooks, 'jekyll/hooks' - autoload :Layout, 'jekyll/layout' - autoload :CollectionReader, 'jekyll/readers/collection_reader' - autoload :DataReader, 'jekyll/readers/data_reader' - autoload :LayoutReader, 'jekyll/readers/layout_reader' - autoload :PostReader, 'jekyll/readers/post_reader' - autoload :PageReader, 'jekyll/readers/page_reader' - autoload :StaticFileReader, 'jekyll/readers/static_file_reader' - autoload :LogAdapter, 'jekyll/log_adapter' - autoload :Page, 'jekyll/page' - autoload :PluginManager, 'jekyll/plugin_manager' - autoload :Publisher, 'jekyll/publisher' - autoload :Reader, 'jekyll/reader' - 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' - autoload :Theme, 'jekyll/theme' - autoload :ThemeBuilder, 'jekyll/theme_builder' - autoload :URL, 'jekyll/url' - autoload :Utils, 'jekyll/utils' - autoload :VERSION, 'jekyll/version' + autoload :Cleaner, "jekyll/cleaner" + autoload :Collection, "jekyll/collection" + autoload :Configuration, "jekyll/configuration" + autoload :Convertible, "jekyll/convertible" + autoload :Deprecator, "jekyll/deprecator" + autoload :Document, "jekyll/document" + autoload :Draft, "jekyll/draft" + autoload :EntryFilter, "jekyll/entry_filter" + autoload :Errors, "jekyll/errors" + autoload :Excerpt, "jekyll/excerpt" + autoload :External, "jekyll/external" + autoload :FrontmatterDefaults, "jekyll/frontmatter_defaults" + autoload :Hooks, "jekyll/hooks" + autoload :Layout, "jekyll/layout" + autoload :CollectionReader, "jekyll/readers/collection_reader" + autoload :DataReader, "jekyll/readers/data_reader" + autoload :LayoutReader, "jekyll/readers/layout_reader" + autoload :PostReader, "jekyll/readers/post_reader" + autoload :PageReader, "jekyll/readers/page_reader" + autoload :StaticFileReader, "jekyll/readers/static_file_reader" + autoload :LogAdapter, "jekyll/log_adapter" + autoload :Page, "jekyll/page" + autoload :PluginManager, "jekyll/plugin_manager" + autoload :Publisher, "jekyll/publisher" + autoload :Reader, "jekyll/reader" + 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" + autoload :Theme, "jekyll/theme" + autoload :ThemeBuilder, "jekyll/theme_builder" + autoload :URL, "jekyll/url" + autoload :Utils, "jekyll/utils" + autoload :VERSION, "jekyll/version" # extensions - require 'jekyll/plugin' - require 'jekyll/converter' - require 'jekyll/generator' - require 'jekyll/command' - require 'jekyll/liquid_extensions' + require "jekyll/plugin" + require "jekyll/converter" + require "jekyll/generator" + require "jekyll/command" + require "jekyll/liquid_extensions" require "jekyll/filters" class << self @@ -94,19 +94,20 @@ def env # options with anything in _config.yml, and adding the given options on top. # # override - A Hash of config directives that override any options in both - # the defaults and the config file. See Jekyll::Configuration::DEFAULTS for a + # the defaults and the config file. + # See Jekyll::Configuration::DEFAULTS for a # list of option names and their defaults. # # Returns the final configuration Hash. - def configuration(override = Hash.new) + def configuration(override = {}) config = Configuration.new - unless override.delete('skip_config_files') + unless override.delete("skip_config_files") config = config.read_config_files(config.config_files(override)) end # Merge DEFAULTS < _config.yml < override - Configuration.from(Utils.deep_merge_hashes(config, override)).tap do |config| - set_timezone(config['timezone']) if config['timezone'] + Configuration.from(Utils.deep_merge_hashes(config, override)).tap do |obj| + set_timezone(obj["timezone"]) if obj["timezone"] end end @@ -115,9 +116,11 @@ def configuration(override = Hash.new) # timezone - the IANA Time Zone # # Returns nothing + # rubocop:disable Style/AccessorMethodName def set_timezone(timezone) - ENV['TZ'] = timezone + ENV["TZ"] = timezone end + # rubocop:enable Style/AccessorMethodName # Public: Fetch the logger instance for this Jekyll process. # @@ -154,11 +157,11 @@ def sites def sanitized_path(base_directory, questionable_path) return base_directory if base_directory.eql?(questionable_path) - questionable_path.insert(0, '/') if questionable_path.start_with?('~') + questionable_path.insert(0, "/") if questionable_path.start_with?("~") clean_path = File.expand_path(questionable_path, "/") - clean_path.sub!(/\A\w\:\//, '/') + clean_path.sub!(%r!\A\w:/!, "/") - if clean_path.start_with?(base_directory.sub(/\A\w\:\//, '/')) + if clean_path.start_with?(base_directory.sub(%r!\A\w:/!, "/")) clean_path else File.join(base_directory, clean_path) @@ -166,17 +169,17 @@ def sanitized_path(base_directory, questionable_path) end # Conditional optimizations - Jekyll::External.require_if_present('liquid-c') + Jekyll::External.require_if_present("liquid-c") end end require "jekyll/drops/drop" require "jekyll/drops/document_drop" -require_all 'jekyll/commands' -require_all 'jekyll/converters' -require_all 'jekyll/converters/markdown' -require_all 'jekyll/drops' -require_all 'jekyll/generators' -require_all 'jekyll/tags' - -require 'jekyll-sass-converter' +require_all "jekyll/commands" +require_all "jekyll/converters" +require_all "jekyll/converters/markdown" +require_all "jekyll/drops" +require_all "jekyll/generators" +require_all "jekyll/tags" + +require "jekyll-sass-converter" From 93f176f8c55ab35d5ec4f76ac0ab2e2517cc7cb2 Mon Sep 17 00:00:00 2001 From: Praveen Kumar Date: Fri, 3 Jun 2016 00:29:49 +0530 Subject: [PATCH 0978/4996] .rubocop.yml - remove lib/jekyll.rb --- .rubocop.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index 6c441f9bfb3..71a5571c0b5 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -16,7 +16,6 @@ AllCops: - lib/jekyll/site.rb - lib/jekyll/static_file.rb - lib/jekyll/utils.rb - - lib/jekyll.rb - bin/**/* - benchmark/**/* - script/**/* From 1c6916f2378e8c40e7aaff627d430294c3085ee5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Jun 2016 22:03:03 -0700 Subject: [PATCH 0979/4996] Update history to reflect merge of #4966 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 99b5abe38fe..7a07fbe595e 100644 --- a/History.markdown +++ b/History.markdown @@ -85,6 +85,7 @@ * rubocop: jekyll/lib/frontmatter_defaults.rb (#4974) * rubocop: features/step_definitions.rb (#4956) * Rubocop theme and url jekyll libs (#4959) + * Rubocop jekyll.rb (#4966) ### Site Enhancements From 59bd2587df2ccb01ed165123ae120d3737f4a40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Guitton?= Date: Fri, 3 Jun 2016 10:48:32 +0200 Subject: [PATCH 0980/4996] Amend WEBrick default headers documentation --- site/_docs/configuration.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 5fe13ddb1b8..f313656e27e 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -383,7 +383,7 @@ before your site is served.

    -## Custom WEBRick Headers +## Custom WEBrick Headers You can provide custom headers for your site by adding them to `_config.yml` @@ -397,9 +397,10 @@ webrick: ### Defaults -We only provide one default and that's a Cache-Control header that disables -caching in development so that you don't have to fight with Chrome's aggressive -caching when you are in development mode. +We provide by default `Content-Type` and `Cache-Control` response headers: one +dynamic in order to specify the nature of the data being served, the other +static in order to disable caching so that you don't have to fight with Chrome's +aggressive caching when you are in development mode. ## Specifying a Jekyll environment at build time From b15423b6a99c1855a899453ceddbcdc138b72de9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 3 Jun 2016 08:12:06 -0700 Subject: [PATCH 0981/4996] Update history to reflect merge of #4976 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7a07fbe595e..da34cf5162d 100644 --- a/History.markdown +++ b/History.markdown @@ -132,6 +132,7 @@ * Instructions on how to install github-gem on Windows (#4975) * Minor tweak to fix missing apostrophne (#4962) * Instructions on how to install github-gem on Windows (v2) (#4977) + * Fix inaccurate HTTP response header field name (#4976) ## 3.1.6 / 2016-05-19 From 912e6b469a619be6eba37061f651be62e730a080 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 3 Jun 2016 13:47:35 -0700 Subject: [PATCH 0982/4996] Add post about GSoC project. --- ...-s-google-summer-of-code-projects.markdown | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown diff --git a/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown b/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown new file mode 100644 index 00000000000..db19662c547 --- /dev/null +++ b/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown @@ -0,0 +1,19 @@ +--- +layout: news_item +title: "Jekyll's Google Summer of Code Project: The CMS You Always Wanted" +date: "2016-06-03 13:21:02 -0700" +author: parkr +categories: [community] +--- + +This year, Jekyll applied to be a part of [Google Summer of Code](https://summerofcode.withgoogle.com/how-it-works/). Students were able to propose any project related to Jekyll. With a gracious sponsorship from GitHub and the participation of myself, [@benbalter](https://github.com/benbalter) and [@jldec](https://github.com/jldec), Jekyll was able to accept two students for the 2016 season, [@mertkahyaoglu](https://github.com/mertkahyaoglu) and [@rush-skills](https://github.com/rush-skills). + +These students are working on a project that fills a huge need for the community: **a graphical solution for managing your site's content.** Current plans include a fully-integrated admin which spins up when you run `jekyll serve` and a web interface at an address like `http://localhost:4000/admin/`. The server implements a common interface which would make a hosted version to make updates to hosted content like a repository on GitHub very easy to write – simply implement the CRUD API and the web interface will happily use that instead. + +The strength of text files as the storage medium for content has been part of Jekyll's success. [Our homepage](/) lauds the absence of a traditional SQL database when using Jekyll – your content should be what demands your time, not pesky database downtime. Unfortunately, understanding of the structure of a Jekyll site takes some work, enough that for some users, it's prohibitive to using Jekyll to accomplish their publishing goals. + +Mert and Ankur both applied to take on this challenge and agreed to split the project, one taking on the web interface and the other taking on the backend. We're very excited to see a fully-functional CMS for Jekyll at the end of the summer produced by these excellent community members, and we hope you'll join us in cheering them on and sharing our gratitude for all their hard work. + +Thanks, as always, for being part of such a wonderful community that made this all possible. I'm honored to work with each of you to create something folks all around the globe find a joy to use. I look forward to our continued work to move Jekyll forward. + +As always, Happy Jekylling! From 03c2811ae01d6e6b7fefc3c70b900b0ab82b4a69 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 3 Jun 2016 14:58:51 -0700 Subject: [PATCH 0983/4996] Use jekyll-mentions and restructure --- Gemfile | 1 + site/_config.yml | 1 + ...date-on-jekyll-s-google-summer-of-code-projects.markdown | 6 ++++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 54983415f45..253826aa58f 100644 --- a/Gemfile +++ b/Gemfile @@ -86,4 +86,5 @@ group :site do gem "jekyll-sitemap" gem "jekyll-seo-tag", "~> 1.1" gem "jekyll-avatar" + gem "jekyll-mentions" end diff --git a/site/_config.yml b/site/_config.yml index e284a81bedd..0b69dc98089 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -32,3 +32,4 @@ gems: - jekyll-sitemap - jekyll-seo-tag - jekyll-avatar + - jekyll-mentions diff --git a/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown b/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown index db19662c547..f2407cb68f9 100644 --- a/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown +++ b/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown @@ -6,9 +6,11 @@ author: parkr categories: [community] --- -This year, Jekyll applied to be a part of [Google Summer of Code](https://summerofcode.withgoogle.com/how-it-works/). Students were able to propose any project related to Jekyll. With a gracious sponsorship from GitHub and the participation of myself, [@benbalter](https://github.com/benbalter) and [@jldec](https://github.com/jldec), Jekyll was able to accept two students for the 2016 season, [@mertkahyaoglu](https://github.com/mertkahyaoglu) and [@rush-skills](https://github.com/rush-skills). +This year, Jekyll applied to be a part of [Google Summer of Code](https://summerofcode.withgoogle.com/how-it-works/). Students were able to propose any project related to Jekyll. With a gracious sponsorship from GitHub and the participation of myself, @benbalter and @jldec, Jekyll was able to accept two students for the 2016 season, @mertkahyaoglu and @rush-skills. -These students are working on a project that fills a huge need for the community: **a graphical solution for managing your site's content.** Current plans include a fully-integrated admin which spins up when you run `jekyll serve` and a web interface at an address like `http://localhost:4000/admin/`. The server implements a common interface which would make a hosted version to make updates to hosted content like a repository on GitHub very easy to write – simply implement the CRUD API and the web interface will happily use that instead. +These students are working on a project that fills a huge need for the community: **a graphical solution for managing your site's content.** + +Current plans include a fully-integrated admin which spins up when you run `jekyll serve` and a web interface at an address like `http://localhost:4000/admin/`. The server implements a common interface which would make a hosted version to make updates to hosted content like a repository on GitHub very easy to write – simply implement the CRUD API and the web interface will happily use that instead. The strength of text files as the storage medium for content has been part of Jekyll's success. [Our homepage](/) lauds the absence of a traditional SQL database when using Jekyll – your content should be what demands your time, not pesky database downtime. Unfortunately, understanding of the structure of a Jekyll site takes some work, enough that for some users, it's prohibitive to using Jekyll to accomplish their publishing goals. From b3583a4236cae37f38f5d04ab8ff274335715cdf Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 3 Jun 2016 16:41:35 -0700 Subject: [PATCH 0984/4996] werdz --- ...update-on-jekyll-s-google-summer-of-code-projects.markdown | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown b/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown index f2407cb68f9..0f4ce2de4d7 100644 --- a/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown +++ b/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown @@ -8,9 +8,7 @@ categories: [community] This year, Jekyll applied to be a part of [Google Summer of Code](https://summerofcode.withgoogle.com/how-it-works/). Students were able to propose any project related to Jekyll. With a gracious sponsorship from GitHub and the participation of myself, @benbalter and @jldec, Jekyll was able to accept two students for the 2016 season, @mertkahyaoglu and @rush-skills. -These students are working on a project that fills a huge need for the community: **a graphical solution for managing your site's content.** - -Current plans include a fully-integrated admin which spins up when you run `jekyll serve` and a web interface at an address like `http://localhost:4000/admin/`. The server implements a common interface which would make a hosted version to make updates to hosted content like a repository on GitHub very easy to write – simply implement the CRUD API and the web interface will happily use that instead. +These students are working on a project that fills a huge need for the community: _a graphical solution for managing your site's content._ Current plans include a fully-integrated admin which spins up when you run jekyll serve and provides a friendly web interface for creating and editing your content. The server and web interface will speak a common HTTP interface so either piece could be switched out for, e.g. a server which writes directly to a repository on GitHub. The strength of text files as the storage medium for content has been part of Jekyll's success. [Our homepage](/) lauds the absence of a traditional SQL database when using Jekyll – your content should be what demands your time, not pesky database downtime. Unfortunately, understanding of the structure of a Jekyll site takes some work, enough that for some users, it's prohibitive to using Jekyll to accomplish their publishing goals. From ea0b43f56d29eeabb0c79327de2124ec3bdb6872 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 3 Jun 2016 16:42:37 -0700 Subject: [PATCH 0985/4996] Update history to reflect merge of #4980 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index da34cf5162d..36f579bc8b3 100644 --- a/History.markdown +++ b/History.markdown @@ -133,6 +133,7 @@ * Minor tweak to fix missing apostrophne (#4962) * Instructions on how to install github-gem on Windows (v2) (#4977) * Fix inaccurate HTTP response header field name (#4976) + * Add post about GSoC project (#4980) ## 3.1.6 / 2016-05-19 From f5a8000baae7eefd09919ee39b73fa0f2120fa73 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 3 Jun 2016 22:10:15 -0700 Subject: [PATCH 0986/4996] Fix regexp literal issues on master. --- lib/jekyll/url.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index ba1abbd40a0..440deb18f3b 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -72,13 +72,13 @@ def generate_url_from_hash(template) # Remove leading "/" to avoid generating urls with `//` result.gsub(%r!/:#{token.first}!, "") else - result.gsub(/:#{token.first}/, self.class.escape_path(token.last)) + result.gsub(%r!:#{token.first}!, self.class.escape_path(token.last)) end end end def generate_url_from_drop(template) - template.gsub(/:([a-z_]+)/) do |match| + template.gsub(%r!:([a-z_]+)!) do |match| replacement = @placeholders.public_send(match.sub(":".freeze, "".freeze)) if replacement.nil? "".freeze From 652f1bad0b88e6561d8e1db9298920dd5c78d3c3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 3 Jun 2016 22:18:39 -0700 Subject: [PATCH 0987/4996] Update history to reflect merge of #4979 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 36f579bc8b3..3afa797069c 100644 --- a/History.markdown +++ b/History.markdown @@ -86,6 +86,7 @@ * rubocop: features/step_definitions.rb (#4956) * Rubocop theme and url jekyll libs (#4959) * Rubocop jekyll.rb (#4966) + * Rubocop: use %r for all regular expressions. (#4979) ### Site Enhancements From e0f2848da6656b5b17d72e40ed234b24b05638e0 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Sat, 4 Jun 2016 12:26:21 -0400 Subject: [PATCH 0988/4996] Link to the HTML page instead of Markdown --- site/_docs/contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/contributing.md b/site/_docs/contributing.md index 4038df0d0d2..3c28953f733 100644 --- a/site/_docs/contributing.md +++ b/site/_docs/contributing.md @@ -73,7 +73,7 @@ One gotcha, all pull requests should be directed at the `master` branch (the def ### Adding plugins -If you want to add your plugin to the [list of plugins](https://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. +If you want to add your plugin to the [list of plugins](https://jekyllrb.com/docs/plugins/#available-plugins), please submit a pull request modifying the [plugins page source file](https://jekyllrb.com/docs/plugins/) by adding a link to your plugin under the proper subheading depending upon its type. ## Code Contributions From 688c7b192560c9301500fd06e43767e111fcc3bd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 4 Jun 2016 09:30:26 -0700 Subject: [PATCH 0989/4996] Update history to reflect merge of #4985 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3afa797069c..cb5463a2c40 100644 --- a/History.markdown +++ b/History.markdown @@ -135,6 +135,7 @@ * Instructions on how to install github-gem on Windows (v2) (#4977) * Fix inaccurate HTTP response header field name (#4976) * Add post about GSoC project (#4980) + * Link to the HTML page instead of Markdown (#4985) ## 3.1.6 / 2016-05-19 From 1f01c88fa05eb644a0546aff087f006429e9eb97 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 5 Jun 2016 16:02:01 -0700 Subject: [PATCH 0990/4996] templates docs: .category, .categories, and .tags only apply to posts. [ci skip] Fixes #4987. --- site/_docs/frontmatter.md | 64 +++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/site/_docs/frontmatter.md b/site/_docs/frontmatter.md index 755f0bc6044..faf67b73f43 100644 --- a/site/_docs/frontmatter.md +++ b/site/_docs/frontmatter.md @@ -96,38 +96,6 @@ front matter of a page or post.

    - - -

    category

    -

    categories

    - - -

    - - Instead of placing posts inside of folders, you can specify one or - more categories that the post belongs to. When the site is generated - the post will act as though it had been set with these categories - normally. Categories (plural key) can be specified as a YAML list or a - comma-separated string. - -

    - - - - -

    tags

    - - -

    - - Similar to categories, one or multiple tags can be added to a post. - Also like categories, tags can be specified as a YAML list or a - comma-separated string. - -

    - - @@ -176,6 +144,38 @@ These are available out-of-the-box to be used in the front matter for a post.

    + + +

    category

    +

    categories

    + + +

    + + Instead of placing posts inside of folders, you can specify one or + more categories that the post belongs to. When the site is generated + the post will act as though it had been set with these categories + normally. Categories (plural key) can be specified as a YAML list or a + comma-separated string. + +

    + + + + +

    tags

    + + +

    + + Similar to categories, one or multiple tags can be added to a post. + Also like categories, tags can be specified as a YAML list or a + comma-separated string. + +

    + + From f41bd1bab7e9d237cd39bcc12280f260bd0a3a37 Mon Sep 17 00:00:00 2001 From: DirtyF Date: Tue, 24 May 2016 23:13:26 +0200 Subject: [PATCH 0991/4996] Rubocop cleanup --- .rubocop.yml | 1 - lib/jekyll/collection.rb | 21 +++-- lib/jekyll/command.rb | 30 ++++--- lib/jekyll/configuration.rb | 161 +++++++++++++++++++----------------- lib/jekyll/deprecator.rb | 17 ++-- lib/jekyll/page.rb | 2 +- 6 files changed, 125 insertions(+), 107 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 8149e36a3f7..49170d63bf1 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -8,7 +8,6 @@ AllCops: - lib/jekyll/command.rb - lib/jekyll/configuration.rb - lib/jekyll/convertible.rb - - lib/jekyll/deprecator.rb - lib/jekyll/document.rb - lib/jekyll/filters.rb - lib/jekyll/regenerator.rb diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index ff605b87063..6ec72703332 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -32,7 +32,8 @@ def respond_to?(method, include_private = false) # Override of method_missing to check in @data for the key. def method_missing(method, *args, &blck) if docs.respond_to?(method.to_sym) - Jekyll.logger.warn "Deprecation:", "#{label}.#{method} should be changed to #{label}.docs.#{method}." + Jekyll.logger.warn "Deprecation:", "#{label}.#{method} should be changed to" \ + "#{label}.docs.#{method}." Jekyll.logger.warn "", "Called by #{caller.first}." docs.public_send(method.to_sym, *args, &blck) else @@ -64,8 +65,10 @@ def read Jekyll.logger.debug "Skipped From Publishing:", doc.relative_path end else - relative_dir = Jekyll.sanitized_path(relative_directory, File.dirname(file_path)).chomp("/.") - files << StaticFile.new(site, site.source, relative_dir, File.basename(full_path), self) + relative_dir = Jekyll.sanitized_path(relative_directory, + File.dirname(file_path)).chomp("/.") + files << StaticFile.new(site, site.source, relative_dir, + File.basename(full_path), self) end end docs.sort! @@ -79,7 +82,7 @@ def entries return [] unless exists? @entries ||= Utils.safe_glob(collection_dir, ["**", "*"]).map do |entry| - entry["#{collection_dir}/"] = '' + entry["#{collection_dir}/"] = "" entry end end @@ -161,7 +164,7 @@ def inspect # # Returns a sanitized version of the label. def sanitize_label(label) - label.gsub(/[^a-z0-9_\-\.]/i, '') + label.gsub(/[^a-z0-9_\-\.]/i, "") end # Produce a representation of this Collection for use in Liquid. @@ -179,14 +182,14 @@ def to_liquid # # Returns true if the 'write' metadata is true, false otherwise. def write? - !!metadata.fetch('output', false) + !!metadata.fetch("output", false) end # The URL template to render collection's documents at. # # Returns the URL template to render collection's documents at. def url_template - @url_template ||= metadata.fetch('permalink') do + @url_template ||= metadata.fetch("permalink") do Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) end end @@ -195,8 +198,8 @@ def url_template # # Returns the metadata for this collection def extract_metadata - if site.config['collections'].is_a?(Hash) - site.config['collections'][label] || {} + if site.config["collections"].is_a?(Hash) + site.config["collections"][label] || {} else {} end diff --git a/lib/jekyll/command.rb b/lib/jekyll/command.rb index afe72a5b44f..eaf8ef44a81 100644 --- a/lib/jekyll/command.rb +++ b/lib/jekyll/command.rb @@ -46,19 +46,23 @@ def configuration_from_options(options) # # Returns nothing def add_build_options(c) - c.option 'config', '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file' - c.option 'destination', '-d', '--destination DESTINATION', 'The current folder will be generated into DESTINATION' - c.option 'source', '-s', '--source SOURCE', 'Custom source directory' - c.option 'future', '--future', 'Publishes posts with a future date' - c.option 'limit_posts', '--limit_posts MAX_POSTS', Integer, 'Limits the number of posts to parse and publish' - c.option 'watch', '-w', '--[no-]watch', 'Watch for changes and rebuild' - c.option 'force_polling', '--force_polling', 'Force watch to use polling' - c.option 'lsi', '--lsi', 'Use LSI for improved related posts' - c.option 'show_drafts', '-D', '--drafts', 'Render posts in the _drafts folder' - c.option 'unpublished', '--unpublished', 'Render posts that were marked as unpublished' - c.option 'quiet', '-q', '--quiet', 'Silence output.' - c.option 'verbose', '-V', '--verbose', 'Print verbose output.' - c.option 'incremental', '-I', '--incremental', 'Enable incremental rebuild.' + c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", + Array, "Custom configuration file" + c.option "destination", "-d", "--destination DESTINATION", + "The current folder will be generated into DESTINATION" + c.option "source", "-s", "--source SOURCE", "Custom source directory" + c.option "future", "--future", "Publishes posts with a future date" + c.option "limit_posts", "--limit_posts MAX_POSTS", Integer, + "Limits the number of posts to parse and publish" + c.option "watch", "-w", "--[no-]watch", "Watch for changes and rebuild" + c.option "force_polling", "--force_polling", "Force watch to use polling" + c.option "lsi", "--lsi", "Use LSI for improved related posts" + c.option "show_drafts", "-D", "--drafts", "Render posts in the _drafts folder" + c.option "unpublished", "--unpublished", + "Render posts that were marked as unpublished" + c.option "quiet", "-q", "--quiet", "Silence output." + c.option "verbose", "-V", "--verbose", "Print verbose output." + c.option "incremental", "-I", "--incremental", "Enable incremental rebuild." end end end diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index a88272cc393..80e36478811 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -6,71 +6,71 @@ class Configuration < Hash # Strings rather than symbols are used for compatibility with YAML. DEFAULTS = Configuration[{ # Where things are - 'source' => Dir.pwd, - 'destination' => File.join(Dir.pwd, '_site'), - 'plugins_dir' => '_plugins', - 'layouts_dir' => '_layouts', - 'data_dir' => '_data', - 'includes_dir' => '_includes', - 'collections' => {}, + "source" => Dir.pwd, + "destination" => File.join(Dir.pwd, "_site"), + "plugins_dir" => "_plugins", + "layouts_dir" => "_layouts", + "data_dir" => "_data", + "includes_dir" => "_includes", + "collections" => {}, # Handling Reading - 'safe' => false, - 'include' => ['.htaccess'], - 'exclude' => [], - 'keep_files' => ['.git', '.svn'], - 'encoding' => 'utf-8', - 'markdown_ext' => 'markdown,mkdown,mkdn,mkd,md', + "safe" => false, + "include" => [".htaccess"], + "exclude" => [], + "keep_files" => [".git", ".svn"], + "encoding" => "utf-8", + "markdown_ext" => "markdown,mkdown,mkdn,mkd,md", # Filtering Content - 'show_drafts' => nil, - 'limit_posts' => 0, - 'future' => false, - 'unpublished' => false, + "show_drafts" => nil, + "limit_posts" => 0, + "future" => false, + "unpublished" => false, # Plugins - 'whitelist' => [], - 'gems' => [], + "whitelist" => [], + "gems" => [], # Conversion - 'markdown' => 'kramdown', - 'highlighter' => 'rouge', - 'lsi' => false, - 'excerpt_separator' => "\n\n", - 'incremental' => false, + "markdown" => "kramdown", + "highlighter" => "rouge", + "lsi" => false, + "excerpt_separator" => "\n\n", + "incremental" => false, # Serving - 'detach' => false, # default to not detaching the server - 'port' => '4000', - 'host' => '127.0.0.1', - 'baseurl' => '', - 'show_dir_listing' => false, + "detach" => false, # default to not detaching the server + "port" => "4000", + "host" => "127.0.0.1", + "baseurl" => "", + "show_dir_listing" => false, # Output Configuration - 'permalink' => 'date', - 'paginate_path' => '/page:num', - 'timezone' => nil, # use the local timezone + "permalink" => "date", + "paginate_path" => "/page:num", + "timezone" => nil, # use the local timezone - 'quiet' => false, - 'verbose' => false, - 'defaults' => [], + "quiet" => false, + "verbose" => false, + "defaults" => [], - 'rdiscount' => { - 'extensions' => [] + "rdiscount" => { + "extensions" => [] }, - 'redcarpet' => { - 'extensions' => [] + "redcarpet" => { + "extensions" => [] }, - 'kramdown' => { - 'auto_ids' => true, - 'toc_levels' => '1..6', - 'entity_output' => 'as_char', - 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo', - 'input' => "GFM", - 'hard_wrap' => false, - 'footnote_nr' => 1 + "kramdown" => { + "auto_ids" => true, + "toc_levels" => "1..6", + "entity_output" => "as_char", + "smart_quotes" => "lsquo,rsquo,ldquo,rdquo", + "input" => "GFM", + "hard_wrap" => false, + "footnote_nr" => 1 } }.map { |k, v| [k, v.freeze] }].freeze @@ -108,28 +108,29 @@ def get_config_value_with_override(config_key, override) # # Returns the path to the Jekyll source directory def source(override) - get_config_value_with_override('source', override) + get_config_value_with_override("source", override) end def quiet(override = {}) - get_config_value_with_override('quiet', override) + get_config_value_with_override("quiet", override) end alias_method :quiet?, :quiet def verbose(override = {}) - get_config_value_with_override('verbose', override) + get_config_value_with_override("verbose", override) end alias_method :verbose?, :verbose def safe_load_file(filename) case File.extname(filename) when /\.toml/i - Jekyll::External.require_with_graceful_fail('toml') unless defined?(TOML) + Jekyll::External.require_with_graceful_fail("toml") unless defined?(TOML) TOML.load_file(filename) when /\.ya?ml/i SafeYAML.load_file(filename) || {} else - raise ArgumentError, "No parser for '#{filename}' is available. Use a .toml or .y(a)ml file instead." + raise ArgumentError, "No parser for '#{filename}' is available. + Use a .toml or .y(a)ml file instead." end end @@ -140,12 +141,15 @@ def safe_load_file(filename) # Returns an Array of config files def config_files(override) # Adjust verbosity quickly - Jekyll.logger.adjust_verbosity(:quiet => quiet?(override), :verbose => verbose?(override)) + Jekyll.logger.adjust_verbosity( + :quiet => quiet?(override), + :verbose => verbose?(override) + ) # Get configuration from /_config.yml or / - config_files = override.delete('config') + config_files = override.delete("config") if config_files.to_s.empty? - default = %w(yml yaml).find(-> { 'yml' }) do |ext| + default = %w(yml yaml).find(-> { "yml" }) do |ext| File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}")) end config_files = Jekyll.sanitized_path(source(override), "_config.#{default}") @@ -170,7 +174,8 @@ def read_config_file(file) Jekyll.logger.warn "Configuration file:", "none" {} else - Jekyll.logger.error "Fatal:", "The configuration file '#{file}' could not be found." + Jekyll.logger.error "Fatal:", "The configuration file '#{file}' + could not be found." raise LoadError, "The Configuration file '#{file}' could not be found." end end @@ -193,7 +198,7 @@ def read_config_files(files) rescue ArgumentError => err Jekyll.logger.warn "WARNING:", "Error reading configuration. " \ "Using defaults (and options)." - $stderr.puts "#{err}" + $stderr.puts err end configuration.fix_common_issues.backwards_compatibilize.add_default_collections @@ -215,34 +220,34 @@ def csv_to_array(csv) def backwards_compatibilize config = clone # Provide backwards-compatibility - if config.key?('auto') || config.key?('watch') + if config.key?("auto") || config.key?("watch") Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" \ - " be set from your configuration file(s). Use the"\ + " be set from your configuration file(s). Use the" \ " --[no-]watch/-w command-line option instead." - config.delete('auto') - config.delete('watch') + config.delete("auto") + config.delete("watch") end - if config.key? 'server' + if config.key?("server") Jekyll::Deprecator.deprecation_message "The 'server' configuration option" \ " is no longer accepted. Use the 'jekyll serve'" \ " subcommand to serve your site with WEBrick." - config.delete('server') + config.delete("server") end - renamed_key 'server_port', 'port', config - renamed_key 'plugins', 'plugins_dir', config - renamed_key 'layouts', 'layouts_dir', config - renamed_key 'data_source', 'data_dir', config + renamed_key "server_port", "port", config + renamed_key "plugins", "plugins_dir", config + renamed_key "layouts", "layouts_dir", config + renamed_key "data_source", "data_dir", config - if config.key? 'pygments' + if config.key?("pygments") Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" \ " has been renamed to 'highlighter'. Please update your" \ " config file accordingly. The allowed values are 'rouge', " \ "'pygments' or null." - config['highlighter'] = 'pygments' if config['pygments'] - config.delete('pygments') + config["highlighter"] = "pygments" if config["pygments"] + config.delete("pygments") end %w(include exclude).each do |option| @@ -256,13 +261,13 @@ def backwards_compatibilize config[option].map!(&:to_s) if config[option] end - if (config['kramdown'] || {}).key?('use_coderay') + if (config["kramdown"] || {}).key?("use_coderay") Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" \ " to 'enable_coderay' in your configuration file." - config['kramdown']['use_coderay'] = config['kramdown'].delete('enable_coderay') + config["kramdown"]["use_coderay"] = config["kramdown"].delete("enable_coderay") end - if config.fetch('markdown', 'kramdown').to_s.downcase.eql?("maruku") + if config.fetch("markdown", "kramdown").to_s.casecmp("maruku") == 0 Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " \ "Markdown processor, which has been removed as of 3.0.0. " \ "We recommend you switch to Kramdown. To do this, replace " \ @@ -276,10 +281,12 @@ def backwards_compatibilize def fix_common_issues config = clone - if config.key?('paginate') && (!config['paginate'].is_a?(Integer) || config['paginate'] < 1) - Jekyll.logger.warn "Config Warning:", "The `paginate` key must be a" \ - " positive integer or nil. It's currently set to '#{config['paginate'].inspect}'." - config['paginate'] = nil + if config.key?("paginate") && (!config["paginate"].is_a?(Integer) || + config["paginate"] < 1) + + Jekyll.logger.warn "Config Warning:", "The `paginate` key must be a positive" \ + " integer or nil. It's currently set to '#{config["paginate"].inspect}'." + config["paginate"] = nil end config diff --git a/lib/jekyll/deprecator.rb b/lib/jekyll/deprecator.rb index 21449400b28..5fa0c0ac8ba 100644 --- a/lib/jekyll/deprecator.rb +++ b/lib/jekyll/deprecator.rb @@ -9,20 +9,24 @@ def process(args) 'serve' subcommand." arg_is_present? args, "--no-server", "To build Jekyll without launching a server, \ use the 'build' subcommand." - arg_is_present? args, "--auto", "The switch '--auto' has been replaced with '--watch'." + arg_is_present? args, "--auto", "The switch '--auto' has been replaced with \ + '--watch'." arg_is_present? args, "--no-auto", "To disable auto-replication, simply leave off \ the '--watch' switch." arg_is_present? args, "--pygments", "The 'pygments'settings has been removed in \ favour of 'highlighter'." - arg_is_present? args, "--paginate", "The 'paginate' setting can only be set in your \ + arg_is_present? args, "--paginate", "The 'paginate' setting can only be set in \ + your config files." + arg_is_present? args, "--url", "The 'url' setting can only be set in your \ config files." - arg_is_present? args, "--url", "The 'url' setting can only be set in your config files." no_subcommand(args) end def no_subcommand(args) - if args.size > 0 && args.first =~ /^--/ && !%w(--help --version).include?(args.first) - deprecation_message "Jekyll now uses subcommands instead of just switches. Run `jekyll help` to find out more." + unless args.empty? || + args.first !~ %r(!/^--/!) || %w(--help --version).include?(args.first) + deprecation_message "Jekyll now uses subcommands instead of just switches. \ + Run `jekyll help` to find out more." abort end end @@ -39,7 +43,8 @@ def deprecation_message(message) def defaults_deprecate_type(old, current) Jekyll.logger.warn "Defaults:", "The '#{old}' type has become '#{current}'." - Jekyll.logger.warn "Defaults:", "Please update your front-matter defaults to use 'type: #{current}'." + Jekyll.logger.warn "Defaults:", "Please update your front-matter defaults to use \ + 'type: #{current}'." end end diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index aa773ebfb7d..4e3efe3f719 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -23,7 +23,7 @@ class Page # A set of extensions that are considered HTML or HTML-like so we # should not alter them, this includes .xhtml through XHTM5. - HTML_EXTENSIONS = %W( + HTML_EXTENSIONS = %w( .html .xhtml .htm From 915b80b6b3a81ae66ac4d38c33a0a88c8d3d2a89 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 6 Jun 2016 07:53:34 -0700 Subject: [PATCH 0992/4996] Update history to reflect merge of #4940 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cb5463a2c40..2cc166f5c1c 100644 --- a/History.markdown +++ b/History.markdown @@ -87,6 +87,7 @@ * Rubocop theme and url jekyll libs (#4959) * Rubocop jekyll.rb (#4966) * Rubocop: use %r for all regular expressions. (#4979) + * Cleanup and make misc files compliant with Rubocop. (#4940) ### Site Enhancements From 43fe09a07bcb5a4cc0cd89dfc09d4ec3bef8770d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 6 Jun 2016 08:03:37 -0700 Subject: [PATCH 0993/4996] Update history to reflect merge of #4973 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2cc166f5c1c..9c17b2f4a2b 100644 --- a/History.markdown +++ b/History.markdown @@ -88,6 +88,7 @@ * Rubocop jekyll.rb (#4966) * Rubocop: use %r for all regular expressions. (#4979) * Cleanup and make misc files compliant with Rubocop. (#4940) + * Rubocop: jekyll/lib/site.rb (#4973) ### Site Enhancements From 732ca468fa051eea57bf1bf6842ef9aa118f9fd5 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Mon, 6 Jun 2016 11:16:32 -0400 Subject: [PATCH 0994/4996] Update normalize.css to v4.0.0. --- site/_sass/_normalize.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/_sass/_normalize.scss b/site/_sass/_normalize.scss index ba2f36c169f..995e0354e25 100644 --- a/site/_sass/_normalize.scss +++ b/site/_sass/_normalize.scss @@ -1 +1,2 @@ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} \ No newline at end of file +/*! normalize.css v4.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}template,[hidden]{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:0.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/*# sourceMappingURL=_normalize.scss.map */ From 2f95517bfd0bcf007676ec234f5d8c77038b9b28 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 6 Jun 2016 09:59:05 -0700 Subject: [PATCH 0995/4996] Update history to reflect merge of #4989 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9c17b2f4a2b..af4f78145bd 100644 --- a/History.markdown +++ b/History.markdown @@ -138,6 +138,7 @@ * Fix inaccurate HTTP response header field name (#4976) * Add post about GSoC project (#4980) * Link to the HTML page instead of Markdown (#4985) + * Update normalize.css to v4.0.0. (#4989) ## 3.1.6 / 2016-05-19 From 5f2bb5d0aaadb270de3b9edd600d9629ce8ef766 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Tue, 7 Jun 2016 12:07:54 +0300 Subject: [PATCH 0996/4996] rubocop: fix code style --- .rubocop.yml | 1 - lib/jekyll/filters.rb | 77 +++++++++++++++++++++++++------------------ 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 8fcb37d30c7..ac0ce379021 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -9,7 +9,6 @@ AllCops: - lib/jekyll/configuration.rb - lib/jekyll/convertible.rb - lib/jekyll/document.rb - - lib/jekyll/filters.rb - lib/jekyll/regenerator.rb - lib/jekyll/renderer.rb - lib/jekyll/static_file.rb diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 3c5d125d28b..a63cf35da38 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -1,7 +1,7 @@ -require 'uri' -require 'json' -require 'date' -require 'liquid' +require "uri" +require "json" +require "date" +require "liquid" module Jekyll module Filters @@ -56,7 +56,7 @@ def scssify(input) # # Returns the given filename or title as a lowercase URL String. # See Utils.slugify for more detail. - def slugify(input, mode=nil) + def slugify(input, mode = nil) Utils.slugify(input, :mode => mode) end @@ -118,7 +118,7 @@ def date_to_rfc822(date) # # Returns the escaped String. def xml_escape(input) - input.to_s.encode(:xml => :attr).gsub(/\A"|"\Z/, "") + input.to_s.encode(:xml => :attr).gsub(%r!\A"|"\Z!, "") end # CGI escape a string for use in a URL. Replaces any special characters @@ -133,7 +133,7 @@ def xml_escape(input) # # Returns the escaped String. def cgi_escape(input) - CGI::escape(input) + CGI.escape(input) end # URI escape a string. @@ -180,7 +180,7 @@ def array_to_sentence_string(array) when 2 "#{array[0]} #{connector} #{array[1]}" else - "#{array[0...-1].join(', ')}, #{connector} #{array[-1]}" + "#{array[0...-1].join(", ")}, #{connector} #{array[-1]}" end end @@ -203,11 +203,14 @@ def jsonify(input) # "items" => [...] } # all the items where `property` == "larry" def group_by(input, property) if groupable?(input) - input.group_by do |item| - item_property(item, property).to_s - end.inject([]) do |memo, i| - memo << { "name" => i.first, "items" => i.last, "size" => i.last.size } - end + input.group_by { |item| item_property(item, property).to_s } + .each_with_object([]) do |item, array| + array << { + "name" => item.first, + "items" => item.last, + "size" => item.last.size + } + end else input end @@ -223,7 +226,9 @@ def group_by(input, property) def where(input, property, value) return input unless input.is_a?(Enumerable) input = input.values if input.is_a?(Hash) - input.select { |object| Array(item_property(object, property)).map(&:to_s).include?(value.to_s) } + input.select do |object| + Array(item_property(object, property)).map(&:to_s).include?(value.to_s) + end end # Filters an array of objects against an expression @@ -255,33 +260,21 @@ def where_exp(input, variable, expression) # Returns the filtered array of objects def sort(input, property = nil, nils = "first") if input.nil? - raise ArgumentError.new("Cannot sort a null object.") + raise ArgumentError, "Cannot sort a null object." end if property.nil? input.sort else - case - when nils == "first" + if nils == "first" order = - 1 - when nils == "last" + elsif nils == "last" order = + 1 else - raise ArgumentError.new("Invalid nils order: " \ - "'#{nils}' is not a valid nils order. It must be 'first' or 'last'.") + raise ArgumentError, "Invalid nils order: " \ + "'#{nils}' is not a valid nils order. It must be 'first' or 'last'." end - input.sort do |apple, orange| - apple_property = item_property(apple, property) - orange_property = item_property(orange, property) - - if !apple_property.nil? && orange_property.nil? - - order - elsif apple_property.nil? && !orange_property.nil? - + order - else - apple_property <=> orange_property - end - end + sort_input(input, property, order) end end @@ -332,6 +325,22 @@ def inspect(input) xml_escape(input.inspect) end + private + def sort_input(input, property, order) + input.sort do |apple, orange| + apple_property = item_property(apple, property) + orange_property = item_property(orange, property) + + if !apple_property.nil? && orange_property.nil? + - order + elsif apple_property.nil? && !orange_property.nil? + + order + else + apple_property <=> orange_property + end + end + end + private def time(input) case input @@ -349,10 +358,12 @@ def time(input) end.localtime end + private def groupable?(element) element.respond_to?(:group_by) end + private def item_property(item, property) if item.respond_to?(:to_liquid) item.to_liquid[property.to_s] @@ -363,6 +374,7 @@ def item_property(item, property) end end + private def as_liquid(item) case item when Hash @@ -386,6 +398,7 @@ def as_liquid(item) end # Parse a string to a Liquid Condition + private def parse_condition(exp) parser = Liquid::Parser.new(exp) left_expr = parser.expression From dfc7d617655cb8243a061eccc721d0c807615fea Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 8 Jun 2016 23:18:16 -0500 Subject: [PATCH 0997/4996] Mac OS -> MacOS --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 5265bea4826..0f722c23468 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -20,7 +20,7 @@ --- -- [ ] I am on (or have tested on) ***Mac OS*** 10+ +- [ ] I am on (or have tested on) ***MacOS*** 10+ - [ ] I am on (or have tested on) ***Debian/Ubuntu*** GNU/Linux - [ ] I am on (or have tested on) ***Fedora*** GNU/Linux - [ ] I am on (or have tested on) ***Arch*** GNU/Linux From 6fd734f6ea900ea434b5e0bcb0bee4347d422982 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Sun, 12 Jun 2016 15:14:37 +0800 Subject: [PATCH 0998/4996] Add jekyll-tags-list-plugin --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 18efecf4b57..2dc2d2ba1d2 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -860,6 +860,7 @@ LESS.js files during generation. - [Jekyll Video Embed](https://github.com/eug/jekyll-video-embed): It provides several tags to easily embed videos (e.g. Youtube, Vimeo, UStream and Ted Talks) - [jekyll-i18n_tags](https://github.com/KrzysiekJ/jekyll-i18n_tags): Translate your templates. - [Jekyll Ideal Image Slider](https://github.com/xHN35RQ/jekyll-ideal-image-slider): Liquid tag plugin to create image sliders using [Ideal Image Slider](https://github.com/gilbitron/Ideal-Image-Slider). +- [Jekyll Tags List Plugin](https://github.com/crispgm/jekyll-tags-list-plugin): A Liquid tag plugin that creates tags list in specific order. #### Collections From e6dc78b22f710ef54b11d287fbb12b08c1bbf821 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 13 Jun 2016 13:08:48 -0700 Subject: [PATCH 0999/4996] Run Site#generate for 'jekyll doctor' to catch plugin issues. --- lib/jekyll/commands/doctor.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 4c750b1c5c5..c7f387df7bb 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -19,7 +19,9 @@ def init_with_program(prog) def process(options) site = Jekyll::Site.new(configuration_from_options(options)) + site.reset site.read + site.generate if healthy?(site) Jekyll.logger.info "Your test results", "are in. Everything looks fine." From 8b1c3bbf33cd88b03d5fe06dfaf03076f1bed2ae Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 13 Jun 2016 13:17:54 -0700 Subject: [PATCH 1000/4996] Update history to reflect merge of #5005 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index af4f78145bd..1e9bab9fe9f 100644 --- a/History.markdown +++ b/History.markdown @@ -27,6 +27,7 @@ * Move EntryFilter to use Pathutil & fix `glob_include?` (#4859) * Add 'jekyll new-theme' command to help users get up and running creating a theme (#4848) * markdownify and smartify should convert input to string before conversion (#4958) + * Run Site#generate for 'jekyll doctor' to catch plugin issues (#5005) ### Bug Fixes From 176b347737102cda8460f7c2f6942f60497a95fd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 13 Jun 2016 14:14:30 -0700 Subject: [PATCH 1001/4996] Update history to reflect merge of #5000 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1e9bab9fe9f..e815640d3cc 100644 --- a/History.markdown +++ b/History.markdown @@ -140,6 +140,7 @@ * Add post about GSoC project (#4980) * Link to the HTML page instead of Markdown (#4985) * Update normalize.css to v4.0.0. (#4989) + * Add jekyll-tags-list-plugin to list of third-party plugins (#5000) ## 3.1.6 / 2016-05-19 From c2441ffbb4b94148049baa0d35b495299d41b118 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 13 Jun 2016 14:23:41 -0700 Subject: [PATCH 1002/4996] Update history to reflect merge of #4908 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e815640d3cc..8f7465c663f 100644 --- a/History.markdown +++ b/History.markdown @@ -90,6 +90,7 @@ * Rubocop: use %r for all regular expressions. (#4979) * Cleanup and make misc files compliant with Rubocop. (#4940) * Rubocop: jekyll/lib/site.rb (#4973) + * Add timings for each scenario in cucumber & print worst offenders (#4908) ### Site Enhancements From 959f19c086ac1ec8ee71d4aa0d4560e67f9dbd2e Mon Sep 17 00:00:00 2001 From: Jamie Bilinski Date: Mon, 13 Jun 2016 14:24:50 -0700 Subject: [PATCH 1003/4996] Command needs to be called from blog path --- site/_docs/windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/windows.md b/site/_docs/windows.md index ea4c0359f58..6c668ba5884 100644 --- a/site/_docs/windows.md +++ b/site/_docs/windows.md @@ -104,7 +104,7 @@ gem 'github-pages' ``` * **Note:** We use an unsecure connection because SSL throws exceptions in the version of Ruby - * Open a command prompt and install github-pages: `bundle install` + * Open a command prompt, target your local blog repository root, and install github-pages: `bundle install` After this process you should have github-pages installed on your system and you can host your blog again with `jekyll s`. \\ From b5466196eaa37b6e76c3611c0cf3fc1b3a300f03 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 13 Jun 2016 14:38:45 -0700 Subject: [PATCH 1004/4996] Update history to reflect merge of #5006 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8f7465c663f..ff69985294c 100644 --- a/History.markdown +++ b/History.markdown @@ -142,6 +142,7 @@ * Link to the HTML page instead of Markdown (#4985) * Update normalize.css to v4.0.0. (#4989) * Add jekyll-tags-list-plugin to list of third-party plugins (#5000) + * Windows docs: Command needs to be called from blog path (#5006) ## 3.1.6 / 2016-05-19 From 3fe9e92c4f3e3bbf2a3dba437e98d08e360a7f50 Mon Sep 17 00:00:00 2001 From: Nathan Hazout Date: Tue, 14 Jun 2016 13:07:26 +0300 Subject: [PATCH 1005/4996] Prevent reset of page to fix #4414 --- lib/jekyll/renderer.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index f9eb94beceb..87f327d6c67 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -141,7 +141,6 @@ def place_in_layouts(content, payload, info) while layout payload['content'] = output - payload['page'] = document.to_liquid payload['layout'] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) output = render_liquid( From 6c279b173f9272e242014313d3915ab680fa3db1 Mon Sep 17 00:00:00 2001 From: Rares Vernica Date: Tue, 14 Jun 2016 09:45:51 -0700 Subject: [PATCH 1006/4996] Update text to be consitent with example --- site/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 9e828d1d082..aaf829514f8 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -497,7 +497,7 @@ defaults: author: "Mr. Hyde" {% endhighlight %} -With these defaults, all posts would use the `my-site` layout. Any html files that exist in the `projects/` folder will use the `project` layout, if it exists. Those files will also have the `page.author` [liquid variable](../variables/) set to `Mr. Hyde` as well as have the category for the page set to `project`. +With these defaults, all posts would use the `my-site` layout. Any html files that exist in the `projects/` folder will use the `project` layout, if it exists. Those files will also have the `page.author` [liquid variable](../variables/) set to `Mr. Hyde`. {% highlight yaml %} collections: From 15477d2417f334463c1646c216f4b14808caefba Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 14 Jun 2016 09:55:36 -0700 Subject: [PATCH 1007/4996] Update history to reflect merge of #5010 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ff69985294c..059a70623cd 100644 --- a/History.markdown +++ b/History.markdown @@ -143,6 +143,7 @@ * Update normalize.css to v4.0.0. (#4989) * Add jekyll-tags-list-plugin to list of third-party plugins (#5000) * Windows docs: Command needs to be called from blog path (#5006) + * Update text to be consitent with example (#5010) ## 3.1.6 / 2016-05-19 From c96fc1166c47991b5b297f0768aff3ba1917b7ed Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 14 Jun 2016 10:25:50 -0700 Subject: [PATCH 1008/4996] Spike out some internal documentation for Jekyll processes. --- docs/avoiding-burnout.md | 3 ++ docs/becoming-a-maintainer.md | 3 ++ docs/merging-a-pull-request.md | 52 ++++++++++++++++++++++++++++++++ docs/readme.md | 12 ++++++++ docs/reviewing-a-pull-request.md | 4 +++ docs/triaging-an-issue.md | 9 ++++++ 6 files changed, 83 insertions(+) create mode 100644 docs/avoiding-burnout.md create mode 100644 docs/becoming-a-maintainer.md create mode 100644 docs/merging-a-pull-request.md create mode 100644 docs/readme.md create mode 100644 docs/reviewing-a-pull-request.md create mode 100644 docs/triaging-an-issue.md diff --git a/docs/avoiding-burnout.md b/docs/avoiding-burnout.md new file mode 100644 index 00000000000..488fbb013cc --- /dev/null +++ b/docs/avoiding-burnout.md @@ -0,0 +1,3 @@ +# Maintainers: Avoiding Burnout + +**This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/becoming-a-maintainer.md b/docs/becoming-a-maintainer.md new file mode 100644 index 00000000000..2926344c86c --- /dev/null +++ b/docs/becoming-a-maintainer.md @@ -0,0 +1,3 @@ +# Contributors: Becoming a Maintainer + +**This guide is for contributors.** These special people have contributed to one or more of Jekyll's repositories, but do not yet have write access to any. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/merging-a-pull-request.md b/docs/merging-a-pull-request.md new file mode 100644 index 00000000000..ff1f102ed98 --- /dev/null +++ b/docs/merging-a-pull-request.md @@ -0,0 +1,52 @@ +# Maintainers: Merging a Pull Request + +**This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. + +## Code Review + +All pull requests should be subject to code review. Code review is a [foundational value](https://blog.fullstory.com/what-we-learned-from-google-code-reviews-arent-just-for-catching-bugs-b125a13aa292) of good engineering teams. Besides providing validation of correctness, it promotes a sense of community and gives other maintainers understanding of all parts of the code base. In short, code review is crucial to a healthy open source project. + +Before merging a pull request **that changes code**, ensure that code is thoroughly reviewed and has received a thorough review from at least two maintainers. + +Before merging a pull request **that changes the documentation**, ensure there aren't any errors and that at least one other maintainer has agreed on the changes. + +## Merging + +We have [a helpful little bot](https://github.com/jekyllbot) which we use to merge pull requests. We don't use the GitHub.com interface for two reasons: + +1. You can't modify anything on mobile (e.g. titles, labels) +2. Provide a consistent paper trail in the `History.markdown` file for each release + +To merge a pull request, leave a comment thanking the contributor, then add the special merge request: + +```text +Thank you very much for your contribution. Folks like you make this project and community strong. :heart: + +@jekyllbot: merge +dev +``` + +The merge request is made up of three things: + +1. `@jekyllbot:` – this is the prefix our bot looks for when processing commands +2. `merge` – the command +3. `+dev` – the category to which the changes belong + +The categories match the H3's in the history/changelog file, and they are: + +1. Major Enhancements (`+major`) – major updates or breaking changes to the code which necessitate a major version bump (v3 ~> v4) +2. Minor Enhancements (`+minor`) – minor updates (feature, enhancement) which necessitate a minor version bump (v3.1 ~> v3.2) +3. Bug Fixes (`+bug`) – corrections to code which do not change or add functionality, which necessitate a patch version bump (v3.1.0 ~> v3.1.1) +4. Site Enhancements (`+site`) – changes to the source of https://jekyllrb.com, found in `site/` +5. Development Fixes (`+dev`) – changes which do not affect user-facing functionality or documentation, such as test fixes or bumping internal dependencies + +Once @jekyllbot has merged the pull request, you should see three things: + +1. A successful merge +2. Addition of labels for the necessary category if they aren't already applied +3. A commit to the `History.markdown` file which adds a note about the change + +If you forget the category, that's just fine. You can always go back and move the line to the proper category header later. The category is always necessary for `jekyll/jekyll`, but many plugins have too few changes to necessitate changelog categories. + +## Rejoice + +You did it! Thanks for being a maintainer for one of our official Jekyll projects. Your work means the world to our thousands of users who rely on Jekyll daily. :heart: diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 00000000000..abf4290113a --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,12 @@ +# Maintaining Jekyll + +Hello! This is where we document various processes for maintaining Jekyll. Being a maintainer for any Jekyll project is a big responsibility, so we put together some helpful documentation for various tasks you might do as a maintainer. + +1. [Triaging and issue](triaging-an-issue.md) +2. [Reviewing a pull request](reviewing-a-pull-request.md) +3. [Merging a pull request](merging-a-pull-request.md) +4. [Avoiding burnout](avoiding-burnout.md) + +Interested in becoming a maintainer? Here is some documentation for **contributors**: + +1. [Becoming a maintainer](becoming-a-maintainer.md) diff --git a/docs/reviewing-a-pull-request.md b/docs/reviewing-a-pull-request.md new file mode 100644 index 00000000000..35ac769e5e4 --- /dev/null +++ b/docs/reviewing-a-pull-request.md @@ -0,0 +1,4 @@ +# Maintainers: Reviewing a Pull Request + +**This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. + diff --git a/docs/triaging-an-issue.md b/docs/triaging-an-issue.md new file mode 100644 index 00000000000..75dbe4d13af --- /dev/null +++ b/docs/triaging-an-issue.md @@ -0,0 +1,9 @@ +# Maintainers: Triaging an Issue + +**This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. + +Here are some key things to remember when evaluating an issue. + +## Reproducible? + +If the bug has clear reproduction steps, take a minute to try them. From 902ff4c1320908a3a4d79458e2b81b2e69ab25bd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 14 Jun 2016 11:23:58 -0700 Subject: [PATCH 1009/4996] Update history to reflect merge of #4993 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 059a70623cd..4bc06fc67cd 100644 --- a/History.markdown +++ b/History.markdown @@ -91,6 +91,7 @@ * Cleanup and make misc files compliant with Rubocop. (#4940) * Rubocop: jekyll/lib/site.rb (#4973) * Add timings for each scenario in cucumber & print worst offenders (#4908) + * rubocop: jekyll/lib/filters.rb (#4993) ### Site Enhancements From ad94182b4914c6ee887ff6049b54d8b24f2c0b7b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 14 Jun 2016 11:43:12 -0700 Subject: [PATCH 1010/4996] Add .gitignore to theme template. --- lib/jekyll/theme_builder.rb | 1 + lib/theme_template/gitignore.erb | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 lib/theme_template/gitignore.erb diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index 649df0efeee..ca7dff69ba6 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -82,6 +82,7 @@ def create_example_site def initialize_git_repo Jekyll.logger.info "initialize", path.join(".git").to_s Dir.chdir(path.to_s) { `git init` } + write_file(".gitignore", template("gitignore")) end def user_name diff --git a/lib/theme_template/gitignore.erb b/lib/theme_template/gitignore.erb new file mode 100644 index 00000000000..3eab3fcb036 --- /dev/null +++ b/lib/theme_template/gitignore.erb @@ -0,0 +1,3 @@ +.sass-cache +_site +Gemfile.lock From ce1c1488989be5101ca61ba44c3da4933ec82d17 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 14 Jun 2016 11:46:10 -0700 Subject: [PATCH 1011/4996] Rename the jekyll_pessimistic_version theme template method to be more descriptive --- lib/jekyll/theme_builder.rb | 2 +- lib/theme_template/theme.gemspec.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index ca7dff69ba6..f5b60bdabb2 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -104,7 +104,7 @@ def initialize(theme_builder) @theme_builder = theme_builder end - def jekyll_pessimistic_version + def jekyll_version_with_minor Jekyll::VERSION.split(".").take(2).join(".") end diff --git a/lib/theme_template/theme.gemspec.erb b/lib/theme_template/theme.gemspec.erb index 0bd7c365732..1c3b7ee462f 100644 --- a/lib/theme_template/theme.gemspec.erb +++ b/lib/theme_template/theme.gemspec.erb @@ -16,7 +16,7 @@ Gem::Specification.new do |spec| spec.bindir = "exe" spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } - spec.add_development_dependency "jekyll", "~> <%= jekyll_pessimistic_version %>" + spec.add_development_dependency "jekyll", "~> <%= jekyll_version_with_minor %>" spec.add_development_dependency "bundler", "~> 1.12" spec.add_development_dependency "rake", "~> 10.0" end From e72bfdab215e7587468f8595a2b3f46b765b7776 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 14 Jun 2016 11:51:01 -0700 Subject: [PATCH 1012/4996] theme template: link to the example post instead of just quoting it. --- lib/theme_template/example/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/theme_template/example/index.html b/lib/theme_template/example/index.html index 858e5a11c23..d3187773878 100644 --- a/lib/theme_template/example/index.html +++ b/lib/theme_template/example/index.html @@ -5,7 +5,7 @@ Lorem ipsum dolor sit amet, quo id prima corrumpit pertinacia, id ius dolor dolores, an veri pertinax explicari mea. Agam solum et qui, his id ludus graeco adipiscing. Duis theophrastus nam in, at his vidisse atomorum. Tantas gloriatur scripserit ne eos. Est wisi tempor habemus at, ei graeco dissentiet eos. Ne usu aliquip sanctus conceptam, te vis ignota animal, modus latine contentiones ius te. {% for post in site.posts %} -

    {{ post.title }}

    +

    {{ post.title }}

    {{ post.excerpt }}
    {% endfor %} From 73f70e9071d63e789c5a33f338b72b51286db9d3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 14 Jun 2016 11:51:26 -0700 Subject: [PATCH 1013/4996] Add .bundle to gitignore for the theme --- lib/theme_template/gitignore.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/theme_template/gitignore.erb b/lib/theme_template/gitignore.erb index 3eab3fcb036..64eb653f051 100644 --- a/lib/theme_template/gitignore.erb +++ b/lib/theme_template/gitignore.erb @@ -1,3 +1,4 @@ +.bundle .sass-cache _site Gemfile.lock From e85e89bbff55d0823e8fb9579a7ebc48c8360197 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 14 Jun 2016 11:54:01 -0700 Subject: [PATCH 1014/4996] Ensure the minima theme is shipped with a new site. --- lib/jekyll/commands/new.rb | 3 +++ lib/site_template/_config.yml | 1 + 2 files changed, 4 insertions(+) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 2658383c1c6..9c3d06eb8c1 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -72,6 +72,9 @@ def gemfile_contents # Happy Jekylling! gem "jekyll", "#{Jekyll::VERSION}" +# This is the default theme for new Jekyll sites. You may change this to anything you like. +gem "minima" + # If you want to use GitHub Pages, remove the "gem "jekyll"" above and # uncomment the line below. To upgrade, run `bundle update github-pages`. # gem "github-pages", group: :jekyll_plugins diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index adbffacd2d5..9bed54e4b23 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -4,6 +4,7 @@ # which you are expected to set up once and rarely edit after that. If you find # yourself editing these this file very often, consider using Jekyll's data files # feature for the data you need to update frequently. +# # For technical reasons, this file is *NOT* reloaded automatically when you use # 'jekyll serve'. If you change this file, please restart the server process. From 8d65ce675a79d982b03db4a8f91ea2cbe6db0dc0 Mon Sep 17 00:00:00 2001 From: Adam Hollett Date: Tue, 14 Jun 2016 15:21:24 -0400 Subject: [PATCH 1015/4996] Update links to point to core Liquid site --- site/_docs/templates.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index c81e9f6c92e..89bee3c11a4 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -4,9 +4,9 @@ title: Templates permalink: /docs/templates/ --- -Jekyll uses the [Liquid](https://github.com/Shopify/liquid/wiki) templating language to -process templates. All of the standard Liquid [tags](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers#tags) and -[filters](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers#standard-filters) are +Jekyll uses the [Liquid](https://shopify.github.io/liquid/) templating language to +process templates. All of the standard Liquid [tags](https://shopify.github.io/liquid/tags/) and +[filters](https://shopify.github.io/liquid/filters/) are supported. Jekyll even adds a few handy filters and tags of its own to make common tasks easier. From 492cfcd962834df6a4d5cd36d21a2f5ede1fb6a2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 14 Jun 2016 14:02:05 -0700 Subject: [PATCH 1016/4996] Update history to reflect merge of #5012 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4bc06fc67cd..ae90517d0ef 100644 --- a/History.markdown +++ b/History.markdown @@ -145,6 +145,7 @@ * Add jekyll-tags-list-plugin to list of third-party plugins (#5000) * Windows docs: Command needs to be called from blog path (#5006) * Update text to be consitent with example (#5010) + * Update template links to point to core Liquid site (#5012) ## 3.1.6 / 2016-05-19 From 8d748ce45f11c9ed4d21868a2c33c7e42fb0e67b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 14 Jun 2016 14:03:06 -0700 Subject: [PATCH 1017/4996] Update history to reflect merge of #4917 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ae90517d0ef..37b96ac803e 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,7 @@ * Add 'jekyll new-theme' command to help users get up and running creating a theme (#4848) * markdownify and smartify should convert input to string before conversion (#4958) * Run Site#generate for 'jekyll doctor' to catch plugin issues (#5005) + * Add normalize_whitepace filter (#4917) ### Bug Fixes From d1f4d874be4d822ba9c68491bb26a8b7cc3df93d Mon Sep 17 00:00:00 2001 From: Nathan Hazout Date: Wed, 15 Jun 2016 11:21:02 +0300 Subject: [PATCH 1018/4996] Added a scenario for #4414 --- features/hooks.feature | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/features/hooks.feature b/features/hooks.feature index 48b2884e37a..075f632ae97 100644 --- a/features/hooks.feature +++ b/features/hooks.feature @@ -333,3 +333,28 @@ Feature: Hooks Then I should get a zero exit status And the _site directory should exist And I should see "Wrote document 0" in "_site/document-build.log" + + Scenario: Set a custom payload['page'] property + Given I have a _plugins directory + And I have a "_plugins/ext.rb" file with content: + """ + Jekyll::Hooks.register :pages, :pre_render do |page, payload| + payload['page']['foo'] = "hello world" + end + """ + And I have a _layouts directory + And I have a "_layouts/custom.html" file with content: + """ + --- + --- + {{ content }} {% include foo.html %} + """ + And I have a _includes directory + And I have a "_includes/foo.html" file with content: + """ + {{page.foo}} + """ + And I have an "index.html" page with layout "custom" that contains "page content" + When I run jekyll build + Then the "_site/index.html" file should exist + And I should see "page content\n hello world" in "_site/index.html" From 4a2b96293b85898d7e6b6b8bbccfb4badd44c10c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 15 Jun 2016 10:04:37 -0700 Subject: [PATCH 1019/4996] Update history to reflect merge of #5009 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 37b96ac803e..dfd86789529 100644 --- a/History.markdown +++ b/History.markdown @@ -46,6 +46,7 @@ * 3.2.x/master: Fix defaults for Documents (posts/collection docs) (#4808) * Don't rescue LoadError or bundler load errors for Bundler. (#4857) * `Serve.process` should receive same config as `Build.process` (#4953) + * Prevent reset of page in Liquid payload right before rendering layouts (#5009) ### Forward Ports From ddf833505c539abcae56fb2fb0340d18cff346b2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 10:33:30 -0700 Subject: [PATCH 1020/4996] Fix offense. --- lib/jekyll/filters.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index fd9cc79fdc1..231eb7b6a87 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -156,7 +156,7 @@ def uri_escape(input) # # Returns the formatted String def normalize_whitespace(input) - input.to_s.gsub(/\s+/, " ").strip + input.to_s.gsub(%r!\s+!, " ").strip end # Count the number of words in the input string. From 5e343f620a0dfbd7026570402a8529e0b206962d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 11:11:22 -0700 Subject: [PATCH 1021/4996] Move bin/jekyll to exe/jekyll to prevent collision with binstubs --- .gitignore | 1 + {bin => exe}/jekyll | 0 jekyll.gemspec | 5 +++-- 3 files changed, 4 insertions(+), 2 deletions(-) rename {bin => exe}/jekyll (100%) diff --git a/.gitignore b/.gitignore index 1d62ecc3876..c2960b077fe 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ /vendor Gemfile.lock _site/ +bin/ bbin/ coverage gh-pages/ diff --git a/bin/jekyll b/exe/jekyll similarity index 100% rename from bin/jekyll rename to exe/jekyll diff --git a/jekyll.gemspec b/jekyll.gemspec index 3f32f0a96d3..b506ffa30c3 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -21,8 +21,9 @@ Gem::Specification.new do |s| s.homepage = 'https://github.com/jekyll/jekyll' all_files = `git ls-files -z`.split("\x0") - s.files = all_files.grep(%r{^(bin|lib)/|^.rubocop.yml$}) - s.executables = all_files.grep(%r{^bin/}) { |f| File.basename(f) } + s.files = all_files.grep(%r{^(exe|lib)/|^.rubocop.yml$}) + s.executables = all_files.grep(%r{^exe/}) { |f| File.basename(f) } + s.bindir = "exe" s.require_paths = ['lib'] s.rdoc_options = ['--charset=UTF-8'] From 6cf6da04af6c561a3571726afa03b9aa081e70d0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 12:12:44 -0700 Subject: [PATCH 1022/4996] features: change jekyll bin path to use exe/jekyll --- features/support/helpers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/support/helpers.rb b/features/support/helpers.rb index e7381a36229..3a85a3b0115 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -12,7 +12,7 @@ def self.output_file; test_dir.join("jekyll_output.txt"); end def self.status_file; test_dir.join("jekyll_status.txt"); end - def self.jekyll_bin; source_dir.join("bin", "jekyll"); end + def self.jekyll_bin; source_dir.join("exe", "jekyll"); end def self.source_dir; SOURCE_DIR; end end From 3a1ac37ed10df3f7f3763cb43bf3359eecb44490 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 12:26:01 -0700 Subject: [PATCH 1023/4996] Exclude exe/jekyll from rubocop for now. --- .rubocop.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.rubocop.yml b/.rubocop.yml index ac0ce379021..431b08fffa7 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,6 +4,7 @@ AllCops: Include: - lib/**/*.rb Exclude: + - exe/jekyll - lib/jekyll/collection.rb - lib/jekyll/command.rb - lib/jekyll/configuration.rb From 499b83236c0289471118991bd5fe743effe9b348 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 15 Jun 2016 12:42:08 -0700 Subject: [PATCH 1024/4996] Update history to reflect merge of #5014 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index dfd86789529..acabb83dd26 100644 --- a/History.markdown +++ b/History.markdown @@ -29,6 +29,7 @@ * markdownify and smartify should convert input to string before conversion (#4958) * Run Site#generate for 'jekyll doctor' to catch plugin issues (#5005) * Add normalize_whitepace filter (#4917) + * Move bin/jekyll to exe/jekyll to prevent collision with binstubs (#5014) ### Bug Fixes From 2c3e044688f313c0f7cb266f039627cdf5680af4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 12:44:03 -0700 Subject: [PATCH 1025/4996] Demonstrate failures on Travis of JRuby and ruby-head. From 52d32a643ee9505ab01176adb100b0836bf89653 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 12:45:40 -0700 Subject: [PATCH 1026/4996] Now remove JRuby and ruby-head from matrix. --- .travis.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6b24b213938..13c17f90550 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,14 +9,8 @@ rvm: - &ruby1 2.3.0 - &ruby2 2.2.4 - &ruby3 2.1.8 - - &jruby jruby-9.0.5.0 - - &rhead ruby-head matrix: - fast_finish: true - allow_failures: - - rvm: *jruby - - rvm: *rhead include: - rvm: 2.3.0 env: TEST_SUITE=fmt From 1dbcf97bef44497986f7e81aaa3e437a5f21600e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 12:50:54 -0700 Subject: [PATCH 1027/4996] Fix rubocop offense. --- lib/jekyll/theme_builder.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index f5b60bdabb2..1ff22e6a2c5 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -55,7 +55,7 @@ def write_file(filename, contents) def create_directories mkdir_p(SCAFFOLD_DIRECTORIES) - mkdir_p(%w{example example/_posts}) + mkdir_p(%w(example example/_posts)) end def create_gemspec From a9666bf1c777aad0eab89b0b039f3ea46a486942 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Wed, 15 Jun 2016 14:54:09 -0500 Subject: [PATCH 1028/4996] It's official. It's macOS not "MacOS" or "Mac OS" anymore. --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 0f722c23468..2e070d476d7 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -20,7 +20,7 @@ --- -- [ ] I am on (or have tested on) ***MacOS*** 10+ +- [ ] I am on (or have tested on) ***macOS*** 10+ - [ ] I am on (or have tested on) ***Debian/Ubuntu*** GNU/Linux - [ ] I am on (or have tested on) ***Fedora*** GNU/Linux - [ ] I am on (or have tested on) ***Arch*** GNU/Linux From 0c6162fc0a9badd4df8df9c743fca9050b124e30 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 13:11:16 -0700 Subject: [PATCH 1029/4996] Borrow 97% of Homebrew's excellent 'Avoiding Burnout' document. Many, many thanks to Mike McQuaid for writing it: https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Maintainers-Avoiding-Burnout.md#3-prioritise-maintainers-over-users --- docs/avoiding-burnout.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/avoiding-burnout.md b/docs/avoiding-burnout.md index 488fbb013cc..4e8b2e0b116 100644 --- a/docs/avoiding-burnout.md +++ b/docs/avoiding-burnout.md @@ -1,3 +1,27 @@ # Maintainers: Avoiding Burnout **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. + +# 1. Use Homebrew + +Maintainers of Homebrew should be using it regularly. This is partly because you won't be a good maintainer unless you can put yourself in the shoes of our users but also because you may decide to stop using Jekyll and at that point you should also decide not to be a maintainer and find other things to work on. + +# 2. No Guilt About Leaving + +All maintainers can stop working on Jekyll at any time without any guilt or explanation (like a job). We may still ask for your help with questions after you leave but you are under no obligation to answer them. Like a job, if you create a big mess and then leave you still have no obligations but we may think less of you (or, realistically, probably just revert the problematic work). Like a job, you should probably take a break from Jekyll at least a few times a year. + +This also means contributors should be consumers. If a maintainer finds they are not using a project in the real-world, they should reconsider their involvement with the project. + +# 3. Prioritise Maintainers Over Users + +It's important to be user-focused but ultimately, as long as you follow #1 above, Jekyll's minimum number of users will be the number of maintainers. However, if Jekyll has no maintainers it will quickly become useless to all users and the project will die. As a result, no user complaint, behaviour or need takes priority over the burnout of maintainers. If users do not like the direction of the project, the easiest way to influence it is to make significant, high-quality code contributions and become a maintainer. + +# 4. Learn To Say No + +Jekyll gets a lot of feature requests, non-reproducible bug reports, usage questions and PRs we won't accept. These should be closed out as soon as we realise that they aren't going to be resolved or merged. This is kinder than deciding this after a long period of review. Our issue tracker should reflect work to be done. + +--- + +Thanks to https://gist.github.com/ryanflorence/124070e7c4b3839d4573 which influenced this document. + +Thanks to [Homebrew's "Avoiding Burnout" document](https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Maintainers-Avoiding-Burnout.md) for providing a perfect base for this document. From c3313d868e92f5906ec21e020c35f08c74dda090 Mon Sep 17 00:00:00 2001 From: DirtyF Date: Wed, 15 Jun 2016 22:22:57 +0200 Subject: [PATCH 1030/4996] fix rubocop offenses in exe/jekyll --- .rubocop.yml | 1 - exe/jekyll | 30 +++++++++++++++++------------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 431b08fffa7..ac0ce379021 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,7 +4,6 @@ AllCops: Include: - lib/**/*.rb Exclude: - - exe/jekyll - lib/jekyll/collection.rb - lib/jekyll/command.rb - lib/jekyll/configuration.rb diff --git a/exe/jekyll b/exe/jekyll index 43364b9960c..c5e03111fc7 100755 --- a/exe/jekyll +++ b/exe/jekyll @@ -3,8 +3,8 @@ STDOUT.sync = true $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w( .. lib )) -require 'jekyll' -require 'mercenary' +require "jekyll" +require "mercenary" Jekyll::PluginManager.require_from_bundler @@ -12,22 +12,26 @@ Jekyll::Deprecator.process(ARGV) Mercenary.program(:jekyll) do |p| p.version Jekyll::VERSION - p.description 'Jekyll is a blog-aware, static site generator in Ruby' - p.syntax 'jekyll [options]' - - p.option 'source', '-s', '--source [DIR]', 'Source directory (defaults to ./)' - p.option 'destination', '-d', '--destination [DIR]', 'Destination directory (defaults to ./_site)' - 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' + p.description "Jekyll is a blog-aware, static site generator in Ruby" + p.syntax "jekyll [options]" + + p.option "source", "-s", "--source [DIR]", "Source directory (defaults to ./)" + p.option "destination", "-d", "--destination [DIR]", \ + "Destination directory (defaults to ./_site)" + 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::External.require_if_present(Jekyll::External.blessed_gems) do |g| - cmd = g.split('-').last + cmd = g.split("-").last p.command(cmd.to_sym) do |c| c.syntax cmd c.action do - Jekyll.logger.abort_with "You must install the '#{g}' gem to use the 'jekyll #{cmd}' command." + Jekyll.logger.abort_with "You must install the '#{g}' gem" \ + " to use the 'jekyll #{cmd}' command." end end end From b972daa54db1f282e978919e0728999316fa549e Mon Sep 17 00:00:00 2001 From: DirtyF Date: Wed, 15 Jun 2016 22:31:08 +0200 Subject: [PATCH 1031/4996] apply @envygeeks recommandation --- exe/jekyll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exe/jekyll b/exe/jekyll index c5e03111fc7..2244e27456f 100755 --- a/exe/jekyll +++ b/exe/jekyll @@ -1,7 +1,7 @@ #!/usr/bin/env ruby STDOUT.sync = true -$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w( .. lib )) +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w( .. lib ))) require "jekyll" require "mercenary" From 20910976c4c6d04d88c33e2bda08d635cd602fc9 Mon Sep 17 00:00:00 2001 From: DirtyF Date: Wed, 15 Jun 2016 23:00:16 +0200 Subject: [PATCH 1032/4996] remove unecessary slashes --- exe/jekyll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exe/jekyll b/exe/jekyll index 2244e27456f..997c64b0155 100755 --- a/exe/jekyll +++ b/exe/jekyll @@ -16,12 +16,12 @@ Mercenary.program(:jekyll) do |p| p.syntax "jekyll [options]" p.option "source", "-s", "--source [DIR]", "Source directory (defaults to ./)" - p.option "destination", "-d", "--destination [DIR]", \ + p.option "destination", "-d", "--destination [DIR]", "Destination directory (defaults to ./_site)" p.option "safe", "--safe", "Safe mode (defaults to false)" - p.option "plugins_dir", "-p", "--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]", Array, \ + p.option "plugins_dir", "-p", "--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]", Array, "Plugins directory (defaults to ./_plugins)" - p.option "layouts_dir", "--layouts DIR", String, \ + p.option "layouts_dir", "--layouts DIR", String, "Layouts directory (defaults to ./_layouts)" p.option "profile", "--profile", "Generate a Liquid rendering profile" From 7c381c931b36fd34b77d8a13cd33bd1a5cdf1bf5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 15 Jun 2016 14:36:22 -0700 Subject: [PATCH 1033/4996] Update history to reflect merge of #5017 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index acabb83dd26..7016a7e4727 100644 --- a/History.markdown +++ b/History.markdown @@ -95,6 +95,7 @@ * Rubocop: jekyll/lib/site.rb (#4973) * Add timings for each scenario in cucumber & print worst offenders (#4908) * rubocop: jekyll/lib/filters.rb (#4993) + * Fix rubocop offenses in exe/jekyll (#5017) ### Site Enhancements From f27fa75935d3001c605e974d7690217dbd5a3004 Mon Sep 17 00:00:00 2001 From: DirtyF Date: Wed, 15 Jun 2016 23:54:05 +0200 Subject: [PATCH 1034/4996] remove lib/jekyll/command.rb from exclude --- .rubocop.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index ac0ce379021..adb0ca870e0 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -5,7 +5,6 @@ AllCops: - lib/**/*.rb Exclude: - lib/jekyll/collection.rb - - lib/jekyll/command.rb - lib/jekyll/configuration.rb - lib/jekyll/convertible.rb - lib/jekyll/document.rb From e9fed13392b4c160daf52ad31a0e0a9d30bfbf4b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 15 Jun 2016 14:58:53 -0700 Subject: [PATCH 1035/4996] Update history to reflect merge of #5018 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7016a7e4727..67b486b900e 100644 --- a/History.markdown +++ b/History.markdown @@ -96,6 +96,7 @@ * Add timings for each scenario in cucumber & print worst offenders (#4908) * rubocop: jekyll/lib/filters.rb (#4993) * Fix rubocop offenses in exe/jekyll (#5017) + * Rubocop: lib/jekyll/command.rb (#5018) ### Site Enhancements From 765a23468e4f59df9a0c6afcd283cbfe4530ea43 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 15:59:31 -0700 Subject: [PATCH 1036/4996] Give the user a layout scaffolding. --- lib/jekyll/theme_builder.rb | 7 +++++++ lib/theme_template/example/_post.md | 3 +-- lib/theme_template/example/index.html | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index 1ff22e6a2c5..71f92e1caba 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -12,6 +12,7 @@ def initialize(theme_name) def create! create_directories + create_starter_files create_gemspec create_accessories create_example_site @@ -58,6 +59,12 @@ def create_directories mkdir_p(%w(example example/_posts)) end + def create_starter_files + %w(page post default).each do |layout| + write_file("_layouts/#{layout}.html", template("_layouts/#{layout}.html")) + end + end + def create_gemspec write_file("Gemfile", template("Gemfile")) write_file("#{name}.gemspec", template("theme.gemspec")) diff --git a/lib/theme_template/example/_post.md b/lib/theme_template/example/_post.md index cf40b7f0dea..145b21de42f 100644 --- a/lib/theme_template/example/_post.md +++ b/lib/theme_template/example/_post.md @@ -1,6 +1,5 @@ --- -# Specify a layout from your theme! -# This will be the layout users specify for their posts. +layout: post --- Eos eu docendi tractatos sapientem, brute option menandri in vix, quando vivendo accommodare te ius. Nec melius fastidii constituam id, viderer theophrastus ad sit, hinc semper periculis cum id. Noluisse postulant assentior est in, no choro sadipscing repudiandae vix. Vis in euismod delenit dignissim. Ex quod nostrum sit, suas decore animal id ius, nobis solet detracto quo te. diff --git a/lib/theme_template/example/index.html b/lib/theme_template/example/index.html index d3187773878..b688538cd69 100644 --- a/lib/theme_template/example/index.html +++ b/lib/theme_template/example/index.html @@ -1,5 +1,5 @@ --- -# Specify a layout from your theme! +layout: page --- Lorem ipsum dolor sit amet, quo id prima corrumpit pertinacia, id ius dolor dolores, an veri pertinax explicari mea. Agam solum et qui, his id ludus graeco adipiscing. Duis theophrastus nam in, at his vidisse atomorum. Tantas gloriatur scripserit ne eos. Est wisi tempor habemus at, ei graeco dissentiet eos. Ne usu aliquip sanctus conceptam, te vis ignota animal, modus latine contentiones ius te. From c70ca8ac9787f9402e1c7941b868f53153c06ece Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 16:04:57 -0700 Subject: [PATCH 1037/4996] Whoops, forgot the _layouts templates. --- lib/theme_template/_layouts/default.html | 1 + lib/theme_template/_layouts/page.html | 5 +++++ lib/theme_template/_layouts/post.html | 5 +++++ 3 files changed, 11 insertions(+) create mode 100644 lib/theme_template/_layouts/default.html create mode 100644 lib/theme_template/_layouts/page.html create mode 100644 lib/theme_template/_layouts/post.html diff --git a/lib/theme_template/_layouts/default.html b/lib/theme_template/_layouts/default.html new file mode 100644 index 00000000000..cddd07099f2 --- /dev/null +++ b/lib/theme_template/_layouts/default.html @@ -0,0 +1 @@ +{{ content }} diff --git a/lib/theme_template/_layouts/page.html b/lib/theme_template/_layouts/page.html new file mode 100644 index 00000000000..5e7112684af --- /dev/null +++ b/lib/theme_template/_layouts/page.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/lib/theme_template/_layouts/post.html b/lib/theme_template/_layouts/post.html new file mode 100644 index 00000000000..5e7112684af --- /dev/null +++ b/lib/theme_template/_layouts/post.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} From a71e67720733d207b7ab6b389578a69d424d8594 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 16:32:28 -0700 Subject: [PATCH 1038/4996] Add 'Reviewing a Pull Request' documentation @mikemcquaid Would love your feedback on this one. Writing from scratch here and I have the tendency to sound pretty formal. Thoughts? --- docs/reviewing-a-pull-request.md | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/reviewing-a-pull-request.md b/docs/reviewing-a-pull-request.md index 35ac769e5e4..aeea06a5a1d 100644 --- a/docs/reviewing-a-pull-request.md +++ b/docs/reviewing-a-pull-request.md @@ -2,3 +2,37 @@ **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. +## Respond Kindly + +Above all else, please review a pull request kindly. Our community can only be strong if we make it a welcoming and inclusive environment. To further promote this, the Jekyll community is governed by a [Code of Conduct](../CONDUCT.markdown) by which all community members must abide. + +Use emoji liberally :heart: :tada: :sparkles: :confetti_ball: and feel free to be emotive!! Contributions keep this project moving forward and we're always happy to receive them, even if the pull request isn't ultimately merged. + +Mike McQuaid's post on the GitHub blog entitled ["Kindly Closing Pull Requests"](https://github.com/blog/2124-kindly-closing-pull-requests) is a great place to start. It describes various scenarios in which it would be acceptable to close a pull request for reasons other than lack of technical integrity or accuracy. Part of being kind is responding to and resolving pull requests quickly. + +## Respond Quickly + +We should be able to review all pull requests within one week. The only time initial review should take longer is if all the maintainers mysteriously took vacation during the same week. Promptness encourages frequent, high-quality contributions from community members and other maintainers. + +If your response requires a response on the part of the author, please add the `pending-feedback` tag. @jekyllbot will automatically remove the tag once the author of the pull request responds. + +## Resolve Quickly + +Similarly, we should aim to resolve pull requests quickly. If a pull request introduces a feature which does not fit into the core purpose or goal of the project, close it prompty with a kind explanation of why it is not acceptable. + +Leave detailed comments wherever possible. Provide the contributor with context around why the change you are requesting is necessary, or why the question you are asking is important to resolve. The more context we can clearly communicate to the contributor, the better able + +You may close a pull request if more than 30 days pass without a response from the author. + +## CI Must Pass + +It is fine to ask a contributor to investigate failures on Travis and patch them up before you begin your review. It is helpful to leave a message for the contributor indicating that the tests have failed and that no review will occur before the tests pass. If they ask for help, take a look and assist if you can. + +## Rule of Two + +A pull request may be merged once two maintainers have reviewed the pull request and indicated that it is acceptable to them. There is no need to wait for a third unless one of the two reviewers wishes for another set of eyes. + +## Think Security + +We owe it to our users to ensure that using a theme from the community or building someone else's site doesn't come with built-in security vulnerabilities. Things like where files may be read from and written to are important to keep secure. Jekyll is also the basis for hosted services such as [GitHub Pages](https://pages.github.com), which cannot upgrade when security issues are introduced. + From fa6934300bf1680f5c505c48415d818ecdd818a7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 15 Jun 2016 17:19:47 -0700 Subject: [PATCH 1039/4996] Add 'Becoming a Maintainer' docs. --- docs/becoming-a-maintainer.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/becoming-a-maintainer.md b/docs/becoming-a-maintainer.md index 2926344c86c..facc9965a59 100644 --- a/docs/becoming-a-maintainer.md +++ b/docs/becoming-a-maintainer.md @@ -1,3 +1,35 @@ # Contributors: Becoming a Maintainer **This guide is for contributors.** These special people have contributed to one or more of Jekyll's repositories, but do not yet have write access to any. You may find what is written here interesting, but it’s definitely not for everyone. + +So you want to become a maintainer of a Jekyll project? We'd love to have you! Here are some things we like to see from community members before we promote them to maintainers. + +## 1. Use Jekyll + +You want to maintain Jekyll? Use it often. Do weird things with it. Do normal things with it. Does it work? Does it have any weaknesses? Is there a gap in the product that you think should be filled? + +## 1. Help Triage Issues + +Watch the repository you're interested in. Join [an Affinity Team](https://teams.jekyllrb.com) and receive mentions regarding a particular interest area of the project. When you receive a notification for an issue that has not been triaged by a maintainer, dive in. Can you reproduce the issue? Can you determine the fix? [More tips on Triaging an Issue in our maintainer guide](triaging-an-issue.md). Every maintainer loves an issue that is resolved before they get to it. :smiley: + +## 2. Write Documentation + +Good documentation means less confusion for our users and fewer issues to triage. Documentation is always in need of fixes and updates as we change the code. Read through the documentation during your normal usage of the product and submit changes as you feel they are necessary. + +## 3. Write Code + +As a maintainer, you will be reviewing pull requests which update code. You should feel comfortable with the Jekyll codebase enough to confidently review a put forward. + +## 4. Review Pull Requests + +Start by reviewing one pull request a week. Leave detailed comments and [follow our guide for reviewing pull requests](reviewing-a-pull-request.md). + +## 5. Ask! + +Open an issue describing your contributions to the project and why you wish to be a maintainer. Issues are nice because you can easily reference where you have demonstrated that you help triage issues, write code & documentation, and review pull requests. You may also email any maintainer privately if you do not feel comfortable asking in the open. + +We would love to expand the team and look forward to many more community members becoming maintainers! + +# Helping Out Elsewhere + +In addition to maintainers of our core and plugin code, the Jekyll team is comprised of moderators for our forums. These helpful community members take a look at the topics posted to https://help.jekyllrb.com and ensure they are properly categorized and are acceptable under our Code of Conduct. If you would like to be a moderator, email one of the maintainers with links to where you have answered questions and a request to be added as a moderator. More help is always welcome. From 7a933893dbcaf1b57dbfafd6dc41edaadef43197 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 16 Jun 2016 13:14:50 +0300 Subject: [PATCH 1040/4996] rubocop: fix code style --- .rubocop.yml | 1 - lib/jekyll/static_file.rb | 50 +++++++++++++++++++-------------------- test/test_site.rb | 2 -- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index adb0ca870e0..8c90c0494de 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -10,7 +10,6 @@ AllCops: - lib/jekyll/document.rb - lib/jekyll/regenerator.rb - lib/jekyll/renderer.rb - - lib/jekyll/static_file.rb - lib/jekyll/utils.rb - bin/**/* - benchmark/**/* diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 3e7d0d25d51..5471c2a9aff 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -1,8 +1,5 @@ module Jekyll class StaticFile - # The cache of last modification times [path] -> mtime. - @@mtimes = {} - attr_reader :relative_path, :extname # Initialize a new StaticFile. @@ -11,6 +8,7 @@ class StaticFile # base - The String path to the . # dir - The String path between and the file. # name - The String filename of the file. + # rubocop: disable ParameterLists def initialize(site, base, dir, name, collection = nil) @site = site @base = base @@ -19,7 +17,10 @@ def initialize(site, base, dir, name, collection = nil) @collection = collection @relative_path = File.join(*[@dir, @name].compact) @extname = File.extname(@name) + # The cache of last modification times [path] -> mtime. + @mtimes = {} end + # rubocop: enable ParameterLists # Returns source file path. def path @@ -56,7 +57,7 @@ def mtime # # Returns true if modified since last write. def modified? - @@mtimes[path] != mtime + @mtimes[path] != mtime end # Whether to write the file to the filesystem @@ -64,7 +65,7 @@ def modified? # Returns true unless the defaults for the destination path from # _config.yml contain `published: false`. def write? - defaults.fetch('published', true) + defaults.fetch("published", true) end # Write the static file to the destination directory (if modified). @@ -76,28 +77,16 @@ def write(dest) dest_path = destination(dest) return false if File.exist?(dest_path) && !modified? - @@mtimes[path] = mtime + @mtimes[path] = mtime FileUtils.mkdir_p(File.dirname(dest_path)) FileUtils.rm(dest_path) if File.exist?(dest_path) - if @site.safe || Jekyll.env == "production" - FileUtils.cp(path, dest_path) - else - FileUtils.copy_entry(path, dest_path) - end - File.utime(@@mtimes[path], @@mtimes[path], dest_path) + copy_file(dest_path) + File.utime(@mtimes[path], @mtimes[path], dest_path) true end - # Reset the mtimes cache (for testing purposes). - # - # Returns nothing. - def self.reset_cache - @@mtimes = {} - nil - end - def to_liquid { "extname" => extname, @@ -109,11 +98,11 @@ def to_liquid def placeholders { :collection => @collection.label, - :path => relative_path[ + :path => relative_path[ @collection.relative_directory.size..relative_path.size], - :output_ext => '', - :name => '', - :title => '' + :output_ext => "", + :name => "", + :title => "" } end @@ -125,10 +114,10 @@ def url relative_path else ::Jekyll::URL.new({ - :template => @collection.url_template, + :template => @collection.url_template, :placeholders => placeholders }) - end.to_s.gsub(/\/$/, '') + end.to_s.gsub(%r!/$!, "") end # Returns the type of the collection if present, nil otherwise. @@ -141,5 +130,14 @@ def type def defaults @defaults ||= @site.frontmatter_defaults.all url, type end + + private + def copy_file(dest_path) + if @site.safe || Jekyll.env == "production" + FileUtils.cp(path, dest_path) + else + FileUtils.copy_entry(path, dest_path) + end + end end end diff --git a/test/test_site.rb b/test/test_site.rb index 4e9e18a57ab..6ac27ccc730 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -100,7 +100,6 @@ def generate(site) should "write only modified static files" do clear_dest - StaticFile.reset_cache @site.regenerator.clear @site.process @@ -130,7 +129,6 @@ def generate(site) should "write static files if not modified but missing in destination" do clear_dest - StaticFile.reset_cache @site.regenerator.clear @site.process From 0f74db413110ae7cb435bbd2d7f21a2918dd9cfe Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 16 Jun 2016 23:12:01 +0300 Subject: [PATCH 1041/4996] rubocop: move mtimes cache hash to class variable --- lib/jekyll/static_file.rb | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 5471c2a9aff..0f8544ee7da 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -2,6 +2,17 @@ module Jekyll class StaticFile attr_reader :relative_path, :extname + class << self + # The cache of last modification times [path] -> mtime. + def mtimes + @mtimes ||= {} + end + + def reset_cache + @mtimes = nil + end + end + # Initialize a new StaticFile. # # site - The Site. @@ -17,8 +28,6 @@ def initialize(site, base, dir, name, collection = nil) @collection = collection @relative_path = File.join(*[@dir, @name].compact) @extname = File.extname(@name) - # The cache of last modification times [path] -> mtime. - @mtimes = {} end # rubocop: enable ParameterLists @@ -57,7 +66,7 @@ def mtime # # Returns true if modified since last write. def modified? - @mtimes[path] != mtime + self.class.mtimes[path] != mtime end # Whether to write the file to the filesystem @@ -77,12 +86,11 @@ def write(dest) dest_path = destination(dest) return false if File.exist?(dest_path) && !modified? - @mtimes[path] = mtime + self.class.mtimes[path] = mtime FileUtils.mkdir_p(File.dirname(dest_path)) FileUtils.rm(dest_path) if File.exist?(dest_path) copy_file(dest_path) - File.utime(@mtimes[path], @mtimes[path], dest_path) true end @@ -138,6 +146,7 @@ def copy_file(dest_path) else FileUtils.copy_entry(path, dest_path) end + File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path) end end end From 4afb407304c1ab11da2e380543eada522f4b5503 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 16 Jun 2016 15:14:42 -0700 Subject: [PATCH 1042/4996] Address comments from PR review. --- docs/avoiding-burnout.md | 2 +- docs/becoming-a-maintainer.md | 12 ++++++------ docs/merging-a-pull-request.md | 4 +--- docs/reviewing-a-pull-request.md | 4 ++++ docs/triaging-an-issue.md | 2 +- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/docs/avoiding-burnout.md b/docs/avoiding-burnout.md index 4e8b2e0b116..8ca27bfe31b 100644 --- a/docs/avoiding-burnout.md +++ b/docs/avoiding-burnout.md @@ -2,7 +2,7 @@ **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -# 1. Use Homebrew +# 1. Use Jekyll Maintainers of Homebrew should be using it regularly. This is partly because you won't be a good maintainer unless you can put yourself in the shoes of our users but also because you may decide to stop using Jekyll and at that point you should also decide not to be a maintainer and find other things to work on. diff --git a/docs/becoming-a-maintainer.md b/docs/becoming-a-maintainer.md index facc9965a59..28f1f70b5f8 100644 --- a/docs/becoming-a-maintainer.md +++ b/docs/becoming-a-maintainer.md @@ -8,23 +8,23 @@ So you want to become a maintainer of a Jekyll project? We'd love to have you! H You want to maintain Jekyll? Use it often. Do weird things with it. Do normal things with it. Does it work? Does it have any weaknesses? Is there a gap in the product that you think should be filled? -## 1. Help Triage Issues +## 2. Help Triage Issues Watch the repository you're interested in. Join [an Affinity Team](https://teams.jekyllrb.com) and receive mentions regarding a particular interest area of the project. When you receive a notification for an issue that has not been triaged by a maintainer, dive in. Can you reproduce the issue? Can you determine the fix? [More tips on Triaging an Issue in our maintainer guide](triaging-an-issue.md). Every maintainer loves an issue that is resolved before they get to it. :smiley: -## 2. Write Documentation +## 3. Write Documentation Good documentation means less confusion for our users and fewer issues to triage. Documentation is always in need of fixes and updates as we change the code. Read through the documentation during your normal usage of the product and submit changes as you feel they are necessary. -## 3. Write Code +## 4. Write Code -As a maintainer, you will be reviewing pull requests which update code. You should feel comfortable with the Jekyll codebase enough to confidently review a put forward. +As a maintainer, you will be reviewing pull requests which update code. You should feel comfortable with the Jekyll codebase enough to confidently review any pull request put forward. In order to become more comfortable, write some code of your own and send a pull request. A great place to start is with any issue labeled "bug" in the issue tracker. Write a test which replicates the problem and fails, then work on fixing the code such that the test passes. -## 4. Review Pull Requests +## 5. Review Pull Requests Start by reviewing one pull request a week. Leave detailed comments and [follow our guide for reviewing pull requests](reviewing-a-pull-request.md). -## 5. Ask! +## 6. Ask! Open an issue describing your contributions to the project and why you wish to be a maintainer. Issues are nice because you can easily reference where you have demonstrated that you help triage issues, write code & documentation, and review pull requests. You may also email any maintainer privately if you do not feel comfortable asking in the open. diff --git a/docs/merging-a-pull-request.md b/docs/merging-a-pull-request.md index ff1f102ed98..3d56b09660d 100644 --- a/docs/merging-a-pull-request.md +++ b/docs/merging-a-pull-request.md @@ -6,9 +6,7 @@ All pull requests should be subject to code review. Code review is a [foundational value](https://blog.fullstory.com/what-we-learned-from-google-code-reviews-arent-just-for-catching-bugs-b125a13aa292) of good engineering teams. Besides providing validation of correctness, it promotes a sense of community and gives other maintainers understanding of all parts of the code base. In short, code review is crucial to a healthy open source project. -Before merging a pull request **that changes code**, ensure that code is thoroughly reviewed and has received a thorough review from at least two maintainers. - -Before merging a pull request **that changes the documentation**, ensure there aren't any errors and that at least one other maintainer has agreed on the changes. +**Read our guide for [Reviewing a pull request](reviewing-a-pull-request.md) before merging.** Notably, the change must have tests if for code, and at least two maintainers must give it an OK. ## Merging diff --git a/docs/reviewing-a-pull-request.md b/docs/reviewing-a-pull-request.md index aeea06a5a1d..feea47ec522 100644 --- a/docs/reviewing-a-pull-request.md +++ b/docs/reviewing-a-pull-request.md @@ -24,6 +24,10 @@ Leave detailed comments wherever possible. Provide the contributor with context You may close a pull request if more than 30 days pass without a response from the author. +## Look for Tests + +If this is a code change, are there tests for the updated or added behaviour? Shipping a version with bugs is inevitable, but ensuring changes are tested helps keep bugs and regressions to a minimum. + ## CI Must Pass It is fine to ask a contributor to investigate failures on Travis and patch them up before you begin your review. It is helpful to leave a message for the contributor indicating that the tests have failed and that no review will occur before the tests pass. If they ask for help, take a look and assist if you can. diff --git a/docs/triaging-an-issue.md b/docs/triaging-an-issue.md index 75dbe4d13af..d69b64577f5 100644 --- a/docs/triaging-an-issue.md +++ b/docs/triaging-an-issue.md @@ -6,4 +6,4 @@ Here are some key things to remember when evaluating an issue. ## Reproducible? -If the bug has clear reproduction steps, take a minute to try them. +If the bug has clear reproduction steps, take a minute to try them. If it helps, write a test in our test suite for the scenario which replicates the problem. From 0c7693f7b918c6d603119281fec9165d61177122 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 16 Jun 2016 17:07:16 -0700 Subject: [PATCH 1043/4996] Updates to Reviewing a Pull Request --- docs/reviewing-a-pull-request.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/reviewing-a-pull-request.md b/docs/reviewing-a-pull-request.md index feea47ec522..b2c3e0def61 100644 --- a/docs/reviewing-a-pull-request.md +++ b/docs/reviewing-a-pull-request.md @@ -18,12 +18,14 @@ If your response requires a response on the part of the author, please add the ` ## Resolve Quickly -Similarly, we should aim to resolve pull requests quickly. If a pull request introduces a feature which does not fit into the core purpose or goal of the project, close it prompty with a kind explanation of why it is not acceptable. +Similarly, we should aim to resolve pull requests quickly. If a pull request introduces a feature which does not fit into the core purpose or goal of the project, close it promptly with a kind explanation of why it is not acceptable. -Leave detailed comments wherever possible. Provide the contributor with context around why the change you are requesting is necessary, or why the question you are asking is important to resolve. The more context we can clearly communicate to the contributor, the better able +Leave detailed comments wherever possible. Provide the contributor with context around why the change you are requesting is necessary, or why the question you are asking is important to resolve. The more context we can clearly communicate to the contributor, the better able the contributor is to provide high-quality patches. You may close a pull request if more than 30 days pass without a response from the author. +In some cases, review will involve many weeks of back-and-forth. As long as communication continues, this is fine. Ideally, any PR would be capable of resolution within 30 days of it being opened. + ## Look for Tests If this is a code change, are there tests for the updated or added behaviour? Shipping a version with bugs is inevitable, but ensuring changes are tested helps keep bugs and regressions to a minimum. From d220c7a9a922eb37f9e20098538bdceed7d8c751 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 16 Jun 2016 17:12:00 -0700 Subject: [PATCH 1044/4996] Try fleshing out Triaging an Issue more. --- docs/triaging-an-issue.md | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/docs/triaging-an-issue.md b/docs/triaging-an-issue.md index d69b64577f5..436a89d0ec6 100644 --- a/docs/triaging-an-issue.md +++ b/docs/triaging-an-issue.md @@ -4,6 +4,35 @@ Here are some key things to remember when evaluating an issue. -## Reproducible? +## Feature? -If the bug has clear reproduction steps, take a minute to try them. If it helps, write a test in our test suite for the scenario which replicates the problem. +If the issue describes a feature request, ask: + +1. Is this a setting? [Settings are a crutch](http://ben.balter.com/2016/03/08/optimizing-for-power-users-and-edge-cases/#settings-are-a-crutch) for doing "the right thing". Settings usually point to a bad default or an edge case that could be solved easily with a plugin. Keep the :christmas_tree: of settings as small as possible so as not to reduce the usability of the product. We like the philosophy "decisions not options." +2. Would at least 80% of users find it useful? If even a quarter of our users won't use it, it's very likely that the request doesn't fit our product's core goal. +3. Is there another way to accomplish the end goal of the request? Most feature requests are due to bad documentation for or understanding of a pre-existing feature. See if you can clarify the end goal of the request. What is the user trying to do? Could they accomplish that goal through another feature we already support? +4. Even if 80% of our users will use it, does it fit the core goal of our project? We are writing a tool for making static websites, not a swiss army knife for publishing more generally. + +Feel free to get others' opinions and ask questions of the issue author, but depending upon the answers to the questions above, it may be out of scope for our project. + +If the request is within scope, prioritize it on the product roadmap with the other maintainers. Apply the appropriate tags and ensure the right people have weighed in to define the feature's scope and implementation. If you want to be the _best ever_, submit a PR yourself which adds the feature. + +## Bug? + +### Reproducibility + +If the bug has clear reproduction steps, take a minute to try them. If it helps, write a test in our test suite for the scenario which replicates the problem. Can you reliably replicate the issue? + +If you can't replicate the issue, post your replication steps which didn't work and ask for clarification from the issue author. + +### Supported Platform + +Is the author using a supported platform? We support the latest versions of macOS, most common distributions of Linux. If the author is using Windows, you can use the `@jekyll/windows` team to help you investigate, but ultimately it is not a supported platform. + +If the user is experiencing issues with GitHub Pages or another hosted platform that we cannot reproduce, please direct them to the platform's support channel and close the issue. + +### What they wanted vs. what they got + +An issue without a clear explanation of what the user got and what they were expecting to get is not an issue we can accurately respond to. If the user doesn't provide this information, please ask for clarification. This information helps us build test cases such that we do not break the behaviour again in the future. + +Is what they wanted to get something we want to happen? Sometimes a bug report is actually masquerading as a feature request. See the guidance above for handling feature requests. From b06cfb9c500eccd3ae681130c9752ad8bd303ad1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 16 Jun 2016 17:31:54 -0700 Subject: [PATCH 1045/4996] Update history to reflect merge of #4922 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 67b486b900e..5966cd6d747 100644 --- a/History.markdown +++ b/History.markdown @@ -30,6 +30,7 @@ * Run Site#generate for 'jekyll doctor' to catch plugin issues (#5005) * Add normalize_whitepace filter (#4917) * Move bin/jekyll to exe/jekyll to prevent collision with binstubs (#5014) + * Cleaning up site template & theme updates. (#4922) ### Bug Fixes From 97fecafff51a046e1ee030d4a3c716e8c33826fb Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Fri, 17 Jun 2016 13:06:11 +0300 Subject: [PATCH 1046/4996] rubocop: revert changes in test --- test/test_site.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_site.rb b/test/test_site.rb index 6ac27ccc730..4e9e18a57ab 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -100,6 +100,7 @@ def generate(site) should "write only modified static files" do clear_dest + StaticFile.reset_cache @site.regenerator.clear @site.process @@ -129,6 +130,7 @@ def generate(site) should "write static files if not modified but missing in destination" do clear_dest + StaticFile.reset_cache @site.regenerator.clear @site.process From 902f344a50c19485c5b47b82791838bf731d215c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 17 Jun 2016 19:42:28 -0700 Subject: [PATCH 1047/4996] Update history to reflect merge of #5019 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5966cd6d747..75fcfacc525 100644 --- a/History.markdown +++ b/History.markdown @@ -98,6 +98,7 @@ * rubocop: jekyll/lib/filters.rb (#4993) * Fix rubocop offenses in exe/jekyll (#5017) * Rubocop: lib/jekyll/command.rb (#5018) + * rubocop: lib/jekyll/static_file.rb (#5019) ### Site Enhancements From 14e857029ab1560c3aaad3bc67b3bf39120d0875 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Sun, 19 Jun 2016 15:48:23 +0300 Subject: [PATCH 1048/4996] rubocop: fix code style --- .rubocop.yml | 1 - lib/jekyll/configuration.rb | 152 +++++++++++++++++++++--------------- 2 files changed, 89 insertions(+), 64 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 8c90c0494de..3bea6a0253f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -5,7 +5,6 @@ AllCops: - lib/**/*.rb Exclude: - lib/jekyll/collection.rb - - lib/jekyll/configuration.rb - lib/jekyll/convertible.rb - lib/jekyll/document.rb - lib/jekyll/regenerator.rb diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 80e36478811..bcd13d0bf84 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -86,8 +86,8 @@ class << self # Returns a Configuration filled with defaults and fixed for common # problems and backwards-compatibility. def from(user_config) - Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys). - fix_common_issues.add_default_collections + Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys) + .fix_common_issues.add_default_collections end end @@ -123,10 +123,10 @@ def verbose(override = {}) def safe_load_file(filename) case File.extname(filename) - when /\.toml/i + when %r!\.toml!i Jekyll::External.require_with_graceful_fail("toml") unless defined?(TOML) TOML.load_file(filename) - when /\.ya?ml/i + when %r!\.ya?ml!i SafeYAML.load_file(filename) || {} else raise ArgumentError, "No parser for '#{filename}' is available. @@ -191,7 +191,7 @@ def read_config_files(files) begin files.each do |config_file| - next if config_file.nil? or config_file.empty? + next if config_file.nil? || config_file.empty? new_config = read_config_file(config_file) configuration = Utils.deep_merge_hashes(configuration, new_config) end @@ -220,60 +220,18 @@ def csv_to_array(csv) def backwards_compatibilize config = clone # Provide backwards-compatibility - if config.key?("auto") || config.key?("watch") - Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" \ - " be set from your configuration file(s). Use the" \ - " --[no-]watch/-w command-line option instead." - config.delete("auto") - config.delete("watch") - end - - if config.key?("server") - Jekyll::Deprecator.deprecation_message "The 'server' configuration option" \ - " is no longer accepted. Use the 'jekyll serve'" \ - " subcommand to serve your site with WEBrick." - config.delete("server") - end + check_auto(config) + check_server(config) renamed_key "server_port", "port", config renamed_key "plugins", "plugins_dir", config renamed_key "layouts", "layouts_dir", config renamed_key "data_source", "data_dir", config - if config.key?("pygments") - Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" \ - " has been renamed to 'highlighter'. Please update your" \ - " config file accordingly. The allowed values are 'rouge', " \ - "'pygments' or null." - - config["highlighter"] = "pygments" if config["pygments"] - config.delete("pygments") - end - - %w(include exclude).each do |option| - if config[option].is_a?(String) - Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" \ - " must now be specified as an array, but you specified" \ - " a string. For now, we've treated the string you provided" \ - " as a list of comma-separated values." - config[option] = csv_to_array(config[option]) - end - config[option].map!(&:to_s) if config[option] - end - - if (config["kramdown"] || {}).key?("use_coderay") - Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" \ - " to 'enable_coderay' in your configuration file." - config["kramdown"]["use_coderay"] = config["kramdown"].delete("enable_coderay") - end - - if config.fetch("markdown", "kramdown").to_s.casecmp("maruku") == 0 - Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " \ - "Markdown processor, which has been removed as of 3.0.0. " \ - "We recommend you switch to Kramdown. To do this, replace " \ - "`markdown: maruku` with `markdown: kramdown` in your " \ - "`_config.yml` file." - end + check_pygments(config) + check_include_exclude(config) + check_coderay(config) + check_maruku(config) config end @@ -296,19 +254,19 @@ def add_default_collections config = clone # It defaults to `{}`, so this is only if someone sets it to null manually. - return config if config['collections'].nil? + return config if config["collections"].nil? # Ensure we have a hash. - if config['collections'].is_a?(Array) - config['collections'] = Hash[config['collections'].map { |c| [c, {}] }] + if config["collections"].is_a?(Array) + config["collections"] = Hash[config["collections"].map { |c| [c, {}] }] end - config['collections'] = Utils.deep_merge_hashes( - { 'posts' => {} }, config['collections'] + config["collections"] = Utils.deep_merge_hashes( + { "posts" => {} }, config["collections"] ).tap do |collections| - collections['posts']['output'] = true - if config['permalink'] - collections['posts']['permalink'] ||= style_to_permalink(config['permalink']) + collections["posts"]["output"] = true + if config["permalink"] + collections["posts"]["permalink"] ||= style_to_permalink(config["permalink"]) end end @@ -325,7 +283,6 @@ def renamed_key(old, new, config, _ = nil) end private - def style_to_permalink(permalink_style) case permalink_style.to_sym when :pretty @@ -347,9 +304,78 @@ def style_to_permalink(permalink_style) # file - the file from which the config was extracted # # Raises an ArgumentError if given config is not a hash + private def check_config_is_hash!(extracted_config, file) unless extracted_config.is_a?(Hash) - raise ArgumentError.new("Configuration file: (INVALID) #{file}".yellow) + raise ArgumentError, "Configuration file: (INVALID) #{file}".yellow + end + end + + private + def check_auto(config) + if config.key?("auto") || config.key?("watch") + Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" \ + " be set from your configuration file(s). Use the" \ + " --[no-]watch/-w command-line option instead." + config.delete("auto") + config.delete("watch") + end + end + + private + def check_server(config) + if config.key?("server") + Jekyll::Deprecator.deprecation_message "The 'server' configuration option" \ + " is no longer accepted. Use the 'jekyll serve'" \ + " subcommand to serve your site with WEBrick." + config.delete("server") + end + end + + private + def check_pygments(config) + if config.key?("pygments") + Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" \ + " has been renamed to 'highlighter'. Please update your" \ + " config file accordingly. The allowed values are 'rouge', " \ + "'pygments' or null." + + config["highlighter"] = "pygments" if config["pygments"] + config.delete("pygments") + end + end + + private + def check_include_exclude(config) + %w(include exclude).each do |option| + if config[option].is_a?(String) + Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" \ + " must now be specified as an array, but you specified" \ + " a string. For now, we've treated the string you provided" \ + " as a list of comma-separated values." + config[option] = csv_to_array(config[option]) + end + config[option].map!(&:to_s) if config[option] + end + end + + private + def check_coderay(config) + if (config["kramdown"] || {}).key?("use_coderay") + Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" \ + " to 'enable_coderay' in your configuration file." + config["kramdown"]["use_coderay"] = config["kramdown"].delete("enable_coderay") + end + end + + private + def check_maruku(config) + if config.fetch("markdown", "kramdown").to_s.casecmp("maruku") == 0 + Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " \ + "Markdown processor, which has been removed as of 3.0.0. " \ + "We recommend you switch to Kramdown. To do this, replace " \ + "`markdown: maruku` with `markdown: kramdown` in your " \ + "`_config.yml` file." end end end From d13112dbdc3b54c6a79c612a0ea32fc08affd6ac Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Sun, 19 Jun 2016 18:22:59 +0300 Subject: [PATCH 1049/4996] rubocop: fix code style --- .rubocop.yml | 1 - lib/jekyll/regenerator.rb | 75 ++++++++++++++++++++++++--------------- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 8c90c0494de..dd0b6b012da 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -8,7 +8,6 @@ AllCops: - lib/jekyll/configuration.rb - lib/jekyll/convertible.rb - lib/jekyll/document.rb - - lib/jekyll/regenerator.rb - lib/jekyll/renderer.rb - lib/jekyll/utils.rb - bin/**/* diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 830ea914a12..b387732a1d1 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -20,18 +20,14 @@ def initialize(site) def regenerate?(document) case document when Page - document.asset_file? || document.data['regenerate'] || - source_modified_or_dest_missing?( - site.in_source_dir(document.relative_path), document.destination(@site.dest) - ) + regenerate_page?(document) when Document - !document.write? || document.data['regenerate'] || - source_modified_or_dest_missing?( - document.path, document.destination(@site.dest) - ) + regenerate_document?(document) else - source_path = document.respond_to?(:path) ? document.path : nil - dest_path = document.respond_to?(:destination) ? document.destination(@site.dest) : nil + source_path = document.respond_to?(:path) ? document.path : nil + dest_path = if document.respond_to?(:destination) + document.destination(@site.dest) + end source_modified_or_dest_missing?(source_path, dest_path) end end @@ -44,7 +40,7 @@ def add(path) metadata[path] = { "mtime" => File.mtime(path), - "deps" => [] + "deps" => [] } cache[path] = true end @@ -94,23 +90,7 @@ def modified?(path) return cache[path] end - # Check path that exists in metadata - data = metadata[path] - if data - data["deps"].each do |dependency| - if modified?(dependency) - return cache[dependency] = cache[path] = true - end - end - if File.exist?(path) && data["mtime"].eql?(File.mtime(path)) - return cache[path] = false - else - return add(path) - end - end - - # Path does not exist in metadata, add it - return add(path) + check_path_exists(path) end # Add a dependency of a path @@ -139,7 +119,7 @@ def write_metadata # # Returns the String path of the file. def metadata_file - site.in_source_dir('.jekyll-metadata') + site.in_source_dir(".jekyll-metadata") end # Check if metadata has been disabled @@ -173,5 +153,42 @@ def read_metadata {} end end + + private + def regenerate_page?(document) + document.asset_file? || document.data["regenerate"] || + source_modified_or_dest_missing?( + site.in_source_dir(document.relative_path), document.destination(@site.dest) + ) + end + + private + def regenerate_document?(document) + !document.write? || document.data["regenerate"] || + source_modified_or_dest_missing?( + document.path, document.destination(@site.dest) + ) + end + + # Private: Check path that exists in metadata + # + # Returns Boolean + private + def check_path_exists(path) + data = metadata[path] + if data + data["deps"].each do |dependency| + if modified?(dependency) + return cache[dependency] = cache[path] = true + end + end + if File.exist?(path) && data["mtime"].eql?(File.mtime(path)) + return cache[path] = false + end + end + + # Path does not exist in metadata, add it + add(path) + end end end From 08b883b268c6dd143b0bf286bdee49224a339212 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Mon, 20 Jun 2016 16:03:42 +0300 Subject: [PATCH 1050/4996] rubocop: fix code style --- .rubocop.yml | 1 - lib/jekyll/utils.rb | 83 ++++++++++++++++++++++++++++----------------- 2 files changed, 52 insertions(+), 32 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 8c90c0494de..4ad1c59f3db 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -10,7 +10,6 @@ AllCops: - lib/jekyll/document.rb - lib/jekyll/regenerator.rb - lib/jekyll/renderer.rb - - lib/jekyll/utils.rb - bin/**/* - benchmark/**/* - script/**/* diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index a70a7916739..ca9e6fbad70 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -2,27 +2,25 @@ module Jekyll module Utils extend self - autoload :Platforms, 'jekyll/utils/platforms' + autoload :Platforms, "jekyll/utils/platforms" autoload :Ansi, "jekyll/utils/ansi" # Constants for use in #slugify - SLUGIFY_MODES = %w(raw default pretty) + SLUGIFY_MODES = %w(raw default pretty).freeze SLUGIFY_RAW_REGEXP = Regexp.new('\\s+').freeze - SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze + SLUGIFY_DEFAULT_REGEXP = Regexp.new("[^[:alnum:]]+").freeze SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze # Takes an indented string and removes the preceding spaces on each line def strip_heredoc(str) - str.gsub(/^[ \t]{#{(str.scan(/^[ \t]*(?=\S)/).min || "").size}}/, "") + str.gsub(%r!^[ \t]{#{(str.scan(%r!^[ \t]*(?=\S)!).min || "").size}}!, "") end # Takes a slug and turns it into a simple title. def titleize_slug(slug) - slug.split("-").map! do |val| - val.capitalize - end.join(" ") + slug.split("-").map!(&:capitalize).join(" ") end # Non-destructive version of deep_merge_hashes! See that method. @@ -42,21 +40,9 @@ def deep_merge_hashes(master_hash, other_hash) # # Thanks to whoever made it. def deep_merge_hashes!(target, overwrite) - target.merge!(overwrite) do |key, old_val, new_val| - if new_val.nil? - old_val - else - mergable?(old_val) && mergable?(new_val) ? deep_merge_hashes(old_val, new_val) : new_val - end - end - - if target.respond_to?(:default_proc) && overwrite.respond_to?(:default_proc) && target.default_proc.nil? - target.default_proc = overwrite.default_proc - end - - target.each do |key, val| - target[key] = val.dup if val.frozen? && duplicable?(val) - end + merge_values(target, overwrite) + merge_default_proc(target, overwrite) + duplicate_frozen_values(target) target end @@ -84,7 +70,9 @@ def duplicable?(obj) # Returns an array def pluralized_array_from_hash(hash, singular_key, plural_key) [].tap do |array| - array << (value_from_singular_key(hash, singular_key) || value_from_plural_key(hash, plural_key)) + value = value_from_singular_key(hash, singular_key) + value ||= value_from_plural_key(hash, plural_key) + array << value end.flatten.compact end @@ -146,11 +134,13 @@ def parse_date(input, msg = "Input could not be parsed.") # Determines whether a given file has # # Returns true if the YAML front matter is present. + # rubocop: disable PredicateName def has_yaml_header?(file) - !!(File.open(file, 'rb') { |f| f.readline } =~ /\A---\s*\r?\n/) + !!(File.open(file, "rb", &:readline) =~ %r!\A---\s*\r?\n!) rescue EOFError false end + # rubocop: enable PredicateName # Slugify a filename or title. # @@ -185,7 +175,7 @@ def has_yaml_header?(file) # # Returns the slugified string. def slugify(string, mode: nil, cased: false) - mode ||= 'default' + mode ||= "default" return nil if string.nil? unless SLUGIFY_MODES.include?(mode) @@ -195,21 +185,21 @@ def slugify(string, mode: nil, cased: false) # Replace each character sequence with a hyphen re = case mode - when 'raw' + when "raw" SLUGIFY_RAW_REGEXP - when 'default' + when "default" SLUGIFY_DEFAULT_REGEXP - when 'pretty' + when "pretty" # "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL # and is allowed in both extN and NTFS. SLUGIFY_PRETTY_REGEXP end # Strip according to the mode - slug = string.gsub(re, '-') + slug = string.gsub(re, "-") # Remove leading/trailing hyphen - slug.gsub!(/^\-|\-$/i, '') + slug.gsub!(%r!^\-|\-$!i, "") slug.downcase! unless cased slug @@ -280,7 +270,7 @@ def add_permalink_suffix(template, permalink_style) # Returns matched pathes def safe_glob(dir, patterns, flags = 0) return [] unless Dir.exist?(dir) - pattern = File.join(Array patterns) + pattern = File.join(Array(patterns)) return [dir] if pattern.empty? Dir.chdir(dir) do Dir.glob(pattern, flags).map { |f| File.join(dir, f) } @@ -297,5 +287,36 @@ def merged_file_read_opts(site, opts) merged end + private + def merge_values(target, overwrite) + target.merge!(overwrite) do |_key, old_val, new_val| + if new_val.nil? + old_val + elsif mergable?(old_val) && mergable?(new_val) + deep_merge_hashes(old_val, new_val) + else + new_val + end + end + end + + private + def merge_default_proc(target, overwrite) + if default_proc?(target) && default_proc?(overwrite) && target.default_proc.nil? + target.default_proc = overwrite.default_proc + end + end + + private + def default_proc?(object) + object.respond_to?(:default_proc) + end + + private + def duplicate_frozen_values(target) + target.each do |key, val| + target[key] = val.dup if val.frozen? && duplicable?(val) + end + end end end From f6f0f483bf31527884a8de7f7daf2075c13d986d Mon Sep 17 00:00:00 2001 From: Sondre Nilsen Date: Tue, 21 Jun 2016 19:40:22 +0200 Subject: [PATCH 1051/4996] Add generator-jekyllized to third party plugins --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 2dc2d2ba1d2..3969406845a 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -904,6 +904,7 @@ LESS.js files during generation. - [Hawkins](https://github.com/awood/hawkins): Adds a `liveserve` sub-command to Jekyll that incorporates [LiveReload](http://livereload.com/) into your pages while you preview them. No more hitting the refresh button in your browser! - [Jekyll Autoprefixer](https://github.com/vwochnik/jekyll-autoprefixer): Autoprefixer integration for Jekyll - [Jekyll-breadcrumbs](https://github.com/git-no/jekyll-breadcrumbs): Creates breadcrumbs for Jekyll 3.x, includes features like SEO optimization, optional breadcrumb item translation and more. +- [generator-jekyllized](https://github.com/sondr3/generator-jekyllized): A Yeoman generator for rapidly developing sites with Gulp. Live reload your site, automatically minify and optimize your assets and much more. #### Editors From 1779aa681acbd43d19237506bd391c4968968c66 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 21 Jun 2016 10:57:15 -0700 Subject: [PATCH 1052/4996] Update history to reflect merge of #5027 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 75fcfacc525..45df5c4bb92 100644 --- a/History.markdown +++ b/History.markdown @@ -153,6 +153,7 @@ * Windows docs: Command needs to be called from blog path (#5006) * Update text to be consitent with example (#5010) * Update template links to point to core Liquid site (#5012) + * Add generator-jekyllized to third-party plugins (#5027) ## 3.1.6 / 2016-05-19 From b539c32364d941e1f0b23de41b7367419191eb18 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 21 Jun 2016 14:20:18 -0700 Subject: [PATCH 1053/4996] Add a benchmark for capture vs. assign in Liquid. [ci skip] --- benchmark/capture-assign.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 benchmark/capture-assign.rb diff --git a/benchmark/capture-assign.rb b/benchmark/capture-assign.rb new file mode 100644 index 00000000000..8d3ac8fa63e --- /dev/null +++ b/benchmark/capture-assign.rb @@ -0,0 +1,20 @@ +require "liquid" +require "benchmark/ips" + +puts "Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}" +puts "Liquid #{Liquid::VERSION}" + +template1 = '{% capture foobar %}foo{{ bar }}{% endcapture %}{{ foo }}{{ foobar }}' +template2 = '{% assign foobar = "foo" | append: bar %}{{ foobar }}' + +def render(template) + Liquid::Template.parse(template).render("bar" => "42") +end + +puts render(template1) +puts render(template2) + +Benchmark.ips do |x| + x.report('capture') { render(template1) } + x.report('assign') { render(template2) } +end From 8a71f0f48efb4e12de86e05a65e5b14707d841eb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 21 Jun 2016 14:21:15 -0700 Subject: [PATCH 1054/4996] Not homebrew, jekyll. --- docs/avoiding-burnout.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/avoiding-burnout.md b/docs/avoiding-burnout.md index 8ca27bfe31b..f5625e6891e 100644 --- a/docs/avoiding-burnout.md +++ b/docs/avoiding-burnout.md @@ -4,7 +4,7 @@ # 1. Use Jekyll -Maintainers of Homebrew should be using it regularly. This is partly because you won't be a good maintainer unless you can put yourself in the shoes of our users but also because you may decide to stop using Jekyll and at that point you should also decide not to be a maintainer and find other things to work on. +Maintainers of Jekyll should be using it regularly. This is partly because you won't be a good maintainer unless you can put yourself in the shoes of our users but also because you may decide to stop using Jekyll and at that point you should also decide not to be a maintainer and find other things to work on. # 2. No Guilt About Leaving From 13d60c21e16db57fe8de5a7f6581bf1f8123cf3e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 21 Jun 2016 14:42:47 -0700 Subject: [PATCH 1055/4996] Specify how the pending-feedback label works and flesh out Windows & automatic closure handling. --- docs/triaging-an-issue.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/triaging-an-issue.md b/docs/triaging-an-issue.md index 436a89d0ec6..e7c5aef6f81 100644 --- a/docs/triaging-an-issue.md +++ b/docs/triaging-an-issue.md @@ -27,12 +27,18 @@ If you can't replicate the issue, post your replication steps which didn't work ### Supported Platform -Is the author using a supported platform? We support the latest versions of macOS, most common distributions of Linux. If the author is using Windows, you can use the `@jekyll/windows` team to help you investigate, but ultimately it is not a supported platform. +Is the author using a supported platform? We support the latest versions of macOS, and most common distributions of Linux. + +You may close the issue immediately if the author cannot reproduce the issue on a supported platform. For Windows-related problems, leave a comment letting the user know that Windows is not officially supported, but that they may absolutely continue using the issue to communicate with folks from `@jekyll/windows` to further investigate. Additionally, you can point them to Jekyll Talk (https://talk.jekyllrb.com) as a means of getting support from the community. If the user is experiencing issues with GitHub Pages or another hosted platform that we cannot reproduce, please direct them to the platform's support channel and close the issue. ### What they wanted vs. what they got -An issue without a clear explanation of what the user got and what they were expecting to get is not an issue we can accurately respond to. If the user doesn't provide this information, please ask for clarification. This information helps us build test cases such that we do not break the behaviour again in the future. +An issue without a clear explanation of what the user got and what they were expecting to get is not an issue we can accurately respond to. If the user doesn't provide this information, please ask for clarification and apply the `pending-feedback` label. This information helps us build test cases such that we do not break the behaviour again in the future. The `pending-feedback` label will be removed automatically once the issue author posts a reply. Is what they wanted to get something we want to happen? Sometimes a bug report is actually masquerading as a feature request. See the guidance above for handling feature requests. + +### Staleness and automatic closure + +@jekyllbot will automatically mark issues as `stale` if no activity occurs for at least one month. @jekyllbot leaves a comment asking for information about reproducibility in current versions. If no one responds after another month, the issue is automatically closed. From 0b169f77393ef320f2025c72f34d4ce60e5d4d50 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Wed, 22 Jun 2016 14:15:13 +0300 Subject: [PATCH 1056/4996] rubocop: refactor modified? method --- lib/jekyll/regenerator.rb | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index b387732a1d1..4d89da2e0e8 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -90,7 +90,14 @@ def modified?(path) return cache[path] end - check_path_exists(path) + if metadata[path] + # If we have seen this file before, + # check if it or one of its dependencies has been modified + existing_file_modified?(path) + else + # If we have not seen this file before, add it to the metadata and regenerate it + add(path) + end end # Add a dependency of a path @@ -170,25 +177,23 @@ def regenerate_document?(document) ) end - # Private: Check path that exists in metadata - # - # Returns Boolean private - def check_path_exists(path) - data = metadata[path] - if data - data["deps"].each do |dependency| - if modified?(dependency) - return cache[dependency] = cache[path] = true - end - end - if File.exist?(path) && data["mtime"].eql?(File.mtime(path)) - return cache[path] = false + def existing_file_modified?(path) + # If one of this file dependencies have been modified, + # set the regeneration bit for both the dependency and the file to true + metadata[path]["deps"].each do |dependency| + if modified?(dependency) + return cache[dependency] = cache[path] = true end end - # Path does not exist in metadata, add it - add(path) + if File.exist?(path) && metadata[path]["mtime"].eql?(File.mtime(path)) + # If this file has not been modified, set the regeneration bit to false + cache[path] = false + else + # If it has been modified, set it to true + add(path) + end end end end From 357e3621e2f3aaa0d31c0407f6d4886983561754 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 22 Jun 2016 10:05:59 -0700 Subject: [PATCH 1057/4996] Update history to reflect merge of #5026 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 45df5c4bb92..f092085d630 100644 --- a/History.markdown +++ b/History.markdown @@ -99,6 +99,7 @@ * Fix rubocop offenses in exe/jekyll (#5017) * Rubocop: lib/jekyll/command.rb (#5018) * rubocop: lib/jekyll/static_file.rb (#5019) + * rubocop: lib/jekyll/utils.rb (#5026) ### Site Enhancements From 77751cbf156487e303855f25d0cf04d307d4cfc4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 22 Jun 2016 10:11:59 -0700 Subject: [PATCH 1058/4996] Add 'special labels' to internal docs. --- docs/readme.md | 1 + docs/special-labels.md | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 docs/special-labels.md diff --git a/docs/readme.md b/docs/readme.md index abf4290113a..f2cb1fed2b5 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -6,6 +6,7 @@ Hello! This is where we document various processes for maintaining Jekyll. Being 2. [Reviewing a pull request](reviewing-a-pull-request.md) 3. [Merging a pull request](merging-a-pull-request.md) 4. [Avoiding burnout](avoiding-burnout.md) +5. [Special Labels](special-labels.md) Interested in becoming a maintainer? Here is some documentation for **contributors**: diff --git a/docs/special-labels.md b/docs/special-labels.md new file mode 100644 index 00000000000..8ce525977e6 --- /dev/null +++ b/docs/special-labels.md @@ -0,0 +1,17 @@ +# Maintainers: Special Labels + +**This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. + +We use a series of "special labels" on GitHub.com to automate handling of some parts of the pull request and issue process. @jekyllbot may automatically apply or remove certain labels based on actions taken by users or maintainers. Below are the labels and how they work: + +## `pending-feedback` + +This label is used to indicate that we need more information from the issue/PR author in order to continue. It may be that you need more info before you can properly triage a bug report, or that you have some unanswered questions about a PR that need to be resolved before moving forward. You can safely ignore any issue with this label, as it is waiting for feedback. + +## `needs-work` & `pending-rebase` + +These labels are used to indicate that the Git state of a pull request must change. Both are removed once a push is registered (a "synchronize" event for the pull request) and the pull request becomes mergable. Add `needs-work` to a PR if, after your review, it requires code changes. Add `pending-rebase` to a PR if the code is fine but the branch is not automatically mergable with the target branch (e.g. `master`). + +## `stale` + +This label is automatically added and removed by @jekyllbot based on activity on an issue or pull request. The rules for this label are laid out in [Triaging an Issue: Staleness and automatic closure](triaging-an-issue.md#staleness-and-automatic-closure). From 856dbcb2de317a0c463e6ea0381403e60befaae9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 22 Jun 2016 10:18:51 -0700 Subject: [PATCH 1059/4996] Add list of supported platforms 4 real. --- docs/triaging-an-issue.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/triaging-an-issue.md b/docs/triaging-an-issue.md index e7c5aef6f81..a6f24447e73 100644 --- a/docs/triaging-an-issue.md +++ b/docs/triaging-an-issue.md @@ -27,7 +27,7 @@ If you can't replicate the issue, post your replication steps which didn't work ### Supported Platform -Is the author using a supported platform? We support the latest versions of macOS, and most common distributions of Linux. +Is the author using a supported platform? We support the latest versions of macOS, Ubuntu, Debian, CentOS, Fedora, and Arch Linux. You may close the issue immediately if the author cannot reproduce the issue on a supported platform. For Windows-related problems, leave a comment letting the user know that Windows is not officially supported, but that they may absolutely continue using the issue to communicate with folks from `@jekyll/windows` to further investigate. Additionally, you can point them to Jekyll Talk (https://talk.jekyllrb.com) as a means of getting support from the community. From 9278eb8fcec85b17573c6658d7d67ef6ea6ffb92 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 22 Jun 2016 12:15:07 -0700 Subject: [PATCH 1060/4996] utils: check that the object is a hash when merging default_proc Follow-up to #5026. --- lib/jekyll/utils.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index ca9e6fbad70..1f0af762edc 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -302,16 +302,11 @@ def merge_values(target, overwrite) private def merge_default_proc(target, overwrite) - if default_proc?(target) && default_proc?(overwrite) && target.default_proc.nil? + if target.is_a?(Hash) && overwrite.is_a?(Hash) && target.default_proc.nil? target.default_proc = overwrite.default_proc end end - private - def default_proc?(object) - object.respond_to?(:default_proc) - end - private def duplicate_frozen_values(target) target.each do |key, val| From 5312e85478c1051eac5734b1136918171b5f7d78 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 23 Jun 2016 09:32:14 -0700 Subject: [PATCH 1061/4996] Update history to reflect merge of #5025 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f092085d630..8ca2caaeeab 100644 --- a/History.markdown +++ b/History.markdown @@ -100,6 +100,7 @@ * Rubocop: lib/jekyll/command.rb (#5018) * rubocop: lib/jekyll/static_file.rb (#5019) * rubocop: lib/jekyll/utils.rb (#5026) + * rubocop: lib/jekyll/regenerator.rb (#5025) ### Site Enhancements From 6dd3cc21c40b98054851846425af06c64f9fb466 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 23 Jun 2016 18:48:25 -0700 Subject: [PATCH 1062/4996] Update history to reflect merge of #5024 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8ca2caaeeab..07344883d22 100644 --- a/History.markdown +++ b/History.markdown @@ -101,6 +101,7 @@ * rubocop: lib/jekyll/static_file.rb (#5019) * rubocop: lib/jekyll/utils.rb (#5026) * rubocop: lib/jekyll/regenerator.rb (#5025) + * rubocop: lib/jekyll/configuration.rb (#5024) ### Site Enhancements From aeca7a195e83b1fc3440435001d6e206bb41b639 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 23 Jun 2016 19:00:29 -0700 Subject: [PATCH 1063/4996] Run the unit tests in jruby. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 13c17f90550..57140623a67 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,8 @@ matrix: include: - rvm: 2.3.0 env: TEST_SUITE=fmt + - rvm: jruby-9.0.5.0 + env: TEST_SUITE=test env: matrix: - TEST_SUITE=test From 6f5ad2530e3e1dd028335ca10429516d10c52c26 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 23 Jun 2016 19:08:53 -0700 Subject: [PATCH 1064/4996] Only run tests with --profile when using MRI. --- script/rubies | 14 ++++++++++++++ script/test | 22 +++++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) create mode 100755 script/rubies diff --git a/script/rubies b/script/rubies new file mode 100755 index 00000000000..fb00ac61fd8 --- /dev/null +++ b/script/rubies @@ -0,0 +1,14 @@ +#!/bin/bash +# ----------------------------------------------------------------------------- +# If you send us a ruby then we use that, if you do not then we test with +# whatever we can detect, this way you can run both suites when you test out +# your source, we expect full coverage now, not just MRI. +# ----------------------------------------------------------------------------- + +rubies=() +for r in jruby ruby; do + if which "$r" > /dev/null 2>&1 + then + echo $r + fi +done diff --git a/script/test b/script/test index 5aab2f06cca..133b9807657 100755 --- a/script/test +++ b/script/test @@ -31,26 +31,26 @@ then shift else - rubies=() - for r in jruby ruby; do - if which "$r" - then - rubies+=( - $r - ) - fi - done + rubies=($(script/rubies)) fi + for ruby in $rubies; do + if [[ "$ruby" == "jruby" ]] + then + testopts="" + else + testopts="--profile" + fi + if [[ $# -lt 1 ]] then set -x time $ruby -S bundle exec \ - rake TESTOPTS='--profile' test + rake TESTOPTS=$testopts test else set -x time $ruby -S bundle exec ruby -Itest \ - "$@" --profile + "$@" $testops fi done From b156aa912a0d36ea9d315ee02154511ccf6ed732 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Sat, 25 Jun 2016 14:56:12 +0300 Subject: [PATCH 1065/4996] rubocop: fix code style --- lib/jekyll/document.rb | 101 +++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index cc0e91b24d3..6703a613cbe 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -7,9 +7,9 @@ class Document attr_reader :path, :site, :extname, :collection attr_accessor :content, :output - YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m - DATELESS_FILENAME_MATCHER = /^(.+\/)*(.*)(\.[^.]+)$/ - DATE_FILENAME_MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ + YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m + DATELESS_FILENAME_MATCHER = %r!^(?:.+/)*(.*)(\.[^.]+)$! + DATE_FILENAME_MATCHER = %r!^(?:.+/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$! # Create a new Document. # @@ -51,16 +51,16 @@ def data # # Returns the merged data. def merge_data!(other, source: "YAML front matter") - if other.key?('categories') && !other['categories'].nil? - if other['categories'].is_a?(String) - other['categories'] = other['categories'].split(" ").map(&:strip) + if other.key?("categories") && !other["categories"].nil? + if other["categories"].is_a?(String) + other["categories"] = other["categories"].split(" ").map(&:strip) end - other['categories'] = (data['categories'] || []) | other['categories'] + other["categories"] = (data["categories"] || []) | other["categories"] end Utils.deep_merge_hashes!(data, other) - if data.key?('date') && !data['date'].is_a?(Time) - data['date'] = Utils.parse_date( - data['date'].to_s, + if data.key?("date") && !data["date"].is_a?(Time) + data["date"] = Utils.parse_date( + data["date"].to_s, "Document '#{relative_path}' does not have a valid date in the #{source}." ) end @@ -68,7 +68,7 @@ def merge_data!(other, source: "YAML front matter") end def date - data['date'] ||= (draft? ? source_file_mtime : site.time) + data["date"] ||= (draft? ? source_file_mtime : site.time) end def source_file_mtime @@ -81,7 +81,8 @@ def source_file_mtime # # Returns whether the document is a draft. def draft? - data['draft'] ||= relative_path.index(collection.relative_directory).nil? && collection.label == "posts" + data["draft"] ||= relative_path.index(collection.relative_directory).nil? && + collection.label == "posts" end # The path to the document, relative to the site source. @@ -89,7 +90,8 @@ def draft? # Returns a String path which represents the relative path # from the site source to this document def relative_path - @relative_path ||= Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s + @relative_path ||= Pathname.new(path) + .relative_path_from(Pathname.new(site.source)).to_s end # The output extension of the document. @@ -103,7 +105,7 @@ def output_ext # # Returns the basename without the file extname. def basename_without_ext - @basename_without_ext ||= File.basename(path, '.*') + @basename_without_ext ||= File.basename(path, ".*") end # The base filename of the document. @@ -156,7 +158,7 @@ def sass_file? # # Returns true if extname == .coffee, false otherwise. def coffeescript_file? - '.coffee'.eql?(extname) + ".coffee" == extname end # Determine whether the file should be rendered with Liquid. @@ -195,7 +197,7 @@ def url_placeholders # # Returns the permalink or nil if no permalink was set in the data. def permalink - data && data.is_a?(Hash) && data['permalink'] + data && data.is_a?(Hash) && data["permalink"] end # The computed URL for the document. See `Jekyll::URL#to_s` for more details. @@ -203,9 +205,9 @@ def permalink # Returns the computed URL for the document. def url @url = URL.new({ - :template => url_template, + :template => url_template, :placeholders => url_placeholders, - :permalink => permalink + :permalink => permalink }).to_s end @@ -237,18 +239,17 @@ def destination(base_directory) def write(dest) path = destination(dest) FileUtils.mkdir_p(File.dirname(path)) - File.open(path, 'wb') do |f| - f.write(output) - end + File.write(path, output, :mode => "wb") trigger_hooks(:post_write) end # Whether the file is published or not, as indicated in YAML front-matter # - # Returns true if the 'published' key is specified in the YAML front-matter and not `false`. + # Returns 'false' if the 'published' key is specified in the + # YAML front-matter and is 'false'. Otherwise returns 'true'. def published? - !(data.key?('published') && data['published'] == false) + !(data.key?("published") && data["published"] == false) end # Read in the file and assign the content and data based on the file contents. @@ -263,23 +264,24 @@ def read(opts = {}) @data = SafeYAML.load_file(path) else begin - defaults = @site.frontmatter_defaults.all(relative_path, collection.label.to_sym) - merge_data!(defaults, source: "front matter defaults") unless defaults.empty? + defaults = @site.frontmatter_defaults.all( + relative_path, + collection.label.to_sym + ) + merge_data!(defaults, :source => "front matter defaults") unless defaults.empty? self.content = File.read(path, Utils.merged_file_read_opts(site, opts)) if content =~ YAML_FRONT_MATTER_REGEXP self.content = $POSTMATCH data_file = SafeYAML.load(Regexp.last_match(1)) - merge_data!(data_file, source: "YAML front matter") if data_file + merge_data!(data_file, :source => "YAML front matter") if data_file end post_read rescue SyntaxError => e Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{e.message}" - rescue Exception => e - if e.is_a? Jekyll::Errors::FatalException - raise e - end + rescue => e + raise e if e.is_a? Jekyll::Errors::FatalException Jekyll.logger.error "Error:", "could not read file #{path}: #{e.message}" end end @@ -287,19 +289,19 @@ def read(opts = {}) def post_read if relative_path =~ DATE_FILENAME_MATCHER - date, slug, ext = $2, $3, $4 - if !data['date'] || data['date'].to_i == site.time.to_i - merge_data!({"date" => date}, source: "filename") + date, slug, ext = Regexp.last_match.captures + if !data["date"] || data["date"].to_i == site.time.to_i + merge_data!({ "date" => date }, :source => "filename") end elsif relative_path =~ DATELESS_FILENAME_MATCHER - slug, ext = $2, $3 + slug, ext = Regexp.last_match.captures end # Try to ensure the user gets a title. data["title"] ||= Utils.titleize_slug(slug) # Only overwrite slug & ext if they aren't specified. - data['slug'] ||= slug - data['ext'] ||= ext + data["slug"] ||= slug + data["ext"] ||= ext populate_categories populate_tags @@ -312,16 +314,19 @@ def post_read # # Returns nothing. def categories_from_path(special_dir) - superdirs = relative_path.sub(/#{special_dir}(.*)/, '').split(File::SEPARATOR).reject do |c| + superdirs = relative_path.sub(%r!#{special_dir}(.*)!, "") + .split(File::SEPARATOR) + .reject do |c| c.empty? || c.eql?(special_dir) || c.eql?(basename) end - merge_data!({ 'categories' => superdirs }, source: "file path") + merge_data!({ "categories" => superdirs }, :source => "file path") end def populate_categories merge_data!({ - 'categories' => ( - Array(data['categories']) + Utils.pluralized_array_from_hash(data, 'category', 'categories') + "categories" => ( + Array(data["categories"]) + + Utils.pluralized_array_from_hash(data, "category", "categories") ).map(&:to_s).flatten.uniq }) end @@ -351,7 +356,7 @@ def inspect # # Returns the content of the document def to_s - output || content || 'NO CONTENT' + output || content || "NO CONTENT" end # Compare this document against another document. @@ -361,7 +366,7 @@ def to_s # equal or greater than the other doc's path. See String#<=> for more details. def <=>(other) return nil unless other.respond_to?(:data) - cmp = data['date'] <=> other.data['date'] + cmp = data["date"] <=> other.data["date"] cmp = path <=> other.path if cmp.nil? || cmp == 0 cmp end @@ -380,7 +385,7 @@ def write? # # Returns the document excerpt_separator def excerpt_separator - (data['excerpt_separator'] || site.config['excerpt_separator']).to_s + (data["excerpt_separator"] || site.config["excerpt_separator"]).to_s end # Whether to generate an excerpt @@ -394,8 +399,6 @@ def next_doc pos = collection.docs.index { |post| post.equal?(self) } if pos && pos < collection.docs.length - 1 collection.docs[pos + 1] - else - nil end end @@ -403,8 +406,6 @@ def previous_doc pos = collection.docs.index { |post| post.equal?(self) } if pos && pos > 0 collection.docs[pos - 1] - else - nil end end @@ -414,7 +415,7 @@ def trigger_hooks(hook_name, *args) end def id - @id ||= File.join(File.dirname(url), (data['slug'] || basename_without_ext).to_s) + @id ||= File.join(File.dirname(url), (data["slug"] || basename_without_ext).to_s) end # Calculate related posts. @@ -433,8 +434,8 @@ def respond_to?(method, include_private = false) # Override of method_missing to check in @data for the key. def method_missing(method, *args, &blck) if data.key?(method.to_s) - Jekyll.logger.warn "Deprecation:", "Document##{method} is now a key in the #data hash." - Jekyll.logger.warn "", "Called by #{caller.first}." + Jekyll::Deprecator.deprecation_message "Document##{method} is now a key "\ + "in the #data hash. Called by #{caller.first}." data[method.to_s] else super From 2bbad7cb43f9594a937b7b66b296cc1aba471bbc Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Sat, 25 Jun 2016 15:11:50 +0300 Subject: [PATCH 1066/4996] rubocop: fix code style --- lib/jekyll/convertible.rb | 50 +++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index a5d356071f1..bfb80c7a74b 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -1,6 +1,6 @@ # encoding: UTF-8 -require 'set' +require "set" # Convertible provides methods for converting a pagelike item # from a certain type of markup into actual content @@ -20,12 +20,12 @@ module Jekyll module Convertible # Returns the contents as a String. def to_s - content || '' + content || "" end # Whether the file is published or not, as indicated in YAML front-matter def published? - !(data.key?('published') && data['published'] == false) + !(data.key?("published") && data["published"] == false) end # Read the YAML frontmatter. @@ -47,7 +47,7 @@ def read_yaml(base, name, opts = {}) end rescue SyntaxError => e Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" - rescue Exception => e + rescue => e Jekyll.logger.warn "Error reading file #{filename}: #{e.message}" end @@ -61,12 +61,13 @@ def read_yaml(base, name, opts = {}) def validate_data!(filename) unless self.data.is_a?(Hash) - raise Errors::InvalidYAMLFrontMatterError, "Invalid YAML front matter in #{filename}" + raise Errors::InvalidYAMLFrontMatterError, + "Invalid YAML front matter in #{filename}" end end def validate_permalink!(filename) - if self.data['permalink'] && self.data['permalink'].size == 0 + if self.data["permalink"] && self.data["permalink"].empty? raise Errors::InvalidPermalinkError, "Invalid permalink in #{filename}" end end @@ -79,7 +80,10 @@ def transform begin converter.convert output rescue => e - Jekyll.logger.error "Conversion error:", "#{converter.class} encountered an error while converting '#{path}':" + Jekyll.logger.error( + "Conversion error:", + "#{converter.class} encountered an error while converting '#{path}':" + ) Jekyll.logger.error("", e.to_s) raise e end @@ -112,12 +116,17 @@ def converters 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}" + Jekyll.logger.error( + "Liquid Exception:", + "#{e.message} in #{e.path}, included in #{path || self.path}" + ) raise e + # rubocop: disable RescueException rescue Exception => e Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{path || self.path}" raise e end + # rubocop: enable RescueException # Convert this Convertible's data to a Hash suitable for use by Liquid. # @@ -168,7 +177,7 @@ def sass_file? # # Returns true if extname == .coffee, false otherwise. def coffeescript_file? - '.coffee'.eql?(ext) + ".coffee" == ext end # Determine whether the file should be rendered with Liquid. @@ -205,7 +214,10 @@ def render_all_layouts(layouts, payload, info) # recursively render layouts layout = layouts[data["layout"]] - Jekyll.logger.warn("Build Warning:", "Layout '#{data["layout"]}' requested in #{path} does not exist.") if invalid_layout? layout + Jekyll.logger.warn( + "Build Warning:", + "Layout '#{data["layout"]}' requested in #{path} does not exist." + ) if invalid_layout? layout used = Set.new([layout]) @@ -228,12 +240,9 @@ def render_all_layouts(layouts, payload, info) site.in_source_dir(layout.path) ) - if layout = layouts[layout.data["layout"]] - if used.include?(layout) - layout = nil # avoid recursive chain - else - used << layout - end + if (layout = layouts[layout.data["layout"]]) + break if used.include?(layout) + used << layout end end end @@ -249,7 +258,10 @@ def do_layout(payload, layouts) Jekyll.logger.debug "Pre-Render Hooks:", self.relative_path Jekyll::Hooks.trigger hook_owner, :pre_render, self, payload - info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload["page"] } } + info = { + :filters => [Jekyll::Filters], + :registers => { :site => site, :page => payload["page"] } + } # render and transform content (this becomes the final content of the object) payload["highlighter_prefix"] = converters.first.highlighter_prefix @@ -278,9 +290,7 @@ def do_layout(payload, layouts) def write(dest) path = destination(dest) FileUtils.mkdir_p(File.dirname(path)) - File.open(path, 'wb') do |f| - f.write(output) - end + File.write(path, output, :mode => "wb") Jekyll::Hooks.trigger hook_owner, :post_write, self end From 3ccc91430f61374efa0045d6b187d27b9b263e7f Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Sat, 25 Jun 2016 15:22:36 +0300 Subject: [PATCH 1067/4996] rubocop: fix code style --- lib/jekyll/renderer.rb | 45 ++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 87f327d6c67..143fe73eefb 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -38,21 +38,21 @@ def run payload["paginator"] = document.pager.to_liquid end - if document.is_a?(Document) && document.collection.label == 'posts' - payload['site']['related_posts'] = document.related_posts + if document.is_a?(Document) && document.collection.label == "posts" + payload["site"]["related_posts"] = document.related_posts else - payload['site']['related_posts'] = nil + payload["site"]["related_posts"] = nil end # render and transform content (this becomes the final content of the object) - payload['highlighter_prefix'] = converters.first.highlighter_prefix - payload['highlighter_suffix'] = converters.first.highlighter_suffix + payload["highlighter_prefix"] = converters.first.highlighter_prefix + payload["highlighter_suffix"] = converters.first.highlighter_suffix Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path document.trigger_hooks(:pre_render, payload) info = { - :registers => { :site => site, :page => payload['page'] } + :registers => { :site => site, :page => payload["page"] } } output = document.content @@ -88,7 +88,9 @@ def convert(content) begin converter.convert output rescue => e - Jekyll.logger.error "Conversion error:", "#{converter.class} encountered an error while converting '#{document.relative_path}':" + Jekyll.logger.error "Conversion error:", + "#{converter.class} encountered an error while "\ + "converting '#{document.relative_path}':" Jekyll.logger.error("", e.to_s) raise e end @@ -106,12 +108,16 @@ def convert(content) def render_liquid(content, payload, info, path = nil) 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}" + Jekyll.logger.error "Liquid Exception:", + "#{e.message} in #{e.path}, included in #{path || document.relative_path}" raise e + # rubocop: disable RescueException rescue Exception => e - Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{path || document.relative_path}" + Jekyll.logger.error "Liquid Exception:", + "#{e.message} in #{path || document.relative_path}" raise e end + # rubocop: enable RescueException # Checks if the layout specified in the document actually exists # @@ -132,16 +138,20 @@ def place_in_layouts(content, payload, info) output = content.dup layout = site.layouts[document.data["layout"]] - Jekyll.logger.warn("Build Warning:", "Layout '#{document.data["layout"]}' requested in #{document.relative_path} does not exist.") if invalid_layout? layout + Jekyll.logger.warn( + "Build Warning:", + "Layout '#{document.data["layout"]}' requested in "\ + "#{document.relative_path} does not exist." + ) if invalid_layout? layout - used = Set.new([layout]) + used = Set.new([layout]) # Reset the payload layout data to ensure it starts fresh for each page. payload["layout"] = nil while layout - payload['content'] = output - payload['layout'] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) + payload["content"] = output + payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) output = render_liquid( layout.content, @@ -156,12 +166,9 @@ def place_in_layouts(content, payload, info) site.in_source_dir(layout.path) ) if document.write? - if layout = site.layouts[layout.data["layout"]] - if used.include?(layout) - layout = nil # avoid recursive chain - else - used << layout - end + if (layout = site.layouts[layout.data["layout"]]) + break if used.include?(layout) + used << layout end end From 6ddd64d4c4469ed6a056a13a5d5e7c41233dd59f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 25 Jun 2016 14:46:32 -0700 Subject: [PATCH 1068/4996] Update history to reflect merge of #5032 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 07344883d22..df8ffeb5a72 100644 --- a/History.markdown +++ b/History.markdown @@ -102,6 +102,7 @@ * rubocop: lib/jekyll/utils.rb (#5026) * rubocop: lib/jekyll/regenerator.rb (#5025) * rubocop: lib/jekyll/configuration.rb (#5024) + * rubocop: lib/jekyll/renderer.rb style fixes (#5032) ### Site Enhancements From 390c98045c1c93a21cd026173605bae5c00d7203 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 25 Jun 2016 14:47:30 -0700 Subject: [PATCH 1069/4996] Update history to reflect merge of #5031 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index df8ffeb5a72..26abe6e3eca 100644 --- a/History.markdown +++ b/History.markdown @@ -103,6 +103,7 @@ * rubocop: lib/jekyll/regenerator.rb (#5025) * rubocop: lib/jekyll/configuration.rb (#5024) * rubocop: lib/jekyll/renderer.rb style fixes (#5032) + * rubocop: lib/jekyll/convertible.rb style fixes (#5031) ### Site Enhancements From 8154eb40aa6c93c5a8c6c31446618f0655ec5ed7 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Sun, 26 Jun 2016 16:43:56 +0200 Subject: [PATCH 1070/4996] rubocop: separate deprecator error messages --- lib/jekyll/document.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 6703a613cbe..e160e64009e 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -435,7 +435,8 @@ def respond_to?(method, include_private = false) def method_missing(method, *args, &blck) if data.key?(method.to_s) Jekyll::Deprecator.deprecation_message "Document##{method} is now a key "\ - "in the #data hash. Called by #{caller.first}." + "in the #data hash." + Jekyll::Deprecator.deprecation_message "Called by #{caller.first}." data[method.to_s] else super From 18a8b4dcc7925208135685b601d59b2b6128481a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 27 Jun 2016 09:48:48 -0700 Subject: [PATCH 1071/4996] Update history to reflect merge of #5030 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 26abe6e3eca..a6a8d81887b 100644 --- a/History.markdown +++ b/History.markdown @@ -104,6 +104,7 @@ * rubocop: lib/jekyll/configuration.rb (#5024) * rubocop: lib/jekyll/renderer.rb style fixes (#5032) * rubocop: lib/jekyll/convertible.rb style fixes (#5031) + * rubocop: lib/jekyll/document.rb style fixes (#5030) ### Site Enhancements From 3a76ddf7a207a0d1048f8d363803c92e59d7a8a5 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 28 Jun 2016 12:38:46 -0700 Subject: [PATCH 1072/4996] script/fmt: print Rubocop version --- script/fmt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/fmt b/script/fmt index 360b6e53419..e9f9d9fb0a5 100755 --- a/script/fmt +++ b/script/fmt @@ -1,3 +1,3 @@ #!/bin/sh - +bundle exec rubocop --version bundle exec rubocop -D $@ From 12c1ada0e582a37427761fec0f9917ca975c317d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 28 Jun 2016 12:43:15 -0700 Subject: [PATCH 1073/4996] test: skip openssl test for jruby --- test/test_commands_serve.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 50fe9f8357e..244ca444f01 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -114,6 +114,8 @@ def custom_opts(what) end should "allow SSL with a key and cert" do + skip "JRuby does not have OpenSSL bindings." if jruby? + expect(OpenSSL::PKey::RSA).to receive(:new).and_return("c2") expect(OpenSSL::X509::Certificate).to receive(:new).and_return("c1") allow(File).to receive(:read).and_return("foo") From 89c6b0ec0de27e7b99c53fb6e2f27258cbea1d6a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 28 Jun 2016 12:43:34 -0700 Subject: [PATCH 1074/4996] travis: do not run 'bundle update' any longer. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 57140623a67..f33cba09c11 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,3 @@ -before_script: bundle update bundler_args: --without benchmark:site:development script: script/cibuild cache: bundler From 2ef70fd34860e0c067117c5fdd587d6eb9b06664 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 28 Jun 2016 14:39:06 -0700 Subject: [PATCH 1075/4996] Some weird stuff with Colorator on my machine & jruby. --- test/test_configuration.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/test/test_configuration.rb b/test/test_configuration.rb index eddb2c96d0d..0e0a69c7052 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -1,4 +1,5 @@ require "helper" +require "colorator" class TestConfiguration < JekyllUnitTest test_config = { @@ -260,7 +261,9 @@ class TestConfiguration < JekyllUnitTest allow(SafeYAML).to receive(:load_file).with(@path) do raise SystemCallError, "No such file or directory - #{@path}" end - allow($stderr).to receive(:puts).with("Configuration file: none".yellow) + allow($stderr).to receive(:puts).with( + Colorator.yellow("Configuration file: none") + ) assert_equal site_configuration, Jekyll.configuration(test_config) end @@ -275,13 +278,12 @@ class TestConfiguration < JekyllUnitTest allow($stderr) .to receive(:puts) .and_return( - ("WARNING: " - .rjust(20) + "Error reading configuration. Using defaults (and options).") - .yellow + "WARNING: ".rjust(20) + + Colorator.yellow("Error reading configuration. Using defaults (and options).") ) allow($stderr) .to receive(:puts) - .and_return("Configuration file: (INVALID) #{@path}".yellow) + .and_return(Colorator.yellow("Configuration file: (INVALID) #{@path}")) assert_equal site_configuration, Jekyll.configuration(test_config) end @@ -291,10 +293,10 @@ class TestConfiguration < JekyllUnitTest end allow($stderr) .to receive(:puts) - .with(( + .with(Colorator.red( "Fatal: ".rjust(20) + \ "The configuration file '#{@user_config}' could not be found." - ).red) + )) assert_raises LoadError do Jekyll.configuration({ "config" => [@user_config] }) end From 6f3c01ca8772434f8e205bd7c06c0750233cec92 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 28 Jun 2016 18:30:02 -0700 Subject: [PATCH 1076/4996] Fix for jruby --- Gemfile | 2 ++ test/test_commands_serve.rb | 3 +-- test/test_utils.rb | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 253826aa58f..3dc758eff61 100644 --- a/Gemfile +++ b/Gemfile @@ -23,6 +23,8 @@ group :test do gem "nokogiri" gem "rspec" gem "test-theme", path: File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) + + gem "jruby-openssl" if RUBY_ENGINE == "jruby" end # diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 244ca444f01..f129a07ece2 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -1,6 +1,7 @@ require "webrick" require "mercenary" require "helper" +require "openssl" class TestCommandsServe < JekyllUnitTest def custom_opts(what) @@ -114,8 +115,6 @@ def custom_opts(what) end should "allow SSL with a key and cert" do - skip "JRuby does not have OpenSSL bindings." if jruby? - expect(OpenSSL::PKey::RSA).to receive(:new).and_return("c2") expect(OpenSSL::X509::Certificate).to receive(:new).and_return("c1") allow(File).to receive(:read).and_return("foo") diff --git a/test/test_utils.rb b/test/test_utils.rb index e2a50c58332..5fbb99fcada 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -320,7 +320,7 @@ class TestUtils < JekyllUnitTest context "The \`Utils.safe_glob\` method" do should "not apply pattern to the dir" do dir = "test/safe_glob_test[" - assert_equal [], Dir.glob(dir + "/*") + assert_equal [], Dir.glob(dir + "/*") unless jruby? assert_equal ["test/safe_glob_test[/find_me.txt"], Utils.safe_glob(dir, "*") end From a7d25ed9631f319fbbb27a3b6ec7a23e25e32046 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 28 Jun 2016 22:08:06 -0700 Subject: [PATCH 1077/4996] Fix rubocop offenses on master. --- exe/jekyll | 2 +- lib/jekyll/entry_filter.rb | 2 +- test/test_filters.rb | 2 +- test/test_kramdown.rb | 2 +- test/test_page.rb | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/exe/jekyll b/exe/jekyll index 997c64b0155..c233dd1ad47 100755 --- a/exe/jekyll +++ b/exe/jekyll @@ -1,7 +1,7 @@ #!/usr/bin/env ruby STDOUT.sync = true -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w( .. lib ))) +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w(.. lib))) require "jekyll" require "mercenary" diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index 9ec02dd4b09..6063607edfe 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -2,7 +2,7 @@ module Jekyll class EntryFilter attr_reader :site SPECIAL_LEADING_CHARACTERS = [ - ".", "_", '#', "~" + ".", "_", "#", "~" ].freeze def initialize(site, base_directory = nil) diff --git a/test/test_filters.rb b/test/test_filters.rb index 1a9c7882a92..fa0f9e52180 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -22,7 +22,7 @@ def initialize(opts = {}) "destination" => dest_dir, "timezone" => "UTC" }) - @sample_time = Time.utc(2013, 03, 27, 11, 22, 33) + @sample_time = Time.utc(2013, 3, 27, 11, 22, 33) @sample_date = Date.parse("2013-03-27") @time_as_string = "September 11, 2001 12:46:30 -0000" @time_as_numeric = 1_399_680_607 diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index e8d494ae217..0a6332f8bdd 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -28,7 +28,7 @@ class TestKramdown < JekyllUnitTest end should "run Kramdown" do - assert_equal "

    Some Header

    ", @markdown.convert('# Some Header #').strip + assert_equal "

    Some Header

    ", @markdown.convert("# Some Header #").strip end context "when asked to convert smart quotes" do diff --git a/test/test_page.rb b/test/test_page.rb index 9b27af7f13a..ba79514e8f2 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -39,7 +39,7 @@ def do_render(page) end should "create url with non-alphabetic characters" do - @page = setup_page("+", '%# +.md') + @page = setup_page("+", "%# +.md") assert_equal "/+/%25%23%20+.html", @page.url end @@ -268,12 +268,12 @@ def do_render(page) end should "write even when permalink has '%# +'" do - page = setup_page("+", '%# +.md') + page = setup_page("+", "%# +.md") do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) - assert_exist dest_dir("+", '%# +.html') + assert_exist dest_dir("+", "%# +.html") end should "write properly without html extension" do From a072e9d25f3fcb83382cf92d9c2498c6bf37962d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 29 Jun 2016 00:55:11 -0700 Subject: [PATCH 1078/4996] Ping our Travis overlords. From 70aa8a4e37cdbb935d8aacda3d6c6b598c2c91bb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 29 Jun 2016 12:18:41 -0700 Subject: [PATCH 1079/4996] Update history to reflect merge of #5015 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a6a8d81887b..4be8a5559e2 100644 --- a/History.markdown +++ b/History.markdown @@ -105,6 +105,7 @@ * rubocop: lib/jekyll/renderer.rb style fixes (#5032) * rubocop: lib/jekyll/convertible.rb style fixes (#5031) * rubocop: lib/jekyll/document.rb style fixes (#5030) + * Remove ruby-head from Travis matrix & fix jruby failures (#5015) ### Site Enhancements From 5a1a7e1056a3e9c19ad2f47614068d1034fae6dd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 29 Jun 2016 14:13:09 -0700 Subject: [PATCH 1080/4996] Remove the plugin_theme metadata field. Not useful. --- lib/theme_template/theme.gemspec.erb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/theme_template/theme.gemspec.erb b/lib/theme_template/theme.gemspec.erb index 1c3b7ee462f..13d795ce16e 100644 --- a/lib/theme_template/theme.gemspec.erb +++ b/lib/theme_template/theme.gemspec.erb @@ -10,8 +10,6 @@ Gem::Specification.new do |spec| spec.homepage = "TODO: Put your gem's website or public repo URL here." spec.license = "MIT" - spec.metadata["plugin_type"] = "theme" - spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(exe|<%= theme_directories.join("|") %>)/}) } spec.bindir = "exe" spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } From 4b7109d2735905491c3c31bf0a698cba0cafdf05 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 29 Jun 2016 14:15:02 -0700 Subject: [PATCH 1081/4996] Themes won't have executables. --- lib/theme_template/theme.gemspec.erb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/theme_template/theme.gemspec.erb b/lib/theme_template/theme.gemspec.erb index 13d795ce16e..dac6ed39bfd 100644 --- a/lib/theme_template/theme.gemspec.erb +++ b/lib/theme_template/theme.gemspec.erb @@ -10,9 +10,7 @@ Gem::Specification.new do |spec| spec.homepage = "TODO: Put your gem's website or public repo URL here." spec.license = "MIT" - spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(exe|<%= theme_directories.join("|") %>)/}) } - spec.bindir = "exe" - spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(<%= theme_directories.join("|") %>)/}) } spec.add_development_dependency "jekyll", "~> <%= jekyll_version_with_minor %>" spec.add_development_dependency "bundler", "~> 1.12" From 0599f114d6cf951888b5f68e27e8609a8a5a4edc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 29 Jun 2016 15:11:52 -0700 Subject: [PATCH 1082/4996] Only add a CODE_OF_CONDUCT.md file if specified. --- lib/jekyll/commands/new_theme.rb | 11 +++++++---- lib/jekyll/theme_builder.rb | 9 ++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/commands/new_theme.rb b/lib/jekyll/commands/new_theme.rb index 08eb4291a44..a703ca852c1 100644 --- a/lib/jekyll/commands/new_theme.rb +++ b/lib/jekyll/commands/new_theme.rb @@ -6,20 +6,23 @@ def init_with_program(prog) prog.command(:"new-theme") do |c| c.syntax "new-theme NAME" c.description "Creates a new Jekyll theme scaffold" + c.option "code_of_conduct", \ + "-c", "--code-of-conduct", \ + "Include a Code of Conduct. (defaults to false)" - c.action do |args, _| - Jekyll::Commands::NewTheme.process(args) + c.action do |args, opts| + Jekyll::Commands::NewTheme.process(args, opts) end end end - def process(args) + def process(args, opts) if !args || args.empty? raise Jekyll::Errors::InvalidThemeName, "You must specify a theme name." end new_theme_name = args.join("_") - theme = Jekyll::ThemeBuilder.new(new_theme_name) + theme = Jekyll::ThemeBuilder.new(new_theme_name, opts) if theme.path.exist? Jekyll.logger.abort_with "Conflict:", "#{theme.path} already exists." end diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index b0e82e3a83d..0145ff3cec2 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -3,11 +3,12 @@ class Jekyll::ThemeBuilder _layouts _includes _sass ).freeze - attr_reader :name, :path + attr_reader :name, :path, :code_of_conduct - def initialize(theme_name) + def initialize(theme_name, opts) @name = theme_name.to_s.tr(" ", "_").gsub(%r!_+!, "_") @path = Pathname.new(File.expand_path(name, Dir.pwd)) + @code_of_conduct = !!opts["code_of_conduct"] end def create! @@ -71,7 +72,9 @@ def create_gemspec end def create_accessories - %w(README.md Rakefile CODE_OF_CONDUCT.md LICENSE.txt).each do |filename| + accessories = %w(README.md Rakefile LICENSE.txt) + accessories << "CODE_OF_CONDUCT.md" if code_of_conduct + accessories.each do |filename| write_file(filename, template(filename)) end end From 897f0c52fa67da1c1fc9fe60d5ab8715c733241e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 29 Jun 2016 15:17:04 -0700 Subject: [PATCH 1083/4996] Add test for CoC flag. --- features/theme.feature | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/features/theme.feature b/features/theme.feature index ae18d3a6e60..0e05d693790 100644 --- a/features/theme.feature +++ b/features/theme.feature @@ -8,6 +8,12 @@ Feature: Writing themes Then I should get a zero exit status And the my-cool-theme directory should exist + Scenario: Generating a new theme scaffold with a code of conduct + When I run jekyll new-theme my-cool-theme --code-of-conduct + Then I should get a zero exit status + And the my-cool-theme directory should exist + And the "my-cool-theme/CODE_OF_CONDUCT.md" file should exist + Scenario: A theme with SCSS Given I have a configuration file with "theme" set to "test-theme" And I have a css directory From c26173079947e92fdf5acb991d63109c4b1168f2 Mon Sep 17 00:00:00 2001 From: Alex Ivkin Date: Wed, 29 Jun 2016 21:30:42 -0700 Subject: [PATCH 1084/4996] Art gallery generator plugin added --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 3969406845a..ed2c239b898 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -751,6 +751,7 @@ LESS.js files during generation. - [Jekyll Flickr Plugin](https://github.com/lawmurray/indii-jekyll-flickr) by [Lawrence Murray](http://www.indii.org): Generates posts for photos uploaded to a Flickr photostream. - [Jekyll::Paginate::Category](https://github.com/midnightSuyama/jekyll-paginate-category): Pagination Generator for Jekyll Category. - [AMP-Jekyll by Juuso Mikkonen](https://github.com/juusaw/amp-jekyll): Generate [Accelerated Mobile Pages](https://www.ampproject.org) of Jekyll posts. +- [Jekyll Art Gallery plugin](https://github.com/alexivkin/Jekyll-Art-Gallery-Plugin): An advanced art/photo gallery generation plugin for creating galleries from a set of image folders. Supports image tagging, thumbnails, sorting, image rotation, post-processing (remove EXIF, add watermark), multiple collections and much more. #### Converters From 2f8c0ffc5d7cf3225d082f79bd735082d530ce8a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 30 Jun 2016 10:37:16 -0700 Subject: [PATCH 1085/4996] Update history to reflect merge of #5043 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4be8a5559e2..5bea9dc16d6 100644 --- a/History.markdown +++ b/History.markdown @@ -161,6 +161,7 @@ * Update text to be consitent with example (#5010) * Update template links to point to core Liquid site (#5012) * Add generator-jekyllized to third-party plugins (#5027) + * Add Jekyll Art Hallery generator plugin to list of third-party plugins (#5043) ## 3.1.6 / 2016-05-19 From dcc896080619e45f6299dffa02fba2f68da7c615 Mon Sep 17 00:00:00 2001 From: Stephen Checkoway Date: Sun, 3 Jul 2016 13:28:33 -0500 Subject: [PATCH 1086/4996] Enable strict (or lax) liquid parsing. Insert liquid: error_mode: strict # or lax or warn in _config.yml to change the error mode. --- lib/jekyll/configuration.rb | 4 ++++ lib/jekyll/liquid_renderer.rb | 1 + 2 files changed, 5 insertions(+) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index bcd13d0bf84..8d57f666f94 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -55,6 +55,10 @@ class Configuration < Hash "verbose" => false, "defaults" => [], + "liquid" => { + "error_mode" => "warn" + }, + "rdiscount" => { "extensions" => [] }, diff --git a/lib/jekyll/liquid_renderer.rb b/lib/jekyll/liquid_renderer.rb index 30f798bc185..9110cb13d96 100644 --- a/lib/jekyll/liquid_renderer.rb +++ b/lib/jekyll/liquid_renderer.rb @@ -5,6 +5,7 @@ module Jekyll class LiquidRenderer def initialize(site) @site = site + Liquid::Template.error_mode = @site.config["liquid"]["error_mode"].to_sym reset end From ac552cd4e4d57c23b05ca404469a8a855e17dff5 Mon Sep 17 00:00:00 2001 From: Andrew Munsell Date: Mon, 4 Jul 2016 16:15:48 -0700 Subject: [PATCH 1087/4996] Add Formingo to the list of Jekyll form SaaS Formingo (https://www.formingo.co) is a new service I'm working on that handles form processing for static websites, such as those generated through Jekyll. Adding it to the list of form services because I believe it'd be a helpful resource and alternative to some of the other listed services. --- site/_docs/resources.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/resources.md b/site/_docs/resources.md index 6d585a599dd..44db27dbfff 100644 --- a/site/_docs/resources.md +++ b/site/_docs/resources.md @@ -22,6 +22,7 @@ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, ext - [Formspree (also open source)](http://formspree.io/) - [FormKeep](https://formkeep.com/guides/contact-form-jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=contact-form-jekyll) - [Simple Form](http://getsimpleform.com/) + - [Formingo](https://www.formingo.co/guides/jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=Jekyll%20Documentation) - [Jekyll Bootstrap](http://jekyllbootstrap.com), 0 to Blog in 3 minutes. Provides detailed explanations, examples, and helper-code to make getting started with Jekyll easier. - [Integrating Twitter with Jekyll](http://www.justkez.com/integrating-twitter-with-jekyll/) > “Having migrated Justkez.com to be based on Jekyll, I was pondering how I might include my recent twitterings on the front page of the site. In the WordPress world, this would have been done via a plugin which may or may not have hung the loading of the page, might have employed caching, but would certainly have had some overheads. … Not in Jekyll.” From 51a80b8225df64c17be4e596571a69a6712b4f8f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 5 Jul 2016 10:19:29 -0700 Subject: [PATCH 1088/4996] Update history to reflect merge of #5054 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5bea9dc16d6..f3b54c3ae53 100644 --- a/History.markdown +++ b/History.markdown @@ -162,6 +162,7 @@ * Update template links to point to core Liquid site (#5012) * Add generator-jekyllized to third-party plugins (#5027) * Add Jekyll Art Hallery generator plugin to list of third-party plugins (#5043) + * Add Formingo to the list of Jekyll form SaaS (#5054) ## 3.1.6 / 2016-05-19 From 72d49490d245444cebaf0503063110e43f06b70a Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Tue, 5 Jul 2016 21:22:24 +0300 Subject: [PATCH 1089/4996] Add fetch method to Drops --- lib/jekyll/drops/drop.rb | 4 ++++ test/test_drop.rb | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 test/test_drop.rb diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index ebd3b4d2e37..b79544fe188 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -199,6 +199,10 @@ def merge!(other) end end end + + def fetch(*args, &block) + to_h.fetch(*args, &block) + end end end end diff --git a/test/test_drop.rb b/test/test_drop.rb new file mode 100644 index 00000000000..e0f1884c807 --- /dev/null +++ b/test/test_drop.rb @@ -0,0 +1,34 @@ +require "helper" + +class TestDrop < JekyllUnitTest + context "a document drop" do + setup do + @site = fixture_site({ + "collections" => ["methods"] + }) + @site.process + @document = @site.collections["methods"].docs.detect do |d| + d.relative_path == "_methods/configuration.md" + end + @drop = @document.to_liquid + end + + should "raise KeyError if key is not found and no default provided" do + assert_raises KeyError do + @drop.fetch("not_existing_key") + end + end + + should "fetch value without default" do + assert_equal "Jekyll.configuration", @drop.fetch("title") + end + + should "fetch default if key is not found" do + assert_equal "default", @drop.fetch("not_existing_key", "default") + end + + should "fetch default value from block if key is not found" do + assert_equal "default bar", @drop.fetch("bar") { |el| "default #{el}" } + end + end +end From 3aead1d4a944b7895d9961e6eaff3bae9a9b6e73 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Wed, 6 Jul 2016 11:20:37 +0300 Subject: [PATCH 1090/4996] Imitate fetch method instead of creating real Hash object --- lib/jekyll/drops/drop.rb | 11 +++++++++-- test/test_drop.rb | 8 ++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index b79544fe188..dfb35d20116 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -200,8 +200,15 @@ def merge!(other) end end - def fetch(*args, &block) - to_h.fetch(*args, &block) + # Imitate Hash.fetch method in Drop + # + # Returns value if key is present in Drop, otherwise returns default value + # KeyError is raised if key is not present and no default value given + def fetch(key, default = nil, &block) + return self[key] if key?(key) + raise KeyError, %(key not found: "#{key}") if default.nil? && block.nil? + return yield(key) unless block.nil? + return default unless default.nil? end end end diff --git a/test/test_drop.rb b/test/test_drop.rb index e0f1884c807..199e94ab075 100644 --- a/test/test_drop.rb +++ b/test/test_drop.rb @@ -27,8 +27,16 @@ class TestDrop < JekyllUnitTest assert_equal "default", @drop.fetch("not_existing_key", "default") end + should "fetch default boolean value correctly" do + assert_equal false, @drop.fetch("bar", false) + end + should "fetch default value from block if key is not found" do assert_equal "default bar", @drop.fetch("bar") { |el| "default #{el}" } end + + should "fetch default value from block first if both argument and block given" do + assert_equal "baz", @drop.fetch("bar", "default") { "baz" } + end end end From c698e83eb1645b3cbcf5e6249acad3b368b3caeb Mon Sep 17 00:00:00 2001 From: Joshua Barnett Date: Wed, 6 Jul 2016 12:00:19 +0100 Subject: [PATCH 1091/4996] Highlight help nav item when navigated to. --- site/_includes/primary-nav-items.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_includes/primary-nav-items.html b/site/_includes/primary-nav-items.html index df5b939f967..6c816b6e469 100644 --- a/site/_includes/primary-nav-items.html +++ b/site/_includes/primary-nav-items.html @@ -8,7 +8,7 @@
  • News
  • -
  • +
  • Help
  • From a25e97b5fb3efd0bab0c8c72caecdb0a09cf50b8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 6 Jul 2016 17:46:35 -0700 Subject: [PATCH 1092/4996] Update history to reflect merge of #5058 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f3b54c3ae53..9ca726fbc08 100644 --- a/History.markdown +++ b/History.markdown @@ -163,6 +163,7 @@ * Add generator-jekyllized to third-party plugins (#5027) * Add Jekyll Art Hallery generator plugin to list of third-party plugins (#5043) * Add Formingo to the list of Jekyll form SaaS (#5054) + * Highlight help nav item when navigated to. (#5058) ## 3.1.6 / 2016-05-19 From 25bff0075c858cfdda8dcf8db2ed119325cfd638 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 6 Jul 2016 19:34:58 -0700 Subject: [PATCH 1093/4996] Update history to reflect merge of #5056 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9ca726fbc08..d9e2e9b06c6 100644 --- a/History.markdown +++ b/History.markdown @@ -31,6 +31,7 @@ * Add normalize_whitepace filter (#4917) * Move bin/jekyll to exe/jekyll to prevent collision with binstubs (#5014) * Cleaning up site template & theme updates. (#4922) + * Add fetch method to Drops (#5056) ### Bug Fixes From ba08e172043d63a2e35fd23d8aa9da7e7920c09d Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 7 Jul 2016 11:30:45 +0300 Subject: [PATCH 1094/4996] Extract tag name to class method --- lib/jekyll/tags/link.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/tags/link.rb b/lib/jekyll/tags/link.rb index e6dcde610c0..6ffd4726c6a 100644 --- a/lib/jekyll/tags/link.rb +++ b/lib/jekyll/tags/link.rb @@ -1,7 +1,11 @@ module Jekyll module Tags class Link < Liquid::Tag - TAG_NAME = "link".freeze + class << self + def tag_name + self.name.split("::").last.downcase + end + end def initialize(tag_name, relative_path, tokens) super @@ -17,7 +21,7 @@ def render(context) end raise ArgumentError, < Date: Thu, 7 Jul 2016 15:30:59 +0200 Subject: [PATCH 1095/4996] Remove useless statement from test --- test/test_configuration.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 0e0a69c7052..dd05a9e7a62 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -329,7 +329,6 @@ class TestConfiguration < JekyllUnitTest .with(@paths[:other]) .and_return({ "baseurl" => "http://wahoo.dev" }) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") - Jekyll.configuration({ "config" => @paths[:other] }) assert_equal \ site_configuration({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration(test_config.merge({ "config" => @paths[:other] })) From 5a339cc735ea64ff3320e962aba278872671923e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 7 Jul 2016 08:12:05 -0700 Subject: [PATCH 1096/4996] Update history to reflect merge of #5065 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d9e2e9b06c6..cbafa3e90f8 100644 --- a/History.markdown +++ b/History.markdown @@ -107,6 +107,7 @@ * rubocop: lib/jekyll/convertible.rb style fixes (#5031) * rubocop: lib/jekyll/document.rb style fixes (#5030) * Remove ruby-head from Travis matrix & fix jruby failures (#5015) + * Remove useless statement from Configuration test (#5065) ### Site Enhancements From c46f219d3cd53afe35ef1e406a1c0488fa2ae739 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 7 Jul 2016 13:34:10 -0700 Subject: [PATCH 1097/4996] Commit failing test for lack of certain excerpt drop properties. --- test/test_excerpt_drop.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/test_excerpt_drop.rb b/test/test_excerpt_drop.rb index f8c75f9a47c..901b06a6f79 100644 --- a/test/test_excerpt_drop.rb +++ b/test/test_excerpt_drop.rb @@ -29,6 +29,10 @@ class TestExcerptDrop < JekyllUnitTest assert_equal @excerpt_drop["layout"], @doc_drop["layout"] end + should "be inspectable" do + refute_empty @excerpt_drop.inspect + end + should "inherit values from the document" do assert_equal @excerpt_drop.keys.sort, @doc_drop.keys.sort end From e3214c23a33464c318f175d0e9360b13da0b428d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 7 Jul 2016 13:37:09 -0700 Subject: [PATCH 1098/4996] Add missing elements to Excerpt which delegate to its Document --- lib/jekyll/drops/drop.rb | 4 ++-- lib/jekyll/excerpt.rb | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index dfb35d20116..6227213e4dd 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -102,8 +102,8 @@ def content_methods # # Returns true if the given key is present def key?(key) - if self.class.mutable && @mutations.key?(key) - true + if self.class.mutable + @mutations.key?(key) else respond_to?(key) || fallback_data.key?(key) end diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index 2d53307e312..c181cb68ed7 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -7,7 +7,8 @@ class Excerpt attr_writer :output def_delegators :@doc, :site, :name, :ext, :relative_path, :extname, - :render_with_liquid?, :collection, :related_posts, :url + :render_with_liquid?, :collection, :related_posts, + :url, :next_doc, :previous_doc # Initialize this Excerpt instance. # From 1a934125d99598e967cb3f7f2c05a9c59ba738be Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 7 Jul 2016 13:37:25 -0700 Subject: [PATCH 1099/4996] Check for Ruby first, then JRuby --- script/rubies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/rubies b/script/rubies index fb00ac61fd8..ae6d486856d 100755 --- a/script/rubies +++ b/script/rubies @@ -6,7 +6,7 @@ # ----------------------------------------------------------------------------- rubies=() -for r in jruby ruby; do +for r in ruby jruby; do if which "$r" > /dev/null 2>&1 then echo $r From f6dc74933253ae72c2f12389a60fe4e686418823 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 7 Jul 2016 15:42:31 -0700 Subject: [PATCH 1100/4996] Update history to reflect merge of #5063 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cbafa3e90f8..d90dc3bb5c3 100644 --- a/History.markdown +++ b/History.markdown @@ -32,6 +32,7 @@ * Move bin/jekyll to exe/jekyll to prevent collision with binstubs (#5014) * Cleaning up site template & theme updates. (#4922) * Add fetch method to Drops (#5056) + * Extract tag name to class method (#5063) ### Bug Fixes From 1c0f21230d6a605c0bef498c695e8a8b1316eaf2 Mon Sep 17 00:00:00 2001 From: Marcus Stollsteimer Date: Wed, 6 Jul 2016 14:30:30 +0200 Subject: [PATCH 1101/4996] Stringify configuration overrides before first use This makes sure that overrides for Jekyll.configuration all have string keys before their first use, particularly also the "config" and "skip_config_files" options. --- lib/jekyll.rb | 1 + test/test_configuration.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index db1e40cd60b..a9fe696f0c5 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -101,6 +101,7 @@ def env # Returns the final configuration Hash. def configuration(override = {}) config = Configuration.new + override = Configuration[override].stringify_keys unless override.delete("skip_config_files") config = config.read_config_files(config.config_files(override)) end diff --git a/test/test_configuration.rb b/test/test_configuration.rb index dd05a9e7a62..90bcc822cdf 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -334,6 +334,18 @@ class TestConfiguration < JekyllUnitTest Jekyll.configuration(test_config.merge({ "config" => @paths[:other] })) end + should "load different config if specified with symbol key" do + allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({}) + allow(SafeYAML) + .to receive(:load_file) + .with(@paths[:other]) + .and_return({ "baseurl" => "http://example.com" }) + allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") + assert_equal \ + site_configuration({ "baseurl" => "http://example.com" }), + Jekyll.configuration(test_config.merge({ :config => @paths[:other] })) + end + should "load default config if path passed is empty" do allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") From ba8573c420c01a3c7e33ea2338d9158aa4f84b08 Mon Sep 17 00:00:00 2001 From: Marcus Stollsteimer Date: Fri, 8 Jul 2016 15:48:14 +0200 Subject: [PATCH 1102/4996] Change baseurl to example.com for some test cases --- test/test_configuration.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_configuration.rb b/test/test_configuration.rb index dd05a9e7a62..dd4d4d40fdf 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -327,10 +327,10 @@ class TestConfiguration < JekyllUnitTest allow(SafeYAML) .to receive(:load_file) .with(@paths[:other]) - .and_return({ "baseurl" => "http://wahoo.dev" }) + .and_return({ "baseurl" => "http://example.com" }) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") assert_equal \ - site_configuration({ "baseurl" => "http://wahoo.dev" }), + site_configuration({ "baseurl" => "http://example.com" }), Jekyll.configuration(test_config.merge({ "config" => @paths[:other] })) end @@ -378,7 +378,7 @@ class TestConfiguration < JekyllUnitTest allow(SafeYAML) .to receive(:load_file) .with(@paths[:other]) - .and_return({ "baseurl" => "http://wahoo.dev" }) + .and_return({ "baseurl" => "http://example.com" }) allow($stdout) .to receive(:puts) .with("Configuration file: #{@paths[:default]}") @@ -386,7 +386,7 @@ class TestConfiguration < JekyllUnitTest .to receive(:puts) .with("Configuration file: #{@paths[:other]}") assert_equal \ - site_configuration({ "baseurl" => "http://wahoo.dev" }), + site_configuration({ "baseurl" => "http://example.com" }), Jekyll.configuration( test_config.merge({ "config" => [@paths[:default], @paths[:other]] }) ) From cc82d442223bdaee36a2aceada64008a0106d82b Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Fri, 8 Jul 2016 20:33:47 +0200 Subject: [PATCH 1103/4996] check if relative URL contains a colon fixes #2834 --- lib/jekyll/errors.rb | 7 ++++--- lib/jekyll/url.rb | 9 ++++++++- test/test_url.rb | 10 ++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/errors.rb b/lib/jekyll/errors.rb index 01bc99b3d12..6ae24337ab5 100644 --- a/lib/jekyll/errors.rb +++ b/lib/jekyll/errors.rb @@ -9,8 +9,9 @@ module Errors InvalidYAMLFrontMatterError = Class.new(FatalException) MissingDependencyException = Class.new(FatalException) - InvalidDateError = Class.new(FatalException) - InvalidPostNameError = Class.new(FatalException) - PostURLError = Class.new(FatalException) + InvalidDateError = Class.new(FatalException) + InvalidPostNameError = Class.new(FatalException) + PostURLError = Class.new(FatalException) + InvalidURLError = Class.new(FatalException) end end diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 440deb18f3b..c74e11c8bd4 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -35,8 +35,15 @@ def initialize(options) # The generated relative URL of the resource # # Returns the String URL + # Raises a Jekyll::Errors::InvalidURLError if the relative URL contains a colon def to_s - sanitize_url(generated_permalink || generated_url) + sanitized_url = sanitize_url(generated_permalink || generated_url) + if sanitized_url.include?(":") + raise Jekyll::Errors::InvalidURLError, + "The URL #{sanitized_url} is invalid because it contains a colon." + else + sanitized_url + end end # Generates a URL from the permalink diff --git a/test/test_url.rb b/test/test_url.rb index fc9a46eb0a3..f5a77622fd1 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -70,5 +70,15 @@ class TestURL < JekyllUnitTest :placeholders => matching_doc.url_placeholders ).to_s end + + should "throw an exception if the URL contains a colon" do + url = URL.new( + :template => "/:x/:y/:z", + :placeholders => { :x => "foo", :z => "bar" } + ) + assert_raises Jekyll::Errors::InvalidURLError do + url.to_s + end + end end end From d4a7fbee28323576c88bbc4b4d689d267389dc47 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 8 Jul 2016 23:23:18 -0700 Subject: [PATCH 1104/4996] Update history to reflect merge of #5068 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d90dc3bb5c3..2784362eb96 100644 --- a/History.markdown +++ b/History.markdown @@ -109,6 +109,7 @@ * rubocop: lib/jekyll/document.rb style fixes (#5030) * Remove ruby-head from Travis matrix & fix jruby failures (#5015) * Remove useless statement from Configuration test (#5065) + * Change baseurl to example.com for some test cases (#5068) ### Site Enhancements From 232054a0596fe16df8472da3bafcfce32cb63733 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Mon, 11 Jul 2016 12:41:42 -0400 Subject: [PATCH 1105/4996] Update normalize.css to v4.2.0. --- site/_sass/_normalize.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/site/_sass/_normalize.scss b/site/_sass/_normalize.scss index 995e0354e25..8d46a8ee270 100644 --- a/site/_sass/_normalize.scss +++ b/site/_sass/_normalize.scss @@ -1,2 +1 @@ -/*! normalize.css v4.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}template,[hidden]{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:0.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} -/*# sourceMappingURL=_normalize.scss.map */ +/*! normalize.css v4.2.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}template,[hidden]{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:0.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} From 5b51b8bdf3385930b7eca85b9d421133c3a4e4ea Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 11 Jul 2016 11:19:31 -0700 Subject: [PATCH 1106/4996] Update history to reflect merge of #5096 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2784362eb96..5b7d23c70f9 100644 --- a/History.markdown +++ b/History.markdown @@ -168,6 +168,7 @@ * Add Jekyll Art Hallery generator plugin to list of third-party plugins (#5043) * Add Formingo to the list of Jekyll form SaaS (#5054) * Highlight help nav item when navigated to. (#5058) + * Update normalize.css to v4.2.0. (#5096) ## 3.1.6 / 2016-05-19 From 4b5126dda7f1e00d2701404b4f1ec2d155f40857 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 11 Jul 2016 11:20:23 -0700 Subject: [PATCH 1107/4996] Update history to reflect merge of #5067 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5b7d23c70f9..5d17e968830 100644 --- a/History.markdown +++ b/History.markdown @@ -51,6 +51,7 @@ * Don't rescue LoadError or bundler load errors for Bundler. (#4857) * `Serve.process` should receive same config as `Build.process` (#4953) * Prevent reset of page in Liquid payload right before rendering layouts (#5009) + * Add missing fields to ExcerptDrop (#5067) ### Forward Ports From 8d2227a03ab259443565cff92366c7e6f6fd19ef Mon Sep 17 00:00:00 2001 From: Mike Neumegen Date: Wed, 6 Jul 2016 15:16:01 +1200 Subject: [PATCH 1108/4996] added JekyllConf page --- site/_data/docs.yml | 1 + site/_data/jekyllconf-talks.yml | 167 ++++++++++++++++++++++++++++++++ site/_docs/jekyllconf.md | 24 +++++ site/_docs/resources.md | 2 +- site/_sass/_style.scss | 15 +++ 5 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 site/_data/jekyllconf-talks.yml create mode 100644 site/_docs/jekyllconf.md diff --git a/site/_data/docs.yml b/site/_data/docs.yml index 071b5a14c72..5ce3ed8f3e8 100644 --- a/site/_data/docs.yml +++ b/site/_data/docs.yml @@ -40,6 +40,7 @@ - troubleshooting - sites - resources + - jekyllconf - upgrading/0-to-2 - upgrading/2-to-3 diff --git a/site/_data/jekyllconf-talks.yml b/site/_data/jekyllconf-talks.yml new file mode 100644 index 00000000000..e5881682a68 --- /dev/null +++ b/site/_data/jekyllconf-talks.yml @@ -0,0 +1,167 @@ +- speaker: Ben Balter + twitter_handle: BenBalter + youtube_id: Z-37y1qaoxc + topic: GitHub Pages behind the scenes + year: 2015 + +- speaker: Brandon Mathis + twitter_handle: imathis + youtube_id: KS6e4XxY2H4 + topic: What the heck is Octopress and why should I care? + year: 2015 + +- speaker: Brian Rinaldi + twitter_handle: remotesynth + youtube_id: vT7DhK5zbv0 + topic: Comparing Jekyll with the Competition + year: 2015 + +- speaker: Kyle Rush + twitter_handle: kylerush + youtube_id: ia8vsuiXiL0 + topic: Meet the Obama Campaign's $250 Million Fundraising Platform + year: 2015 + +- speaker: Michael Jovel + twitter_handle: mjovel + youtube_id: 8zSHG6XU_xY + topic: Building Living Style Guides with Jekyll + year: 2015 + +- speaker: Mike Neumegen + twitter_handle: mikeneumegen + youtube_id: NuChR_YdjrI + topic: A CMS for Jekyll + year: 2015 + +- speaker: Parker Moore + twitter_handle: parkr + youtube_id: y2SbOIQ5nSA + topic: Jekyll 3 and Beyond + year: 2015 + +- speaker: Tom Preston-Werner + twitter_handle: mojombo + youtube_id: BMve1OCKj6M + topic: Some crazy ideas I have for the future of static sites + year: 2015 + +- speaker: Allison Zadrozny + twitter_handle: allizad + youtube_id: Rsc0Mmp1qc8 + topic: Elasticsearch for Jekyll + year: 2016 + +- speaker: Amy Johnston + twitter_handle: amybeukenex + youtube_id: HR12JiUI2Zc + topic: Jekyll for Technical Documentation + year: 2016 + +- speaker: Bud Parr + twitter_handle: budparr + youtube_id: A1nTuNjoNbg + topic: Real World Content Strategy with Jekyll + year: 2016 + +- speaker: George Phillips + twitter_handle: gphillips_nz + youtube_id: skb_XWABEDc + topic: Building client-editable Jekyll sites + year: 2016 + +- speaker: Ire Aderinokun + twitter_handle: ireaderinokun + youtube_id: PRKV5IGKF2c + topic: Using Jekyll for Rapid CSS Testing + year: 2016 + +- speaker: Jon Chan + twitter_handle: JonHMChan + youtube_id: vDeKPs6xpOM + topic: Stack Overflow on Jekyll + year: 2016 + +- speaker: Julio Faerman + twitter_handle: jmfaerman + youtube_id: SOMonG8Iqak + topic: Jekyll on AWS + year: 2016 + +- speaker: Katy DeCorah + twitter_handle: katydecorah + youtube_id: s84wFRD8vfE + topic: Unconventional use cases for Jekyll + year: 2016 + +- speaker: David Darnes + twitter_handle: DavidDarnes + youtube_id: Y4qwpN40Dvg + topic: Doing a lot with a little + year: 2016 + +- speaker: Ronan Berder + twitter_handle: hunvreus + youtube_id: TteAQq25_Ns + topic: Designing fast websites with Jekyll + year: 2016 + +- speaker: David Von Lehman + twitter_handle: davidvlsea + youtube_id: wMlPlKCZfEk + topic: Continuous deployment of Jekyll sites powered by Docker + year: 2016 + +- speaker: David Jones + twitter_handle: d_jones + youtube_id: 4XxYQ7efk0E + topic: Building our agency site with Jekyll + year: 2016 + +- speaker: Scott Hewitt + twitter_handle: scotthewitt + youtube_id: qSd3pXQaPsE + topic: Jekyll For Every Case + year: 2016 + +- speaker: Tim Carry + twitter_handle: pixelastic + youtube_id: ivMML1J4ABY + topic: Algolia search on Jekyll sites + year: 2016 + +- speaker: Nils Borchers + twitter_handle: nilsborchers + youtube_id: DtNMjuv6Rbo + topic: Building a living brand guide with Jekyll and Hologram + year: 2016 + +- speaker: Mike Neumegen + twitter_handle: mikeneumegen + youtube_id: rJ5EhVmTR7I + topic: Learning resources for the Jekyll community + year: 2016 + +- speaker: Oliver Pattison + twitter_handle: olivermakes + youtube_id: BIf6oNpGl74 + topic: Responsive srcset images with imgix + year: 2016 + +- speaker: Michael Lee + twitter_handle: michaelsoolee + youtube_id: F4bJRLEvXIc + topic: Jekyll, Your Website's Baseplate + year: 2016 + +- speaker: Paul Webb + twitter_handle: NetOpWibby + youtube_id: BRB5DgAE5nM + topic: Deploy Jekyll Like A Boss + year: 2016 + +- speaker: Tom Johnson + twitter_handle: tomjohnson + youtube_id: nq1AUB72GCQ + topic: Overcoming challenges in using Jekyll for documentation projects + year: 2016 diff --git a/site/_docs/jekyllconf.md b/site/_docs/jekyllconf.md new file mode 100644 index 00000000000..baf4d457a25 --- /dev/null +++ b/site/_docs/jekyllconf.md @@ -0,0 +1,24 @@ +--- +layout: docs +title: JekyllConf +permalink: /docs/jekyllconf/ +--- + +[JekyllConf](http://jekyllconf.com) is a free, online conference for all things Jekyll hosted by [CloudCannon](http://cloudcannon.com). Each year members of the Jekyll community speak about interesting use cases, tricks they've learned or meta Jekyll topics. + +## Featured +{% assign random = site.time | date: "%s%N" | modulo: site.data.jekyllconf-talks.size %} +{% assign featured = site.data.jekyllconf-talks[random] %} + +{{ featured.topic }} - [{{ featured.speaker }}](https://twitter.com/{{ featured.twitter_handle }}) +
    + +
    + +{% assign talks = site.data.jekyllconf-talks | group_by: 'year' %} +{% for year in talks reversed %} +## {{ year.name }} + {% for talk in year.items %} + * [{{ talk.topic }}](https://youtu.be/{{ talk.youtube_id }}) - [{{ talk.speaker }}](https://twitter.com/{{ talk.twitter_handle }}) + {% endfor %} +{% endfor %} diff --git a/site/_docs/resources.md b/site/_docs/resources.md index 44db27dbfff..b35ea9c18e3 100644 --- a/site/_docs/resources.md +++ b/site/_docs/resources.md @@ -8,7 +8,7 @@ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, ext ### Useful Guides -- [Jekyll Tips](http://jekyll.tips) is a set of resources created by [CloudCannon](https://cloudcannon.com) to help folks get up and running with Jekyll. The cover all skill levels, and even include some great video tutorials. +- [Jekyll Tips](http://jekyll.tips) is a set of resources created by [CloudCannon](https://cloudcannon.com) to help folks get up and running with Jekyll. They cover all skill levels, and even include some great video tutorials. - [Jekyll Cheatsheet](http://cheat.jekyll.tips) is a single-page resource for Jekyll filters, variables, and the like. - [“Creating and Hosting a Personal Site on GitHub”](http://jmcglone.com/guides/github-pages/) - [‘Build A Blog With Jekyll And GitHub Pages’ on Smashing Magazine](http://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) diff --git a/site/_sass/_style.scss b/site/_sass/_style.scss index f06ea77f36d..540c4cc970d 100644 --- a/site/_sass/_style.scss +++ b/site/_sass/_style.scss @@ -986,6 +986,21 @@ code.output { } } +.videoWrapper { + position: relative; + padding-bottom: 52.4%; + padding-top: 25px; + height: 0; +} + +.videoWrapper iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + /* Helper class taken from Bootstrap. Hides an element to all devices except screen readers. From 26b2a6251cefae098d69f9ac94615b6d03c0109d Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Mon, 11 Jul 2016 17:47:41 -0400 Subject: [PATCH 1109/4996] Add a Community section and cleanup, closes #5057 --- site/_includes/primary-nav-items.html | 3 +++ site/_sass/_style.scss | 1 + site/{_docs/jekyllconf.md => community/index.md} | 8 ++++---- 3 files changed, 8 insertions(+), 4 deletions(-) rename site/{_docs/jekyllconf.md => community/index.md} (88%) diff --git a/site/_includes/primary-nav-items.html b/site/_includes/primary-nav-items.html index 6c816b6e469..f67b1fadfef 100644 --- a/site/_includes/primary-nav-items.html +++ b/site/_includes/primary-nav-items.html @@ -8,6 +8,9 @@
  • News
  • +
  • + Community +
  • Help
  • diff --git a/site/_sass/_style.scss b/site/_sass/_style.scss index 540c4cc970d..10b1b0e292d 100644 --- a/site/_sass/_style.scss +++ b/site/_sass/_style.scss @@ -56,6 +56,7 @@ nav { ul { padding: 0; margin: 0; + white-space: nowrap; } li { display: inline-block; } diff --git a/site/_docs/jekyllconf.md b/site/community/index.md similarity index 88% rename from site/_docs/jekyllconf.md rename to site/community/index.md index baf4d457a25..981a465ba66 100644 --- a/site/_docs/jekyllconf.md +++ b/site/community/index.md @@ -1,10 +1,10 @@ --- -layout: docs -title: JekyllConf -permalink: /docs/jekyllconf/ +layout: page +title: Community +permalink: /community/ --- -[JekyllConf](http://jekyllconf.com) is a free, online conference for all things Jekyll hosted by [CloudCannon](http://cloudcannon.com). Each year members of the Jekyll community speak about interesting use cases, tricks they've learned or meta Jekyll topics. +[JekyllConf](http://jekyllconf.com) is a free, online conference for all things Jekyll hosted by [CloudCannon](http://cloudcannon.com). Each year members of the Jekyll community speak about interesting use cases, tricks they've learned, or meta Jekyll topics. ## Featured {% assign random = site.time | date: "%s%N" | modulo: site.data.jekyllconf-talks.size %} From d683baa2576c57d75d945565467191d24aaa3eaa Mon Sep 17 00:00:00 2001 From: Erick Sasse Date: Mon, 11 Jul 2016 23:17:30 -0300 Subject: [PATCH 1110/4996] Updates html-proofer code As in html-proofer docs: https://github.com/gjtorikian/html-proofer --- site/_docs/continuous-integration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/continuous-integration.md b/site/_docs/continuous-integration.md index 8a50afa768d..4bd01e2b343 100644 --- a/site/_docs/continuous-integration.md +++ b/site/_docs/continuous-integration.md @@ -63,8 +63,8 @@ You can also invoke `html-proofer` in Ruby scripts (e.g. in a Rakefile): {% highlight ruby %} #!/usr/bin/env ruby -require 'html/proofer' -HTML::Proofer.new("./_site").run +require 'html-proofer' +HTMLProofer.check_directory("./_site").run {% endhighlight %} Options are given as a second argument to `.new`, and are encoded in a From 3674a7760fa3dc603938c3555b305069a9fcc126 Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Mon, 11 Jul 2016 22:18:12 -0400 Subject: [PATCH 1111/4996] Remove JekyllConf from the sidebar --- site/_data/docs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/site/_data/docs.yml b/site/_data/docs.yml index 5ce3ed8f3e8..071b5a14c72 100644 --- a/site/_data/docs.yml +++ b/site/_data/docs.yml @@ -40,7 +40,6 @@ - troubleshooting - sites - resources - - jekyllconf - upgrading/0-to-2 - upgrading/2-to-3 From 0ebf7129cff85df518d9486454e357a06819baf6 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Tue, 12 Jul 2016 21:26:52 +0200 Subject: [PATCH 1112/4996] use activesupport ~> 4.2 if we are on a Ruby < 2.2.2 activesupport 5.0.x requires a ruby version >= 2.2.2 see https://github.com/rails/rails/blob/48512d790680a4fbfc20026f3c976f8fa759b2e5/activesupport/activesupport.gemspec#L10 --- Gemfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Gemfile b/Gemfile index 3dc758eff61..6b1db4c5f69 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,9 @@ source "https://rubygems.org" gemspec :name => "jekyll" gem "rake", "~> 11.0" + +gem "activesupport", "~> 4.2", :groups => [:test_legacy, :site] if RUBY_ENGINE == 'ruby' && RUBY_VERSION < '2.2.2' + group :development do gem "launchy", "~> 2.3" gem "pry" From 506ba8af1e95e9fa27633e99483fecdcd7407fc5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 12 Jul 2016 19:22:40 -0700 Subject: [PATCH 1113/4996] Update history to reflect merge of #5098 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5d17e968830..be1fc29933f 100644 --- a/History.markdown +++ b/History.markdown @@ -170,6 +170,7 @@ * Add Formingo to the list of Jekyll form SaaS (#5054) * Highlight help nav item when navigated to. (#5058) * Update normalize.css to v4.2.0. (#5096) + * Updates html-proofer code (#5098) ## 3.1.6 / 2016-05-19 From a29498eaaebbccd415cc3b811d050137f456cd9a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 12 Jul 2016 19:50:33 -0700 Subject: [PATCH 1114/4996] Update history to reflect merge of #5069 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index be1fc29933f..2882db66af8 100644 --- a/History.markdown +++ b/History.markdown @@ -33,6 +33,7 @@ * Cleaning up site template & theme updates. (#4922) * Add fetch method to Drops (#5056) * Extract tag name to class method (#5063) + * check if relative URL contains a colon (#5069) ### Bug Fixes From 5194d1a42ccfceb2747a03c06e0b7ac7912f44b9 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Wed, 13 Jul 2016 10:52:18 +0800 Subject: [PATCH 1115/4996] Add to_integer filter --- lib/jekyll/filters.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 231eb7b6a87..71e0dabdbfb 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -260,6 +260,15 @@ def where_exp(input, variable, expression) end end + # Convert the input into integer + # + # input - the object string + # + # Returns the integer value + def to_integer(input) + input.to_i + end + # Sort an array of objects # # input - the object array From f42fac60b01904b5b79fca82ec0b957c45d94644 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 12 Jul 2016 20:11:04 -0700 Subject: [PATCH 1116/4996] Update history to reflect merge of #5097 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2882db66af8..dc6f2e69151 100644 --- a/History.markdown +++ b/History.markdown @@ -172,6 +172,7 @@ * Highlight help nav item when navigated to. (#5058) * Update normalize.css to v4.2.0. (#5096) * Updates html-proofer code (#5098) + * Jekyll Community (#5097) ## 3.1.6 / 2016-05-19 From cc994105ededbb91e185de3e855bbf518cb1046c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 12 Jul 2016 20:16:11 -0700 Subject: [PATCH 1117/4996] Update history to reflect merge of #5100 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index dc6f2e69151..e140d49f0a7 100644 --- a/History.markdown +++ b/History.markdown @@ -112,6 +112,7 @@ * Remove ruby-head from Travis matrix & fix jruby failures (#5015) * Remove useless statement from Configuration test (#5065) * Change baseurl to example.com for some test cases (#5068) + * use activesupport < 5 if we are on a Ruby < 2.2.2 (#5100) ### Site Enhancements From a3cd58431100bbd2c12a3fe674e51b08dc9d9614 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 12 Jul 2016 20:17:44 -0700 Subject: [PATCH 1118/4996] Update activesupport handling and add comment to Gemfile. /cc #5100 --- Gemfile | 3 ++- site/_docs/contributing.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 6b1db4c5f69..1f49e56a339 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,8 @@ gemspec :name => "jekyll" gem "rake", "~> 11.0" -gem "activesupport", "~> 4.2", :groups => [:test_legacy, :site] if RUBY_ENGINE == 'ruby' && RUBY_VERSION < '2.2.2' +# Dependency of jekyll-mentions. RubyGems in Ruby 2.1 doesn't shield us from this. +gem "activesupport", "~> 4.2", :groups => [:test_legacy, :site] if RUBY_VERSION < '2.2.2' group :development do gem "launchy", "~> 2.3" diff --git a/site/_docs/contributing.md b/site/_docs/contributing.md index 3c28953f733..4038df0d0d2 100644 --- a/site/_docs/contributing.md +++ b/site/_docs/contributing.md @@ -73,7 +73,7 @@ One gotcha, all pull requests should be directed at the `master` branch (the def ### Adding plugins -If you want to add your plugin to the [list of plugins](https://jekyllrb.com/docs/plugins/#available-plugins), please submit a pull request modifying the [plugins page source file](https://jekyllrb.com/docs/plugins/) by adding a link to your plugin under the proper subheading depending upon its type. +If you want to add your plugin to the [list of plugins](https://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. ## Code Contributions From 9336ad0fcf911e4fcde0d32abfeee464674f0f01 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Wed, 13 Jul 2016 14:47:14 +0800 Subject: [PATCH 1119/4996] Add to_integer filter --- lib/jekyll/filters.rb | 9 ++++++++- test/test_filters.rb | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 71e0dabdbfb..6e794bb02b2 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -266,7 +266,14 @@ def where_exp(input, variable, expression) # # Returns the integer value def to_integer(input) - input.to_i + return input if input.is_a?(Integer) + return 1 if input == true + return 0 if input == false + begin + input.to_i + rescue + raise ArgumentError, "Invalid input object type." + end end # Sort an array of objects diff --git a/test/test_filters.rb b/test/test_filters.rb index fa0f9e52180..c916bab926f 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -26,6 +26,7 @@ def initialize(opts = {}) @sample_date = Date.parse("2013-03-27") @time_as_string = "September 11, 2001 12:46:30 -0000" @time_as_numeric = 1_399_680_607 + @integer_as_string = "142857" @array_of_objects = [ { "color" => "red", "size" => "large" }, { "color" => "red", "size" => "medium" }, @@ -235,6 +236,13 @@ def initialize(opts = {}) @filter.date_to_rfc822(@time_as_string) ) end + + should "convert a String to Integer" do + assert_equal( + 142857, + @filter.to_integer(@integer_as_string) + ) + end end context "with a Numeric object" do @@ -635,6 +643,30 @@ def to_liquid end end + context "to_integer filter" do + should "raise Exception when input is not integer or string" do + err_msg = "Invalid input object type." + err = assert_raises ArgumentError do + @filter.to_integer([1, 2]) + end + assert_equal err_msg, err.message + end + should "return 0 when input is nil" do + assert_equal 0, @filter.to_integer(nil) + end + should "return integer when input is boolean" do + assert_equal 0, @filter.to_integer(false) + assert_equal 1, @filter.to_integer(true) + end + should "return integers" do + assert_equal 0, @filter.to_integer(0) + assert_equal 1, @filter.to_integer(1) + assert_equal 1, @filter.to_integer(1.42857) + assert_equal -1, @filter.to_integer(-1) + assert_equal -1, @filter.to_integer(-1.42857) + end + end + context "inspect filter" do should "return a HTML-escaped string representation of an object" do assert_equal "{"<a>"=>1}", @filter.inspect({ "" => 1 }) From 218c7039a9b09504d81bdcf1617981eb9c788616 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Wed, 13 Jul 2016 15:13:20 +0800 Subject: [PATCH 1120/4996] Fix test_filter: parenthesize the method --- test/test_filters.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index c916bab926f..55856044a66 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -662,8 +662,8 @@ def to_liquid assert_equal 0, @filter.to_integer(0) assert_equal 1, @filter.to_integer(1) assert_equal 1, @filter.to_integer(1.42857) - assert_equal -1, @filter.to_integer(-1) - assert_equal -1, @filter.to_integer(-1.42857) + assert_equal(-1, @filter.to_integer(-1)) + assert_equal(-1, @filter.to_integer(-1.42857)) end end From 5c6c01793c940569f29880eff338da566f406a0b Mon Sep 17 00:00:00 2001 From: David Zhang Date: Wed, 13 Jul 2016 15:32:34 +0800 Subject: [PATCH 1121/4996] Fix offense: seperate every 3 digits with _ --- test/test_filters.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index 55856044a66..06fa59ff697 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -239,7 +239,7 @@ def initialize(opts = {}) should "convert a String to Integer" do assert_equal( - 142857, + 142_857, @filter.to_integer(@integer_as_string) ) end From 75989fdb3eb86d3dd03c3bccb4a2dbef3566e3b5 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 13 Jul 2016 14:51:12 -0700 Subject: [PATCH 1122/4996] Add definitions for feature & bug to maintainer docs. --- docs/triaging-an-issue.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/triaging-an-issue.md b/docs/triaging-an-issue.md index a6f24447e73..10da324a3f4 100644 --- a/docs/triaging-an-issue.md +++ b/docs/triaging-an-issue.md @@ -2,7 +2,14 @@ **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -Here are some key things to remember when evaluating an issue. +Before evaluating an issue, it is important to identify if it is a feature +request or a bug. For the Jekyll project the following definitions are used +to identify a feature or a bug: + +**Feature** - A feature is defined as a request that adds functionality to +Jekyll outside of its current capabilities. +**Bug** - A bug is defined as an issue that identifies an error that a user +(or users) encounter when using current Jekyll functionalities. ## Feature? From 8a3ea59141d721b09a762d7ae26e677b173bfcfa Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 13 Jul 2016 14:52:11 -0700 Subject: [PATCH 1123/4996] Update history to reflect merge of #5011 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e140d49f0a7..0806d6ffd81 100644 --- a/History.markdown +++ b/History.markdown @@ -113,6 +113,7 @@ * Remove useless statement from Configuration test (#5065) * Change baseurl to example.com for some test cases (#5068) * use activesupport < 5 if we are on a Ruby < 2.2.2 (#5100) + * Internal documentation for working on Jekyll (#5011) ### Site Enhancements From 5e760a206ace6095c6adb99ec85fb50812a44a61 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 14 Jul 2016 11:05:30 +0800 Subject: [PATCH 1124/4996] rubocop:disable Metrics/ModuleLength --- lib/jekyll/filters.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 6e794bb02b2..73e662298ab 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -4,6 +4,7 @@ require "liquid" module Jekyll + # rubocop:disable Metrics/ModuleLength module Filters # Convert a Markdown string into HTML output. # From b1f9a0809c19929305470ed6e0437635cb121cc9 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 14 Jul 2016 11:27:47 +0800 Subject: [PATCH 1125/4996] More descriptive exception --- lib/jekyll/filters.rb | 2 +- test/test_filters.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 73e662298ab..06a4147fbe1 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -273,7 +273,7 @@ def to_integer(input) begin input.to_i rescue - raise ArgumentError, "Invalid input object type." + raise ArgumentError, "Object '#{input.inspect}' could not be converted into an integer." end end diff --git a/test/test_filters.rb b/test/test_filters.rb index 06fa59ff697..c8d4a68b805 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -645,7 +645,7 @@ def to_liquid context "to_integer filter" do should "raise Exception when input is not integer or string" do - err_msg = "Invalid input object type." + err_msg = "Object '[1, 2]' could not be converted into an integer." err = assert_raises ArgumentError do @filter.to_integer([1, 2]) end From e503c17dfa1de5e06a8f461201e74c43b1442ae3 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 14 Jul 2016 12:00:19 +0800 Subject: [PATCH 1126/4996] Fix fmt error --- lib/jekyll/filters.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 06a4147fbe1..1d89b830ca6 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -273,7 +273,8 @@ def to_integer(input) begin input.to_i rescue - raise ArgumentError, "Object '#{input.inspect}' could not be converted into an integer." + raise ArgumentError, + "Object '#{input.inspect}' could not be converted into an integer." end end From b44457a80ba72500675e06e4c84439b130ed9f3d Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 14 Jul 2016 13:38:14 +0800 Subject: [PATCH 1127/4996] Remove if stmt for integer input --- lib/jekyll/filters.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 1d89b830ca6..d688fca9f42 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -267,7 +267,6 @@ def where_exp(input, variable, expression) # # Returns the integer value def to_integer(input) - return input if input.is_a?(Integer) return 1 if input == true return 0 if input == false begin From 3435b5ddac271b462602e688e6526760a87da86f Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 14 Jul 2016 14:06:25 +0800 Subject: [PATCH 1128/4996] Remove rescue for to_i --- lib/jekyll/filters.rb | 8 +------- test/test_filters.rb | 9 +++++++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index d688fca9f42..0ab50d49f69 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -4,7 +4,6 @@ require "liquid" module Jekyll - # rubocop:disable Metrics/ModuleLength module Filters # Convert a Markdown string into HTML output. # @@ -269,12 +268,7 @@ def where_exp(input, variable, expression) def to_integer(input) return 1 if input == true return 0 if input == false - begin - input.to_i - rescue - raise ArgumentError, - "Object '#{input.inspect}' could not be converted into an integer." - end + input.to_i end # Sort an array of objects diff --git a/test/test_filters.rb b/test/test_filters.rb index c8d4a68b805..bb97952421d 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -645,8 +645,13 @@ def to_liquid context "to_integer filter" do should "raise Exception when input is not integer or string" do - err_msg = "Object '[1, 2]' could not be converted into an integer." - err = assert_raises ArgumentError do + err_msg = <<-EOS.strip! +undefined method `to_i' for [1, 2]:Array +Did you mean? to_s + to_a + to_h +EOS + err = assert_raises NoMethodError do @filter.to_integer([1, 2]) end assert_equal err_msg, err.message From 9ef9c2fb644e1ec3b2f91aa5a598ddfa0e6a4519 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 14 Jul 2016 14:15:23 +0800 Subject: [PATCH 1129/4996] Remove error message assert --- test/test_filters.rb | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index bb97952421d..399ade72c69 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -645,16 +645,9 @@ def to_liquid context "to_integer filter" do should "raise Exception when input is not integer or string" do - err_msg = <<-EOS.strip! -undefined method `to_i' for [1, 2]:Array -Did you mean? to_s - to_a - to_h -EOS - err = assert_raises NoMethodError do + assert_raises NoMethodError do @filter.to_integer([1, 2]) end - assert_equal err_msg, err.message end should "return 0 when input is nil" do assert_equal 0, @filter.to_integer(nil) From 695b5396fde83c84d38b134f0024b9b88bf9fb48 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Fri, 17 Jun 2016 15:44:08 +0300 Subject: [PATCH 1130/4996] rubocop: fix code style --- .rubocop.yml | 1 - lib/jekyll/collection.rb | 34 ++++++++++++++++++++++------------ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index f255cb76f05..426c61a8a46 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,7 +4,6 @@ AllCops: Include: - lib/**/*.rb Exclude: - - lib/jekyll/collection.rb - lib/jekyll/convertible.rb - lib/jekyll/document.rb - lib/jekyll/renderer.rb diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 6ec72703332..88120d1fc6f 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -57,18 +57,9 @@ def read full_path = collection_dir(file_path) next if File.directory?(full_path) if Utils.has_yaml_header? full_path - doc = Jekyll::Document.new(full_path, { :site => site, :collection => self }) - doc.read - if site.publisher.publish?(doc) || !write? - docs << doc - else - Jekyll.logger.debug "Skipped From Publishing:", doc.relative_path - end + read_docs(full_path) else - relative_dir = Jekyll.sanitized_path(relative_directory, - File.dirname(file_path)).chomp("/.") - files << StaticFile.new(site, site.source, relative_dir, - File.basename(full_path), self) + read_files(file_path, full_path) end end docs.sort! @@ -164,7 +155,7 @@ def inspect # # Returns a sanitized version of the label. def sanitize_label(label) - label.gsub(/[^a-z0-9_\-\.]/i, "") + label.gsub(%r![^a-z0-9_\-\.]!i, "") end # Produce a representation of this Collection for use in Liquid. @@ -204,5 +195,24 @@ def extract_metadata {} end end + + private + def read_docs(full_path) + doc = Jekyll::Document.new(full_path, { :site => site, :collection => self }) + doc.read + if site.publisher.publish?(doc) || !write? + docs << doc + else + Jekyll.logger.debug "Skipped From Publishing:", doc.relative_path + end + end + + private + def read_files(file_path, full_path) + relative_dir = Jekyll.sanitized_path(relative_directory, + File.dirname(file_path)).chomp("/.") + files << StaticFile.new(site, site.source, relative_dir, + File.basename(full_path), self) + end end end From 0e8f2040113fd4ca49ca138925f6c01f9e7197b0 Mon Sep 17 00:00:00 2001 From: Marko Locher Date: Sat, 7 May 2016 16:58:44 +0200 Subject: [PATCH 1131/4996] Fix #3926 post_url helper with sub-directories Instead of matching the the value provided to `post_url` against the basename, test against the relative path. Updated the regexp to match both * _posts/category * category/_posts --- lib/jekyll/tags/post_url.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index 04c1ef2957b..c8b820b8b30 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -14,7 +14,7 @@ def initialize(name) "'#{name}' does not contain valid date and/or title." end - @name_regex = %r!^#{path}#{date}-#{slug}\.[^.]+! + @name_regex = %r!^_posts/#{path}#{date}-#{slug}\.[^.]+|^#{path}_posts/?#{date}-#{slug}\.[^.]+! end def post_date @@ -23,7 +23,7 @@ def post_date end def ==(other) - other.basename.match(@name_regex) + other.relative_path.match(@name_regex) end def deprecated_equality(other) From 49e97ef9b01831e747f1466452f527cc4bcb9aa6 Mon Sep 17 00:00:00 2001 From: Marko Locher Date: Wed, 18 May 2016 14:29:51 +0200 Subject: [PATCH 1132/4996] Add test case for deprecated post comparison Checks that `post_url` works for nested posts even if the path isn't specified. Also checks that a deprecation message is shown in the build log. --- test/test_tags.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/test_tags.rb b/test/test_tags.rb index 6b8fe8db78d..5bfbd2f8d75 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -587,6 +587,32 @@ def highlight_block_with_opts(options_string) end end + context "simple page with nested post linking and path not used in `post_url`" do + setup do + content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) + end + + should "not cause an error" do + refute_match(/markdown\-html\-error/, @result) + end + + should "have the url to the \"nested\" post from 2008-11-21" do + assert_match %r{1\s/2008/11/21/nested/}, @result + end + + should "throw a deprecation warning" do + deprecation_warning = " Deprecation: A call to '{{ post_url 2008-11-21-nested }}' did not match a post using the new matching method of checking name (path-date-slug) equality. Please make sure that you change this tag to match the post's name exactly." + assert_includes Jekyll.logger.messages, deprecation_warning + end + end + context "simple page with invalid post name linking" do should "cause an error" do content = < Date: Thu, 14 Jul 2016 12:15:00 +0200 Subject: [PATCH 1133/4996] Fix Rubocop warnings --- lib/jekyll/tags/post_url.rb | 3 ++- test/test_tags.rb | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index c8b820b8b30..b865cd67fdf 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -14,7 +14,8 @@ def initialize(name) "'#{name}' does not contain valid date and/or title." end - @name_regex = %r!^_posts/#{path}#{date}-#{slug}\.[^.]+|^#{path}_posts/?#{date}-#{slug}\.[^.]+! + @name_regex = %r!^_posts/#{path}#{date}-#{slug}\.[^.]+| + ^#{path}_posts/?#{date}-#{slug}\.[^.]+!x end def post_date diff --git a/test/test_tags.rb b/test/test_tags.rb index 5bfbd2f8d75..7a92928185a 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -596,19 +596,27 @@ def highlight_block_with_opts(options_string) - 1 {% post_url 2008-11-21-nested %} CONTENT - create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) + create_post(content, { + "permalink" => "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true + }) end should "not cause an error" do - refute_match(/markdown\-html\-error/, @result) + refute_match(%r!markdown\-html\-error!, @result) end should "have the url to the \"nested\" post from 2008-11-21" do - assert_match %r{1\s/2008/11/21/nested/}, @result + assert_match %r!1\s/2008/11/21/nested/!, @result end should "throw a deprecation warning" do - deprecation_warning = " Deprecation: A call to '{{ post_url 2008-11-21-nested }}' did not match a post using the new matching method of checking name (path-date-slug) equality. Please make sure that you change this tag to match the post's name exactly." + deprecation_warning = " Deprecation: A call to "\ + "'{{ post_url 2008-11-21-nested }}' did not match a post using the new matching "\ + "method of checking name (path-date-slug) equality. Please make sure that you "\ + "change this tag to match the post's name exactly." assert_includes Jekyll.logger.messages, deprecation_warning end end From 2b57795c7f24fb8be7a5d165d08e0a29de64f938 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 14 Jul 2016 13:08:25 -0500 Subject: [PATCH 1134/4996] Failing test: where_exp filter should filter posts --- test/test_filters.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/test_filters.rb b/test/test_filters.rb index fa0f9e52180..1c5b27c6f47 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -594,6 +594,14 @@ def to_liquid assert_equal "b", results[1]["id"] assert_equal "d", results[2]["id"] end + + should "filter posts" do + site = fixture_site.tap(&:read) + posts = site.site_payload["site"]["posts"] + results = @filter.where_exp(posts, "obj", "obj.title == 'Foo Bar'") + assert_equal 1, results.length + assert_equal site.posts.find { |p| p.title == "Foo Bar" }, results.first + end end context "sort filter" do From 99663a919966e9f2f204b048f180e441f7a4bd32 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Sun, 10 Jul 2016 20:52:39 +0200 Subject: [PATCH 1135/4996] object needs to respond to select instead of being an enumerable --- lib/jekyll/filters.rb | 8 ++++---- test/test_filters.rb | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 231eb7b6a87..f98845d281e 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -233,11 +233,11 @@ def group_by(input, property) # # Returns the filtered array of objects def where(input, property, value) - return input unless input.is_a?(Enumerable) + return input unless input.respond_to?(:select) input = input.values if input.is_a?(Hash) input.select do |object| Array(item_property(object, property)).map(&:to_s).include?(value.to_s) - end + end || [] end # Filters an array of objects against an expression @@ -248,7 +248,7 @@ def where(input, property, value) # # Returns the filtered array of objects def where_exp(input, variable, expression) - return input unless input.is_a?(Enumerable) + return input unless input.respond_to?(:select) input = input.values if input.is_a?(Hash) # FIXME condition = parse_condition(expression) @@ -257,7 +257,7 @@ def where_exp(input, variable, expression) @context[variable] = object condition.evaluate(@context) end - end + end || [] end # Sort an array of objects diff --git a/test/test_filters.rb b/test/test_filters.rb index 1c5b27c6f47..b6effecdbf6 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -15,6 +15,10 @@ def initialize(opts = {}) end end + class SelectDummy + def select; end + end + context "filters" do setup do @filter = JekyllFilter.new({ @@ -530,6 +534,11 @@ def to_liquid assert_equal 1, results.length assert_equal 4.7, results[0]["rating"] end + + should "always return an array if the object responds to `select`" do + results = @filter.where(SelectDummy.new, "obj", "1 == 1") + assert_equal [], results + end end context "where_exp filter" do @@ -602,6 +611,11 @@ def to_liquid assert_equal 1, results.length assert_equal site.posts.find { |p| p.title == "Foo Bar" }, results.first end + + should "always return an array if the object responds to `select`" do + results = @filter.where_exp(SelectDummy.new, "obj", "1 == 1") + assert_equal [], results + end end context "sort filter" do From 83a72606b3a0bb89696ce69bcf6f6de971137fb4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 14 Jul 2016 16:23:02 -0700 Subject: [PATCH 1136/4996] Add a test to ensure the Apache bug doesn't come up again. --- features/highlighting.feature | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 features/highlighting.feature diff --git a/features/highlighting.feature b/features/highlighting.feature new file mode 100644 index 00000000000..c9f2b00acec --- /dev/null +++ b/features/highlighting.feature @@ -0,0 +1,33 @@ +Feature: Syntax Highlighting + As a hacker who likes to blog + I want to share code snippets in my blog + And make them pretty for all the world to see + + Scenario: highlighting an apache configuration + Given I have an "index.html" file with content: + """ + --- + --- + + {% highlight apache %} + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.*)$ index.php [QSA,L] + {% endhighlight %} + + ```apache + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.*)$ index.php [QSA,L] + ``` + """ + And I have a "_config.yml" file with content: + """ + kramdown: + input: GFM + """ + When I run jekyll build + Then I should get a zero exit-status + And I should see "RewriteCond" in "_site/index.html" From 20b3758edb05130135cfb620a8aa5ca0db059679 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Wed, 13 Jul 2016 10:52:18 +0800 Subject: [PATCH 1137/4996] Add to_integer filter Add to_integer filter Fix test_filter: parenthesize the method Fix offense: seperate every 3 digits with _ rubocop:disable Metrics/ModuleLength More descriptive exception Fix fmt error Remove if stmt for integer input Remove rescue for to_i Remove error message assert --- lib/jekyll/filters.rb | 11 +++++++++++ test/test_filters.rb | 30 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 231eb7b6a87..0ab50d49f69 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -260,6 +260,17 @@ def where_exp(input, variable, expression) end end + # Convert the input into integer + # + # input - the object string + # + # Returns the integer value + def to_integer(input) + return 1 if input == true + return 0 if input == false + input.to_i + end + # Sort an array of objects # # input - the object array diff --git a/test/test_filters.rb b/test/test_filters.rb index fa0f9e52180..399ade72c69 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -26,6 +26,7 @@ def initialize(opts = {}) @sample_date = Date.parse("2013-03-27") @time_as_string = "September 11, 2001 12:46:30 -0000" @time_as_numeric = 1_399_680_607 + @integer_as_string = "142857" @array_of_objects = [ { "color" => "red", "size" => "large" }, { "color" => "red", "size" => "medium" }, @@ -235,6 +236,13 @@ def initialize(opts = {}) @filter.date_to_rfc822(@time_as_string) ) end + + should "convert a String to Integer" do + assert_equal( + 142_857, + @filter.to_integer(@integer_as_string) + ) + end end context "with a Numeric object" do @@ -635,6 +643,28 @@ def to_liquid end end + context "to_integer filter" do + should "raise Exception when input is not integer or string" do + assert_raises NoMethodError do + @filter.to_integer([1, 2]) + end + end + should "return 0 when input is nil" do + assert_equal 0, @filter.to_integer(nil) + end + should "return integer when input is boolean" do + assert_equal 0, @filter.to_integer(false) + assert_equal 1, @filter.to_integer(true) + end + should "return integers" do + assert_equal 0, @filter.to_integer(0) + assert_equal 1, @filter.to_integer(1) + assert_equal 1, @filter.to_integer(1.42857) + assert_equal(-1, @filter.to_integer(-1)) + assert_equal(-1, @filter.to_integer(-1.42857)) + end + end + context "inspect filter" do should "return a HTML-escaped string representation of an object" do assert_equal "{"<a>"=>1}", @filter.inspect({ "" => 1 }) From 3b6561a57c7b2fa35675d514ffd1523d6d6f85c4 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 14 Jul 2016 19:55:09 -0700 Subject: [PATCH 1138/4996] Update history to reflect merge of #5053 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0806d6ffd81..e1b6c8b040d 100644 --- a/History.markdown +++ b/History.markdown @@ -34,6 +34,7 @@ * Add fetch method to Drops (#5056) * Extract tag name to class method (#5063) * check if relative URL contains a colon (#5069) + * Enable strict (or lax) liquid parsing via a config variable. (#5053) ### Bug Fixes From b88f0a21d653129328ef07e6b2916d4f7b1c4d70 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Fri, 15 Jul 2016 10:31:02 +0300 Subject: [PATCH 1139/4996] hooks: move after_init hook call at the end of Site.initialize --- lib/jekyll/site.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 978f64a6afd..14f9369c657 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -29,10 +29,10 @@ def initialize(config) Jekyll.sites << self - Jekyll::Hooks.trigger :site, :after_init, self - reset setup + + Jekyll::Hooks.trigger :site, :after_init, self end # Public: Set the site's configuration. This handles side-effects caused by From b9f232e5bfeb621f37e558ca0379d2f98344a95a Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Fri, 15 Jul 2016 10:56:29 +0300 Subject: [PATCH 1140/4996] rubocop: fix methods naming and indentation --- lib/jekyll/collection.rb | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 88120d1fc6f..ebe6891c20a 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -57,9 +57,9 @@ def read full_path = collection_dir(file_path) next if File.directory?(full_path) if Utils.has_yaml_header? full_path - read_docs(full_path) + read_document(full_path) else - read_files(file_path, full_path) + read_static_file(file_path, full_path) end end docs.sort! @@ -197,8 +197,8 @@ def extract_metadata end private - def read_docs(full_path) - doc = Jekyll::Document.new(full_path, { :site => site, :collection => self }) + def read_document(full_path) + doc = Jekyll::Document.new(full_path, :site => site, :collection => self) doc.read if site.publisher.publish?(doc) || !write? docs << doc @@ -208,11 +208,14 @@ def read_docs(full_path) end private - def read_files(file_path, full_path) - relative_dir = Jekyll.sanitized_path(relative_directory, - File.dirname(file_path)).chomp("/.") + def read_static_file(file_path, full_path) + relative_dir = Jekyll.sanitized_path( + relative_directory, + File.dirname(file_path) + ).chomp("/.") + files << StaticFile.new(site, site.source, relative_dir, - File.basename(full_path), self) + File.basename(full_path), self) end end end From 0db1ec339d39cd06f2f91746fcd4b45c827bf655 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Jul 2016 09:58:09 -0700 Subject: [PATCH 1141/4996] Update history to reflect merge of #5101 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e1b6c8b040d..24dd8e541a0 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Extract tag name to class method (#5063) * check if relative URL contains a colon (#5069) * Enable strict (or lax) liquid parsing via a config variable. (#5053) + * Add filter: to_integer (#5101) ### Bug Fixes From 196275f5b4e885a5489fcdda1898694af2e4ebc8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Jul 2016 17:26:14 -0700 Subject: [PATCH 1142/4996] Update history to reflect merge of #5060 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 24dd8e541a0..312920eec33 100644 --- a/History.markdown +++ b/History.markdown @@ -55,6 +55,7 @@ * `Serve.process` should receive same config as `Build.process` (#4953) * Prevent reset of page in Liquid payload right before rendering layouts (#5009) * Add missing fields to ExcerptDrop (#5067) + * Stringify configuration overrides before first use (#5060) ### Forward Ports From 10cfaa2a75e6ee81335d598eb155754fdee89654 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Jul 2016 19:24:03 -0700 Subject: [PATCH 1143/4996] Update history to reflect merge of #5106 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 312920eec33..5fb67a20a79 100644 --- a/History.markdown +++ b/History.markdown @@ -56,6 +56,7 @@ * Prevent reset of page in Liquid payload right before rendering layouts (#5009) * Add missing fields to ExcerptDrop (#5067) * Stringify configuration overrides before first use (#5060) + * hooks: move after_init hook call at the end of Site.initialize (#5106) ### Forward Ports From 5e74610755e9faeacadf647b2373d7b68ab8b3fd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Jul 2016 19:39:42 -0700 Subject: [PATCH 1144/4996] Update history to reflect merge of #5022 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5fb67a20a79..3ac64babf2a 100644 --- a/History.markdown +++ b/History.markdown @@ -118,6 +118,7 @@ * Change baseurl to example.com for some test cases (#5068) * use activesupport < 5 if we are on a Ruby < 2.2.2 (#5100) * Internal documentation for working on Jekyll (#5011) + * rubocop: lib/jekyll/collection.rb (#5022) ### Site Enhancements From 311e3d2fef137903bd97ba4f1d258ca50d148076 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 18 Jul 2016 18:27:38 +0300 Subject: [PATCH 1145/4996] Slightly, improve PNG compression. Before: 101 KB (103.742 bytes) After: 100 KB (102.817 bytes) --- site/img/article-footer.png | Bin 1863 -> 1581 bytes site/img/footer-logo.png | Bin 3783 -> 3688 bytes site/img/logo-2x.png | Bin 46514 -> 45966 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/site/img/article-footer.png b/site/img/article-footer.png index d000cf08cd1be7d8ef746e3cc712c239fcc7c3d5..eeb74411cd0b8dcc59d3684192ea7dd45e345d20 100644 GIT binary patch literal 1581 zcmb_cXE+-O0F4%Jpp3k5|UEVKp9y%c@S7ZQAv5< z{-0EShNwc-{=X@6pfUgeDH%t58!wy~e=NIt%tY18`R;RkX=00TiQL z1zU%Hn_eBl?=HI!ENGreqvi?+sAciJUyax5u&egVn)z;z23H%{U9LI-l$zyggP={~uE4teYn;!eK-^%vts;3HSeOK!D zGde^^IDV}SN=WS-f2X@ceGyM3XeWE&IZbBq4Pgs%6%yp<}|9F{qRK`kf{3OvpZb zupIeY^87J^eNr@y2W99RPui;A;Ya##K420`8jJ}F-NrNM2+eyuzf;%xzfux8Syd7W zu%jd`gE$qPI`IgZzfB3SKuQ2jkT5EJ%3GP-g7AG40z0JdAeR?qBd!tRl8upNn#cSSxJf4xIykg zr}geTT3L_G7wMWnm->b?KMFT-y3zb_gT;cplH0$S_6$V5Gq2~FS`P$EtP$kMrHa|K z_UpspDHYph@&t4M4(~Dn#Oq^poKwXnkU>Ws+Y08VcZi)b!GSj=hsd4P=_`M4$LSA` zh01KKbvffaEi4e2LxI~<3#|-xDV+n{|f+BIl=FR=r!aCbhc1O(4u{2XAocGs&gT=QAkV%JCi< zfp`YhShM&H<I}U8=megSv|pY~o7iV2?q6z&_iQoHWuVGEB8~Q#3Ha&BX}4@d&%9 z$S&fEgt>tWezWM_0|kAboLL3RJ}(@JX}$H(8}UIDLPD6UEf(D_3?f7Q<^vg5Bl$f% z#-D~yo(aB+U)1s-2HNzr6+&{T#p)Y~cRA%O)+|=O9-&mdy2+Pl(pogAIa~&FI2csX zfHbQb%7Zb-csRkZ-A7r>rQGwV?vLTgk4EhTffP{=TSu$??8UZXuTd9}5Y7omAkq7- zv92Mcfs;x?!DOIoB)2Jhta{1$eTM$~_4#rcl ztg_#~b@G;QBu^JZ*^)iD41coTb8BIE4fCth0w){J5rQQl?!MMr)nKDFDW%hOR#z6)IwHiatva$Qp{Np@(v)l+>%Ln@ z%O*-SiMXP!ZKbN~P8=m_NurG|T77u-?aYpO^Jd=nkKgb6`~0rE?ylz{U~Mn}0DxR@ zcJKfIq&g0~yS(&49KPjMeUNJ0(U%?f|D%KIARms0`QNR>@P7{f4G)_G|9|z@<^Ov0 z7p%+PEj-vq#d)}10ssM0Kxru%kgT+vyo>@^38W|skyBPtRgnKmNl^`~3{h26fqtc~ zp$Ug+X~8wMHJ~tc?e>$IQUHLg{sjly%Lzcy^gI#j2z8RA$%M!#IN9C5dX!Ri;5R?~0(_HMOXih_6E^JmJZ`R4@G>)YH(F_XBh(k|V@qj5LE?-QQ?f?kUc zXeBhPCu}P|tK+^$cw&gKLB035GBcHr8Oy#JpY$E)gE~Ar2eK$H47S}>S?RQn;q0Yf z*!1syHXa%4f7Lm}&NOPtNed?!p1#Ydn4V>=FJ88+snl2lUD}IIG=7Odbzl&@OrOmY zN$sWF($$pd&eByP)T~Ue6{b2ojKOk z*{JVkHI$`u^@fG=6ABMvrVMav+-BoR`{6vQVmw*CK#O*SY1ILG_9GUD#m;bsNG2@T zW4AK)^5?QalL8yOjn!aTu<8I<{RaT@x;mXs6Gv&${M)8{ak6ks5oqFK-EDJ7!{Bkn z5PcZaD8c1EenSV4Y$T!ZLnqxpz01WttXgce7=O*EUroq!&ddKb0guUon1>f-^nEh& zPosY#bO{I9zqc*4T7Rucym?~5ec|UG*7B5^7&_HmEIVXB2w%Jl8<4#>uQMI+fsA{X zTq`Tt5#f}?8@{Q2)mUFX(9ir!O!dj&9daNVpY@)J6U8{hM4U_bxSk!?rym*LGS0x% z-&ASUuhqX&K1-}f%uOswENDlc?G~R9p4t4T@Y38$(@)sl)>*l&l!yBRN$1|k-Ra)` zp>YILxzQEsUr%ePm?st|796bQo^dOm-Le#3Tnn1GhNA|TDw^m$F~465=5)nbj7rD# zGICDuSq|U^K46AQnSG_s{*d;q-|s#?+I;7+Gq^?<>X4TIIv0hA1~Qr!G$J^}8I%5Z zff-)Fr^Myrhk{|rA1H88Wgq*PrHCOFs68O6qp-0h{G0Ap98~x8R$XKgD4K#t49)7= z5k7A;X>j_}OGvxK)McL!;1=Y|+Rf55{BHOME}>n#lr7x+?AdkYQP0W|z&t9zRM1OH zb}X;0**1%~O}M@k*3~(>Ilc=DIugD^carI$)$yVeR*ji+uf z^M!FC`(e&G(Qx`03a7D%NCEoDq$5>ZQ@yHSj961c7NUx0gOdpB?c;8}^#JhGsMDTS-h7JqvPmZ2xg5cH(=-xw ziy@-UIIhRv2Wa%Zm@;;G1q;uqDQ7bpo)bEhEnVT193*N)qKoJ_dfMd~o-JG?cBq=< zK1jKUZnkzhRo(7$r7>dkU!7zOffplxTGt@BP}Hzw+n7Yg2(EsaTc4y$6MJb>dM?09 zDOC8xYz?eIOmZ~Wy(eI<7J06$h5DPW-N0gzkBy6{OT}(RI`Ql>%pecwZI2$HvMM49 z*L=&H#zwsWqGKYGo+NU>gWr%xXq(vKZ=LGZvKDARL?8)tV!Z{B%-IQvek}Yl@<{&*t#* z|LWk-^laj9DNabHV%Pt{e$pco-DyGjz<*uNe@g&H*yXS`UTv z3MP(uJjVD2Vd-o=Tx3HQppZ~rW6^h3Ay?#e1Ot!dqr?}osJ_Un3oe*f_=BTh}B}q)30AB6~?<-%^~7%4#$bRkYZJFdV> z@cbZ*q}}37HkU65Jhft}T#=4Ztyy(}=hSFw(kT+Hw!qWrm|f{qvECDR)*pWiw-}8N zw8?Z^n+1#Z?lC@&EsW#%bA7k}+PtjY+@{&EO18F}+D2-`tZm!2?Q7e%Z6(d_d1hyJ zc94F~_iec6x8CQ>ILRo%B?AOPLdjTR;Sumjow{VEdJwBm${IkdAsHnSLQyUWS=n^_C%x4q3Mkbm>bTD)ocAG8JV=V?&1Z zhdy_BK64rXPk9H*kVb|K3xQ69$Xy|b43;4c4CxvIorVr0H^YZQXoPd+K)0zbauW+q9C-+g zZzE7VP=?f^HS|j$cXxu5NFI_Plq^GPP$LEUrINceaB7i<1PCR_km@-j;RosDE(4rM z8PbT5o#6-Lijli%;PiiyAq@yQY&ulQJ!59vtl4wsR+&Bf&bZ{nfO)vtd@Way1u~=o zAs51{a*Gx(2_tt)mvv5Ez5@ShO&+R(Q(T5LAY@*6v2yY%VmVi@88QJtJb79Rv7zhy zA5w-~4`o9pk~d+YcRfr38z8ok{2x+=jDeCKo5**=?t#eAmi~VaDMR)y2L;PlksdWB zD312Xkbblo3hH+weYU{UR+1qN2st0TZKT^8xZB=MhBP4LgW&aal75Bf;bs$RI>~^L zGUOVt?x{rnaNE`i$P}}K7&4?jCBcbWO@7jQ=dQ*89BX&)A%+a8Q{BDb%qD-@7dVhO zGNgX{!8uTg%p!k7>bDV`LX?9-%8>cM$h}X7G&^Lq9Sv{4{q}>0R*`1i4)dS)n@5Ip zHEfW4HYC zS`b-Vm)u34ISo~g#hVcF(Ahi!=Q5lma{hwoyVqV+6>@*w!h9)Uq~t$CDs2N}G5Nz{ zh+U$a?Yn*Vsl!mKtO+46L#!!@L_lbyijaY`OF>a`RZ?X+7?a2!T6>*OUV0_G*IsB5 zU_!_kO?SQ!i}4=v>QH#I;*zdA?@~@vLT*@D8jM>!qz1E8v?w}`|0hfcxvCr>Lwa?s z8+mgbj2nNZgnSS(q#9d&AJ=&_Cx@KiP_{Rxg~Y?;#baPRn3F?lXZMifn)-MQsH099 z(oP}qcro7=dOFFF)`!$EbW;ancay-d;*(W)Vx0jYWyo?DNl7Bao+N>%pvp`GLduZ1 zOiG^CFbPigK$Uq$gp?smKS&CuL#!qV1V9ys5g~tNNZd~f4nXV~8PawkbGwM=;1^nk zv{^_LCSDZ8&dZSY3wamu_=_Y%niuli<(ikyOxp2mn}YX1LG@wULl!qD@M>rexx}21^!y76nHk7l%x@qowEd3U2S{Us(*?uXNPQm zNYj6$agz3sPsosFglt6u&az;FQg1feZe@W`3-@&7KW4| zZ`Xcs)anqsYGFtja@f6^H#)uyu{aAu%8>L5#6}V)i2omQaL5BO%3ij6$Sn|iRqGBY z^tV2wb-S^w4;c)xmBdMc*jOt=%8*MT_BelWUV~UlUGnt03~5qGDi5LRns-a#S@QHo zTue6Qj0!1320$oE`+)Lf^3GvYNEz}4h!N*aFrKn9qzoCOHDo6+`dJxLhHRxZWVZ0;7ceLduY(iFE^v(-wx5AuI4p%XkZ%w=EATpS5ZTSrvbr zcdQF3L+*l5DdLp@!?DzwkTN8{7Vi@8NpNaf7E*@n&wnVzX$DU2VpfHeA*VoS7xAj5 zfV04=kTRshhs~}b;FNn?hP2n`k?)X#8(_Ux*OHJjG2SF$xbUm%8(yG>;Y2p zGtU3$@32#^&@;y6+EMZE> zx=|3CO3LD(WJPSWr6D7tZ4|PCDIr6Zry*HIpsdVeblnl5b{Ham3NvEa;@_G zKQ9Sh9J^~nRmv{+%yy*$u^oLvk#)QeHhnxe> z*6bynZ@vI%4w)tIV@oN!J!QZ+>>_V!=dwY_XTVA*>@qjx2C(vdPXFuHF#K^qZAeB$ zorSe2(?cbqz!^o}b+tjrbSQr~y0%sK*|Rqmh=~k&-h_~6px|83X=@tIy;@+#F)-MW zjPfrG4qr33X6ohlpkOC?*R8+xA>V*HM~fOC@=$w|sq>EIAuF2|vX%Fc8*CS{^hr|3^{Ri>Ay@6SPspWH z?G|zXsZ}?`;*d1JJ|QW|ZXtt7wXhJ2LpHQg$S-Xc@^#W6tfaLesh@p9Qh!^8oUntm zaE-J!WbioqgiN4V14sd*8Nb^>5klavLtq*Ou_vEvMHJMl<-VkZg6TXj3z&c4&D;C zaxXZ!B7g4u5E-Fc(*-j;{_b}}W-nPsrmNk&!V1xa-}UfEoi&6^-3tH!002ovPDHLkV1fvgj4J>D delta 3032 zcmZWrX*iS(8=a!EjxqM7%%e$0r7$XFo3T72B(hYtn3Off@}hXiEDh3QEENh-l8`+~ zy?T{rYIrpj$yOQ3p0!AP^Zx#Ro^##jzOU86plI+ANHSA?DüTQS&ua{g4C!y2 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 LJ6ctdd@uhG+$@f( diff --git a/site/img/logo-2x.png b/site/img/logo-2x.png index 28b9cd8d1c0741a956a7d22bdfda46a54a4213a0..57af994c61aed71f4c7ad11685d7baebd1fec373 100644 GIT binary patch literal 45966 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̂l{EE@V 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 UV0TLl2>6keRQg=`$t39i0cd-D5dZ)H From dbc034990935daf1148cafbadbad03d8445b174c Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 18 Jul 2016 15:05:06 +0300 Subject: [PATCH 1146/4996] tests: Typo fixes. --- test/test_collections.rb | 4 ++-- test/test_commands_serve.rb | 2 +- test/test_convertible.rb | 14 +++++++------- test/test_doctor_command.rb | 2 +- test/test_document.rb | 14 +++++++------- test/test_excerpt.rb | 2 +- test/test_filters.rb | 2 +- test/test_page.rb | 20 ++++++++++---------- test/test_regenerator.rb | 4 ++-- test/test_related_posts.rb | 4 ++-- test/test_site.rb | 10 +++++----- test/test_static_file.rb | 4 ++-- test/test_tags.rb | 12 ++++++------ test/test_utils.rb | 4 ++-- 14 files changed, 49 insertions(+), 49 deletions(-) diff --git a/test/test_collections.rb b/test/test_collections.rb index 795c0d8b0f3..3ae1ab12d4a 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -28,7 +28,7 @@ class TestCollections < JekyllUnitTest assert_equal @collection.label, "methods" end - should "have default url template" do + should "have default URL template" do assert_equal @collection.url_template, "/:collection/:path:output_ext" end @@ -99,7 +99,7 @@ class TestCollections < JekyllUnitTest @collection = @site.collections["methods"] end - should "have custom url template" do + should "have custom URL template" do assert_equal @collection.url_template, "/awesome/:path/" end end diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index f129a07ece2..7e8a7062bc4 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -99,7 +99,7 @@ def custom_opts(what) end end - context "enabling ssl" do + context "enabling SSL" do should "raise if enabling without key or cert" do assert_raises RuntimeError do custom_opts({ diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 0280946f085..82d643748a7 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -2,7 +2,7 @@ require "ostruct" class TestConvertible < JekyllUnitTest - context "yaml front-matter" do + context "YAML front matter" do setup do @convertible = OpenStruct.new( "site" => Site.new(Jekyll.configuration( @@ -13,17 +13,17 @@ class TestConvertible < JekyllUnitTest @base = File.expand_path("../fixtures", __FILE__) end - should "parse the front-matter correctly" do + should "parse the front matter correctly" do ret = @convertible.read_yaml(@base, "front_matter.erb") assert_equal({ "test" => "good" }, ret) end - should "not parse if the front-matter is not at the start of the file" do + should "not parse if the front matter is not at the start of the file" do ret = @convertible.read_yaml(@base, "broken_front_matter1.erb") assert_equal({}, ret) end - should "not parse if there is syntax error in front-matter" do + should "not parse if there is syntax error in front matter" do name = "broken_front_matter2.erb" out = capture_stderr do ret = @convertible.read_yaml(@base, name) @@ -33,7 +33,7 @@ class TestConvertible < JekyllUnitTest assert_match(%r!#{File.join(@base, name)}!, out) end - should "not allow ruby objects in yaml" do + should "not allow ruby objects in YAML" do out = capture_stderr do @convertible.read_yaml(@base, "exploit_front_matter.erb") end @@ -50,14 +50,14 @@ class TestConvertible < JekyllUnitTest assert_match(%r!#{File.join(@base, name)}!, out) end - should "parse the front-matter but show an error if permalink is empty" do + should "parse the front matter but show an error if permalink is empty" do name = "empty_permalink.erb" assert_raises(Errors::InvalidPermalinkError) do @convertible.read_yaml(@base, name) end end - should "parse the front-matter correctly whitout permalink" do + should "parse the front matter correctly without permalink" do out = capture_stderr do @convertible.read_yaml(@base, "front_matter.erb") end diff --git a/test/test_doctor_command.rb b/test/test_doctor_command.rb index 7280b2871ee..652175b9cf4 100644 --- a/test/test_doctor_command.rb +++ b/test/test_doctor_command.rb @@ -2,7 +2,7 @@ require "jekyll/commands/doctor" class TestDoctorCommand < JekyllUnitTest - context "urls only differ by case" do + context "URLs only differ by case" do setup do clear_dest end diff --git a/test/test_document.rb b/test/test_document.rb index 808ef2e7d56..e4d7abbfdac 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -36,7 +36,7 @@ def assert_equal_value(key, one, other) assert_equal "configuration", @document.basename_without_ext end - should "know whether its a yaml file" do + should "know whether it's a YAML file" do assert_equal false, @document.yaml_file? end @@ -110,7 +110,7 @@ def assert_equal_value(key, one, other) end end - context "a document as part of a collection with frontmatter defaults" do + context "a document as part of a collection with front matter defaults" do setup do @site = fixture_site({ "collections" => ["slides"], @@ -127,14 +127,14 @@ def assert_equal_value(key, one, other) @document = @site.collections["slides"].docs.select { |d| d.is_a?(Document) }.first end - should "know the frontmatter defaults" do + should "know the front matter defaults" do assert_equal "Example slide", @document.data["title"] assert_equal "slide", @document.data["layout"] assert_equal({ "key"=>"myval" }, @document.data["nested"]) end end - context "a document as part of a collection with overriden default values" do + context "a document as part of a collection with overridden default values" do setup do @site = fixture_site({ "collections" => ["slides"], @@ -152,7 +152,7 @@ def assert_equal_value(key, one, other) @document = @site.collections["slides"].docs[1] end - should "override default values in the document frontmatter" do + should "override default values in the document front matter" do assert_equal "Override title", @document.data["title"] assert_equal "slide", @document.data["layout"] assert_equal( @@ -179,7 +179,7 @@ def assert_equal_value(key, one, other) @document = @site.collections["slides"].docs.first end - should "know the frontmatter defaults" do + should "know the front matter defaults" do assert_equal "Example slide", @document.data["title"] assert_equal "slide", @document.data["layout"] assert_equal({ "key"=>"value123" }, @document.data["nested"]) @@ -203,7 +203,7 @@ def assert_equal_value(key, one, other) @document = @site.collections["slides"].docs.first end - should "not know the specified frontmatter defaults" do + should "not know the specified front matter defaults" do assert_equal "Example slide", @document.data["title"] assert_equal "slide", @document.data["layout"] assert_equal nil, @document.data["nested"] diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index 060323feb8b..b8169794c61 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -77,7 +77,7 @@ def do_render(document) end context "#to_liquid" do - should "contain the proper page data to mimick the post liquid" do + should "contain the proper page data to mimic the post liquid" do assert_equal "Post Excerpt with Layout", @excerpt.to_liquid["title"] url = "/bar/baz/z_category/mixedcase/2013/07/22/post-excerpt-with-layout.html" assert_equal url, @excerpt.to_liquid["url"] diff --git a/test/test_filters.rb b/test/test_filters.rb index 399ade72c69..7e37f228236 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -151,7 +151,7 @@ def initialize(opts = {}) assert_equal "a b", @filter.normalize_whitespace("a \t \n\nb") end - should "strip whitespace from begining and end of string" do + should "strip whitespace from beginning and end of string" do assert_equal "a", @filter.normalize_whitespace("a ") assert_equal "a", @filter.normalize_whitespace(" a") assert_equal "a", @filter.normalize_whitespace(" a ") diff --git a/test/test_page.rb b/test/test_page.rb index ba79514e8f2..3072aebb7f4 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -28,7 +28,7 @@ def do_render(page) end context "processing pages" do - should "create url based on filename" do + should "create URL based on filename" do @page = setup_page("contacts.html") assert_equal "/contacts.html", @page.url end @@ -38,18 +38,18 @@ def do_render(page) assert_equal false, @page.published? end - should "create url with non-alphabetic characters" do + should "create URL with non-alphabetic characters" do @page = setup_page("+", "%# +.md") assert_equal "/+/%25%23%20+.html", @page.url end context "in a directory hierarchy" do - should "create url based on filename" do + should "create URL based on filename" do @page = setup_page("/contacts", "bar.html") assert_equal "/contacts/bar.html", @page.url end - should "create index url based on filename" do + should "create index URL based on filename" do @page = setup_page("/contacts", "index.html") assert_equal "/contacts/", @page.url end @@ -105,7 +105,7 @@ def do_render(page) @site.permalink_style = :pretty end - should "return dir, url, and destination correctly" do + should "return dir, URL, and destination correctly" do @page = setup_page("contacts.html") @dest_file = dest_dir("contacts/index.html") @@ -125,7 +125,7 @@ def do_render(page) assert_equal "/contacts/bar/", @page.url end - should "create index url based on filename" do + should "create index URL based on filename" do @page = setup_page("/contacts", "index.html") assert_equal "/contacts/", @page.url end @@ -166,7 +166,7 @@ def do_render(page) @site.permalink_style = "/:title/" end - should "return url and destination correctly" do + should "return URL and destination correctly" do @page = setup_page("contacts.html") @dest_file = dest_dir("contacts/index.html") assert_equal "/contacts/", @page.url @@ -179,7 +179,7 @@ def do_render(page) @site.permalink_style = "/:title:output_ext" end - should "return url and destination correctly" do + should "return URL and destination correctly" do @page = setup_page("contacts.html") @dest_file = dest_dir("contacts.html") assert_equal "/contacts.html", @page.url @@ -192,7 +192,7 @@ def do_render(page) @site.permalink_style = "/:title" end - should "return url and destination correctly" do + should "return URL and destination correctly" do @page = setup_page("contacts.html") @dest_file = dest_dir("contacts.html") assert_equal "/contacts", @page.url @@ -209,7 +209,7 @@ def do_render(page) end end - should "respect permalink in yaml front matter" do + should "respect permalink in YAML front matter" do file = "about.html" @page = setup_page(file) diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index 36b15949591..03920c83022 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -166,7 +166,7 @@ class TestRegenerator < JekyllUnitTest assert_equal File.mtime(@path), @regenerator.metadata[@path]["mtime"] end - should "read legacy yaml metadata" do + should "read legacy YAML metadata" do metadata_file = source_dir(".jekyll-metadata") @regenerator = Regenerator.new(@site) @@ -305,7 +305,7 @@ class TestRegenerator < JekyllUnitTest end end - context "when incremental regen is disabled" do + context "when incremental regeneration is disabled" do setup do FileUtils.rm_rf(source_dir(".jekyll-metadata")) @site = Site.new(Jekyll.configuration({ diff --git a/test/test_related_posts.rb b/test/test_related_posts.rb index cda18dfcb3b..cea3ad0b539 100644 --- a/test/test_related_posts.rb +++ b/test/test_related_posts.rb @@ -18,7 +18,7 @@ class TestRelatedPosts < JekyllUnitTest end end - context "building related posts with lsi" do + context "building related posts with LSI" do setup do if jruby? skip( @@ -53,7 +53,7 @@ class TestRelatedPosts < JekyllUnitTest Jekyll::RelatedPosts.new(post).build end - should "use lsi for the related posts" do + should "use LSI for the related posts" do allow_any_instance_of(::ClassifierReborn::LSI).to \ receive(:find_related).and_return(@site.posts[-1..-9]) allow_any_instance_of(::ClassifierReborn::LSI).to receive(:build_index) diff --git a/test/test_site.rb b/test/test_site.rb index 4e9e18a57ab..f09d94b9dac 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -210,12 +210,12 @@ def generate(site) assert_equal posts.size - @num_invalid_posts, @site.posts.size end - should "read pages with yaml front matter" do + should "read pages with YAML front matter" do abs_path = File.expand_path("about.html", @site.source) assert_equal true, Utils.has_yaml_header?(abs_path) end - should "enforce a strict 3-dash limit on the start of the YAML front-matter" do + should "enforce a strict 3-dash limit on the start of the YAML front matter" do abs_path = File.expand_path("pgp.key", @site.source) assert_equal false, Utils.has_yaml_header?(abs_path) end @@ -330,7 +330,7 @@ def convert(*_args) s = Site.new(site_configuration("markdown" => custom_processor)) s.process - # Do some cleanup, we don't like straggling stuff's. + # Do some cleanup, we don't like straggling stuff. Jekyll::Converters::Markdown.send(:remove_const, :CustomMarkdown) end @@ -356,7 +356,7 @@ def convert(*_args) s.process end - # Do some cleanup, we don't like straggling stuff's. + # Do some cleanup, we don't like straggling stuff. Jekyll::Converters::Markdown.send(:remove_const, :Custom) end end @@ -544,7 +544,7 @@ def convert(*_args) assert_equal mtime3, mtime4 # no modifications, so remain the same end - should "regnerate files that have had their destination deleted" do + should "regenerate files that have had their destination deleted" do contacts_html = @site.pages.find { |p| p.name == "contacts.html" } @site.process diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 7019a1073b3..285ec879ffe 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -118,7 +118,7 @@ def setup_static_file_with_defaults(base, dir, name, defaults) assert @static_file.modified? end - should "known if the source path is modified, when its not" do + should "known if the source path is modified, when it's not" do @static_file.write(dest_dir) sleep 1 # wait, else the times are still the same assert !@static_file.modified? @@ -128,7 +128,7 @@ def setup_static_file_with_defaults(base, dir, name, defaults) assert @static_file.write?, "always true, with current implementation" end - should "be able to write itself to the desitination directory" do + should "be able to write itself to the destination directory" do assert @static_file.write(dest_dir) end diff --git a/test/test_tags.rb b/test/test_tags.rb index 6b8fe8db78d..239a75fa871 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -547,7 +547,7 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the url to the \"complex\" post from 2008-11-21" do + should "have the URL to the \"complex\" post from 2008-11-21" do assert_match %r!/2008/11/21/complex/!, @result end end @@ -576,12 +576,12 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the url to the \"complex\" post from 2008-11-21" do + should "have the URL to the \"complex\" post from 2008-11-21" do assert_match %r!1\s/2008/11/21/complex/!, @result assert_match %r!2\s/2008/11/21/complex/!, @result end - should "have the url to the \"nested\" post from 2008-11-21" do + should "have the URL to the \"nested\" post from 2008-11-21" do assert_match %r!3\s/2008/11/21/nested/!, @result assert_match %r!4\s/2008/11/21/nested/!, @result end @@ -648,7 +648,7 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the url to the \"yaml_with_dots\" item" do + should "have the URL to the \"yaml_with_dots\" item" do assert_match(%r!/methods/yaml_with_dots\.html!, @result) end end @@ -675,11 +675,11 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the url to the \"sanitized_path\" item" do + should "have the URL to the \"sanitized_path\" item" do assert_match %r!1\s/methods/sanitized_path\.html!, @result end - should "have the url to the \"site/generate\" item" do + should "have the URL to the \"site/generate\" item" do assert_match %r!2\s/methods/site/generate\.html!, @result end end diff --git a/test/test_utils.rb b/test/test_utils.rb index 5fbb99fcada..7fab0d55a97 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -356,12 +356,12 @@ class TestUtils < JekyllUnitTest end context "The \`Utils.has_yaml_header?\` method" do - should "accept files with yaml front matter" do + should "accept files with YAML front matter" do file = source_dir("_posts", "2008-10-18-foo-bar.markdown") assert_equal "---\n", File.open(file, "rb") { |f| f.read(4) } assert Utils.has_yaml_header?(file) end - should "accept files with extraneous spaces after yaml front matter" do + should "accept files with extraneous spaces after YAML front matter" do file = source_dir("_posts", "2015-12-27-extra-spaces.markdown") assert_equal "--- \n", File.open(file, "rb") { |f| f.read(6) } assert Utils.has_yaml_header?(file) From 5ca080ac6f526e0d70b5c27b24cb4a2fd7ab8b49 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 18 Jul 2016 15:23:26 +0300 Subject: [PATCH 1147/4996] Whitespace cleanup. --- .github/ISSUE_TEMPLATE.md | 4 ++-- History.markdown | 2 +- docs/triaging-an-issue.md | 2 +- lib/jekyll/utils.rb | 2 +- script/cibuild | 2 +- script/proof | 2 +- site/_data/jekyllconf-talks.yml | 2 +- site/_docs/assets.md | 6 +++--- site/_docs/configuration.md | 2 +- site/_docs/continuous-integration.md | 2 +- site/_docs/deployment-methods.md | 6 +++--- site/_docs/github-pages.md | 6 +++--- site/_docs/upgrading/2-to-3.md | 2 +- site/_docs/windows.md | 22 +++++++++++----------- site/community/index.md | 8 ++++---- 15 files changed, 35 insertions(+), 35 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 2e070d476d7..bd7579c39d3 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,8 +1,8 @@ - [ ] I believe this to be a bug, not a question about using Jekyll. -- [ ] I Updated to the latest Jekyll (or) if on Github Pages to the latest `github-pages` -- [ ] I Read the CONTRIBUTION file at https://jekyllrb.com/docs/contributing/ +- [ ] I updated to the latest Jekyll (or) if on GitHub Pages to the latest `github-pages` +- [ ] I read the CONTRIBUTION file at https://jekyllrb.com/docs/contributing/ - [ ] This is a feature request. --- @@ -38,20 +38,20 @@ - [ ] I was trying to install. - [ ] There is a broken Plugin API. -- [ ] I had an error on Github Pages, and I have not tested locally. -- [ ] I had an error on Github Pages, and Github Support said it was a Jekyll Bug. -- [ ] I had an error on Github Pages and I did not test it locally. +- [ ] I had an error on GitHub Pages, and I have not tested locally. +- [ ] I had an error on GitHub Pages, and GitHub Support said it was a Jekyll Bug. +- [ ] I had an error on GitHub Pages and I did not test it locally. - [ ] I was trying to build. - [ ] It was another bug. ## My Reproduction Steps ## The Output I Wanted - @@ -76,3 +79,4 @@ anything like that so there should be no need to alter it. --> +/cc include any Jekyll affinity teams here (see https://teams.jekyllrb.com/ for more info) diff --git a/docs/affinity-team-captain.md b/docs/affinity-team-captain.md new file mode 100644 index 00000000000..ccdcec7a689 --- /dev/null +++ b/docs/affinity-team-captain.md @@ -0,0 +1,25 @@ +# Affinity Team Captains + +**This guide is for affinity team captains.** These special people are **team maintainers** of one of our [affinity teams][] and help triage and evaluate the issues and contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. + +## Affinity teams & their captains + +The Jekyll project uses [affinity teams][] to help break up the work of incoming issues and pull requests from community members. We receive a sizeable number of issues and pull requests each week; the use of affinity teams helps distribute this load across a number of specialized groups instead of pushing it all onto @jekyll/core. + +## Responsibilities of Team Captains + +Each affinity team has a few captains who manage the issues and pull requests for that team. When an issue or PR is opened with a `/cc` for a given affinity team, @jekyllbot automatically assigns a random affinity team captain to the issue to triage it. They have access to add labels, reassign the issue, give LGTM's, and so forth. While they do not merge PR's today, they are still asked to review PR's for parts of the codebase under their purview. + +## How do I become a team captain? + +Just ask! Feel free to open an issue on `jekyll/jekyll` and add `/cc @jekyll/core`. We can add you. :smile: + +Alternatively, you can email or otherwise reach out to [@parkr](https://github.com/parkr) directly if you prefer the more private route. + +## Ugh, I'm tired and don't have time to be a captain anymore. What now? + +No sweat at all! Email [@parkr](https://github.com/parkr) and ask to be removed. Alternatively, you should be able to go to your team's page on GitHub.com (go to https://github.com/jekyll, click "Teams", click the link to your team) and change your status to either "member" or leave the team. + +We realize that being a captain is no easy feat so we want to make it a great experience. As always, communicate as much as you can with us about what is working, and what isn't. Thanks for dedicating some time to Jekyll! :sparkles: + +[affinity teams]: https://teams.jekyllrb.com/ From 27139f40e22c35ea4227bdc750c50331653533ee Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 23 Aug 2016 02:24:30 +0200 Subject: [PATCH 1313/4996] Link to latent semantic indexing on Wikipedia --- site/_docs/variables.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/site/_docs/variables.md b/site/_docs/variables.md index f3ead4c70c1..059e092b4ef 100644 --- a/site/_docs/variables.md +++ b/site/_docs/variables.md @@ -115,8 +115,7 @@ following is a reference of the available data. If the page being processed is a Post, this contains a list of up to ten related Posts. By default, these are the ten most recent posts. For high quality but slow to compute results, run the - jekyll command with the --lsi (latent semantic - indexing) option. Also note GitHub Pages does not support the lsi option when generating sites. + jekyll command with the --lsi (latent semantic indexing) option. Also note GitHub Pages does not support the lsi option when generating sites.

    From b908c3de1d9b813c891c980e0c7aa7095b0dcdc2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 23 Aug 2016 07:40:10 -0700 Subject: [PATCH 1314/4996] Update history to reflect merge of #5274 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cbc2b00b780..13eb14022ec 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Documentation: improve highlight in `Creating a theme` (#5249) * Bundler isn't installed by default (#5258) * Update troubleshooting documentation to include fix for issue with vendored gems (#5271) + * Link --lsi option's description to Wikipedia docs on LSI (#5274) ### Development Fixes From 276404c3f8a8e01f59de6ccedc0715f424e72f19 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 23 Aug 2016 09:15:36 -0700 Subject: [PATCH 1315/4996] Update history to reflect merge of #5272 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 13eb14022ec..8b5db7da882 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * Update appveyor.yml and fix optional deps for Ruby x64 (#5180) * Improve tests for Jekyll::PluginManager (#5167) * Update Ruby versions in travis.yml (#5221) + * Avoid installing unecessary gems for site testing (#5272) ### Bug Fixes From 13ce18d6a65d53bee6960d20d57190186e0dfb82 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 23 Aug 2016 21:36:06 +0200 Subject: [PATCH 1316/4996] document --profile option --- site/_docs/configuration.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 1dc6f9ce52c..82f3436d292 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -284,6 +284,18 @@ class="flag">flags
    (specified on the command-line) that control them.

    -I, --incremental

    + + +

    Liquid profiler

    +

    + Generate a Liquid rendering profile to help you identify performance bottlenecks. +

    + + +

    profile: BOOL

    +

    --profile

    + + From 8aa54ad8014dafe64688cbe771eb4cfed88fa2f0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 23 Aug 2016 13:01:31 -0700 Subject: [PATCH 1317/4996] Update history to reflect merge of #5279 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8b5db7da882..b3f830023c0 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * Bundler isn't installed by default (#5258) * Update troubleshooting documentation to include fix for issue with vendored gems (#5271) * Link --lsi option's description to Wikipedia docs on LSI (#5274) + * Document --profile option on the configuration page (#5279) ### Development Fixes From cf33a9c427ecd736feeec5f129d15a205e179b93 Mon Sep 17 00:00:00 2001 From: Anthony Gaudino Date: Tue, 23 Aug 2016 21:06:11 -0300 Subject: [PATCH 1318/4996] The hook ":site, :post_render" also provides a "payload", but the plugins documentation section of the official Jekyll site doesnt inform this. --- site/_docs/plugins.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index b6a12932256..36757520178 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -498,11 +498,13 @@ end {% endhighlight %} Jekyll provides hooks for :site, :pages, -:posts, and :documents. In all cases, Jekyll calls your -hooks with the container object as the first callback parameter. But in the -case of :pre_render, your hook will also receive a payload hash as -a second parameter which allows you full control over the variables that are -available while rendering. +:posts, and :documents. In all cases, Jekyll calls +your hooks with the container object as the first callback parameter. But in the +case of :pre_render and :site, :post_render, your hook +will also receive a payload hash as a second parameter which allows you full +control over the variables that are available while rendering in the former case +and make final changes just before writing your website to disk on the latter +case. The complete list of available hooks is below: From 7c6fde1ac24f91d61b1a63bd41fc4f660f725514 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 23 Aug 2016 17:19:14 -0700 Subject: [PATCH 1319/4996] Update history to reflect merge of #5273 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b3f830023c0..60f2d0ebb10 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Improve tests for Jekyll::PluginManager (#5167) * Update Ruby versions in travis.yml (#5221) * Avoid installing unecessary gems for site testing (#5272) + * Proposal: Affinity teams and their captains (#5273) ### Bug Fixes From df1cafd507c5040cd42b949842ff9857367d8309 Mon Sep 17 00:00:00 2001 From: Anthony Gaudino Date: Tue, 23 Aug 2016 21:48:35 -0300 Subject: [PATCH 1320/4996] On the site documentation section, links to documentation items point to the "jekyllrb.com" website, this means that users testing changes might get confused because they will see the official external website instead of their local website upon clicking those links. --- site/_includes/docs_option.html | 2 +- site/_includes/docs_ul.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_includes/docs_option.html b/site/_includes/docs_option.html index e7afcc88aa1..a2e156220a3 100644 --- a/site/_includes/docs_option.html +++ b/site/_includes/docs_option.html @@ -1,5 +1,5 @@ {% for item in include.items %} {% assign item_url = item | prepend:"/docs/" | append:"/" %} {% assign doc = site.docs | where: "url", item_url | first %} - + {% endfor %} diff --git a/site/_includes/docs_ul.html b/site/_includes/docs_ul.html index 7688328fc20..adb6600e845 100644 --- a/site/_includes/docs_ul.html +++ b/site/_includes/docs_ul.html @@ -2,6 +2,6 @@ {% for item in include.items %} {% assign item_url = item | prepend:"/docs/" | append:"/" %} {% assign p = site.docs | where:"url", item_url | first %} -
  • {{ p.title }}
  • +
  • {{ p.title }}
  • {% endfor %} From a5470a32f1b12ac2fc5129746dd357edfb2ffbf1 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 24 Aug 2016 12:50:09 +0200 Subject: [PATCH 1321/4996] replace duplicate with local test [ci-skip] --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 18d79319ca1..77602bc6ea2 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -41,7 +41,7 @@ - [ ] I was trying to install. - [ ] There is a broken Plugin API. -- [ ] I had an error on GitHub Pages, and I have not tested locally. +- [ ] I had an error on GitHub Pages, and I have reproduced it locally. - [ ] I had an error on GitHub Pages, and GitHub Support said it was a Jekyll Bug. - [ ] I had an error on GitHub Pages and I did not test it locally. - [ ] I was trying to build. From a74a6be4c43cf60a4e26de5cdd3f8052ce18e353 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 24 Aug 2016 19:37:10 +0530 Subject: [PATCH 1322/4996] update homepage to reflect merge of #5258 --- site/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/index.html b/site/index.html index 06c32d31509..74bace334ca 100644 --- a/site/index.html +++ b/site/index.html @@ -45,7 +45,7 @@

    Get up and running in seconds.

    ~ $ - gem install jekyll + gem install jekyll bundler

    ~ From 13330caa19fd3b89694ee20d4012cd3ed9ebf8ab Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 24 Aug 2016 13:15:39 -0700 Subject: [PATCH 1323/4996] Update history to reflect merge of #5287 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 60f2d0ebb10..748c24d88b8 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ * Update troubleshooting documentation to include fix for issue with vendored gems (#5271) * Link --lsi option's description to Wikipedia docs on LSI (#5274) * Document --profile option on the configuration page (#5279) + * Update homepage to sync with merge of #5258 (#5287) ### Development Fixes From e0580c89091747fa6b587b8602caf2b66665cbfd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 24 Aug 2016 13:16:42 -0700 Subject: [PATCH 1324/4996] Update history to reflect merge of #5286 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 748c24d88b8..e577689425e 100644 --- a/History.markdown +++ b/History.markdown @@ -27,6 +27,7 @@ * Update Ruby versions in travis.yml (#5221) * Avoid installing unecessary gems for site testing (#5272) * Proposal: Affinity teams and their captains (#5273) + * Replace duplicate with postive local test in issue template (#5286) ### Bug Fixes From 250ca228c98ebd008963224e51b4af62d915ac7a Mon Sep 17 00:00:00 2001 From: mertkahyaoglu Date: Thu, 25 Aug 2016 01:53:00 +0300 Subject: [PATCH 1325/4996] add post about jekyll admin initial release --- ...08-24-jekyll-admin-initial-release.markdown | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 site/_posts/2016-08-24-jekyll-admin-initial-release.markdown diff --git a/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown b/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown new file mode 100644 index 00000000000..316975d2a75 --- /dev/null +++ b/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown @@ -0,0 +1,18 @@ +--- +layout: news_item +title: "Jekyll Admin Initial Release" +date: "2016-08-24 15:51:00 -0700" +author: mertkahyaoglu +categories: [community] +--- + +[Jekyll's Google Summer of Code Project](http://jekyllrb.com/news/2016/06/03/update-on-jekyll-s-google-summer-of-code-projects/) has concluded. After three months of hard (but fun) work with my mentors @benbalter, @jldec, and @parkr, I'm proud to announce [Jekyll Admin](https://github.com/jekyll/jekyll-admin)'s [initial release](https://github.com/jekyll/jekyll-admin/releases/tag/v0.1.0). Jekyll admin is a Jekyll plugin that provides users with a traditional CMS-style graphical interface to author content and administer Jekyll sites. You can start to use it right away by following [these instructions](https://github.com/jekyll/jekyll-admin#installation). + +As a Google Summer of Code student, I feel very lucky to be part of a project that the community has been wanting for such a long time. The three-month Google Summer of Code period was a great journey. It was a lot of fun developing the project and seeing how it could help the community, and going forward, we are really excited to see where the project goes with the help of the amazing Jekyll community. + +I would like to thank my mentors who embraced me as their teammate and guided me throughout the process. They have put a lot of work and time to mentor me and helped me with everything. It was a great pleasure to work with them. I also would like to thank the wonderful Jekyll community for making Jekyll what it is today. It was amazing to see the community contribute to the project and give their feedback +prior to its release. I'm sure that they will support Jekyll Admin as much as they can and move Jekyll even further. + +Please let us know what you think about [Jekyll Admin](https://github.com/jekyll/jekyll-admin) and feel free to [contribute](https://github.com/jekyll/jekyll-admin/blob/master/.github/CONTRIBUTING.md). Your feedback and contributions are greatly appreciated. + +Happy (graphical) Jekylling! From 89030385714da502debeb5ab268c8276e5f990fa Mon Sep 17 00:00:00 2001 From: mertkahyaoglu Date: Thu, 25 Aug 2016 02:57:24 +0300 Subject: [PATCH 1326/4996] up date --- site/_posts/2016-08-24-jekyll-admin-initial-release.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown b/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown index 316975d2a75..1f3eb24f495 100644 --- a/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown +++ b/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown @@ -1,7 +1,7 @@ --- layout: news_item title: "Jekyll Admin Initial Release" -date: "2016-08-24 15:51:00 -0700" +date: "2016-08-25 15:51:00 -0700" author: mertkahyaoglu categories: [community] --- From 299e89df01f7590ed2c9ec2b8711cb724bdabd30 Mon Sep 17 00:00:00 2001 From: mertkahyaoglu Date: Thu, 25 Aug 2016 09:50:03 +0300 Subject: [PATCH 1327/4996] up timezone --- site/_posts/2016-08-24-jekyll-admin-initial-release.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown b/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown index 1f3eb24f495..36532efdb47 100644 --- a/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown +++ b/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown @@ -1,7 +1,7 @@ --- layout: news_item title: "Jekyll Admin Initial Release" -date: "2016-08-25 15:51:00 -0700" +date: "2016-08-25 09:50:00 +0300" author: mertkahyaoglu categories: [community] --- From 9c33754f4f5c224350e55cfef93d21f9623a2e31 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 25 Aug 2016 14:54:59 +0800 Subject: [PATCH 1328/4996] Exclude Gemfile in _config.yml template --- lib/site_template/_config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index 9a17fc3d36e..7e5346b4478 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -29,3 +29,6 @@ markdown: kramdown theme: minima gems: - jekyll-feed +exclude: + - Gemfile + - Gemfile.lock From 158e02623a4b0207878dfd01fda7a9bd666937fc Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Fri, 1 Jul 2016 17:24:14 +0300 Subject: [PATCH 1329/4996] rubocop: reduce code complexity --- .rubocop.yml | 1 - lib/jekyll/document.rb | 191 ++++++++++++++++++++++++----------------- 2 files changed, 112 insertions(+), 80 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 058b7502018..8ae01fb17d1 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -5,7 +5,6 @@ AllCops: - lib/**/*.rb Exclude: - lib/jekyll/convertible.rb - - lib/jekyll/document.rb - lib/jekyll/renderer.rb - bin/**/* - benchmark/**/* diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 9c67d84854e..e277886366e 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -51,19 +51,9 @@ def data # # Returns the merged data. def merge_data!(other, source: "YAML front matter") - if other.key?("categories") && !other["categories"].nil? - if other["categories"].is_a?(String) - other["categories"] = other["categories"].split(" ").map(&:strip) - end - other["categories"] = (data["categories"] || []) | other["categories"] - end + merge_categories!(other) Utils.deep_merge_hashes!(data, other) - if data.key?("date") && !data["date"].is_a?(Time) - data["date"] = Utils.parse_date( - data["date"].to_s, - "Document '#{relative_path}' does not have a valid date in the #{source}." - ) - end + merge_date!(source) data end @@ -90,8 +80,7 @@ def draft? # Returns a String path which represents the relative path # from the site source to this document def relative_path - @relative_path ||= Pathname.new(path) - .relative_path_from(Pathname.new(site.source)).to_s + @relative_path ||= Pathutil.new(path).relative_path_from(site.source).to_s end # The output extension of the document. @@ -264,20 +253,9 @@ def read(opts = {}) @data = SafeYAML.load_file(path) else begin - defaults = @site.frontmatter_defaults.all( - relative_path, - collection.label.to_sym - ) - merge_data!(defaults, :source => "front matter defaults") unless defaults.empty? - - self.content = File.read(path, Utils.merged_file_read_opts(site, opts)) - if content =~ YAML_FRONT_MATTER_REGEXP - self.content = $POSTMATCH - data_file = SafeYAML.load(Regexp.last_match(1)) - merge_data!(data_file, :source => "YAML front matter") if data_file - end - - post_read + merge_defaults + read_content(opts) + read_post_data rescue SyntaxError => e Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{e.message}" rescue => e @@ -287,56 +265,6 @@ def read(opts = {}) end end - def post_read - if relative_path =~ DATE_FILENAME_MATCHER - date, slug, ext = Regexp.last_match.captures - if !data["date"] || data["date"].to_i == site.time.to_i - merge_data!({ "date" => date }, :source => "filename") - end - elsif relative_path =~ DATELESS_FILENAME_MATCHER - slug, ext = Regexp.last_match.captures - end - - # Try to ensure the user gets a title. - data["title"] ||= Utils.titleize_slug(slug) - # Only overwrite slug & ext if they aren't specified. - data["slug"] ||= slug - data["ext"] ||= ext - - populate_categories - populate_tags - generate_excerpt - end - - # Add superdirectories of the special_dir to categories. - # In the case of es/_posts, 'es' is added as a category. - # In the case of _posts/es, 'es' is NOT added as a category. - # - # Returns nothing. - def categories_from_path(special_dir) - superdirs = relative_path.sub(%r!#{special_dir}(.*)!, "") - .split(File::SEPARATOR) - .reject do |c| - c.empty? || c.eql?(special_dir) || c.eql?(basename) - end - merge_data!({ "categories" => superdirs }, :source => "file path") - end - - def populate_categories - merge_data!({ - "categories" => ( - Array(data["categories"]) + - Utils.pluralized_array_from_hash(data, "category", "categories") - ).map(&:to_s).flatten.uniq - }) - end - - def populate_tags - merge_data!({ - "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten - }) - end - # Create a Liquid-understandable version of this Document. # # Returns a Hash representing this Document's data. @@ -443,7 +371,112 @@ def method_missing(method, *args, &blck) end end - private # :nodoc: + private + def merge_categories!(other) + if other.key?("categories") && !other["categories"].nil? + if other["categories"].is_a?(String) + other["categories"] = other["categories"].split(%r!\s+!).map(&:strip) + end + other["categories"] = (data["categories"] || []) | other["categories"] + end + end + + private + def merge_date!(source) + if data.key?("date") && !data["date"].is_a?(Time) + data["date"] = Utils.parse_date( + data["date"].to_s, + "Document '#{relative_path}' does not have a valid date in the #{source}." + ) + end + end + + private + def merge_defaults + defaults = @site.frontmatter_defaults.all( + relative_path, + collection.label.to_sym + ) + merge_data!(defaults, :source => "front matter defaults") unless defaults.empty? + end + + private + def read_content(opts) + self.content = File.read(path, Utils.merged_file_read_opts(site, opts)) + if content =~ YAML_FRONT_MATTER_REGEXP + self.content = $POSTMATCH + data_file = SafeYAML.load(Regexp.last_match(1)) + merge_data!(data_file, :source => "YAML front matter") if data_file + end + end + + private + def read_post_data + populate_title + populate_categories + populate_tags + generate_excerpt + end + + private + def populate_title + if relative_path =~ DATE_FILENAME_MATCHER + date, slug, ext = Regexp.last_match.captures + modify_date(date) + elsif relative_path =~ DATELESS_FILENAME_MATCHER + slug, ext = Regexp.last_match.captures + end + + # Try to ensure the user gets a title. + data["title"] ||= Utils.titleize_slug(slug) + # Only overwrite slug & ext if they aren't specified. + data["slug"] ||= slug + data["ext"] ||= ext + end + + private + def modify_date(date) + if !data["date"] || data["date"].to_i == site.time.to_i + merge_data!({ "date" => date }, :source => "filename") + end + end + + # Add superdirectories of the special_dir to categories. + # In the case of es/_posts, 'es' is added as a category. + # In the case of _posts/es, 'es' is NOT added as a category. + # + # Returns nothing. + private + def categories_from_path(special_dir) + superdirs = relative_path.sub(%r!#{special_dir}(.*)!, "") + .split(File::SEPARATOR) + .reject do |c| + c.empty? || c == special_dir || c == basename + end + merge_data!({ "categories" => superdirs }, :source => "file path") + end + + private + def populate_categories + merge_data!({ + "categories" => ( + Array(data["categories"]) + Utils.pluralized_array_from_hash( + data, + "category", + "categories" + ) + ).map(&:to_s).flatten.uniq + }) + end + + private + def populate_tags + merge_data!({ + "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten + }) + end + + private def generate_excerpt if generate_excerpt? data["excerpt"] ||= Jekyll::Excerpt.new(self) From 2183d9d6b4658adf878fc4a2cf308d4131e4cffa Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 25 Aug 2016 12:13:34 +0200 Subject: [PATCH 1330/4996] Implement respond_to_missing? in Document --- lib/jekyll/document.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index e277886366e..f35cdb0e061 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -371,6 +371,10 @@ def method_missing(method, *args, &blck) end end + def respond_to_missing?(method, *) + data.key?(method.to_s) || super + end + private def merge_categories!(other) if other.key?("categories") && !other["categories"].nil? From 7892c5e1f392061c3d6862a83cefb6da8f134b6d Mon Sep 17 00:00:00 2001 From: "Heng, K. (Stephen)" Date: Thu, 25 Aug 2016 18:35:09 +0800 Subject: [PATCH 1331/4996] Fix issue #5276, where path strips root destination dir if filename matches --- lib/jekyll.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index ffe9e4acae2..f3c38f537f2 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -161,7 +161,9 @@ def sanitized_path(base_directory, questionable_path) questionable_path.insert(0, "/") if questionable_path.start_with?("~") clean_path = File.expand_path(questionable_path, "/") - if clean_path.start_with?(base_directory) + return clean_path if clean_path.eql?(base_directory) + + if clean_path.start_with?(base_directory.sub(%r!\z!, "/")) clean_path else clean_path.sub!(%r!\A\w:/!, "/") From f56f252b28162682d39c17ee47ccb4fdcba084fc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 25 Aug 2016 11:13:55 -0700 Subject: [PATCH 1332/4996] Update history to reflect merge of #5291 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e577689425e..f6e3c07cf93 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * Link --lsi option's description to Wikipedia docs on LSI (#5274) * Document --profile option on the configuration page (#5279) * Update homepage to sync with merge of #5258 (#5287) + * Add post about Jekyll Admin initial release (#5291) ### Development Fixes From 1cd880f9d09223a54a7d5eba0208652d3ab6a617 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 20 Aug 2016 12:01:25 +0530 Subject: [PATCH 1333/4996] replace liquid highlight tag with backticks --- site/_docs/assets.md | 16 +++---- site/_docs/collections.md | 28 ++++++------ site/_docs/configuration.md | 48 ++++++++++---------- site/_docs/continuous-integration.md | 56 +++++++++++------------ site/_docs/datafiles.md | 32 ++++++------- site/_docs/deployment-methods.md | 41 +++++++++-------- site/_docs/drafts.md | 4 +- site/_docs/extras.md | 4 +- site/_docs/frontmatter.md | 8 ++-- site/_docs/github-pages.md | 12 ++--- site/_docs/installation.md | 16 +++---- site/_docs/pages.md | 8 ++-- site/_docs/pagination.md | 16 +++---- site/_docs/plugins.md | 48 ++++++++++---------- site/_docs/posts.md | 40 ++++++++-------- site/_docs/quickstart.md | 4 +- site/_docs/structure.md | 4 +- site/_docs/templates.md | 52 ++++++++++----------- site/_docs/themes.md | 4 +- site/_docs/troubleshooting.md | 68 ++++++++++++++-------------- site/_docs/upgrading/0-to-2.md | 4 +- site/_docs/upgrading/2-to-3.md | 24 +++++----- site/_docs/usage.md | 20 ++++---- site/_docs/windows.md | 16 +++---- 24 files changed, 287 insertions(+), 286 deletions(-) diff --git a/site/_docs/assets.md b/site/_docs/assets.md index fd163e061cc..4908a4008de 100644 --- a/site/_docs/assets.md +++ b/site/_docs/assets.md @@ -9,14 +9,14 @@ a Ruby gem. In order to use them, you must first create a file with the proper extension name (one of `.sass`, `.scss`, or `.coffee`) and ***start the file with two lines of triple dashes***, like this: -{% highlight sass %} +```sass --- --- // start content .my-definition font-size: 1.2em -{% endhighlight %} +``` Jekyll treats these files the same as a regular page, in that the output file will be placed in the same directory that it came from. For instance, if you @@ -46,10 +46,10 @@ If you are using Sass `@import` statements, you'll need to ensure that your `sass_dir` is set to the base directory that contains your Sass files. You can do that thusly: -{% highlight yaml %} +```yaml sass: sass_dir: _sass -{% endhighlight %} +``` The Sass converter will default the `sass_dir` configuration option to `_sass`. @@ -72,10 +72,10 @@ The Sass converter will default the `sass_dir` configuration option to You may also specify the output style with the `style` option in your `_config.yml` file: -{% highlight yaml %} +```yaml sass: style: compressed -{% endhighlight %} +``` These are passed to Sass, so any output style options Sass supports are valid here, too. @@ -88,7 +88,7 @@ To enable Coffeescript in Jekyll 3.0 and up you must * Install the `jekyll-coffeescript` gem * Ensure that your `_config.yml` is up-to-date and includes the following: -{% highlight yaml %} +```yaml gems: - jekyll-coffeescript -{% endhighlight %} +``` diff --git a/site/_docs/collections.md b/site/_docs/collections.md index c1e1e7c27ff..22a86e60ff4 100644 --- a/site/_docs/collections.md +++ b/site/_docs/collections.md @@ -17,29 +17,29 @@ namespace. Add the following to your site's `_config.yml` file, replacing `my_collection` with the name of your collection: -{% highlight yaml %} +```yaml collections: - my_collection -{% endhighlight %} +``` You can optionally specify metadata for your collection in the configuration: -{% highlight yaml %} +```yaml collections: my_collection: foo: bar -{% endhighlight %} +``` Default attributes can also be set for a collection: -{% highlight yaml %} +```yaml defaults: - scope: path: "" type: my_collection values: layout: page -{% endhighlight %} +``` ### Step 2: Add your content @@ -62,11 +62,11 @@ If you'd like Jekyll to create a public-facing, rendered version of each document in your collection, set the `output` key to `true` in your collection metadata in your `_config.yml`: -{% highlight yaml %} +```yaml collections: my_collection: output: true -{% endhighlight %} +``` This will produce a file for each document in the collection. For example, if you have `_my_collection/some_subdir/some_doc.md`, @@ -76,12 +76,12 @@ choice and written out to `/my_collection/some_subdir/some_doc.html`. As for posts with [Permalinks](../permalinks/), the document URL can be customized by setting `permalink` metadata for the collection: -{% highlight yaml %} +```yaml collections: my_collection: output: true permalink: /awesome/:path/ -{% endhighlight %} +``` For example, if you have `_my_collection/some_subdir/some_doc.md`, it will be written out to `/awesome/some_subdir/some_doc/index.html`. @@ -339,7 +339,7 @@ one might have front matter in an individual file structured as follows (which must use a supported markup format, and cannot be saved with a `.yaml` extension): -{% highlight yaml %} +```yaml title: "Josquin: Missa De beata virgine and Missa Ave maris stella" artist: "The Tallis Scholars" director: "Peter Phillips" @@ -357,11 +357,11 @@ works: duration: "7:47" - title: "Agnus Dei I, II & III" duration: "6:49" -{% endhighlight %} +``` Every album in the collection could be listed on a single page with a template: -{% highlight html %} +```html {% raw %} {% for album in site.albums %}

    {{ album.title }}

    @@ -377,4 +377,4 @@ Every album in the collection could be listed on a single page with a template: {% endfor %} {% endfor %} {% endraw %} -{% endhighlight %} +``` diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 82f3436d292..abb9e234eeb 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -399,13 +399,13 @@ before your site is served. You can provide custom headers for your site by adding them to `_config.yml` -{% highlight yaml %} +```yaml # File: _config.yml webrick: headers: My-Header: My-Value My-Other-Header: My-Other-Value -{% endhighlight %} +``` ### Defaults @@ -420,19 +420,19 @@ In the build (or serve) arguments, you can specify a Jekyll environment and valu For example, suppose you set this conditional statement in your code: -{% highlight liquid %} +```liquid {% raw %} {% if jekyll.environment == "production" %} {% include disqus.html %} {% endif %} {% endraw %} -{% endhighlight %} +``` When you build your Jekyll site, the content inside the `if` statement won't be run unless you also specify a `production` environment in the build command, like this: -{% highlight sh %} +```sh JEKYLL_ENV=production jekyll build -{% endhighlight %} +``` Specifying an environment value allows you to make certain content available only within specific environments. @@ -454,14 +454,14 @@ The `defaults` key holds an array of scope/values pairs that define what default Let's say that you want to add a default layout to all pages and posts in your site. You would add this to your `_config.yml` file: -{% highlight yaml %} +```yaml defaults: - scope: path: "" # an empty string here means all files in the project values: layout: "default" -{% endhighlight %} +```
    Please stop and rerun `jekyll serve` command.
    @@ -477,7 +477,7 @@ defaults: Here, we are scoping the `values` to any file that exists in the path `scope`. Since the path is set as an empty string, it will apply to **all files** in your project. You probably don't want to set a layout on every file in your project - like css files, for example - so you can also specify a `type` value under the `scope` key. -{% highlight yaml %} +```yaml defaults: - scope: @@ -485,14 +485,14 @@ defaults: type: "posts" # previously `post` in Jekyll 2.2. values: layout: "default" -{% endhighlight %} +``` Now, this will only set the layout for files where the type is `posts`. The different types that are available to you are `pages`, `posts`, `drafts` or any collection in your site. While `type` is optional, you must specify a value for `path` when creating a `scope/values` pair. As mentioned earlier, you can set multiple scope/values pairs for `defaults`. -{% highlight yaml %} +```yaml defaults: - scope: @@ -507,11 +507,11 @@ defaults: values: layout: "project" # overrides previous default layout author: "Mr. Hyde" -{% endhighlight %} +``` With these defaults, all posts would use the `my-site` layout. Any html files that exist in the `projects/` folder will use the `project` layout, if it exists. Those files will also have the `page.author` [liquid variable](../variables/) set to `Mr. Hyde`. -{% highlight yaml %} +```yaml collections: - my_collection: output: true @@ -523,7 +523,7 @@ defaults: type: "my_collection" # a collection in your site, in plural form values: layout: "default" -{% endhighlight %} +``` In this example, the `layout` is set to `default` inside the [collection](../collections/) with the name `my_collection`. @@ -536,7 +536,7 @@ You can see that in the second to last example above. First, we set the default Finally, if you set defaults in the site configuration by adding a `defaults` section to your `_config.yml` file, you can override those settings in a post or page file. All you need to do is specify the settings in the post or page front matter. For example: -{% highlight yaml %} +```yaml # In _config.yml ... defaults: @@ -549,16 +549,16 @@ defaults: author: "Mr. Hyde" category: "project" ... -{% endhighlight %} +``` -{% highlight yaml %} +```yaml # In projects/foo_project.md --- author: "John Smith" layout: "foobar" --- The post text goes here... -{% endhighlight %} +``` The `projects/foo_project.md` would have the `layout` set to `foobar` instead of `project` and the `author` set to `John Smith` instead of `Mr. Hyde` when @@ -579,7 +579,7 @@ file or on the command-line.

    -{% highlight yaml %} +```yaml # Where things are source: . destination: ./_site @@ -651,7 +651,7 @@ kramdown: input: GFM hard_wrap: false footnote_nr: 1 -{% endhighlight %} +``` ## Liquid Options @@ -715,7 +715,7 @@ extensions are: If you're interested in creating a custom markdown processor, you're in luck! Create a new class in the `Jekyll::Converters::Markdown` namespace: -{% highlight ruby %} +```ruby class Jekyll::Converters::Markdown::MyCustomProcessor def initialize(config) require 'funky_markdown' @@ -730,14 +730,14 @@ class Jekyll::Converters::Markdown::MyCustomProcessor ::FunkyMarkdown.new(content).convert end end -{% endhighlight %} +``` Once you've created your class and have it properly set up either as a plugin in the `_plugins` folder or as a gem, specify it in your `_config.yml`: -{% highlight yaml %} +```yaml markdown: MyCustomProcessor -{% endhighlight %} +``` ## Incremental Regeneration
    diff --git a/site/_docs/continuous-integration.md b/site/_docs/continuous-integration.md index c01d1d1bc6d..4599115d5fe 100644 --- a/site/_docs/continuous-integration.md +++ b/site/_docs/continuous-integration.md @@ -38,13 +38,13 @@ Save the commands you want to run and succeed in a file: `./script/cibuild` ### The HTML Proofer Executable -{% highlight shell %} +```sh #!/usr/bin/env bash set -e # halt script on error bundle exec jekyll build bundle exec htmlproofer ./_site -{% endhighlight %} +``` Some options can be specified via command-line switches. Check out the `html-proofer` README for more information about these switches, or run @@ -52,20 +52,20 @@ Some options can be specified via command-line switches. Check out the For example to avoid testing external sites, use this command: -{% highlight shell %} +```sh $ bundle exec htmlproofer ./_site --disable-external -{% endhighlight %} +``` ### The HTML Proofer Library You can also invoke `html-proofer` in Ruby scripts (e.g. in a Rakefile): -{% highlight ruby %} +```ruby #!/usr/bin/env ruby require 'html-proofer' HTMLProofer.check_directory("./_site").run -{% endhighlight %} +``` Options are given as a second argument to `.new`, and are encoded in a symbol-keyed Ruby Hash. For more information about the configuration options, @@ -82,16 +82,16 @@ an explanation of each line. **Note:** You will need a Gemfile as well, [Travis will automatically install](https://docs.travis-ci.com/user/languages/ruby/#Dependency-Management) the dependencies based on the referenced gems: -{% highlight ruby %} +```ruby source "https://rubygems.org" gem "jekyll" gem "html-proofer" -{% endhighlight %} +``` Your `.travis.yml` file should look like this: -{% highlight yaml %} +```yaml language: ruby rvm: - 2.1 @@ -114,39 +114,39 @@ env: - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer sudo: false # route your build to the container-based infrastructure for a faster build -{% endhighlight %} +``` Ok, now for an explanation of each line: -{% highlight yaml %} +```yaml language: ruby -{% endhighlight %} +``` This line tells Travis to use a Ruby build container. It gives your script access to Bundler, RubyGems, and a Ruby runtime. -{% highlight yaml %} +```yaml rvm: - 2.1 -{% endhighlight %} +``` 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 %} +```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 %} +```yaml script: ./script/cibuild -{% endhighlight %} +``` Travis allows you to run any arbitrary shell script to test your site. One convention is to put all scripts for your project in the `script` @@ -154,20 +154,20 @@ directory, and to call your test script `cibuild`. This line is completely customizable. If your script won't change much, you can write your test incantation here directly: -{% highlight yaml %} +```yaml install: gem install jekyll html-proofer script: jekyll build && htmlproofer ./_site -{% endhighlight %} +``` The `script` directive can be absolutely any valid shell command. -{% highlight yaml %} +```yaml # branch whitelist, only for GitHub Pages branches: only: - gh-pages # test the gh-pages branch - /pages-(.*)/ # test every branch which starts with "pages-" -{% endhighlight %} +``` You want to ensure the Travis builds for your site are being run only on the branch or branches which contain your site. One means of ensuring this @@ -181,11 +181,11 @@ prefixed, exemplified above with the `/pages-(.*)/` regular expression. The `branches` directive is completely optional. Travis will build from every push to any branch of your repo if leave it out. -{% highlight yaml %} +```yaml env: global: - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer -{% endhighlight %} +``` Using `html-proofer`? You'll want this environment variable. Nokogiri, used to parse HTML files in your compiled site, comes bundled with libraries @@ -200,9 +200,9 @@ environment variable `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true`. servers, which Jekyll will mistakenly read and explode on.

    -{% highlight yaml %} +```yaml exclude: [vendor] -{% endhighlight %} +``` By default you should supply the `sudo: false` command to Travis. This command explicitly tells Travis to run your build on Travis's [container-based @@ -210,9 +210,9 @@ explicitly tells Travis to run your build on Travis's [container-based speed up your build. If you have any trouble with your build, or if your build does need `sudo` access, modify the line to `sudo: required`. -{% highlight yaml %} +```yaml sudo: false -{% endhighlight %} +``` ### Troubleshooting diff --git a/site/_docs/datafiles.md b/site/_docs/datafiles.md index 474e8e8278c..d61c1bfaf48 100644 --- a/site/_docs/datafiles.md +++ b/site/_docs/datafiles.md @@ -32,7 +32,7 @@ of code in your Jekyll templates: In `_data/members.yml`: -{% highlight yaml %} +```yaml - name: Eric Mill github: konklone @@ -41,23 +41,23 @@ In `_data/members.yml`: - name: Liu Fengyun github: liufengyun -{% endhighlight %} +``` Or `_data/members.csv`: -{% highlight text %} +```text name,github Eric Mill,konklone Parker Moore,parkr Liu Fengyun,liufengyun -{% endhighlight %} +``` This data can be accessed via `site.data.members` (notice that the filename determines the variable name). You can now render the list of members in a template: -{% highlight html %} +```html {% raw %}
      {% for member in site.data.members %} @@ -69,7 +69,7 @@ You can now render the list of members in a template: {% endfor %}
    {% endraw %} -{% endhighlight %} +``` ## Example: Organizations @@ -80,7 +80,7 @@ folder: In `_data/orgs/jekyll.yml`: -{% highlight yaml %} +```yaml username: jekyll name: Jekyll members: @@ -89,22 +89,22 @@ members: - name: Parker Moore github: parkr -{% endhighlight %} +``` In `_data/orgs/doeorg.yml`: -{% highlight yaml %} +```yaml username: doeorg name: Doe Org members: - name: John Doe github: jdoe -{% endhighlight %} +``` The organizations can then be accessed via `site.data.orgs`, followed by the file name: -{% highlight html %} +```html {% raw %}
      {% for org_hash in site.data.orgs %} @@ -118,22 +118,22 @@ file name: {% endfor %}
    {% endraw %} -{% endhighlight %} +``` ## Example: Accessing a specific author Pages and posts can also access a specific data item. The example below shows how to access a specific item: `_data/people.yml`: -{% highlight yaml %} +```yaml dave: name: David Smith twitter: DavidSilvaSmith -{% endhighlight %} +``` The author can then be specified as a page variable in a post's frontmatter: -{% highlight html %} +```html {% raw %} --- title: sample post @@ -148,4 +148,4 @@ author: dave {% endraw %} -{% endhighlight %} +``` diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index af6edf73b8f..7391fe0366a 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -35,19 +35,19 @@ this](http://web.archive.org/web/20091223025644/http://www.taknado.com/en/2009/0 To have a remote server handle the deploy for you every time you push changes using Git, you can create a user account which has all the public keys that are authorized to deploy in its `authorized_keys` file. With that in place, setting up the post-receive hook is done as follows: -{% highlight shell %} +```sh laptop$ ssh deployer@example.com server$ mkdir myrepo.git server$ cd myrepo.git server$ git --bare init server$ cp hooks/post-receive.sample hooks/post-receive server$ mkdir /var/www/myrepo -{% endhighlight %} +``` Next, add the following lines to hooks/post-receive and be sure Jekyll is installed on the server: -{% highlight shell %} +```sh GIT_REPO=$HOME/myrepo.git TMP_GIT_CLONE=$HOME/tmp/myrepo PUBLIC_WWW=/var/www/myrepo @@ -56,21 +56,21 @@ git clone $GIT_REPO $TMP_GIT_CLONE jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW rm -Rf $TMP_GIT_CLONE exit -{% endhighlight %} +``` Finally, run the following command on any users laptop that needs to be able to deploy using this hook: -{% highlight shell %} +```sh laptops$ git remote add deploy deployer@example.com:~/myrepo.git -{% endhighlight %} +``` Deploying is now as easy as telling nginx or Apache to look at `/var/www/myrepo` and running the following: -{% highlight shell %} +```sh laptops$ git push deploy master -{% endhighlight %} +``` ### Jekyll-hook @@ -98,12 +98,13 @@ Another way to deploy your Jekyll site is to use [Rake](https://github.com/ruby/ ### scp Once you’ve generated the `_site` directory, you can easily scp it using a -`tasks/deploy` shell script similar to this: +`tasks/deploy` shell script similar to [this deploy script][]. You’d obviously +need to change the values to reflect your site’s details. There is even [a +matching TextMate command][] that will help you run this script. - #!/bin/bash - - scp -r _site/* user@server:/home/user/public_html +[this deploy script here]: https://github.com/henrik/henrik.nyh.se/blob/master/script/deploy +[a matching TextMate command]: https://gist.github.com/henrik/214959 ### rsync @@ -128,9 +129,9 @@ is to put the restriction to certificate-based authorization in `~/.ssh/authorized_keys`. Then, launch `rrsync` and supply it with the folder it shall have read-write access to: -{% highlight shell %} +```sh command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa -{% endhighlight %} +``` `` is the path to your site. E.g., `~/public_html/you.org/blog-html/`. @@ -138,11 +139,11 @@ command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pt Add the `deploy` script to the site source folder: -{% highlight shell %} +```sh #!/bin/sh rsync -crvz --rsh='ssh -p2222' --delete-after --delete-excluded @: -{% endhighlight %} +``` Command line parameters are: @@ -154,9 +155,9 @@ your host uses a different port than the default (e.g, HostGator) Using this setup, you might run the following command: -{% highlight shell %} +```sh rsync -crvz --rsh='ssh -p2222' --delete-after --delete-excluded _site/ hostuser@example.org: -{% endhighlight %} +``` Don't forget the column `:` after server name! @@ -168,10 +169,10 @@ copy it to the output folder. This behavior can be changed in `_config.yml`. Just add the following line: -{% highlight yaml %} +```yaml # Do not copy these files to the output directory exclude: ["deploy"] -{% endhighlight %} +``` Alternatively, you can use an `rsync-exclude.txt` file to control which files will be transferred to your server. diff --git a/site/_docs/drafts.md b/site/_docs/drafts.md index e50af47435a..d5513f75fc1 100644 --- a/site/_docs/drafts.md +++ b/site/_docs/drafts.md @@ -9,10 +9,10 @@ don't want to publish yet. To get up and running with drafts, create a `_drafts` folder in your site's root (as described in the [site structure](/docs/structure/) section) and create your first draft: -{% highlight text %} +```text |-- _drafts/ | |-- a-draft-post.md -{% endhighlight %} +``` To preview your site with drafts, simply run `jekyll serve` or `jekyll build` with the `--drafts` switch. Each will be assigned the value modification time diff --git a/site/_docs/extras.md b/site/_docs/extras.md index 5abd0d735be..83e79963213 100644 --- a/site/_docs/extras.md +++ b/site/_docs/extras.md @@ -11,9 +11,9 @@ may want to install, depending on how you plan to use Jekyll. Kramdown comes with optional support for LaTeX to PNG rendering via [MathJax](https://www.mathjax.org) within math blocks. See the Kramdown documentation on [math blocks](http://kramdown.gettalong.org/syntax.html#math-blocks) and [math support](http://kramdown.gettalong.org/converter/html.html#math-support) for more details. MathJax requires you to include JavaScript or CSS to render the LaTeX, e.g. -{% highlight html %} +```html -{% endhighlight %} +``` For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/opinion/2014/02/16/Mathjax-with-jekyll/). diff --git a/site/_docs/frontmatter.md b/site/_docs/frontmatter.md index faf67b73f43..7e427552a2f 100644 --- a/site/_docs/frontmatter.md +++ b/site/_docs/frontmatter.md @@ -10,12 +10,12 @@ Jekyll as a special file. The front matter must be the first thing in the file and must take the form of valid YAML set between triple-dashed lines. Here is a basic example: -{% highlight yaml %} +```yaml --- layout: post title: Blogging Like a Hacker --- -{% endhighlight %} +``` Between these triple-dashed lines, you can set predefined variables (see below for a reference) or even create custom ones of your own. These variables will @@ -108,7 +108,7 @@ data that is sent to the Liquid templating engine during the conversion. For instance, if you set a title, you can use that in your layout to set the page title: -{% highlight html %} +```html @@ -116,7 +116,7 @@ title: ... -{% endhighlight %} +``` ## Predefined Variables for Posts diff --git a/site/_docs/github-pages.md b/site/_docs/github-pages.md index 4a4c3895a3b..6a449d682e2 100644 --- a/site/_docs/github-pages.md +++ b/site/_docs/github-pages.md @@ -22,14 +22,14 @@ branch to GitHub. However, the subdirectory-like URL structure GitHub uses for Project Pages complicates the proper resolution of URLs. In order to assure your site builds properly, use `site.github.url` in your URL's. -{% highlight html %} +```html {% raw %} {{ page.title }} {% endraw %} -{% endhighlight %} +``` This way you can preview your site locally from the site root on localhost, but when GitHub generates your pages from the gh-pages branch all the URLs @@ -54,7 +54,7 @@ few minor details. currently-deployed version of the gem in your project, add the following to your Gemfile: -{% highlight ruby %} +```ruby source 'https://rubygems.org' require 'json' @@ -62,18 +62,18 @@ require 'open-uri' versions = JSON.parse(open('https://pages.github.com/versions.json').read) gem 'github-pages', versions['github-pages'] -{% endhighlight %} +``` This will ensure that when you run bundle install, you have the correct version of the github-pages gem. If that fails, simplify it: -{% highlight ruby %} +```ruby source 'https://rubygems.org' gem 'github-pages' -{% endhighlight %} +``` And be sure to run bundle update often. diff --git a/site/_docs/installation.md b/site/_docs/installation.md index f608a29908f..b86d179e562 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -37,9 +37,9 @@ The best way to install Jekyll is via [RubyGems](http://rubygems.org/pages/download). At the terminal prompt, simply run the following command to install Jekyll: -{% highlight shell %} +```sh $ gem install jekyll -{% endhighlight %} +``` All of Jekyll’s gem dependencies are automatically installed by the above command, so you won’t have to worry about them at all. If you have problems @@ -62,28 +62,28 @@ community can improve the experience for everyone. In order to install a pre-release, make sure you have all the requirements installed properly and run: -{% highlight shell %} +```sh gem install jekyll --pre -{% endhighlight %} +``` This will install the latest pre-release. If you want a particular pre-release, use the `-v` switch to indicate the version you'd like to install: -{% highlight shell %} +```sh gem install jekyll -v '2.0.0.alpha.1' -{% endhighlight %} +``` If you'd like to install a development version of Jekyll, the process is a bit more involved. This gives you the advantage of having the latest and greatest, but may be unstable. -{% highlight shell %} +```sh $ git clone git://github.com/jekyll/jekyll.git $ cd jekyll $ script/bootstrap $ bundle exec rake build $ ls pkg/*.gem | head -n 1 | xargs gem install -l -{% endhighlight %} +``` ## Optional Extras diff --git a/site/_docs/pages.md b/site/_docs/pages.md index 48ba3de67bc..15e8f830e5f 100644 --- a/site/_docs/pages.md +++ b/site/_docs/pages.md @@ -46,7 +46,7 @@ directory with a suitable name for the page you want to create. For a site with a homepage, an about page, and a contact page, here’s what the root directory and associated URLs might look like: -{% highlight shell %} +```sh . |-- _config.yml |-- _includes/ @@ -57,7 +57,7 @@ and associated URLs might look like: |-- index.html # => http://example.com/ |-- other.md # => http://example.com/other.html └── contact.html # => http://example.com/contact.html -{% endhighlight %} +``` ### Named folders containing index HTML files @@ -69,7 +69,7 @@ the page URL ends up being the folder name, and the web server will serve up the respective `index.html` file. Here's an example of what this structure might look like: -{% highlight shell %} +```sh . ├── _config.yml ├── _includes/ @@ -83,7 +83,7 @@ might look like: |── other/ | └── index.md # => http://example.com/other/ └── index.html # => http://example.com/ -{% endhighlight %} +``` This approach may not suit everyone, but for people who like clean URLs it’s simple and it works. In the end, the decision is yours! diff --git a/site/_docs/pagination.md b/site/_docs/pagination.md index 1ef2d496f15..b32b934ca91 100644 --- a/site/_docs/pagination.md +++ b/site/_docs/pagination.md @@ -28,18 +28,18 @@ your `_config.yml` under `gems`. For Jekyll 2, this is standard. To enable pagination for your blog, add a line to the `_config.yml` file that specifies how many items should be displayed per page: -{% highlight yaml %} +```yaml paginate: 5 -{% endhighlight %} +``` The number should be the maximum number of Posts you’d like to be displayed per-page in the generated site. You may also specify the destination of the pagination pages: -{% highlight yaml %} +```yaml paginate_path: "/blog/page:num/" -{% endhighlight %} +``` This will read in `blog/index.html`, send it each pagination page in Liquid as `paginator` and write the output to `blog/page:num/`, where `:num` is the @@ -146,7 +146,7 @@ the `paginator` variable that will now be available to you. You’ll probably want to do this in one of the main pages of your site. Here’s one example of a simple way of rendering paginated Posts in a HTML file: -{% highlight html %} +```html {% raw %} --- layout: default @@ -179,7 +179,7 @@ title: My Blog {% endif %} {% endraw %} -{% endhighlight %} +```
    Beware the page one edge-case
    @@ -193,7 +193,7 @@ title: My Blog The following HTML snippet should handle page one, and render a list of each page with links to all but the current page. -{% highlight html %} +```html {% raw %} {% if paginator.total_pages > 1 %} {% endif %} {% endraw %} -{% endhighlight %} +``` diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index b6a12932256..218a94435c8 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -93,7 +93,7 @@ For instance, a generator can inject values computed at build time for template variables. In the following example the template `reading.html` has two variables `ongoing` and `done` that we fill in the generator: -{% highlight ruby %} +```ruby module Reading class Generator < Jekyll::Generator def generate(site) @@ -105,11 +105,11 @@ module Reading end end end -{% endhighlight %} +``` This is a more complex generator that generates new pages: -{% highlight ruby %} +```ruby module Jekyll class CategoryPage < Page @@ -142,7 +142,7 @@ module Jekyll end end -{% endhighlight %} +``` In this example, our generator will create a series of files under the `categories` directory for each category, listing the posts in each category @@ -189,7 +189,7 @@ languages are implemented using this method. Below is a converter that will take all posts ending in `.upcase` and process them using the `UpcaseConverter`: -{% highlight ruby %} +```ruby module Jekyll class UpcaseConverter < Converter safe true @@ -208,7 +208,7 @@ module Jekyll end end end -{% endhighlight %} +``` Converters should implement at a minimum 3 methods: @@ -266,16 +266,16 @@ As of version 2.5.0, Jekyll can be extended with plugins which provide subcommands for the `jekyll` executable. This is possible by including the relevant plugins in a `Gemfile` group called `:jekyll_plugins`: -{% highlight ruby %} +```ruby group :jekyll_plugins do gem "my_fancy_jekyll_plugin" end -{% endhighlight %} +``` Each `Command` must be a subclass of the `Jekyll::Command` class and must contain one class method: `init_with_program`. An example: -{% highlight ruby %} +```ruby class MyNewCommand < Jekyll::Command class << self def init_with_program(prog) @@ -292,7 +292,7 @@ class MyNewCommand < Jekyll::Command end end end -{% endhighlight %} +``` Commands should implement this single class method: @@ -328,7 +328,7 @@ hooking into the tagging system. Built-in examples added by Jekyll include the `highlight` and `include` tags. Below is an example of a custom liquid tag that will output the time the page was rendered: -{% highlight ruby %} +```ruby module Jekyll class RenderTimeTag < Liquid::Tag @@ -344,7 +344,7 @@ module Jekyll end Liquid::Template.register_tag('render_time', Jekyll::RenderTimeTag) -{% endhighlight %} +``` At a minimum, liquid tags must implement: @@ -372,24 +372,24 @@ At a minimum, liquid tags must implement: You must also register the custom tag with the Liquid template engine as follows: -{% highlight ruby %} +```ruby Liquid::Template.register_tag('render_time', Jekyll::RenderTimeTag) -{% endhighlight %} +``` In the example above, we can place the following tag anywhere in one of our pages: -{% highlight ruby %} +```ruby {% raw %}

    {% render_time page rendered at: %}

    {% endraw %} -{% endhighlight %} +``` And we would get something like this on the page: -{% highlight html %} +```html

    page rendered at: Tue June 22 23:38:47 –0500 2010

    -{% endhighlight %} +``` ### Liquid filters @@ -398,7 +398,7 @@ add tags above. Filters are simply modules that export their methods to liquid. All methods will have to take at least one parameter which represents the input of the filter. The return value will be the output of the filter. -{% highlight ruby %} +```ruby module Jekyll module AssetFilter def asset_url(input) @@ -408,7 +408,7 @@ module Jekyll end Liquid::Template.register_filter(Jekyll::AssetFilter) -{% endhighlight %} +```
    ProTip™: Access the site object using Liquid
    @@ -469,7 +469,7 @@ There are two flags to be aware of when writing a plugin: To use one of the example plugins above as an illustration, here is how you’d specify these two flags: -{% highlight ruby %} +```ruby module Jekyll class UpcaseConverter < Converter safe true @@ -477,7 +477,7 @@ module Jekyll ... end end -{% endhighlight %} +``` ## Hooks @@ -491,11 +491,11 @@ call whenever the hook is triggered. For example, if you want to execute some custom functionality every time Jekyll renders a post, you could register a hook like this: -{% highlight ruby %} +```ruby Jekyll::Hooks.register :posts, :post_render do |post| # code to call after Jekyll renders a post end -{% endhighlight %} +``` Jekyll provides hooks for :site, :pages, :posts, and :documents. In all cases, Jekyll calls your diff --git a/site/_docs/posts.md b/site/_docs/posts.md index 2a9bf3faed8..0253dbac9e4 100644 --- a/site/_docs/posts.md +++ b/site/_docs/posts.md @@ -27,18 +27,18 @@ To create a new post, all you need to do is create a file in the `_posts` directory. How you name files in this folder is important. Jekyll requires blog post files to be named according to the following format: -{% highlight shell %} +```sh YEAR-MONTH-DAY-title.MARKUP -{% endhighlight %} +``` Where `YEAR` is a four-digit number, `MONTH` and `DAY` are both two-digit numbers, and `MARKUP` is the file extension representing the format used in the file. For example, the following are examples of valid post filenames: -{% highlight shell %} +```sh 2011-12-31-new-years-eve-is-awesome.md 2012-09-12-how-to-write-a-blog.textile -{% endhighlight %} +```
    ProTip™: Link to other posts
    @@ -90,16 +90,16 @@ variable in a post. Including an image asset in a post: -{% highlight text %} +```text ... which is shown in the screenshot below: ![My helpful screenshot]({% raw %}{{ site.url }}{% endraw %}/assets/screenshot.jpg) -{% endhighlight %} +``` Linking to a PDF for readers to download: -{% highlight text %} +```text ... you can [get the PDF]({% raw %}{{ site.url }}{% endraw %}/assets/mydoc.pdf) directly. -{% endhighlight %} +```
    ProTip™: Link using just the site root URL
    @@ -119,7 +119,7 @@ you have a list of posts somewhere. Creating an index of posts on another page language](https://docs.shopify.com/themes/liquid/basics) and its tags. Here’s a basic example of how to create a list of links to your blog posts: -{% highlight html %} +```html
      {% raw %}{% for post in site.posts %}{% endraw %}
    • @@ -127,7 +127,7 @@ basic example of how to create a list of links to your blog posts:
    • {% raw %}{% endfor %}{% endraw %}
    -{% endhighlight %} +``` Of course, you have full control over how (and where) you display your posts, and how you structure your site. You should read more about [how templates @@ -146,7 +146,7 @@ Take the above example of an index of posts. Perhaps you want to include a little hint about the post's content by adding the first paragraph of each of your posts: -{% highlight html %} +```html
      {% raw %}{% for post in site.posts %}{% endraw %}
    • @@ -155,22 +155,22 @@ your posts:
    • {% raw %}{% endfor %}{% endraw %}
    -{% endhighlight %} +``` Because Jekyll grabs the first paragraph you will not need to wrap the excerpt in `p` tags, which is already done for you. These tags can be removed with the following if you'd prefer: -{% highlight html %} +```html {% raw %}{{ post.excerpt | remove: '

    ' | remove: '

    ' }}{% endraw %} -{% endhighlight %} +``` If you don't like the automatically-generated post excerpt, it can be explicitly overridden by adding an `excerpt` value to your post's YAML Front Matter. Alternatively, you can choose to define a custom `excerpt_separator` in the post's YAML front matter: -{% highlight text %} +```text --- excerpt_separator: --- @@ -178,7 +178,7 @@ excerpt_separator: Excerpt Out-of-excerpt -{% endhighlight %} +``` You can also set the `excerpt_separator` globally in your `_config.yml` configuration file. @@ -197,7 +197,7 @@ Jekyll also has built-in support for syntax highlighting of code snippets using either Pygments or Rouge, and including a code snippet in any post is easy. Just use the dedicated Liquid tag as follows: -{% highlight text %} +```text {% raw %}{% highlight ruby %}{% endraw %} def show @widget = Widget(params[:id]) @@ -207,11 +207,11 @@ def show end end {% raw %}{% endhighlight %}{% endraw %} -{% endhighlight %} +``` And the output will look like this: -{% highlight ruby %} +```ruby def show @widget = Widget(params[:id]) respond_to do |format| @@ -219,7 +219,7 @@ def show format.json { render json: @widget } end end -{% endhighlight %} +```
    ProTip™: Show line numbers
    diff --git a/site/_docs/quickstart.md b/site/_docs/quickstart.md index 81bd74d20a4..b6cb5895599 100644 --- a/site/_docs/quickstart.md +++ b/site/_docs/quickstart.md @@ -6,14 +6,14 @@ permalink: /docs/quickstart/ For the impatient, here's how to get a boilerplate Jekyll site up and running. -{% highlight shell %} +```sh ~ $ gem install jekyll bundler ~ $ jekyll new myblog ~ $ cd myblog ~/myblog $ bundle install ~/myblog $ bundle exec jekyll serve # => Now browse to http://localhost:4000 -{% endhighlight %} +``` If you wish to install jekyll into an existing directory, you can do so by running `jekyll new .` from within the directory instead of creating a new one. If the existing directory isn't empty, you'll also have to pass the `--force` option like so `jekyll new . --force`. diff --git a/site/_docs/structure.md b/site/_docs/structure.md index 227b8491ce9..de077c5ec40 100644 --- a/site/_docs/structure.md +++ b/site/_docs/structure.md @@ -14,7 +14,7 @@ product. A basic Jekyll site usually looks something like this: -{% highlight shell %} +```sh . ├── _config.yml ├── _drafts @@ -34,7 +34,7 @@ A basic Jekyll site usually looks something like this: ├── _site ├── .jekyll-metadata └── index.html -{% endhighlight %} +``` An overview of what each of these does: diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 080ac5faf2f..55bd8b5b2f7 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -374,9 +374,9 @@ The default is `default`. They are as follows (with what they filter): If you have small page fragments that you wish to include in multiple places on your site, you can use the `include` tag. -{% highlight liquid %} +```liquid {% raw %}{% include footer.html %}{% endraw %} -{% endhighlight %} +``` 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 @@ -395,23 +395,23 @@ root of your source directory. This will embed the contents of You can also pass parameters to an include. Omit the quotation marks to send a variable's value. Liquid curly brackets should not be used here: -{% highlight liquid %} +```liquid {% raw %}{% include footer.html param="value" variable-param=page.variable %}{% endraw %} -{% endhighlight %} +``` These parameters are available via Liquid in the include: -{% highlight liquid %} +```liquid {% raw %}{{ include.param }}{% endraw %} -{% endhighlight %} +``` #### Including files relative to another file You can also choose to include file fragments relative to the current file: -{% highlight liquid %} +```liquid {% raw %}{% include_relative somedir/footer.html %}{% endraw %} -{% endhighlight %} +``` You won't need to place your included content within the `_includes` directory. Instead, the inclusion is specifically relative to the file where the tag is being used. For example, @@ -437,7 +437,7 @@ languages](http://pygments.org/languages/) To render a code block with syntax highlighting, surround your code as follows: -{% highlight liquid %} +```liquid {% raw %} {% highlight ruby %} def foo @@ -445,7 +445,7 @@ def foo end {% endhighlight %} {% endraw %} -{% endhighlight %} +``` The argument to the `highlight` tag (`ruby` in the example above) is the language identifier. To find the appropriate identifier to use for the language @@ -460,7 +460,7 @@ Including the `linenos` argument will force the highlighted code to include line numbers. For instance, the following code block would include line numbers next to each line: -{% highlight liquid %} +```liquid {% raw %} {% highlight ruby linenos %} def foo @@ -468,7 +468,7 @@ def foo end {% endhighlight %} {% endraw %} -{% endhighlight %} +``` #### Stylesheets for syntax highlighting @@ -488,21 +488,21 @@ specify. You must include the file extension when using the `link` tag. -{% highlight liquid %} +```liquid {% raw %} {% link _collection/name-of-document.md %} {% link _posts/2016-07-26-name-of-post.md %} {% endraw %} -{% endhighlight %} +``` You can also use this tag to create a link in Markdown as follows: -{% highlight liquid %} +```liquid {% raw %} [Link to a document]({% link _collection/name-of-document.md %}) [Link to a post]({% link _posts/2016-07-26-name-of-post.md %}) {% endraw %} -{% endhighlight %} +``` Support for static files and pages is coming in a later release but is **not** released as of v3.2.1. @@ -512,49 +512,49 @@ Support for static files and pages is coming in a later release but is If you would like to include a link to a post on your site, the `post_url` tag will generate the correct permalink URL for the post you specify. -{% highlight liquid %} +```liquid {% raw %} {% post_url 2010-07-21-name-of-post %} {% endraw %} -{% endhighlight %} +``` If you organize your posts in subdirectories, you need to include subdirectory path to the post: -{% highlight liquid %} +```liquid {% raw %} {% post_url /subdir/2010-07-21-name-of-post %} {% endraw %} -{% endhighlight %} +``` There is no need to include the file extension when using the `post_url` tag. You can also use this tag to create a link to a post in Markdown as follows: -{% highlight liquid %} +```liquid {% raw %} [Name of Link]({% post_url 2010-07-21-name-of-post %}) {% endraw %} -{% endhighlight %} +``` ### Gist Use the `gist` tag to easily embed a GitHub Gist onto your site. This works with public or secret gists: -{% highlight liquid %} +```liquid {% raw %} {% gist parkr/931c1c8d465a04042403 %} {% endraw %} -{% endhighlight %} +``` You may also optionally specify the filename in the gist to display: -{% highlight liquid %} +```liquid {% raw %} {% gist parkr/931c1c8d465a04042403 jekyll-private-gist.markdown %} {% endraw %} -{% endhighlight %} +``` To use the `gist` tag, you'll need to add the [jekyll-gist](https://github.com/jekyll/jekyll-gist) gem to your project. diff --git a/site/_docs/themes.md b/site/_docs/themes.md index 41b3c4db187..55e14b4bb3e 100644 --- a/site/_docs/themes.md +++ b/site/_docs/themes.md @@ -38,7 +38,7 @@ Refer to your selected theme's documentation and source repository for more info Jekyll themes are distributed as Ruby gems. Don't worry, Jekyll will help you scaffold a new theme with the `new-theme` command. Just run `jekyll new-theme` with the theme name as an argument: -{% highlight plaintext %} +```sh jekyll new-theme my-awesome-theme create /path/to/my-awesome-theme/_layouts create /path/to/my-awesome-theme/_includes @@ -54,7 +54,7 @@ jekyll new-theme my-awesome-theme create /path/to/my-awesome-theme/.gitignore Your new Jekyll theme, my-awesome-theme, is ready for you in /path/to/my-awesome-theme! For help getting started, read /path/to/my-awesome-theme/README.md. -{% endhighlight %} +``` Add your template files in the corresponding folders, complete the `.gemspec` and the README files according to your needs. diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index a129961292d..c4580f69777 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -20,61 +20,61 @@ If you encounter errors during gem installation, you may need to install the header files for compiling extension modules for Ruby 2.0.0. This can be done on Ubuntu or Debian by running: -{% highlight shell %} +```sh sudo apt-get install ruby2.0.0-dev -{% endhighlight %} +``` On Red Hat, CentOS, and Fedora systems you can do this by running: -{% highlight shell %} +```sh sudo yum install ruby-devel -{% endhighlight %} +``` If you installed the above - specifically on Fedora 23 - but the extensions would still not compile, you are probably running a Fedora image that misses the `redhat-rpm-config` package. To solve this, simply run: -{% highlight shell %} +```sh sudo dnf install redhat-rpm-config -{% endhighlight %} +``` On [NearlyFreeSpeech](https://www.nearlyfreespeech.net/) you need to run the following commands before installing Jekyll: -{% highlight shell %} +```sh export GEM_HOME=/home/private/gems export GEM_PATH=/home/private/gems:/usr/local/lib/ruby/gems/1.8/ export PATH=$PATH:/home/private/gems/bin export RB_USER_INSTALL='true' -{% endhighlight %} +``` To install RubyGems on Gentoo: -{% highlight shell %} +```sh sudo emerge -av dev-ruby/rubygems -{% endhighlight %} +``` On Windows, you may need to install [RubyInstaller DevKit](https://wiki.github.com/oneclick/rubyinstaller/development-kit). On Mac OS X, you may need to update RubyGems (using `sudo` only if necessary): -{% highlight shell %} +```sh sudo gem update --system -{% endhighlight %} +``` If you still have issues, you can download and install new Command Line Tools (such as `gcc`) using the command -{% highlight shell %} +```sh xcode-select --install -{% endhighlight %} +``` which may allow you to install native gems using this command (again using `sudo` only if necessary): -{% highlight shell %} +```sh sudo gem install jekyll -{% endhighlight %} +``` Note that upgrading Mac OS X does not automatically upgrade Xcode itself (that can be done separately via the App Store), and having an out-of-date @@ -90,22 +90,22 @@ longer available. Given these changes, there are a couple of simple ways to get up and running. One option is to change the location where the gem will be installed (again using `sudo` only if necessary): -{% highlight shell %} +```sh sudo gem install -n /usr/local/bin jekyll -{% endhighlight %} +``` Alternatively, Homebrew can be installed and used to set up Ruby. This can be done as follows: -{% highlight shell %} +```sh ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" -{% endhighlight %} +``` Once Homebrew is installed, the second step is easy: -{% highlight shell %} +```sh brew install ruby -{% endhighlight %} +``` Advanced users (with more complex needs) may find it helpful to choose one of a number of Ruby version managers ([RVM][], [rbenv][], [chruby][], [etc][].) in @@ -119,15 +119,15 @@ which to install Jekyll. If you elect to use one of the above methods to install Ruby, it might be necessary to modify your `$PATH` variable using the following command: -{% highlight shell %} +```sh export PATH=/usr/local/bin:$PATH -{% endhighlight %} +``` GUI apps can modify the `$PATH` as follows: -{% highlight shell %} +```sh launchctl setenv PATH "/usr/local/bin:$PATH" -{% endhighlight %} +``` Either of these approaches are useful because `/usr/local` is considered a "safe" location on systems which have SIP enabled, they avoid potential @@ -151,21 +151,21 @@ in order to have the `jekyll` executable be available in your Terminal. If you are using base-url option like: -{% highlight shell %} +```sh jekyll serve --baseurl '/blog' -{% endhighlight %} +``` … then make sure that you access the site at: -{% highlight shell %} +```sh http://localhost:4000/blog/index.html -{% endhighlight %} +``` It won’t work to just access: -{% highlight shell %} +```sh http://localhost:4000/blog -{% endhighlight %} +``` ## Configuration problems @@ -197,9 +197,9 @@ The latest version, version 2.0, seems to break the use of `{{ "{{" }}` in templates. Unlike previous versions, using `{{ "{{" }}` in 2.0 triggers the following error: -{% highlight shell %} +```sh '{{ "{{" }}' was not properly terminated with regexp: /\}\}/ (Liquid::SyntaxError) -{% endhighlight %} +``` ### Excerpts diff --git a/site/_docs/upgrading/0-to-2.md b/site/_docs/upgrading/0-to-2.md index 9d91b01948a..9de634557c9 100644 --- a/site/_docs/upgrading/0-to-2.md +++ b/site/_docs/upgrading/0-to-2.md @@ -9,9 +9,9 @@ and 2.0 that you'll want to know about. Before we dive in, go ahead and fetch the latest version of Jekyll: -{% highlight shell %} +```sh $ gem update jekyll -{% endhighlight %} +```
    Diving in
    diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index 3d15ec55e73..9e7b0a6ee71 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -9,9 +9,9 @@ that you'll want to know about. Before we dive in, go ahead and fetch the latest version of Jekyll: -{% highlight shell %} +```sh $ gem update jekyll -{% endhighlight %} +``` Please note: Jekyll 3 requires Ruby version >= 2.0.0. @@ -36,11 +36,11 @@ When iterating over `site.collections`, ensure the above conversions are made. For `site.collections.myCollection` in Jekyll 2, you now do: -{% highlight liquid %} +```liquid {% raw %} {% assign myCollection = site.collections | where: "label", "myCollection" | first %} {% endraw %} -{% endhighlight %} +``` This is a bit cumbersome at first, but is easier than a big `for` loop. @@ -97,17 +97,17 @@ In Jekyll 3 and above, relative permalinks have been deprecated. If you created your site using Jekyll 2 and below, you may receive the following error when trying to **serve** or **build**: -{% highlight text %} +```text Since v3.0, permalinks for pages in subfolders must be relative to the site source directory, not the parent directory. Check http://jekyllrb.com/docs/upgrading/ for more info. -{% endhighlight %} +``` This can be fixed by removing the following line from your `_config.yml` file: -{% highlight yaml %} +```yaml relative_permalinks: true -{% endhighlight %} +``` ### Permalinks no longer automatically add a trailing slash @@ -117,19 +117,19 @@ In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slas Try adding `future: true` to your `_config.yml` file. Are they showing up now? If they are, then you were ensnared by an issue with the way Ruby parses times. Each of your posts is being read in a different timezone than you might expect and, when compared to the computer's current time, is "in the future." The fix for this is to add [a timezone offset](https://en.wikipedia.org/wiki/List_of_UTC_time_offsets) to each post (and make sure you remove `future: true` from your `_config.yml` file). If you're writing from California, for example, you would change this: -{% highlight yaml %} +```yaml --- date: 2016-02-06 19:32:10 --- -{% endhighlight %} +``` to this (note the offset): -{% highlight yaml %} +```yaml --- date: 2016-02-06 19:32:10 -0800 --- -{% endhighlight %} +``` ### My categories have stopped working! diff --git a/site/_docs/usage.md b/site/_docs/usage.md index ee02b508e14..3d2413d444b 100644 --- a/site/_docs/usage.md +++ b/site/_docs/usage.md @@ -7,7 +7,7 @@ permalink: /docs/usage/ The Jekyll gem makes a `jekyll` executable available to you in your Terminal window. You can use this command in a number of ways: -{% highlight shell %} +```sh $ jekyll build # => The current folder will be generated into ./_site @@ -20,7 +20,7 @@ $ jekyll build --source --destination $ jekyll build --watch # => The current folder will be generated into ./_site, # watched for changes, and regenerated automatically. -{% endhighlight %} +```
    Changes to _config.yml are not included during automatic regeneration.
    @@ -52,7 +52,7 @@ $ jekyll build --watch Jekyll also comes with a built-in development server that will allow you to preview what the generated site will look like in your browser locally. -{% highlight shell %} +```sh $ jekyll serve # => A development server will run at http://localhost:4000/ # Auto-regeneration: enabled. Use `--no-watch` to disable. @@ -61,7 +61,7 @@ $ jekyll serve --detach # => Same as `jekyll serve` but will detach from the current terminal. # If you need to kill the server, you can `kill -9 1234` where "1234" is the PID. # If you cannot find the PID, then do, `ps aux | grep jekyll` and kill the instance. [Read more](http://unixhelp.ed.ac.uk/shell/jobz5.html). -{% endhighlight %} +```
    Be aware of default behavior
    @@ -70,10 +70,10 @@ $ jekyll serve --detach

    -{% highlight shell %} +```sh $ jekyll serve --no-watch # => Same as `jekyll serve` but will not watch for changes. -{% endhighlight %} +``` These are just a few of the available [configuration options](../configuration/). Many configuration options can either be specified as flags on the command line, @@ -82,17 +82,17 @@ file at the root of the source directory. Jekyll will automatically use the options from this file when run. For example, if you place the following lines in your `_config.yml` file: -{% highlight yaml %} +```yaml source: _source destination: _deploy -{% endhighlight %} +``` Then the following two commands will be equivalent: -{% highlight shell %} +```sh $ jekyll build $ jekyll build --source _source --destination _deploy -{% endhighlight %} +``` For more about the possible configuration options, see the [configuration](../configuration/) page. diff --git a/site/_docs/windows.md b/site/_docs/windows.md index 3a8dddc6ac5..f64ac6d49d3 100644 --- a/site/_docs/windows.md +++ b/site/_docs/windows.md @@ -29,9 +29,9 @@ Additionally, you might need to change the code page of the console window to UT in case you get a "Liquid Exception: Incompatible character encoding" error during the site generation process. It can be done with the following command: -{% highlight shell %} +```sh $ chcp 65001 -{% endhighlight %} +``` [windows-installation]: http://jekyll-windows.juthilo.com/ [hitimes-issue]: https://github.com/copiousfreetime/hitimes/issues/40 @@ -43,9 +43,9 @@ As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the built-in support for UNIX systems, it requires an extra gem for compatibility with Windows. Add the following to the Gemfile for your site: -{% highlight ruby %} +```ruby gem 'wdm', '~> 0.1.0' if Gem.win_platform? -{% endhighlight %} +``` ### How to install github-pages @@ -81,7 +81,7 @@ This gem is also needed in the github-pages and to get it running on Windows x64 `choco install libiconv -Source "https://www.nuget.org/api/v2/"`{:.language-ruby} -{% highlight ruby %} +```ruby gem install nokogiri --^ --with-xml2-include=C:\Chocolatey\lib\libxml2.2.7.8.7\build\native\include^ --with-xml2-lib=C:\Chocolatey\lib\libxml2.redist.2.7.8.7\build\native\bin\v110\x64\Release\dynamic\cdecl^ @@ -89,7 +89,7 @@ This gem is also needed in the github-pages and to get it running on Windows x64 --with-iconv-lib=C:\Chocolatey\lib\libiconv.redist.1.14.0.11\build\native\bin\v110\x64\Release\dynamic\cdecl^ --with-xslt-include=C:\Chocolatey\lib\libxslt.1.1.28.0\build\native\include^ --with-xslt-lib=C:\Chocolatey\lib\libxslt.redist.1.1.28.0\build\native\bin\v110\x64\Release\dynamic -{% endhighlight %} +``` #### Install github-pages @@ -98,10 +98,10 @@ This gem is also needed in the github-pages and to get it running on Windows x64 * Copy & paste the two lines into the file: -{% highlight ruby %} +```ruby source 'http://rubygems.org' gem 'github-pages' -{% endhighlight %} +``` * **Note:** We use an unsecure connection because SSL throws exceptions in the version of Ruby * Open a command prompt, target your local blog repository root, and install github-pages: `bundle install` From 7f578b5dd88653583bdf3ad5ff703a6ee5d91b95 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 24 Aug 2016 19:31:32 +0530 Subject: [PATCH 1334/4996] sassy update to match --- site/_sass/_style.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/site/_sass/_style.scss b/site/_sass/_style.scss index 10b1b0e292d..528de7cbaf0 100644 --- a/site/_sass/_style.scss +++ b/site/_sass/_style.scss @@ -673,6 +673,12 @@ h5 > code, overflow: auto; } +.highlighter-rouge .highlight { + @extend .highlight; + margin: 0; + padding: 10px 0.5em; +} + /* HTML Elements */ h1, h2, h3, h4, h5, h6 { margin: 0; } From 0d8796fbe60dbca7e7af8d82bf94a822a8ffce90 Mon Sep 17 00:00:00 2001 From: "Heng, K. (Stephen)" Date: Fri, 26 Aug 2016 11:20:03 +0800 Subject: [PATCH 1335/4996] Test case for issue #5276, where Jekyll.sanitized_path strips base path incorrectly if file path has matching prefix --- test/test_path_sanitization.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/test_path_sanitization.rb b/test/test_path_sanitization.rb index df7ef172d68..a0e2f8d6305 100644 --- a/test/test_path_sanitization.rb +++ b/test/test_path_sanitization.rb @@ -28,4 +28,22 @@ class TestPathSanitization < JekyllUnitTest assert_equal source_dir("files", "hi.txt"), Jekyll.sanitized_path(source_dir, "f./../../../../../../files/hi.txt") end + + context "on Windows with file path has matching prefix" do + setup do + @base_path = "D:/site" + @file_path = "D:/sitemap.xml" + allow(Dir).to receive(:pwd).and_return("D:/") + end + + should "not strip base path" do + assert_equal "D:/site/sitemap.xml", + Jekyll.sanitized_path(@base_path, @file_path) + end + end + + should "not strip base path if file path has matching prefix" do + assert_equal "/site/sitemap.xml", + Jekyll.sanitized_path("/site", "sitemap.xml") + end end From 23d79299480fe8dd6c609aebcfd0e2ba8c193039 Mon Sep 17 00:00:00 2001 From: "Heng, K. (Stephen)" Date: Fri, 26 Aug 2016 11:43:32 +0800 Subject: [PATCH 1336/4996] Test case for issue #5192, where Jekyll.sanitized_path strips drive name on Windows incorrectly --- test/test_path_sanitization.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/test_path_sanitization.rb b/test/test_path_sanitization.rb index a0e2f8d6305..a94fc0c52d1 100644 --- a/test/test_path_sanitization.rb +++ b/test/test_path_sanitization.rb @@ -29,6 +29,19 @@ class TestPathSanitization < JekyllUnitTest Jekyll.sanitized_path(source_dir, "f./../../../../../../files/hi.txt") end + context "on Windows with absolute path" do + setup do + @base_path = "D:/demo" + @file_path = "D:/demo/_site" + allow(Dir).to receive(:pwd).and_return("D:/") + end + + should "strip just the clean path drive name" do + assert_equal "D:/demo/_site", + Jekyll.sanitized_path(@base_path, @file_path) + end + end + context "on Windows with file path has matching prefix" do setup do @base_path = "D:/site" From 891a66bddb2943bfbe8322d2ee8814368a48ea4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C5=A0v=C3=A1cha?= Date: Fri, 26 Aug 2016 13:56:41 +0200 Subject: [PATCH 1337/4996] Word update Just a little update - I guess Travis has changed its icon a bit. It's not a wrench icon, but a gear one. --- site/_docs/continuous-integration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/continuous-integration.md b/site/_docs/continuous-integration.md index c01d1d1bc6d..eb283d90e42 100644 --- a/site/_docs/continuous-integration.md +++ b/site/_docs/continuous-integration.md @@ -19,7 +19,7 @@ Enabling Travis builds for your GitHub repository is pretty simple: 1. Go to your profile on travis-ci.org: https://travis-ci.org/profile/username 2. Find the repository for which you're interested in enabling builds. 3. Click the slider on the right so it says "ON" and is a dark grey. -4. Optionally configure the build by clicking on the wrench icon. Further +4. Optionally configure the build by clicking on the gear icon. Further configuration happens in your `.travis.yml` file. More details on that below. From b0425d83088a6f2ca662e88566c1c3b5a7a34671 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 26 Aug 2016 16:11:38 -0700 Subject: [PATCH 1338/4996] Update history to reflect merge of #5262 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f6e3c07cf93..1f356831cc0 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * Document --profile option on the configuration page (#5279) * Update homepage to sync with merge of #5258 (#5287) * Add post about Jekyll Admin initial release (#5291) + * Replace liquid highlight tag with backticks (#5262) ### Development Fixes From 35846b8406e3687ebd8855b815f9a2a29f90fff3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 26 Aug 2016 16:54:10 -0700 Subject: [PATCH 1339/4996] Update history to reflect merge of #5294 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1f356831cc0..8c48a4e6763 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,7 @@ * Update homepage to sync with merge of #5258 (#5287) * Add post about Jekyll Admin initial release (#5291) * Replace liquid highlight tag with backticks (#5262) + * Word update (#5294) ### Development Fixes From 488496a3a65965b53f4ee7bc67f9123c480e8429 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 26 Aug 2016 17:04:51 -0700 Subject: [PATCH 1340/4996] Update history to reflect merge of #5281 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8c48a4e6763..634114bf31d 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * Add post about Jekyll Admin initial release (#5291) * Replace liquid highlight tag with backticks (#5262) * Word update (#5294) + * Site documentation section links always point to https://jekyllrb.com (#5281) ### Development Fixes From 02602bebd7dcbbfdb7caadc7fd77409b8384b53f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 26 Aug 2016 18:56:42 -0700 Subject: [PATCH 1341/4996] Update history to reflect merge of #5293 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 634114bf31d..712f416cfe2 100644 --- a/History.markdown +++ b/History.markdown @@ -40,6 +40,7 @@ ### Minor Enhancements * Colorize interpolated output in logger.info (#5239) + * Site template: exclude Gemfile and Gemfile.lock in site config (#5293) ## 3.2.1 / 2016-08-02 From d49bf808b626aa71752d2cff5406e45d62c3688c Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Sat, 13 Aug 2016 09:49:50 +0300 Subject: [PATCH 1342/4996] Update AppVeyor config. Install gems in ./vendor/bundle and cache those only. --- appveyor.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 9e4ac855a6c..2fe407f4cd6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,3 @@ -# https://www.appveyor.com/docs/appveyor-yml - version: "{build}" clone_depth: 10 @@ -13,31 +11,24 @@ build: off install: - SET PATH=C:\Ruby%RUBY_FOLDER_VER%\bin;%PATH% - - bundle install --retry 5 + - bundle install --retry 5 --jobs=%NUMBER_OF_PROCESSORS% --clean --path vendor\bundle environment: BUNDLE_WITHOUT: "benchmark:site:development" matrix: - RUBY_FOLDER_VER: "23" - GEMS_FOLDER_VER: "2.3.0" TEST_SUITE: "test" - RUBY_FOLDER_VER: "23" - GEMS_FOLDER_VER: "2.3.0" TEST_SUITE: "cucumber" - RUBY_FOLDER_VER: "23" - GEMS_FOLDER_VER: "2.3.0" TEST_SUITE: "fmt" - RUBY_FOLDER_VER: "23" - GEMS_FOLDER_VER: "2.3.0" TEST_SUITE: "default-site" - RUBY_FOLDER_VER: "23-x64" - GEMS_FOLDER_VER: "2.3.0" TEST_SUITE: "test" - RUBY_FOLDER_VER: "22" - GEMS_FOLDER_VER: "2.2.0" TEST_SUITE: "test" - RUBY_FOLDER_VER: "21" - GEMS_FOLDER_VER: "2.1.0" TEST_SUITE: "test" test_script: @@ -48,5 +39,4 @@ test_script: cache: # If one of the files after the right arrow changes, cache will be skipped - - C:\Ruby%RUBY_FOLDER_VER%\bin -> Gemfile,jekyll.gemspec,appveyor.yml - - C:\Ruby%RUBY_FOLDER_VER%\lib\ruby\gems\%GEMS_FOLDER_VER% -> Gemfile,jekyll.gemspec,appveyor.yml + - 'vendor\bundle -> appveyor.yml,Gemfile,jekyll.gemspec' From d0d41792f9b4fb53960bc07d00b0e8a486c270be Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Tue, 23 Aug 2016 02:01:47 +0300 Subject: [PATCH 1343/4996] script/default-site: add `ruby` in exec command. Windows doesn't recognize `exe/jekyll` as Ruby executable so this should work everywhere. --- script/default-site | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/default-site b/script/default-site index 006fd93b0b8..5e96a991049 100755 --- a/script/default-site +++ b/script/default-site @@ -10,7 +10,7 @@ rm -Rf ./tmp/default-site workdir=$(pwd) echo "$0: creating new default site" -bundle exec exe/jekyll new tmp/default-site +bundle exec ruby exe/jekyll new tmp/default-site pushd tmp/default-site echo "$0: respecifying the jekyll install location" From 349569592eb1a1d6ee68f798b62de5d610e658b2 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 27 Aug 2016 10:06:29 +0200 Subject: [PATCH 1344/4996] [docs] add examples for static files liquid metadata --- site/_docs/static_files.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/site/_docs/static_files.md b/site/_docs/static_files.md index 00afbaecbe0..df12acf1bf9 100644 --- a/site/_docs/static_files.md +++ b/site/_docs/static_files.md @@ -26,7 +26,7 @@ following metadata:

    file.path

    - The relative path to the file. + The relative path to the file, e.g /assets/img/image.jpg

    @@ -34,7 +34,15 @@ following metadata:

    file.modified_time

    - The `Time` the file was last modified. + The `Time` the file was last modified, e.g 2016-04-01 16:35:26 +0200 + +

    + + +

    file.name

    +

    + + The string name of the file without the extension, e.g. image for image.jpg

    From a9da814f17a8df4c040ecfd13cc07b42a4ddd506 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 27 Aug 2016 11:22:24 +0200 Subject: [PATCH 1345/4996] add basename and name variables for static files --- lib/jekyll/static_file.rb | 3 ++- site/_docs/static_files.md | 10 +++++++++- test/test_static_file.rb | 3 ++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 1158c044908..f26263e3051 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -97,7 +97,8 @@ def write(dest) def to_liquid { - "name" => File.basename(name, extname), + "basename" => File.basename(name, extname), + "name" => name, "extname" => extname, "modified_time" => modified_time, "path" => File.join("", relative_path) diff --git a/site/_docs/static_files.md b/site/_docs/static_files.md index df12acf1bf9..19d4508930c 100644 --- a/site/_docs/static_files.md +++ b/site/_docs/static_files.md @@ -42,7 +42,15 @@ following metadata:

    file.name

    - The string name of the file without the extension, e.g. image for image.jpg + The string name of the file e.g. image.jpg for image.jpg + +

    + + +

    file.basename

    +

    + + The string basename of the file e.g. image for image.jpg

    diff --git a/test/test_static_file.rb b/test/test_static_file.rb index a53dc952203..ebb51c23102 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -134,7 +134,8 @@ def setup_static_file_with_defaults(base, dir, name, defaults) should "be able to convert to liquid" do expected = { - "name" => "static_file", + "basename" => "static_file", + "name" => "static_file.txt", "extname" => ".txt", "modified_time" => @static_file.modified_time, "path" => "/static_file.txt" From fd65e6ce32e7d376ca0dc9eb523740f377bbf733 Mon Sep 17 00:00:00 2001 From: Anthony Gaudino Date: Sun, 28 Aug 2016 12:48:25 -0300 Subject: [PATCH 1346/4996] Improve sentence to reduce confusion --- site/_docs/plugins.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 36757520178..91f95bc921c 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -499,12 +499,12 @@ end Jekyll provides hooks for :site, :pages, :posts, and :documents. In all cases, Jekyll calls -your hooks with the container object as the first callback parameter. But in the -case of :pre_render and :site, :post_render, your hook -will also receive a payload hash as a second parameter which allows you full -control over the variables that are available while rendering in the former case -and make final changes just before writing your website to disk on the latter -case. +your hooks with the container object as the first callback parameter. However, +all `:pre_render` hooks and the`:site, :post_render` hook will also provide a +payload hash as a second parameter. In the case of `:pre_render`, the payload +gives you full control over the variables that are available while rendering. +In the case of `:site, :post_render`, the payload contains final values after +rendering all the site (useful for sitemaps, feeds, etc). The complete list of available hooks is below: From 809ceea1075c320ec3696ef3bd7ab758c80d912d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 29 Aug 2016 11:57:23 -0700 Subject: [PATCH 1347/4996] Update history to reflect merge of #5240 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 712f416cfe2..ce8e9a9344b 100644 --- a/History.markdown +++ b/History.markdown @@ -32,6 +32,7 @@ * Avoid installing unecessary gems for site testing (#5272) * Proposal: Affinity teams and their captains (#5273) * Replace duplicate with postive local test in issue template (#5286) + * Update AppVeyor config. (#5240) ### Bug Fixes From 20f9c260881d45decbeb116f6254177c98b075b3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 29 Aug 2016 18:55:58 -0700 Subject: [PATCH 1348/4996] Update history to reflect merge of #5280 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ce8e9a9344b..2e0326d65e0 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * Replace liquid highlight tag with backticks (#5262) * Word update (#5294) * Site documentation section links always point to https://jekyllrb.com (#5281) + * Missing ":site, :post_render" payload documentation on site (#5280) ### Development Fixes From 34404af0319ae6350a4ad3c3da3b109eb8cb37c5 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Tue, 30 Aug 2016 09:22:44 +0530 Subject: [PATCH 1349/4996] execute jekyll from cloned source --- script/default-site | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/default-site b/script/default-site index 5e96a991049..041c7e97160 100755 --- a/script/default-site +++ b/script/default-site @@ -10,7 +10,7 @@ rm -Rf ./tmp/default-site workdir=$(pwd) echo "$0: creating new default site" -bundle exec ruby exe/jekyll new tmp/default-site +bundle exec jekyll new tmp/default-site pushd tmp/default-site echo "$0: respecifying the jekyll install location" From f3093e2f6f17c5490dc3e6c70dc11ebdcad05b0e Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Tue, 30 Aug 2016 09:35:07 +0530 Subject: [PATCH 1350/4996] change workdir assignment --- script/default-site | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/script/default-site b/script/default-site index 041c7e97160..6530c320b7d 100755 --- a/script/default-site +++ b/script/default-site @@ -7,11 +7,10 @@ echo "$0: setting up tmp directory" mkdir -p ./tmp rm -Rf ./tmp/default-site -workdir=$(pwd) - echo "$0: creating new default site" bundle exec jekyll new tmp/default-site pushd tmp/default-site +workdir="../../" echo "$0: respecifying the jekyll install location" ruby -e "contents = File.read('Gemfile'); File.write('Gemfile', contents.sub(/gem \"jekyll\".*\\n/, 'gem \"jekyll\", path: \"$workdir\"'))" From 160782ec505c01a103556e86b2c2eec73cb9dcf9 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Tue, 30 Aug 2016 19:54:33 +0800 Subject: [PATCH 1351/4996] Site: exclude README.md and .gitignore [ci skip] --- site/_config.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/site/_config.yml b/site/_config.yml index 0c1e3245885..722f712cc4a 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -32,3 +32,7 @@ gems: - jekyll-seo-tag - jekyll-avatar - jekyll-mentions + +exclude: + - README.md + - .gitignore From b2ece36d27166037e364a30597126b5babd59527 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Tue, 30 Aug 2016 22:15:00 +0530 Subject: [PATCH 1352/4996] remove variable workdir --- script/default-site | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/script/default-site b/script/default-site index 6530c320b7d..899524a710d 100755 --- a/script/default-site +++ b/script/default-site @@ -10,10 +10,9 @@ rm -Rf ./tmp/default-site echo "$0: creating new default site" bundle exec jekyll new tmp/default-site pushd tmp/default-site -workdir="../../" echo "$0: respecifying the jekyll install location" -ruby -e "contents = File.read('Gemfile'); File.write('Gemfile', contents.sub(/gem \"jekyll\".*\\n/, 'gem \"jekyll\", path: \"$workdir\"'))" +ruby -e "contents = File.read('Gemfile'); File.write('Gemfile', contents.sub(/gem \"jekyll\".*\\n/, 'gem \"jekyll\", path: \"../../\"'))" echo "$0: installing default site dependencies" BUNDLE_GEMFILE=Gemfile bundle install echo "$0: building the default site" From f3d0a9760430b33ab11c5a18ff2fbed155831079 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 30 Aug 2016 11:02:59 -0700 Subject: [PATCH 1353/4996] Update history to reflect merge of #5304 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2e0326d65e0..b7567d60506 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * Word update (#5294) * Site documentation section links always point to https://jekyllrb.com (#5281) * Missing ":site, :post_render" payload documentation on site (#5280) + * Site: exclude README.md and .gitignore [ci skip] (#5304) ### Development Fixes From b5ee87b4ca91fefe86c42526fee230a3c0294eca Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 30 Aug 2016 11:17:43 -0700 Subject: [PATCH 1354/4996] Update history to reflect merge of #5295 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b7567d60506..b2afa9d8769 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Proposal: Affinity teams and their captains (#5273) * Replace duplicate with postive local test in issue template (#5286) * Update AppVeyor config. (#5240) + * Execute jekyll from clone instead of defined binary when running 'script/default-site' (#5295) ### Bug Fixes From 40cc44c2ea265efd8f054d3189fd913726f4f094 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 11:46:58 -0700 Subject: [PATCH 1355/4996] Reorganize history.markdown for HEAD. --- History.markdown | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/History.markdown b/History.markdown index b2afa9d8769..7a4e8bf910d 100644 --- a/History.markdown +++ b/History.markdown @@ -1,8 +1,17 @@ ## HEAD +### Minor Enhancements + + * Colorize interpolated output in logger.info (#5239) + * Site template: exclude Gemfile and Gemfile.lock in site config (#5293) + +### Bug Fixes + + * Use jekyll-feed to generate the default site's RSS feed (#5196) + ### Site Enhancements - * Document for to_integer and inspect filters (#5185) + * Document `to_integer` and `inspect` filters (#5185) * Fix path in the prompt (#5194) * need subcommand build (#5190) * Add the Jekyll Cloudinary plugin (#5183) @@ -11,20 +20,20 @@ * Remove mention of page for link tag in release post (#5214) * fixed typo (#5226) * Add missing comma (#5222) - * Maintain aspect ratio with height: auto; (#5254) + * Maintain aspect ratio with `height: auto;` (#5254) * Fix a link in deployment-methods.md (#5244) * Documentation: improve highlight in `Creating a theme` (#5249) * Bundler isn't installed by default (#5258) * Update troubleshooting documentation to include fix for issue with vendored gems (#5271) - * Link --lsi option's description to Wikipedia docs on LSI (#5274) - * Document --profile option on the configuration page (#5279) + * Link `--lsi` option's description to Wikipedia docs on LSI (#5274) + * Document `--profile` option on the configuration page (#5279) * Update homepage to sync with merge of #5258 (#5287) * Add post about Jekyll Admin initial release (#5291) * Replace liquid highlight tag with backticks (#5262) * Word update (#5294) * Site documentation section links always point to https://jekyllrb.com (#5281) - * Missing ":site, :post_render" payload documentation on site (#5280) - * Site: exclude README.md and .gitignore [ci skip] (#5304) + * Missing `:site, :post_render` payload documentation on site (#5280) + * Site: exclude README.md and .gitignore (#5304) ### Development Fixes @@ -37,15 +46,6 @@ * Update AppVeyor config. (#5240) * Execute jekyll from clone instead of defined binary when running 'script/default-site' (#5295) -### Bug Fixes - - * Use jekyll-feed to generate the default site's RSS feed (#5196) - -### Minor Enhancements - - * Colorize interpolated output in logger.info (#5239) - * Site template: exclude Gemfile and Gemfile.lock in site config (#5293) - ## 3.2.1 / 2016-08-02 ### Bug Fixes From 4420c3b2af9c826fa3db3de4949e201e14988260 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 11:58:21 -0700 Subject: [PATCH 1356/4996] Make Site#configure_theme more understandable --- lib/jekyll/site.rb | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 02110f9745d..91f58e3abc7 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -423,15 +423,14 @@ def configure_plugins private def configure_theme - self.theme = nil - return unless config["theme"] - - if config["theme"].is_a?(String) - self.theme = Jekyll::Theme.new(config["theme"]) - else - Jekyll.logger.warn "Theme:", - "value of 'theme' in config should be String, but got #{config["theme"].class}" - end + self.theme = + if config["theme"].is_a?(String) + Jekyll::Theme.new(config["theme"]) + else + Jekyll.logger.warn "Theme:", "value of 'theme' in config should be " + "String to use gem-based themes, but got #{config["theme"].class}" + nil + end end private From 2b15b0b3251d35c290dc96eb07e18fa31a58bcc6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 12:17:24 -0700 Subject: [PATCH 1357/4996] Site#configure_theme: don't do anything if theme config is unset; TEST --- lib/jekyll/site.rb | 5 ++++- test/test_site.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 91f58e3abc7..661365416d9 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -423,11 +423,14 @@ def configure_plugins private def configure_theme + self.theme = nil + return if config["theme"].nil? + self.theme = if config["theme"].is_a?(String) Jekyll::Theme.new(config["theme"]) else - Jekyll.logger.warn "Theme:", "value of 'theme' in config should be " + Jekyll.logger.warn "Theme:", "value of 'theme' in config should be " \ "String to use gem-based themes, but got #{config["theme"].class}" nil end diff --git a/test/test_site.rb b/test/test_site.rb index f09d94b9dac..615f8a6977e 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -489,6 +489,32 @@ def convert(*_args) end end + context "when setting theme" do + should "set no theme if config is not set" do + expect($stderr).not_to receive(:puts) + expect($stdout).not_to receive(:puts) + site = fixture_site({ "theme" => nil }) + assert_nil site.theme + end + + should "set no theme if config is a hash" do + output = capture_output do + site = fixture_site({ "theme" => {} }) + assert_nil site.theme + end + expected_msg = "Theme: value of 'theme' in config should be String to use gem-based themes, but got Hash\n" + assert output.end_with?(expected_msg), "Expected #{output.inspect} to end with #{expected_msg.inspect}" + end + + should "set a theme if the config is a string" do + expect($stderr).not_to receive(:puts) + expect($stdout).not_to receive(:puts) + site = fixture_site({ "theme" => "test-theme" }) + assert_instance_of Jekyll::Theme, site.theme + assert_equal "test-theme", site.theme.name + end + end + context "with liquid profiling" do setup do @site = Site.new(site_configuration("profile" => true)) From 5b21f8fda9357ddf42b665dda5bf38e657b043b4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 13:28:46 -0700 Subject: [PATCH 1358/4996] Fix fmt errors. --- test/test_site.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/test_site.rb b/test/test_site.rb index 615f8a6977e..57b06871377 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -502,8 +502,10 @@ def convert(*_args) site = fixture_site({ "theme" => {} }) assert_nil site.theme end - expected_msg = "Theme: value of 'theme' in config should be String to use gem-based themes, but got Hash\n" - assert output.end_with?(expected_msg), "Expected #{output.inspect} to end with #{expected_msg.inspect}" + expected_msg = "Theme: value of 'theme' in config should be String " \ + "to use gem-based themes, but got Hash\n" + assert output.end_with?(expected_msg), + "Expected #{output.inspect} to end with #{expected_msg.inspect}" end should "set a theme if the config is a string" do From 17883b77c6c6dcbf8fce1a5141ecaeed526de736 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 30 Aug 2016 13:34:56 -0700 Subject: [PATCH 1359/4996] Update history to reflect merge of #5045 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7a4e8bf910d..d14bf9403af 100644 --- a/History.markdown +++ b/History.markdown @@ -45,6 +45,7 @@ * Replace duplicate with postive local test in issue template (#5286) * Update AppVeyor config. (#5240) * Execute jekyll from clone instead of defined binary when running 'script/default-site' (#5295) + * rubocop: lib/jekyll/document.rb complexity fixes (#5045) ## 3.2.1 / 2016-08-02 From b781b9967de4386440c2f09f2e670ad34d329f4e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 14:04:57 -0700 Subject: [PATCH 1360/4996] Proxy Convertible#render_all_layouts to Renderer.place_in_layouts --- .rubocop.yml | 1 - lib/jekyll/convertible.rb | 42 +++++++-------------------------------- 2 files changed, 7 insertions(+), 36 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 8ae01fb17d1..787fbdbe8f6 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,7 +4,6 @@ AllCops: Include: - lib/**/*.rb Exclude: - - lib/jekyll/convertible.rb - lib/jekyll/renderer.rb - bin/**/* - benchmark/**/* diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index ca613f78b8d..954802a1eb1 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -95,7 +95,7 @@ def transform # Returns the String extension for the output file. # e.g. ".html" for an HTML output file. def output_ext - Jekyll::Renderer.new(site, self).output_ext + _renderer.output_ext end # Determine which converter to use based on this convertible's @@ -211,40 +211,7 @@ def invalid_layout?(layout) # # Returns nothing def render_all_layouts(layouts, payload, info) - # recursively render layouts - layout = layouts[data["layout"]] - - Jekyll.logger.warn( - "Build Warning:", - "Layout '#{data["layout"]}' requested in #{path} does not exist." - ) if invalid_layout? layout - - used = Set.new([layout]) - - # Reset the payload layout data to ensure it starts fresh for each page. - payload["layout"] = nil - - while layout - Jekyll.logger.debug "Rendering Layout:", path - payload["content"] = output - payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) - - self.output = render_liquid(layout.content, - payload, - info, - layout.relative_path) - - # Add layout to dependency tree - site.regenerator.add_dependency( - site.in_source_dir(path), - site.in_source_dir(layout.path) - ) - - if (layout = layouts[layout.data["layout"]]) - break if used.include?(layout) - used << layout - end - end + _renderer.place_in_layouts(output, payload, info) end # Add any necessary layouts to this convertible document. @@ -306,5 +273,10 @@ def [](property) data[property] end end + + private + def _renderer + @_renderer ||= Jekyll::Renderer.new(site, self) + end end end From 741102bd40db3d12b2bb9221a37aefd3d6beb744 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 14:13:26 -0700 Subject: [PATCH 1361/4996] Proxy Convertible#converters to Renderer --- lib/jekyll/convertible.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 954802a1eb1..db187dc96f7 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -103,7 +103,7 @@ def output_ext # # Returns the Converter instance. def converters - @converters ||= site.converters.select { |c| c.matches(ext) }.sort + _renderer.converters end # Render Liquid in the content From d0f57b61d4e5e4ff1a6514578bf23f4ef0628296 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 14:14:03 -0700 Subject: [PATCH 1362/4996] Proxy Convertible#transform to Renderer --- lib/jekyll/convertible.rb | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index db187dc96f7..8e87eec97e8 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -76,18 +76,7 @@ def validate_permalink!(filename) # # Returns the transformed contents. def transform - converters.reduce(content) do |output, converter| - begin - converter.convert output - rescue => e - Jekyll.logger.error( - "Conversion error:", - "#{converter.class} encountered an error while converting '#{path}':" - ) - Jekyll.logger.error("", e.to_s) - raise e - end - end + _renderer.transform end # Determine the extension depending on content_type. From 8496e2e8b6b79e6804f1c1daf90ea790bec81751 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 14:14:12 -0700 Subject: [PATCH 1363/4996] Proxy Convertible#render_liquid to Renderer --- lib/jekyll/convertible.rb | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 8e87eec97e8..c0c97e337b5 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -103,17 +103,7 @@ def converters # # Returns the converted content def render_liquid(content, payload, info, path) - template = site.liquid_renderer.file(path).parse(content) - template.warnings.each do |e| - Jekyll.logger.warn "Liquid Warning:", - LiquidRenderer.format_error(e, path || self.path) - end - template.render!(payload, info) - # rubocop: disable RescueException - rescue Exception => e - Jekyll.logger.error "Liquid Exception:", - LiquidRenderer.format_error(e, path || self.path) - raise e + _renderer.render_liquid(content, payload, info, path) end # rubocop: enable RescueException From 73e79f0049b642dd1246aebdf7e4696682ec56c2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 14:14:22 -0700 Subject: [PATCH 1364/4996] Proxy Convertible#converters to Renderer#run --- lib/jekyll/convertible.rb | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index c0c97e337b5..9922f7797ea 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -200,30 +200,9 @@ def render_all_layouts(layouts, payload, info) # # Returns nothing. def do_layout(payload, layouts) - Jekyll.logger.debug "Rendering:", self.relative_path + @_renderer = Jekyll::Renderer.new(site, self, payload) + _renderer.run - Jekyll.logger.debug "Pre-Render Hooks:", self.relative_path - Jekyll::Hooks.trigger hook_owner, :pre_render, self, payload - info = { - :filters => [Jekyll::Filters], - :registers => { :site => site, :page => payload["page"] } - } - - # render and transform content (this becomes the final content of the object) - payload["highlighter_prefix"] = converters.first.highlighter_prefix - payload["highlighter_suffix"] = converters.first.highlighter_suffix - - if render_with_liquid? - Jekyll.logger.debug "Rendering Liquid:", self.relative_path - self.content = render_liquid(content, payload, info, path) - end - Jekyll.logger.debug "Rendering Markup:", self.relative_path - self.content = transform - - # output keeps track of what will finally be written - self.output = content - - render_all_layouts(layouts, payload, info) if place_in_layout? Jekyll.logger.debug "Post-Render Hooks:", self.relative_path Jekyll::Hooks.trigger hook_owner, :post_render, self end From 8014c54ee0bafbaede8196c15741101f65197b52 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 14:14:33 -0700 Subject: [PATCH 1365/4996] Convertible#converters: sort the converters --- lib/jekyll/renderer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 083a2a6bafa..44f3fb5e2e4 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -15,7 +15,7 @@ def initialize(site, document, site_payload = nil) # # Returns an array of Converter instances. def converters - @converters ||= site.converters.select { |c| c.matches(document.extname) } + @converters ||= site.converters.select { |c| c.matches(document.extname) }.sort end # Determine the extname the outputted file should have From ac6bbc190690fcb4c4ec4e9b821ac8fd922cbd88 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 14:14:52 -0700 Subject: [PATCH 1366/4996] Renderer#invalid_layout? should check if document is an excerpt --- lib/jekyll/renderer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 44f3fb5e2e4..b1177b602fc 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -126,7 +126,7 @@ def render_liquid(content, payload, info, path = nil) # # Returns true if the layout is invalid, false if otherwise def invalid_layout?(layout) - !document.data["layout"].nil? && layout.nil? + !document.data["layout"].nil? && layout.nil? && !(document.is_a? Jekyll::Excerpt) end # Render layouts and place given content inside. From 9ddc12bad8773f022456be2bd72107ade97c06c2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 14:39:20 -0700 Subject: [PATCH 1367/4996] Convertible: ensure layouts the argument and payload the argument are set properly in the renderer --- lib/jekyll/convertible.rb | 12 ++++++++++-- lib/jekyll/renderer.rb | 31 ++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 9922f7797ea..52fc49b4832 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -190,7 +190,10 @@ def invalid_layout?(layout) # # Returns nothing def render_all_layouts(layouts, payload, info) + _renderer.layouts = layouts _renderer.place_in_layouts(output, payload, info) + ensure + @_renderer = nil # this will allow the modifications above to disappear end # Add any necessary layouts to this convertible document. @@ -200,11 +203,16 @@ def render_all_layouts(layouts, payload, info) # # Returns nothing. def do_layout(payload, layouts) - @_renderer = Jekyll::Renderer.new(site, self, payload) - _renderer.run + _renderer.tap do |renderer| + renderer.layouts = layouts + renderer.payload = payload + renderer.run + end Jekyll.logger.debug "Post-Render Hooks:", self.relative_path Jekyll::Hooks.trigger hook_owner, :post_render, self + ensure + @_renderer = nil # this will allow the modifications above to disappear end # Write the generated page file to the destination directory. diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index b1177b602fc..db01a167b91 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -2,12 +2,33 @@ module Jekyll class Renderer - attr_reader :document, :site, :payload + attr_reader :document, :site + attr_writer :layouts, :payload - def initialize(site, document, site_payload = nil) + def initialize(site, document, site_payload = nil, layouts: nil) @site = site @document = document - @payload = site_payload || site.site_payload + @payload = site_payload + @layouts = layouts + end + + # Fetches the payload used in Liquid rendering. + # It can be written with #payload=(new_payload) + # Falls back to site.site_payload if no payload is set. + # + # Returns a Jekyll::Drops::UnifiedPayloadDrop + def payload + @payload ||= site.site_payload + end + + # The list of layouts registered for this Renderer. + # It can be written with #layouts=(new_layouts) + # Falls back to site.layouts if no layouts are registered. + # + # Returns a Hash of String => Jekyll::Layout identified + # as basename without the extension name. + def layouts + @layouts || site.layouts end # Determine which converters to use based on this document's @@ -137,7 +158,7 @@ def invalid_layout?(layout) # Returns the content placed in the Liquid-rendered layouts def place_in_layouts(content, payload, info) output = content.dup - layout = site.layouts[document.data["layout"]] + layout = layouts[document.data["layout"]] Jekyll.logger.warn( "Build Warning:", @@ -167,7 +188,7 @@ def place_in_layouts(content, payload, info) site.in_source_dir(layout.path) ) if document.write? - if (layout = site.layouts[layout.data["layout"]]) + if (layout = layouts[layout.data["layout"]]) break if used.include?(layout) used << layout end From a78426f20db370bc0ee7f0bba681b3d91cd2ca2e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 30 Aug 2016 14:39:49 -0700 Subject: [PATCH 1368/4996] Convertible#read_yaml: disable Metrics/AbcSize check --- lib/jekyll/convertible.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 52fc49b4832..65052b689c9 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -35,6 +35,7 @@ def published? # opts - optional parameter to File.read, default at site configs # # Returns nothing. + # rubocop:disable Metrics/AbcSize def read_yaml(base, name, opts = {}) filename = File.join(base, name) @@ -58,6 +59,7 @@ def read_yaml(base, name, opts = {}) self.data end + # rubocop:enable Metrics/AbcSize def validate_data!(filename) unless self.data.is_a?(Hash) From d905a0475a0bcbcbce856189a81ef02cc23e81dc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 30 Aug 2016 14:54:48 -0700 Subject: [PATCH 1369/4996] Update history to reflect merge of #5189 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d14bf9403af..65ba60de61c 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ ### Bug Fixes * Use jekyll-feed to generate the default site's RSS feed (#5196) + * Site#configure_theme: do not set theme unless it's a string (#5189) ### Site Enhancements From 4f80dde8c42c3ac37559cd3433c8225d9fce7d76 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 31 Aug 2016 06:31:01 -0700 Subject: [PATCH 1370/4996] Update history to reflect merge of #5224 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 65ba60de61c..21f959f190d 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Site documentation section links always point to https://jekyllrb.com (#5281) * Missing `:site, :post_render` payload documentation on site (#5280) * Site: exclude README.md and .gitignore (#5304) + * Add link to Staticman (#5224) ### Development Fixes From 4af0f0262ec119fd2a6049b236bba97314b2976e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 1 Sep 2016 13:26:14 -0700 Subject: [PATCH 1371/4996] Remove layouts named param from Renderer#initialize --- lib/jekyll/renderer.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index db01a167b91..749882bf77d 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -5,11 +5,10 @@ class Renderer attr_reader :document, :site attr_writer :layouts, :payload - def initialize(site, document, site_payload = nil, layouts: nil) + def initialize(site, document, site_payload = nil) @site = site @document = document @payload = site_payload - @layouts = layouts end # Fetches the payload used in Liquid rendering. From 45aac995d81dc2ac9f2d301e7c0819b7b55a4e79 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 1 Sep 2016 17:18:51 -0700 Subject: [PATCH 1372/4996] Update history to reflect merge of #5308 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 21f959f190d..3ab9086e41b 100644 --- a/History.markdown +++ b/History.markdown @@ -48,6 +48,7 @@ * Update AppVeyor config. (#5240) * Execute jekyll from clone instead of defined binary when running 'script/default-site' (#5295) * rubocop: lib/jekyll/document.rb complexity fixes (#5045) + * Proxy a number of Convertible methods to Renderer (#5308) ## 3.2.1 / 2016-08-02 From 63595f388d2371d1ce07aaedf4be1fc100c9aaf1 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 2 Sep 2016 11:17:23 +0200 Subject: [PATCH 1373/4996] promote .md extensions --- site/_docs/posts.md | 2 +- site/_docs/structure.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/site/_docs/posts.md b/site/_docs/posts.md index 0253dbac9e4..40aa8365c58 100644 --- a/site/_docs/posts.md +++ b/site/_docs/posts.md @@ -37,7 +37,7 @@ file. For example, the following are examples of valid post filenames: ```sh 2011-12-31-new-years-eve-is-awesome.md -2012-09-12-how-to-write-a-blog.textile +2012-09-12-how-to-write-a-blog.md ```
    diff --git a/site/_docs/structure.md b/site/_docs/structure.md index de077c5ec40..b21cb1b27be 100644 --- a/site/_docs/structure.md +++ b/site/_docs/structure.md @@ -18,8 +18,8 @@ A basic Jekyll site usually looks something like this: . ├── _config.yml ├── _drafts -| ├── begin-with-the-crazy-ideas.textile -| └── on-simplicity-in-technology.markdown +| ├── begin-with-the-crazy-ideas.md +| └── on-simplicity-in-technology.md ├── _includes | ├── footer.html | └── header.html @@ -27,8 +27,8 @@ A basic Jekyll site usually looks something like this: | ├── default.html | └── post.html ├── _posts -| ├── 2007-10-29-why-every-programmer-should-play-nethack.textile -| └── 2009-04-26-barcamp-boston-4-roundup.textile +| ├── 2007-10-29-why-every-programmer-should-play-nethack.md +| └── 2009-04-26-barcamp-boston-4-roundup.md ├── _data | └── members.yml ├── _site From 9b09d8a8e810bca2c528cbe44beb6a333ea4797b Mon Sep 17 00:00:00 2001 From: Eloy Espinaco Date: Mon, 8 Aug 2016 11:28:53 -0300 Subject: [PATCH 1374/4996] Add support for indented link references on excerpt Excerpt link reference extraction is missing all the indented references at the bottom of the page. Markdown specify that those can be indented up to three spaces. --- lib/jekyll/excerpt.rb | 2 +- ...16-08-16-indented-link-references.markdown | 16 ++++++++++++ test/test_excerpt.rb | 26 +++++++++++++++++++ test/test_generated_site.rb | 2 +- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 test/source/_posts/2016-08-16-indented-link-references.markdown diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index c181cb68ed7..34a2e65c103 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -118,7 +118,7 @@ def extract_excerpt(doc_content) if tail.empty? head else - "" << head << "\n\n" << tail.scan(%r!^\[[^\]]+\]:.+$!).join("\n") + "" << head << "\n\n" << tail.scan(%r!^ {0,3}\[[^\]]+\]:.+$!).join("\n") end end end diff --git a/test/source/_posts/2016-08-16-indented-link-references.markdown b/test/source/_posts/2016-08-16-indented-link-references.markdown new file mode 100644 index 00000000000..f536616219f --- /dev/null +++ b/test/source/_posts/2016-08-16-indented-link-references.markdown @@ -0,0 +1,16 @@ +--- +--- + +This is the first paragraph. It [has][link_0] [lots][link_1] [of][link_2] +[links][link_3]. + +This is the second paragraph. It has sample code that should not be extracted: + + [fakelink]: www.invalid.com + +And here are the real links: + +[link_0]: www.example.com/0 + [link_1]: www.example.com/1 + [link_2]: www.example.com/2 + [link_3]: www.example.com/3 diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index b8169794c61..671d55af4ae 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -119,6 +119,32 @@ def do_render(document) assert @extracted_excerpt.content.include?("http://www.jekyllrb.com/") end end + + context "with indented link references" do + setup do + @post = setup_post("2016-08-16-indented-link-references.markdown") + @excerpt = @post.excerpt + end + + should "contain all refs at the bottom of the page" do + (0..3).each do |i| + assert_match "[link_#{i}]: www.example.com/#{i}", @excerpt.content + end + end + + should "ignore indented code" do + refute_match "[fakelink]:", @excerpt.content + end + + should "render links properly" do + @rendered_post = @post.dup + do_render(@rendered_post) + output = @rendered_post.data["excerpt"].output + (0..3).each do |i| + assert_includes output, "" + end + end + end end end diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 8373f0fc848..31784054fd6 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -11,7 +11,7 @@ class TestGeneratedSite < JekyllUnitTest end should "ensure post count is as expected" do - assert_equal 49, @site.posts.size + assert_equal 50, @site.posts.size end should "insert site.posts into the index" do From 57b86ee77eab0a9cddfd6b6bc7681051c1d16a78 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 3 Sep 2016 18:09:06 +0530 Subject: [PATCH 1375/4996] add a line about updating theme-gems in the docs --- site/_docs/themes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/_docs/themes.md b/site/_docs/themes.md index 55e14b4bb3e..a07e9cfb00e 100644 --- a/site/_docs/themes.md +++ b/site/_docs/themes.md @@ -94,3 +94,5 @@ Themes are published via [RubyGems.org](https://rubygems.org). You'll need a Rub 2. Next, push your packaged theme up to the RubyGems service, by running the following command, again replacing `my-awesome-jekyll-theme` with the name of your theme: gem push my-awesome-jekyll-theme-*.gem + +3. To release a new version of your theme, simply update the version number in the gemspec file, ( `my-awesome-jekyll-theme.gemspec` in this example ), following the principles of [Semantic Versioning](http://semver.org/) and then repeat Steps 1 & 2 above. From da0776d70e9de8b13578338a435fa5f57034daeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAnior=20Messias?= Date: Sat, 3 Sep 2016 11:28:18 -0300 Subject: [PATCH 1376/4996] Update url for OpenShift Update url for Github repository with cartridge --- site/_docs/deployment-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index 7391fe0366a..ad73c337295 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -205,7 +205,7 @@ low-volume blogs as you only pay for what you use. ## OpenShift If you'd like to deploy your site to an OpenShift gear, there's [a cartridge -for that](https://github.com/openshift-cartridges/openshift-jekyll-cartridge). +for that](https://github.com/openshift-quickstart/jekyll-openshift).
    ProTip™: Use GitHub Pages for zero-hassle Jekyll hosting
    From f69671c46c76a97d7d664b3c780348b2b191ec61 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 3 Sep 2016 13:36:22 -0700 Subject: [PATCH 1377/4996] Update history to reflect merge of #5320 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3ab9086e41b..960ae5c0c14 100644 --- a/History.markdown +++ b/History.markdown @@ -36,6 +36,7 @@ * Missing `:site, :post_render` payload documentation on site (#5280) * Site: exclude README.md and .gitignore (#5304) * Add link to Staticman (#5224) + * Update url for OpenShift (#5320) ### Development Fixes From a666e6faee3c89e9bcc44b6fb1ce4a986df5d4c5 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 4 Sep 2016 13:04:24 +0530 Subject: [PATCH 1378/4996] update line about semver to be less authoritative --- site/_docs/themes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/_docs/themes.md b/site/_docs/themes.md index a07e9cfb00e..6fff61b283b 100644 --- a/site/_docs/themes.md +++ b/site/_docs/themes.md @@ -95,4 +95,5 @@ Themes are published via [RubyGems.org](https://rubygems.org). You'll need a Rub gem push my-awesome-jekyll-theme-*.gem -3. To release a new version of your theme, simply update the version number in the gemspec file, ( `my-awesome-jekyll-theme.gemspec` in this example ), following the principles of [Semantic Versioning](http://semver.org/) and then repeat Steps 1 & 2 above. +3. To release a new version of your theme, simply update the version number in the gemspec file, ( `my-awesome-jekyll-theme.gemspec` in this example ), and then repeat Steps 1 & 2 above. +We recommend that you follow [Semantic Versioning](http://semver.org/) while bumping your theme-version. From b47db14f8663ae7479ca60c8a0eed55ec0d0d14c Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 5 Sep 2016 15:14:59 +0530 Subject: [PATCH 1379/4996] add future gems to gitignore --- lib/theme_template/gitignore.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/theme_template/gitignore.erb b/lib/theme_template/gitignore.erb index 64eb653f051..867d3792d5a 100644 --- a/lib/theme_template/gitignore.erb +++ b/lib/theme_template/gitignore.erb @@ -1,3 +1,4 @@ +*.gem .bundle .sass-cache _site From 42b85bb82f65f3d74cc630f43e4b2c0b76022ffd Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 7 Sep 2016 02:00:51 +0200 Subject: [PATCH 1380/4996] explain how to copy theme's file --- site/_docs/themes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/site/_docs/themes.md b/site/_docs/themes.md index 55e14b4bb3e..cc96fefdc9d 100644 --- a/site/_docs/themes.md +++ b/site/_docs/themes.md @@ -34,6 +34,10 @@ Jekyll will look first to your site's content, before looking to the theme's def Refer to your selected theme's documentation and source repository for more information on what files you can override. {: .note .info} +To locate theme's files on your computer, run `bundle show` followed by +the name of the theme's gem, e.g. `bundle show minima` for default Jekyll's +theme. Then copy the files you want to override, from the returned path to your root folder. + ## Creating a theme Jekyll themes are distributed as Ruby gems. Don't worry, Jekyll will help you scaffold a new theme with the `new-theme` command. Just run `jekyll new-theme` with the theme name as an argument: From f0293def80c222d43a50813f24897b8240c78eff Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Tue, 6 Sep 2016 22:48:32 +0200 Subject: [PATCH 1381/4996] [docs] add help for missing static_file e.g. on heroku fixes #5144 --- site/_docs/troubleshooting.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index c4580f69777..3a2c61700fd 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -13,6 +13,7 @@ that might be of help. If the problem you’re experiencing isn’t covered belo - [Base-URL Problems](#base-url-problems) - [Configuration problems](#configuration-problems) - [Markup Problems](#markup-problems) +- [Production Problems](#production-problems) ## Installation Problems @@ -209,6 +210,13 @@ strange errors where references don't exist or a tag hasn't been closed. If you run into these errors, try setting `excerpt_separator: ""` in your `_config.yml`, or set it to some nonsense string. +## Production Problems + +If you run into an issue that a static file can't be found in your +production environment during build since v3.2.0 you should set your +[environment to `production`](../configuration/#specifying-a-jekyll-environment-at-build-time). +The issue is caused by trying to copy a non-existing symlink. +
    Please report issues you encounter!

    From d632cdda6841a06c7f905bdb8cd6a36168b5a01b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 7 Sep 2016 15:04:17 -0700 Subject: [PATCH 1382/4996] Update history to reflect merge of #5334 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 960ae5c0c14..389f39be36b 100644 --- a/History.markdown +++ b/History.markdown @@ -37,6 +37,7 @@ * Site: exclude README.md and .gitignore (#5304) * Add link to Staticman (#5224) * Update url for OpenShift (#5320) + * [docs] add help for missing static_file e.g. on heroku (#5334) ### Development Fixes From 3840a38081d93e0edb2f5267e0c5ce4b17059e6c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 7 Sep 2016 15:59:43 -0700 Subject: [PATCH 1383/4996] Convertible: set self.output in #render_all_layouts and #do_layout --- lib/jekyll/convertible.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 65052b689c9..e710b6f03c4 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -193,7 +193,7 @@ def invalid_layout?(layout) # Returns nothing def render_all_layouts(layouts, payload, info) _renderer.layouts = layouts - _renderer.place_in_layouts(output, payload, info) + self.output = _renderer.place_in_layouts(output, payload, info) ensure @_renderer = nil # this will allow the modifications above to disappear end @@ -205,11 +205,10 @@ def render_all_layouts(layouts, payload, info) # # Returns nothing. def do_layout(payload, layouts) - _renderer.tap do |renderer| + self.output = _renderer.tap do |renderer| renderer.layouts = layouts renderer.payload = payload - renderer.run - end + end.run Jekyll.logger.debug "Post-Render Hooks:", self.relative_path Jekyll::Hooks.trigger hook_owner, :post_render, self From 8c979ec565c736af6275b3598120002462c53240 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 7 Sep 2016 16:28:01 -0700 Subject: [PATCH 1384/4996] Update history to reflect merge of #5318 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 389f39be36b..f7e85325c58 100644 --- a/History.markdown +++ b/History.markdown @@ -38,6 +38,7 @@ * Add link to Staticman (#5224) * Update url for OpenShift (#5320) * [docs] add help for missing static_file e.g. on heroku (#5334) + * Add a line about updating theme-gems in the docs (#5318) ### Development Fixes From f53a3b627239e87d7e85555982eeba1e038f8e68 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 7 Sep 2016 16:34:37 -0700 Subject: [PATCH 1385/4996] Update history to reflect merge of #5235 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f7e85325c58..f9c1ef668ab 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Colorize interpolated output in logger.info (#5239) * Site template: exclude Gemfile and Gemfile.lock in site config (#5293) + * Fix #5233: Increase our ability to detect Windows. (#5235) ### Bug Fixes From c1e6f1fb94799157c924005a01e51f184842f4e0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 7 Sep 2016 17:50:14 -0700 Subject: [PATCH 1386/4996] Fix rubocop errors & add one more test for slugify 'ascii' mode (#4680) --- .rubocop.yml | 2 +- lib/jekyll/utils.rb | 2 +- test/test_utils.rb | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 787fbdbe8f6..15bcb5dfbfd 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -23,7 +23,7 @@ Metrics/ClassLength: - !ruby/regexp /test\/.*.rb$/ Max: 300 Metrics/CyclomaticComplexity: - Max: 8 + Max: 9 Metrics/LineLength: Exclude: - !ruby/regexp /features\/.*.rb/ diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 24c5b832fac..f870ea85420 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -200,7 +200,7 @@ def slugify(string, mode: nil, cased: false) # "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL # and is allowed in both extN and NTFS. SLUGIFY_PRETTY_REGEXP - when 'ascii' + when "ascii" # For web servers not being able to handle Unicode, the safe # method is to ditch anything else but latin letters and numeric # digits. diff --git a/test/test_utils.rb b/test/test_utils.rb index d2cc60ff237..5f5611ce55e 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -199,7 +199,10 @@ class TestUtils < JekyllUnitTest end should "replace everything else but ASCII characters" do - assert_equal "the-config-yml-file", Utils.slugify("The _config.yml file?", mode: "ascii") + assert_equal "the-config-yml-file", + Utils.slugify("The _config.yml file?", :mode => "ascii") + assert_equal "f-rtive-glance", + Utils.slugify("fürtive glance!!!!", :mode => "ascii") end should "only replace whitespace if mode is raw" do From eefcbf5ddee6a09dfdf5aa1b0df75f7d0fc20668 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 8 Sep 2016 02:54:03 -0700 Subject: [PATCH 1387/4996] Update history to reflect merge of #5335 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f9c1ef668ab..04230f5e8a3 100644 --- a/History.markdown +++ b/History.markdown @@ -40,6 +40,7 @@ * Update url for OpenShift (#5320) * [docs] add help for missing static_file e.g. on heroku (#5334) * Add a line about updating theme-gems in the docs (#5318) + * Explain how to copy a theme's files (#5335) ### Development Fixes From 6ebdcdb198356b4ef78c4d5bd08277826b787a30 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 8 Sep 2016 02:55:30 -0700 Subject: [PATCH 1388/4996] Update history to reflect merge of #5316 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 04230f5e8a3..9ae9d018203 100644 --- a/History.markdown +++ b/History.markdown @@ -41,6 +41,7 @@ * [docs] add help for missing static_file e.g. on heroku (#5334) * Add a line about updating theme-gems in the docs (#5318) * Explain how to copy a theme's files (#5335) + * [docs] .md as default extension in examples (#5316) ### Development Fixes From 8813173ba7cd960f08693608ecb5ae26dd9d38fe Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 8 Sep 2016 08:07:29 +0530 Subject: [PATCH 1389/4996] set empty url in config file by default --- lib/site_template/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index 7e5346b4478..24a465185ff 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -20,7 +20,7 @@ description: > # this means to ignore newlines until "baseurl:" line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description. baseurl: "" # the subpath of your site, e.g. /blog -url: "http://example.com" # the base hostname & protocol for your site +url: "" # the base hostname & protocol for your site, e.g. http://example.com twitter_username: jekyllrb github_username: jekyll From aa2cfc81b7d13bc87b090da4c7fa7f28fe3cefeb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 8 Sep 2016 11:27:36 -0700 Subject: [PATCH 1390/4996] Update history to reflect merge of #5337 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9ae9d018203..952957ff557 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,7 @@ * Use jekyll-feed to generate the default site's RSS feed (#5196) * Site#configure_theme: do not set theme unless it's a string (#5189) + * Convertible: set self.output in #render_all_layouts and #do_layout (#5337) ### Site Enhancements From a2e911c1b53c2a977a6c9dfba8322a4d1f106ab1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 9 Sep 2016 13:53:28 -0700 Subject: [PATCH 1391/4996] Update history to reflect merge of #5326 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 952957ff557..887ffa397bf 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,7 @@ * Colorize interpolated output in logger.info (#5239) * Site template: exclude Gemfile and Gemfile.lock in site config (#5293) * Fix #5233: Increase our ability to detect Windows. (#5235) + * update gitignore template to ignore theme gems built by user (#5326) ### Bug Fixes From d86a293d784d61a55aaf3d44c4b54acfc0bd9e9c Mon Sep 17 00:00:00 2001 From: vohedge Date: Sun, 11 Sep 2016 00:18:02 +0900 Subject: [PATCH 1392/4996] Fix typo --- site/_docs/templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 55bd8b5b2f7..59bb4b1815a 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -263,7 +263,7 @@ common tasks easier.

    - {% raw %}{{ "a \n b" | normalize_whitepace }}{% endraw %} + {% raw %}{{ "a \n b" | normalize_whitespace }}{% endraw %}

    From 55de780520d06eccc5ed2d629dba3dd11e5e9545 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 12 Sep 2016 00:26:00 -0700 Subject: [PATCH 1393/4996] Update history to reflect merge of #5347 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 887ffa397bf..bb4babf608f 100644 --- a/History.markdown +++ b/History.markdown @@ -44,6 +44,7 @@ * Add a line about updating theme-gems in the docs (#5318) * Explain how to copy a theme's files (#5335) * [docs] .md as default extension in examples (#5316) + * Fix small typo in docs (#5347) ### Development Fixes From 566b42b8b34eeea233e9375c9f9688ebdf9dfc79 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 12 Aug 2016 07:40:05 +0530 Subject: [PATCH 1394/4996] add `bundle install` to `jekyll new` - automatically run `bundle install` from within the newly generated blog directory by default. - add a new switch to skip this default behaviour. --- lib/jekyll/commands/new.rb | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 90e35feee2a..c85691642fc 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -11,6 +11,7 @@ def init_with_program(prog) c.option "force", "--force", "Force creation even if PATH already exists" c.option "blank", "--blank", "Creates scaffolding but with empty files" + c.option "skip-bundle", "--skip-bundle", "Skip 'bundle install'" c.action do |args, options| Jekyll::Commands::New.process(args, options) @@ -34,7 +35,7 @@ def process(args, options = {}) create_site new_blog_path end - Jekyll.logger.info "New jekyll site installed in #{new_blog_path.cyan}." + after_install(new_blog_path, options) end def create_blank_site(path) @@ -114,6 +115,27 @@ def site_template def scaffold_path "_posts/0000-00-00-welcome-to-jekyll.markdown.erb" end + + # After a new blog has been created, print a success notification and + # then automatically execute bundle install from within the new blog dir + # unless the user opts to generate a blank blog or skip 'bundle install'. + + def after_install(path, options = {}) + Jekyll.logger.info "New jekyll site installed in #{path.cyan}." + Jekyll.logger.info "Bundle install skipped." if options["skip-bundle"] + + unless options["blank"] || options["skip-bundle"] + bundle_install path + end + end + + def bundle_install(path) + Jekyll::External.require_with_graceful_fail "bundler" + Jekyll.logger.info "Running bundle install in #{path.cyan}..." + Dir.chdir(path) do + system("bundle", "install") + end + end end end end From 345f043cc44f21b153a97629e47f2319a5f8e8f5 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Tue, 13 Sep 2016 08:23:02 +0530 Subject: [PATCH 1395/4996] test bundle install and skipping it. --- test/test_new_command.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/test_new_command.rb b/test/test_new_command.rb index aea7dd4c328..982de1da23d 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -40,9 +40,12 @@ def site_template should "display a success message" do Jekyll::Commands::New.process(@args) - output = Jekyll.logger.messages.last + output = Jekyll.logger.messages[-3] + output_last = Jekyll.logger.messages.last success_message = "New jekyll site installed in #{@full_path.cyan}." + bundle_message = "Running bundle install in #{@full_path.cyan}..." assert_includes output, success_message + assert_includes output_last, bundle_message end should "copy the static files in site template to the new directory" do @@ -85,7 +88,10 @@ def site_template should "create blank project" do blank_contents = %w(/_drafts /_layouts /_posts /index.html) capture_stdout { Jekyll::Commands::New.process(@args, "--blank") } + output = Jekyll.logger.messages.last + bundle_message = "Running bundle install in #{@full_path.cyan}..." assert_same_elements blank_contents, dir_contents(@full_path) + refute_includes output, bundle_message end should "force created folder" do @@ -93,6 +99,13 @@ def site_template output = capture_stdout { Jekyll::Commands::New.process(@args, "--force") } assert_match(%r!New jekyll site installed in!, output) end + + should "skip bundle install when opted to" do + capture_stdout { Jekyll::Commands::New.process(@args, "--skip-bundle") } + output = Jekyll.logger.messages.last + bundle_message = "Bundle install skipped." + assert_includes output, bundle_message + end end context "when multiple args are given" do From 57fd5f887da1189a16bdfbb982d75f725c38d725 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 13 Sep 2016 07:11:51 -0700 Subject: [PATCH 1396/4996] Update history to reflect merge of #5199 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bb4babf608f..d9cccbc92a4 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,7 @@ * Site template: exclude Gemfile and Gemfile.lock in site config (#5293) * Fix #5233: Increase our ability to detect Windows. (#5235) * update gitignore template to ignore theme gems built by user (#5326) + * Adds ability to link to all files (#5199) ### Bug Fixes From 59b61c3f9f64eaefae999019c565ab58153f47e6 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 16 Sep 2016 07:56:37 +0200 Subject: [PATCH 1397/4996] Exclude vendor by default --- lib/jekyll/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index c70cdd2c92e..0f0fbd8d8f2 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -17,7 +17,7 @@ class Configuration < Hash # Handling Reading "safe" => false, "include" => [".htaccess"], - "exclude" => [], + "exclude" => ["vendor"], "keep_files" => [".git", ".svn"], "encoding" => "utf-8", "markdown_ext" => "markdown,mkdown,mkdn,mkd,md", From 0233d933522d3a17dee681e9a4afb979e7ead65f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 16 Sep 2016 18:25:06 +0200 Subject: [PATCH 1398/4996] vendor is now excluded by default [ci-skip] --- site/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index abb9e234eeb..4771a438d00 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -594,7 +594,7 @@ collections: # Handling Reading safe: false include: [".htaccess"] -exclude: [] +exclude: ["vendor"] keep_files: [".git", ".svn"] encoding: "utf-8" markdown_ext: "markdown,mkdown,mkdn,mkd,md" From 562ffe7a3f4e691323a492c243dfaaf5677d2bcb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 16 Sep 2016 12:58:42 -0700 Subject: [PATCH 1399/4996] Update history to reflect merge of #5361 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d9cccbc92a4..db214a70fd1 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * Fix #5233: Increase our ability to detect Windows. (#5235) * update gitignore template to ignore theme gems built by user (#5326) * Adds ability to link to all files (#5199) + * Exclude vendor by default (#5361) ### Bug Fixes From b8f17b9034200a76bdbeb60ee5f4091e0acc8130 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 7 Aug 2016 12:15:58 -0700 Subject: [PATCH 1400/4996] Exclude node_modules by default If no 'exclude' directive is specified, exclude node_modules by default. https://twitter.com/mxstbr/status/761856359579185153 --- lib/jekyll/configuration.rb | 2 +- site/_docs/configuration.md | 2 +- test/test_configuration.rb | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 0f0fbd8d8f2..196cf5876e7 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -17,7 +17,7 @@ class Configuration < Hash # Handling Reading "safe" => false, "include" => [".htaccess"], - "exclude" => ["vendor"], + "exclude" => %w(node_modules vendor), "keep_files" => [".git", ".svn"], "encoding" => "utf-8", "markdown_ext" => "markdown,mkdown,mkdn,mkd,md", diff --git a/site/_docs/configuration.md b/site/_docs/configuration.md index 4771a438d00..a244e1ab1fd 100644 --- a/site/_docs/configuration.md +++ b/site/_docs/configuration.md @@ -594,7 +594,7 @@ collections: # Handling Reading safe: false include: [".htaccess"] -exclude: ["vendor"] +exclude: ["node_modules", "vendor"] keep_files: [".git", ".svn"] encoding: "utf-8" markdown_ext: "markdown,mkdown,mkdn,mkd,md" diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 75daffa5ff6..b0b34cce7c6 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -48,6 +48,12 @@ class TestConfiguration < JekyllUnitTest end end + context "the defaults" do + should "exclude node_modules" do + assert_includes Configuration.from({})["exclude"], "node_modules" + end + end + context "#add_default_collections" do should "no-op if collections is nil" do result = Configuration[{ "collections" => nil }].add_default_collections From 13aec48137b18e6007e43b5009c05e664c18aa83 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 16 Sep 2016 14:40:54 -0700 Subject: [PATCH 1401/4996] Add ThemeAssetsReader which reads assets from a theme If the theme includes the 'assets' directory, it will be walked and items will be added to the site based on the normal rules of Jekyll: if there is YAML front matter, it will be added as a (convertible) Page, otherwise it will be added as a StaticFile. --- lib/jekyll.rb | 1 + lib/jekyll/page.rb | 6 ++++- lib/jekyll/reader.rb | 1 + lib/jekyll/readers/theme_assets_reader.rb | 31 +++++++++++++++++++++++ lib/jekyll/theme.rb | 12 ++++++--- 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 lib/jekyll/readers/theme_assets_reader.rb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index a9fe696f0c5..3c4def1a426 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -55,6 +55,7 @@ module Jekyll autoload :PostReader, "jekyll/readers/post_reader" autoload :PageReader, "jekyll/readers/page_reader" autoload :StaticFileReader, "jekyll/readers/static_file_reader" + autoload :ThemeAssetsReader, "jekyll/readers/theme_assets_reader" autoload :LogAdapter, "jekyll/log_adapter" autoload :Page, "jekyll/page" autoload :PluginManager, "jekyll/plugin_manager" diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 4e3efe3f719..00fdec230d1 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -40,7 +40,11 @@ def initialize(site, base, dir, name) @base = base @dir = dir @name = name - @path = site.in_source_dir(base, dir, name) + if site.in_theme_dir(base) == base # we're in a theme + @path = site.in_theme_dir(base, dir, name) + else + @path = site.in_source_dir(base, dir, name) + end process(name) read_yaml(File.join(base, dir), name) diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index abbe923f6c4..7bde499d8e5 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -18,6 +18,7 @@ def read sort_files! @site.data = DataReader.new(site).read(site.config["data_dir"]) CollectionReader.new(site).read + ThemeAssetsReader.new(site).read end # Sorts posts, pages, and static files. diff --git a/lib/jekyll/readers/theme_assets_reader.rb b/lib/jekyll/readers/theme_assets_reader.rb new file mode 100644 index 00000000000..85151d0f5a0 --- /dev/null +++ b/lib/jekyll/readers/theme_assets_reader.rb @@ -0,0 +1,31 @@ +module Jekyll + class ThemeAssetsReader + attr_reader :site + def initialize(site) + @site = site + end + + def read + return unless site.theme && site.theme.assets_path + + Find.find(site.theme.assets_path) do |path| + next if File.directory?(path) + if File.symlink?(path) + Jekyll.logger.warn "Theme reader:", "Ignored symlinked asset: #{path}" + else + base = site.theme.root + dir = File.dirname(path.sub("#{site.theme.root}/", "")) + name = File.basename(path) + relative_path = File.join(*[dir, name].compact) + if Utils.has_yaml_header?(path) + next if site.pages.any? { |file| file.relative_path == relative_path } + site.pages << Jekyll::Page.new(site, base, dir, name) + else + next if site.static_files.any? { |file| file.relative_path == relative_path } + site.static_files << Jekyll::StaticFile.new(site, base, dir, name) + end + end + end + end + end +end diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index 0dd73f78486..4b0eb2db323 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -18,15 +18,19 @@ def root end def includes_path - path_for :includes + path_for :_includes end def layouts_path - path_for :layouts + path_for :_layouts end def sass_path - path_for :sass + path_for :_sass + end + + def assets_path + path_for :assets end def configure_sass @@ -43,7 +47,7 @@ def path_for(folder) end def realpath_for(folder) - File.realpath(Jekyll.sanitized_path(root, "_#{folder}")) + File.realpath(Jekyll.sanitized_path(root, folder.to_s)) rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP nil end From 87b9cfe2b5871807ee4269bdbf870028f244ff27 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 16 Sep 2016 14:57:58 -0700 Subject: [PATCH 1402/4996] ThemeBuilder: add 'assets' to list of scaffold directories --- lib/jekyll/theme_builder.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index 33477185baa..68a5eeabf3f 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -1,6 +1,6 @@ class Jekyll::ThemeBuilder SCAFFOLD_DIRECTORIES = %w( - _layouts _includes _sass + assets _layouts _includes _sass ).freeze attr_reader :name, :path, :code_of_conduct From cf26bf5db0fd2a50ae2bf5cc207bd3d6d633cc0c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 16 Sep 2016 15:36:33 -0700 Subject: [PATCH 1403/4996] TestTheme: update tests for 'path_for' now that it's no longer prepending the underscore --- test/test_theme.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_theme.rb b/test/test_theme.rb index a448ce30735..a24a4c8863b 100644 --- a/test/test_theme.rb +++ b/test/test_theme.rb @@ -43,7 +43,7 @@ def setup should "generate folder paths" do expected = File.expand_path("./_sass", @expected_root) - assert_equal expected, @theme.send(:path_for, :sass) + assert_equal expected, @theme.send(:path_for, :_sass) end should "not allow paths outside of the theme root" do @@ -56,7 +56,7 @@ def setup should "return the resolved path when a symlink & resolved path exists" do expected = File.expand_path("./_layouts", @expected_root) - assert_equal expected, @theme.send(:path_for, :symlink) + assert_equal expected, @theme.send(:path_for, :_symlink) end end From 6d7f305e7c40229149a01cc118b4ea569842e2c9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 16 Sep 2016 16:04:35 -0700 Subject: [PATCH 1404/4996] Add tests for assets directory support. --- .../{style.scss => test-theme-black.scss} | 0 .../test-theme/assets/img/another-logo.png | 1 + test/fixtures/test-theme/assets/img/logo.png | Bin 0 -> 3514 bytes test/fixtures/test-theme/assets/style.scss | 3 + test/test_theme.rb | 4 +- test/test_theme_assets_reader.rb | 61 ++++++++++++++++++ 6 files changed, 67 insertions(+), 2 deletions(-) rename test/fixtures/test-theme/_sass/{style.scss => test-theme-black.scss} (100%) create mode 120000 test/fixtures/test-theme/assets/img/another-logo.png create mode 100644 test/fixtures/test-theme/assets/img/logo.png create mode 100644 test/fixtures/test-theme/assets/style.scss create mode 100644 test/test_theme_assets_reader.rb diff --git a/test/fixtures/test-theme/_sass/style.scss b/test/fixtures/test-theme/_sass/test-theme-black.scss similarity index 100% rename from test/fixtures/test-theme/_sass/style.scss rename to test/fixtures/test-theme/_sass/test-theme-black.scss diff --git a/test/fixtures/test-theme/assets/img/another-logo.png b/test/fixtures/test-theme/assets/img/another-logo.png new file mode 120000 index 00000000000..bd36e718eaa --- /dev/null +++ b/test/fixtures/test-theme/assets/img/another-logo.png @@ -0,0 +1 @@ +logo.png \ No newline at end of file diff --git a/test/fixtures/test-theme/assets/img/logo.png b/test/fixtures/test-theme/assets/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1cbe53d68031a7bb33ca2fd765d7cffb34f000 GIT binary patch literal 3514 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 "test-theme", + "theme-color" => "black" + ) + assert @site.theme + end + + def assert_file_with_relative_path(haystack, relative_path) + assert haystack.any? { |f| + f.relative_path == relative_path + }, "Site should read in the #{relative_path} file, but it was not found in #{haystack.inspect}" + end + + def refute_file_with_relative_path(haystack, relative_path) + refute haystack.any? { |f| + f.relative_path == relative_path + }, "Site should not have read in the #{relative_path} file, but it was found in #{haystack.inspect}" + end + + context "with a valid theme" do + should "read all assets" do + ThemeAssetsReader.new(@site).read + assert_file_with_relative_path @site.static_files, "assets/img/logo.png" + assert_file_with_relative_path @site.pages, "assets/style.scss" + end + + should "convert pages" do + @site.process + + file = @site.pages.find { |f| f.relative_path == "assets/style.scss" } + refute_nil file + assert_equal @site.in_dest_dir("assets/style.css"), file.destination(@site.dest) + assert_includes file.output, ".sample {\n color: black; }" + end + end + + context "with a valid theme without an assets dir" do + should "not read any assets" do + allow(Theme).to receive(:realpath_for).with(:sass).and_return(nil) + site = fixture_site("theme" => "test-theme") + ThemeAssetsReader.new(site).read + refute_file_with_relative_path @site.static_files, "assets/img/logo.png" + refute_file_with_relative_path @site.pages, "assets/style.scss" + end + end + + context "with no theme" do + should "not read any assets" do + site = fixture_site("theme" => nil) + ThemeAssetsReader.new(site).read + refute_file_with_relative_path @site.static_files, "assets/img/logo.png" + refute_file_with_relative_path @site.pages, "assets/style.scss" + end + + end + +end From 5a932c90b5aa69c340ab3b469cd8ea0ab8c1ce94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mertcan=20G=C3=96KG=C3=96Z?= Date: Sun, 18 Sep 2016 10:50:21 +0300 Subject: [PATCH 1405/4996] added jekyll-spotify plugin --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 5ec55ca74f0..816e6de2e0a 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -910,6 +910,7 @@ LESS.js files during generation. - [Jekyll Autoprefixer](https://github.com/vwochnik/jekyll-autoprefixer): Autoprefixer integration for Jekyll - [Jekyll-breadcrumbs](https://github.com/git-no/jekyll-breadcrumbs): Creates breadcrumbs for Jekyll 3.x, includes features like SEO optimization, optional breadcrumb item translation and more. - [generator-jekyllized](https://github.com/sondr3/generator-jekyllized): A Yeoman generator for rapidly developing sites with Gulp. Live reload your site, automatically minify and optimize your assets and much more. +- [Jekyll-Spotify](https://github.com/MertcanGokgoz/Jekyll-Spotify): Easily output Spotify Embed Player for jekyll #### Editors From 9aea71137e1183ed768f156afebd0055f5620ad0 Mon Sep 17 00:00:00 2001 From: Kyle O'Brien Date: Sun, 18 Sep 2016 09:51:33 -0400 Subject: [PATCH 1406/4996] Add missing period to sentence in first paragraph. Added a period to the end of the last sentence in the first paragraph, which was missing. --- site/_docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/installation.md b/site/_docs/installation.md index b86d179e562..712e3bae6fc 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -7,7 +7,7 @@ permalink: /docs/installation/ Getting Jekyll installed and ready-to-go should only take a few minutes. If it ever becomes a pain, please [file an issue]({{ site.repository }}/issues/new) (or submit a pull request) describing the issue you -encountered and how we might make the process easier +encountered and how we might make the process easier. ### Requirements From 7a9427ccec81eb210bb818fc66523c7d57ddb890 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 18 Sep 2016 10:54:26 -0700 Subject: [PATCH 1407/4996] Update history to reflect merge of #5372 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index db214a70fd1..b85989b1d1e 100644 --- a/History.markdown +++ b/History.markdown @@ -47,6 +47,7 @@ * Explain how to copy a theme's files (#5335) * [docs] .md as default extension in examples (#5316) * Fix small typo in docs (#5347) + * Add missing period to sentence in first paragraph. (#5372) ### Development Fixes From 74baeb889a923ee46a29a3010caf605f2fbba453 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 18 Sep 2016 15:04:15 -0400 Subject: [PATCH 1408/4996] ThemeAssetsReader: fix tests so everything passes. --- .rubocop.yml | 2 +- features/theme.feature | 2 +- lib/jekyll/page.rb | 10 ++--- lib/jekyll/readers/theme_assets_reader.rb | 38 +++++++++++++------ .../test-theme/_sass/test-theme-red.scss | 3 ++ test/fixtures/test-theme/assets/style.scss | 2 +- test/test_theme.rb | 2 +- test/test_theme_assets_reader.rb | 18 ++++----- 8 files changed, 48 insertions(+), 29 deletions(-) create mode 100644 test/fixtures/test-theme/_sass/test-theme-red.scss diff --git a/.rubocop.yml b/.rubocop.yml index 15bcb5dfbfd..b0fef47a254 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -16,7 +16,7 @@ Lint/UnreachableCode: Lint/UselessAccessModifier: Enabled: false Metrics/AbcSize: - Max: 20 + Max: 21 Metrics/ClassLength: Exclude: - !ruby/regexp /features\/.*.rb$/ diff --git a/features/theme.feature b/features/theme.feature index 0e05d693790..7729a0ebbb6 100644 --- a/features/theme.feature +++ b/features/theme.feature @@ -17,7 +17,7 @@ Feature: Writing themes Scenario: A theme with SCSS Given I have a configuration file with "theme" set to "test-theme" And I have a css directory - And I have a "css/main.scss" page that contains "@import 'style';" + And I have a "css/main.scss" page that contains "@import 'test-theme-black';" When I run jekyll build Then I should get a zero exit status And the _site directory should exist diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 00fdec230d1..3e3c7ec86ca 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -40,11 +40,11 @@ def initialize(site, base, dir, name) @base = base @dir = dir @name = name - if site.in_theme_dir(base) == base # we're in a theme - @path = site.in_theme_dir(base, dir, name) - else - @path = site.in_source_dir(base, dir, name) - end + @path = if site.in_theme_dir(base) == base # we're in a theme + site.in_theme_dir(base, dir, name) + else + site.in_source_dir(base, dir, name) + end process(name) read_yaml(File.join(base, dir), name) diff --git a/lib/jekyll/readers/theme_assets_reader.rb b/lib/jekyll/readers/theme_assets_reader.rb index 85151d0f5a0..035c0607832 100644 --- a/lib/jekyll/readers/theme_assets_reader.rb +++ b/lib/jekyll/readers/theme_assets_reader.rb @@ -13,19 +13,35 @@ def read if File.symlink?(path) Jekyll.logger.warn "Theme reader:", "Ignored symlinked asset: #{path}" else - base = site.theme.root - dir = File.dirname(path.sub("#{site.theme.root}/", "")) - name = File.basename(path) - relative_path = File.join(*[dir, name].compact) - if Utils.has_yaml_header?(path) - next if site.pages.any? { |file| file.relative_path == relative_path } - site.pages << Jekyll::Page.new(site, base, dir, name) - else - next if site.static_files.any? { |file| file.relative_path == relative_path } - site.static_files << Jekyll::StaticFile.new(site, base, dir, name) - end + read_theme_asset(path) end end end + + private + def read_theme_asset(path) + base = site.theme.root + dir = File.dirname(path.sub("#{site.theme.root}/", "")) + name = File.basename(path) + + if Utils.has_yaml_header?(path) + append_unless_exists site.pages, + Jekyll::Page.new(site, base, dir, name) + else + append_unless_exists site.static_files, + Jekyll::StaticFile.new(site, base, dir, name) + end + end + + def append_unless_exists(haystack, new_item) + if haystack.any? { |file| file.relative_path == new_item.relative_path } + Jekyll.logger.debug "Theme:", + "Ignoring #{new_item.relative_path} in theme due to existing file " \ + "with that path in site." + return + end + + haystack << new_item + end end end diff --git a/test/fixtures/test-theme/_sass/test-theme-red.scss b/test/fixtures/test-theme/_sass/test-theme-red.scss new file mode 100644 index 00000000000..0307e17abb3 --- /dev/null +++ b/test/fixtures/test-theme/_sass/test-theme-red.scss @@ -0,0 +1,3 @@ +.sample { + color: red; +} diff --git a/test/fixtures/test-theme/assets/style.scss b/test/fixtures/test-theme/assets/style.scss index 408f04f769a..47c4a2f1375 100644 --- a/test/fixtures/test-theme/assets/style.scss +++ b/test/fixtures/test-theme/assets/style.scss @@ -1,3 +1,3 @@ --- --- -@import "test-theme-{{ site.theme-color }}"; +@import "test-theme-{{ site.theme-color | default: "red" }}"; diff --git a/test/test_theme.rb b/test/test_theme.rb index 82b4224a62d..fd380d95090 100644 --- a/test/test_theme.rb +++ b/test/test_theme.rb @@ -37,7 +37,7 @@ def setup [:assets, :_layouts, :_includes, :_sass].each do |folder| should "know the #{folder} path" do expected = File.expand_path(folder.to_s, @expected_root) - assert_equal expected, @theme.public_send("#{folder}_path") + assert_equal expected, @theme.public_send("#{folder.to_s.tr("_", "")}_path") end end diff --git a/test/test_theme_assets_reader.rb b/test/test_theme_assets_reader.rb index d964acf3466..ecafa0f1103 100644 --- a/test/test_theme_assets_reader.rb +++ b/test/test_theme_assets_reader.rb @@ -3,22 +3,24 @@ class TestThemeAssetsReader < JekyllUnitTest def setup @site = fixture_site( - "theme" => "test-theme", + "theme" => "test-theme", "theme-color" => "black" ) assert @site.theme end def assert_file_with_relative_path(haystack, relative_path) - assert haystack.any? { |f| - f.relative_path == relative_path - }, "Site should read in the #{relative_path} file, but it was not found in #{haystack.inspect}" + assert haystack.any? { |f| + f.relative_path == relative_path + }, "Site should read in the #{relative_path} file, " \ + "but it was not found in #{haystack.inspect}" end def refute_file_with_relative_path(haystack, relative_path) - refute haystack.any? { |f| - f.relative_path == relative_path - }, "Site should not have read in the #{relative_path} file, but it was found in #{haystack.inspect}" + refute haystack.any? { |f| + f.relative_path == relative_path + }, "Site should not have read in the #{relative_path} file, " \ + "but it was found in #{haystack.inspect}" end context "with a valid theme" do @@ -55,7 +57,5 @@ def refute_file_with_relative_path(haystack, relative_path) refute_file_with_relative_path @site.static_files, "assets/img/logo.png" refute_file_with_relative_path @site.pages, "assets/style.scss" end - end - end From 1a11536a2c5cdf2589c3773de58200c04796992f Mon Sep 17 00:00:00 2001 From: Jonathan Thornton Date: Sun, 18 Sep 2016 17:38:28 -0500 Subject: [PATCH 1409/4996] Clarify documentation in README This change is subtle, but may prove greatly useful to Jekyll newbies --- lib/theme_template/README.md.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/theme_template/README.md.erb b/lib/theme_template/README.md.erb index a4ec12f1ef4..1b2d04b2bad 100644 --- a/lib/theme_template/README.md.erb +++ b/lib/theme_template/README.md.erb @@ -12,7 +12,7 @@ Add this line to your Jekyll site's Gemfile: gem <%= theme_name.inspect %> ``` -And add this line to your Jekyll site: +And add this line to your Jekyll site's _config.yml: ```yaml theme: <%= theme_name %> From 0b94cf3fa1dbace4f6409b7b3204767c0c841aca Mon Sep 17 00:00:00 2001 From: Nicolas Porcel Date: Sun, 18 Sep 2016 23:17:15 +0200 Subject: [PATCH 1410/4996] Allow underscore in highlighter language --- lib/jekyll/tags/highlight.rb | 2 +- test/test_tags.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 952fc9b46fd..43b0c62f7ef 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -8,7 +8,7 @@ class HighlightBlock < Liquid::Block # forms: name, name=value, or name="" # # is a space-separated list of numbers - SYNTAX = %r!^([a-zA-Z0-9.+#-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$! + SYNTAX = %r!^([a-zA-Z0-9.+#_-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$! def initialize(tag_name, markup, tokens) super diff --git a/test/test_tags.rb b/test/test_tags.rb index 16e10a9b84a..8a0395f3c82 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -59,6 +59,7 @@ def highlight_block_with_opts(options_string) assert_match r, "xml+cheetah" assert_match r, "x.y" assert_match r, "coffee-script" + assert_match r, "shell_session" refute_match r, "blah^" From 054b23f69a47c9f4d8f696aa0a3a90bfa551561e Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Mon, 19 Sep 2016 11:23:05 -0500 Subject: [PATCH 1411/4996] Only complain about `coderay` if it is actually in the config Don't complain about the deprecated `kramdown.coderay` key when `highlighter == "coderay"`, since that could have been set with the legitimate `syntax_highlighter: coderay` setting. Instead, complain only if the `kramdown.coderay` configuration setting is actually present. --- lib/jekyll/converters/markdown/kramdown_parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index 932cf24e490..dd71c6c1d5f 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -104,7 +104,7 @@ def strip_coderay_prefix(hash) private def modernize_coderay_config - if highlighter == "coderay" + unless @config["coderay"].empty? Jekyll::Deprecator.deprecation_message( "You are using 'kramdown.coderay' in your configuration, " \ "please use 'syntax_highlighter_opts' instead." From f2bfc832a02410582c9368ecb13be39fa89ddc7f Mon Sep 17 00:00:00 2001 From: Jonathan Thornton Date: Mon, 19 Sep 2016 12:08:20 -0500 Subject: [PATCH 1412/4996] Marking filename with backticks as suggested --- lib/theme_template/README.md.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/theme_template/README.md.erb b/lib/theme_template/README.md.erb index 1b2d04b2bad..71cf29d393c 100644 --- a/lib/theme_template/README.md.erb +++ b/lib/theme_template/README.md.erb @@ -12,7 +12,7 @@ Add this line to your Jekyll site's Gemfile: gem <%= theme_name.inspect %> ``` -And add this line to your Jekyll site's _config.yml: +And add this line to your Jekyll site's `_config.yml`: ```yaml theme: <%= theme_name %> From 3bfdc00d14af0202295172169985f5de3ab71571 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Mon, 19 Sep 2016 13:15:02 -0500 Subject: [PATCH 1413/4996] Appease Rubocop --- exe/jekyll | 2 +- lib/jekyll/hooks.rb | 2 +- test/test_related_posts.rb | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exe/jekyll b/exe/jekyll index c233dd1ad47..3bd37e544de 100755 --- a/exe/jekyll +++ b/exe/jekyll @@ -1,7 +1,7 @@ #!/usr/bin/env ruby STDOUT.sync = true -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w(.. lib))) +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) require "jekyll" require "mercenary" diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index c9a4f79439a..44ce0c12495 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -54,7 +54,7 @@ def self.register(owners, event, priority: DEFAULT_PRIORITY, &block) # Ensure the priority is a Fixnum def self.priority_value(priority) - return priority if priority.is_a?(Fixnum) + return priority if priority.is_a?(Integer) PRIORITY_MAP[priority] || DEFAULT_PRIORITY end diff --git a/test/test_related_posts.rb b/test/test_related_posts.rb index cea3ad0b539..ef7265ef01d 100644 --- a/test/test_related_posts.rb +++ b/test/test_related_posts.rb @@ -13,8 +13,8 @@ class TestRelatedPosts < JekyllUnitTest last_post = @site.posts.last related_posts = Jekyll::RelatedPosts.new(last_post).build - last_10_recent_posts = (@site.posts.docs.reverse - [last_post]).first(10) - assert_equal last_10_recent_posts, related_posts + last_ten_recent_posts = (@site.posts.docs.reverse - [last_post]).first(10) + assert_equal last_ten_recent_posts, related_posts end end From 7309ecf8e188ee1a329a9b260b2a6678a54d8c38 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 19 Sep 2016 13:47:51 -0700 Subject: [PATCH 1414/4996] Theme: for various path helpers, use strings. Symbols confuse people. --- lib/jekyll/theme.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index 4b0eb2db323..803004f3ab8 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -18,19 +18,19 @@ def root end def includes_path - path_for :_includes + path_for "_includes".freeze end def layouts_path - path_for :_layouts + path_for "_layouts".freeze end def sass_path - path_for :_sass + path_for "_sass".freeze end def assets_path - path_for :assets + path_for "assets".freeze end def configure_sass From b78827cecbc5c158a9e7d4242ecfe663af8c8c7d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 19 Sep 2016 13:57:36 -0700 Subject: [PATCH 1415/4996] Add documentation for assets. --- site/_docs/themes.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/site/_docs/themes.md b/site/_docs/themes.md index 988f6ebd093..c7d6d574474 100644 --- a/site/_docs/themes.md +++ b/site/_docs/themes.md @@ -27,6 +27,7 @@ Jekyll themes set default layouts, includes, and stylesheets, that can be overri Jekyll will look first to your site's content, before looking to the theme's defaults, for any requested file in the following folders: +* `/assets` * `/_layouts` * `/_includes` * `/_sass` @@ -68,6 +69,12 @@ Theme layouts and includes work just like they work in any Jekyll site. Place la For example, if your theme has a `/_layouts/page.html` file, and a page has `layout: page` in its YAML front matter, Jekyll will first look to the site's `_layouts` folder for a the `page` layout, and if none exists, will use your theme's `page` layout. +### Assets + +Any file in `/assets` will be copied over to the user's site upon build unless they have a file with the same relative path. You may ship any kind of asset here: SCSS, an image, a webfont, etc. These files behave just like pages and static files in Jekyll: if the file has [YAML front matter]({{ site.baseurl }}/docs/frontmatter/) at the top, then it will be rendered. If it does not have YAML front matter, it will simply be copied over into the resulting site. This allows theme creators to ship a default `/assets/styles.scss` file which their layouts can depend on as `/assets/styles.css`. + +All files in `/assets` will be output into the compiled site in the `/assets` folder just as you'd expect from using Jekyll on your sites. + ### Stylesheets Your theme's stylesheets should be placed in your theme's `/_sass` folder, again, just as you would when authoring a Jekyll site. Your theme's styles can be included in the user's stylesheet using the `@import` directive. From 75d59911ae6d9dd559fa71b17a2539380406d795 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 19 Sep 2016 17:08:00 +0530 Subject: [PATCH 1416/4996] run features on windows --- features/support/helpers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 79210ad7d4b..0d809bca985 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -90,7 +90,7 @@ def run_bundle(args) def run_jekyll(args) args = args.strip.split(" ") # Shellwords? - process = run_in_shell(Paths.jekyll_bin.to_s, *args, "--trace") + process = run_in_shell("ruby", Paths.jekyll_bin.to_s, *args, "--trace") process.exitstatus.zero? end From 92dbe313e997af6287c78433a8e6188dbee9dfda Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 20 Sep 2016 09:26:40 -0700 Subject: [PATCH 1417/4996] Update history to reflect merge of #5383 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b85989b1d1e..f340cd6923b 100644 --- a/History.markdown +++ b/History.markdown @@ -61,6 +61,7 @@ * Execute jekyll from clone instead of defined binary when running 'script/default-site' (#5295) * rubocop: lib/jekyll/document.rb complexity fixes (#5045) * Proxy a number of Convertible methods to Renderer (#5308) + * Run executable for Cucumber via Ruby instead of Shell (#5383) ## 3.2.1 / 2016-08-02 From 950a37395fad8ef7de830ca1260afc0d27141e23 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 20 Sep 2016 13:10:49 -0700 Subject: [PATCH 1418/4996] Update history to reflect merge of #5381 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f340cd6923b..b9309d54e89 100644 --- a/History.markdown +++ b/History.markdown @@ -62,6 +62,7 @@ * rubocop: lib/jekyll/document.rb complexity fixes (#5045) * Proxy a number of Convertible methods to Renderer (#5308) * Run executable for Cucumber via Ruby instead of Shell (#5383) + * Appease Rubocop (#5381) ## 3.2.1 / 2016-08-02 From 29d8fee4ce9162019ef35facb4a5a44eb42c6920 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 20 Sep 2016 13:12:34 -0700 Subject: [PATCH 1419/4996] Add test to ensure that the /assets theme reader doesn't clobber preexisting site files. --- .../test-theme/assets/application.coffee | 3 +++ test/source/assets/application.coffee | 3 +++ test/test_filters.rb | 2 +- test/test_site.rb | 1 + test/test_theme_assets_reader.rb | 20 ++++++++++++++----- 5 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 test/fixtures/test-theme/assets/application.coffee create mode 100644 test/source/assets/application.coffee diff --git a/test/fixtures/test-theme/assets/application.coffee b/test/fixtures/test-theme/assets/application.coffee new file mode 100644 index 00000000000..02f335154b5 --- /dev/null +++ b/test/fixtures/test-theme/assets/application.coffee @@ -0,0 +1,3 @@ +--- +--- +alert "From your theme." diff --git a/test/source/assets/application.coffee b/test/source/assets/application.coffee new file mode 100644 index 00000000000..b9f5e1efa21 --- /dev/null +++ b/test/source/assets/application.coffee @@ -0,0 +1,3 @@ +--- +--- +alert "From your site." diff --git a/test/test_filters.rb b/test/test_filters.rb index b5f0a395ddf..d6ff9eac12b 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -475,7 +475,7 @@ def to_liquid g["items"].is_a?(Array), "The list of grouped items for '' is not an Array." ) - assert_equal 14, g["items"].size + assert_equal 15, g["items"].size end end end diff --git a/test/test_site.rb b/test/test_site.rb index 83d6e45625b..1f0d30a1835 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -180,6 +180,7 @@ def generate(site) %#\ +.md .htaccess about.html + application.coffee bar.html coffeescript.coffee contacts.html diff --git a/test/test_theme_assets_reader.rb b/test/test_theme_assets_reader.rb index ecafa0f1103..fc335248084 100644 --- a/test/test_theme_assets_reader.rb +++ b/test/test_theme_assets_reader.rb @@ -25,6 +25,7 @@ def refute_file_with_relative_path(haystack, relative_path) context "with a valid theme" do should "read all assets" do + @site.reset ThemeAssetsReader.new(@site).read assert_file_with_relative_path @site.static_files, "assets/img/logo.png" assert_file_with_relative_path @site.pages, "assets/style.scss" @@ -38,15 +39,24 @@ def refute_file_with_relative_path(haystack, relative_path) assert_equal @site.in_dest_dir("assets/style.css"), file.destination(@site.dest) assert_includes file.output, ".sample {\n color: black; }" end + + should "not overwrite site content with the same relative path" do + @site.reset + @site.read + + file = @site.pages.find { |f| f.relative_path == "assets/application.coffee" } + refute_nil file + assert_includes file.content, "alert \"From your site.\"" + end end context "with a valid theme without an assets dir" do should "not read any assets" do - allow(Theme).to receive(:realpath_for).with(:sass).and_return(nil) site = fixture_site("theme" => "test-theme") + allow(site.theme).to receive(:assets_path).and_return(nil) ThemeAssetsReader.new(site).read - refute_file_with_relative_path @site.static_files, "assets/img/logo.png" - refute_file_with_relative_path @site.pages, "assets/style.scss" + refute_file_with_relative_path site.static_files, "assets/img/logo.png" + refute_file_with_relative_path site.pages, "assets/style.scss" end end @@ -54,8 +64,8 @@ def refute_file_with_relative_path(haystack, relative_path) should "not read any assets" do site = fixture_site("theme" => nil) ThemeAssetsReader.new(site).read - refute_file_with_relative_path @site.static_files, "assets/img/logo.png" - refute_file_with_relative_path @site.pages, "assets/style.scss" + refute_file_with_relative_path site.static_files, "assets/img/logo.png" + refute_file_with_relative_path site.pages, "assets/style.scss" end end end From 152fa877f6775dc6502e8020e4384cd24f0a0c8c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 20 Sep 2016 13:40:11 -0700 Subject: [PATCH 1420/4996] Update history to reflect merge of #5364 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b9309d54e89..46838a87f19 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * update gitignore template to ignore theme gems built by user (#5326) * Adds ability to link to all files (#5199) * Exclude vendor by default (#5361) + * Add ThemeAssetsReader which reads assets from a theme (#5364) ### Bug Fixes From 650a3c7932d8ec23e073feef85ab68d67dd577a5 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 20 Sep 2016 13:48:40 -0700 Subject: [PATCH 1421/4996] Update history to reflect merge of #5369 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 46838a87f19..71f2276df9c 100644 --- a/History.markdown +++ b/History.markdown @@ -49,6 +49,7 @@ * [docs] .md as default extension in examples (#5316) * Fix small typo in docs (#5347) * Add missing period to sentence in first paragraph. (#5372) + * added jekyll-spotify plugin (#5369) ### Development Fixes From 262be85c49239fcfe0c9c71f0d876881791de1e9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 20 Sep 2016 15:32:26 -0700 Subject: [PATCH 1422/4996] Update history to reflect merge of #5237 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 71f2276df9c..bec100fddac 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,7 @@ * Adds ability to link to all files (#5199) * Exclude vendor by default (#5361) * Add ThemeAssetsReader which reads assets from a theme (#5364) + * Add bundle install to jekyll new command (#5237) ### Bug Fixes From 1ac87eaae2c794cdecbd602c815032868540c71f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 20 Sep 2016 16:39:33 -0700 Subject: [PATCH 1423/4996] Update history to reflect merge of #5380 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index bec100fddac..23a5d9088d8 100644 --- a/History.markdown +++ b/History.markdown @@ -67,6 +67,10 @@ * Run executable for Cucumber via Ruby instead of Shell (#5383) * Appease Rubocop (#5381) +### buf + + * Only complain about `kramdown.coderay` if it is actually in the config (#5380) + ## 3.2.1 / 2016-08-02 ### Bug Fixes From 9ae0a7023bb79240b3a9620b9c3ec32314a85cc5 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 20 Sep 2016 17:04:26 -0700 Subject: [PATCH 1424/4996] Move reference to #5380. --- History.markdown | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/History.markdown b/History.markdown index 23a5d9088d8..ca5f7486771 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Use jekyll-feed to generate the default site's RSS feed (#5196) * Site#configure_theme: do not set theme unless it's a string (#5189) * Convertible: set self.output in #render_all_layouts and #do_layout (#5337) + * Only complain about `kramdown.coderay` if it is actually in the config (#5380) ### Site Enhancements @@ -67,10 +68,6 @@ * Run executable for Cucumber via Ruby instead of Shell (#5383) * Appease Rubocop (#5381) -### buf - - * Only complain about `kramdown.coderay` if it is actually in the config (#5380) - ## 3.2.1 / 2016-08-02 ### Bug Fixes From f3859384c09dfd219eed3b3371ed2982a800e6d1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 20 Sep 2016 17:04:58 -0700 Subject: [PATCH 1425/4996] Update history to reflect merge of #5376 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ca5f7486771..3b4c08464e5 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * Site#configure_theme: do not set theme unless it's a string (#5189) * Convertible: set self.output in #render_all_layouts and #do_layout (#5337) * Only complain about `kramdown.coderay` if it is actually in the config (#5380) + * Clarify documentation in theme gem's README template (#5376) ### Site Enhancements From 846ab94f43be5d4e11883cb5f611d296d8e97754 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 20 Sep 2016 17:05:49 -0700 Subject: [PATCH 1426/4996] Update history to reflect merge of #5375 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3b4c08464e5..490688781aa 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ * Convertible: set self.output in #render_all_layouts and #do_layout (#5337) * Only complain about `kramdown.coderay` if it is actually in the config (#5380) * Clarify documentation in theme gem's README template (#5376) + * Allow underscore in highlighter language (#5375) ### Site Enhancements From 99fc60e28c192cb44fe372efbf5ffed8148ad8cb Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 5 Sep 2016 14:45:04 +0530 Subject: [PATCH 1427/4996] update template to include theme files --- lib/theme_template/theme.gemspec.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/theme_template/theme.gemspec.erb b/lib/theme_template/theme.gemspec.erb index d403d6746d2..d0714ffce15 100644 --- a/lib/theme_template/theme.gemspec.erb +++ b/lib/theme_template/theme.gemspec.erb @@ -10,7 +10,7 @@ Gem::Specification.new do |spec| spec.homepage = "TODO: Put your gem's website or public repo URL here." spec.license = "MIT" - spec.files = `git ls-files -z`.split("\x0").select { |f| f.match(%r{^(<%= theme_directories.join("|") %>|LICENSE|README)/i}) } + spec.files = `git ls-files -z`.split("\x0").select { |f| f.match(%r{^(<%= theme_directories.join("|") %>|LICENSE|README)}i) } spec.add_development_dependency "jekyll", "~> <%= jekyll_version_with_minor %>" spec.add_development_dependency "bundler", "~> 1.12" From 588b3a6649eef68b172eac6fc8ab4f8e9720eeec Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 21 Sep 2016 22:42:01 +0530 Subject: [PATCH 1428/4996] remove features dirs on windows with proper access --- features/step_definitions.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 731f8b7b942..ffe3fff53e3 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -1,4 +1,5 @@ Before do + FileUtils.rm_rf(Paths.test_dir) if Paths.test_dir.exist? FileUtils.mkdir_p(Paths.test_dir) unless Paths.test_dir.directory? Dir.chdir(Paths.test_dir) end @@ -6,7 +7,7 @@ # After do - Paths.test_dir.rmtree if Paths.test_dir.exist? + FileUtils.rm_rf(Paths.test_dir) if Paths.test_dir.exist? Paths.output_file.delete if Paths.output_file.exist? Paths.status_file.delete if Paths.status_file.exist? Dir.chdir(Paths.test_dir.parent) From 87c745573fde23d5b7416e57774f95484752e288 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 21 Sep 2016 13:29:38 -0700 Subject: [PATCH 1429/4996] Update history to reflect merge of #5389 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 490688781aa..de8c07feae2 100644 --- a/History.markdown +++ b/History.markdown @@ -69,6 +69,7 @@ * Proxy a number of Convertible methods to Renderer (#5308) * Run executable for Cucumber via Ruby instead of Shell (#5383) * Appease Rubocop (#5381) + * remove features' directories on windows with proper access (#5389) ## 3.2.1 / 2016-08-02 From ae27db62eb14a620e5b3645fadedcc70fda71379 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 22 Sep 2016 09:47:36 -0500 Subject: [PATCH 1430/4996] Add jekyll-menus to the list of plugins. --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 816e6de2e0a..f8909ddbeb0 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -911,6 +911,7 @@ LESS.js files during generation. - [Jekyll-breadcrumbs](https://github.com/git-no/jekyll-breadcrumbs): Creates breadcrumbs for Jekyll 3.x, includes features like SEO optimization, optional breadcrumb item translation and more. - [generator-jekyllized](https://github.com/sondr3/generator-jekyllized): A Yeoman generator for rapidly developing sites with Gulp. Live reload your site, automatically minify and optimize your assets and much more. - [Jekyll-Spotify](https://github.com/MertcanGokgoz/Jekyll-Spotify): Easily output Spotify Embed Player for jekyll +- [jekyll-menus](https://github.com/forestryio/jekyll-menus): Hugo style menus for your Jekyll site... recursive menus included. #### Editors From aa866516504b97743b1b13d799313566303f01a3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 22 Sep 2016 14:16:00 -0700 Subject: [PATCH 1431/4996] Add absolute_url and relative_url filters. --- lib/jekyll/filters.rb | 3 + lib/jekyll/filters/url_filters.rb | 45 ++++++++++++ test/helper.rb | 7 +- test/test_filters.rb | 114 +++++++++++++++++++++++++++--- 4 files changed, 156 insertions(+), 13 deletions(-) create mode 100644 lib/jekyll/filters/url_filters.rb diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index d8915b3af4f..29f2a2b5e1a 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -3,8 +3,11 @@ require "date" require "liquid" +require_all "jekyll/filters" + module Jekyll module Filters + include URLFilters # Convert a Markdown string into HTML output. # # input - The Markdown String to convert. diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb new file mode 100644 index 00000000000..e907c91bf14 --- /dev/null +++ b/lib/jekyll/filters/url_filters.rb @@ -0,0 +1,45 @@ +module Jekyll + module Filters + module URLFilters + # Produces an absolute URL based on site.url and site.baseurl. + # + # input - the URL to make absolute. + # + # Returns the absolute URL as a String. + def absolute_url(input) + return if input.nil? + site = @context.registers[:site] + return relative_url(input).to_s if site.config["url"].nil? + URI(site.config["url"] + relative_url(input)).to_s + end + + # Produces a URL relative to the domain root based on site.baseurl. + # + # input - the URL to make relative to the domain root + # + # Returns a URL relative to the domain root as a String. + def relative_url(input) + return if input.nil? + site = @context.registers[:site] + return ensure_leading_slash(input.to_s) if site.config["baseurl"].nil? + ensure_leading_slash( # in case the baseurl doesn't have a leading slash + URI( + site.config["baseurl"] + ensure_leading_slash(input.to_s) + # in case the input doesn't have a leading slash + ).to_s + ) + end + + private + def ensure_leading_slash(input) + return input if input.nil? || input.empty? + if input.start_with?("/") + input + else + "/#{input}" + end + end + + end + end +end diff --git a/test/helper.rb b/test/helper.rb index 9505c76239e..8fc43d6733d 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -120,12 +120,9 @@ def site_configuration(overrides = {}) "destination" => dest_dir, "incremental" => false })) - build_configs({ + Configuration.from(full_overrides.merge({ "source" => source_dir - }, full_overrides) - .fix_common_issues - .backwards_compatibilize - .add_default_collections + })) end def clear_dest diff --git a/test/test_filters.rb b/test/test_filters.rb index d6ff9eac12b..d027cbb4f27 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -8,23 +8,28 @@ class JekyllFilter attr_accessor :site, :context def initialize(opts = {}) - @site = Jekyll::Site.new( - Jekyll.configuration(opts.merge("skip_config_files" => true)) - ) + @site = Jekyll::Site.new(opts.merge("skip_config_files" => true)) @context = Liquid::Context.new({}, {}, { :site => @site }) end end + def make_filter_mock(opts = {}) + JekyllFilter.new(site_configuration(opts)).tap do |f| + tz = f.site.config["timezone"] + Jekyll.set_timezone(tz) if tz + end + end + class SelectDummy def select; end end context "filters" do setup do - @filter = JekyllFilter.new({ - "source" => source_dir, - "destination" => dest_dir, - "timezone" => "UTC" + @filter = make_filter_mock({ + "timezone" => "UTC", + "url" => "http://example.com", + "baseurl" => "/base" }) @sample_time = Time.utc(2013, 3, 27, 11, 22, 33) @sample_date = Date.parse("2013-03-27") @@ -65,7 +70,7 @@ def select; end end should "escapes special characters when configured to do so" do - kramdown = JekyllFilter.new({ :kramdown => { :entity_output => :symbolic } }) + kramdown = make_filter_mock({ :kramdown => { :entity_output => :symbolic } }) assert_equal( "“This filter’s test…”", kramdown.smartify(%q{"This filter's test..."}) @@ -307,6 +312,99 @@ def select; end assert_equal "my%20things", @filter.uri_escape("my things") end + context "absolute_url filter" do + should "produce an absolute URL from a page URL" do + page_url = "/about/my_favorite_page/" + assert_equal "http://example.com/base#{page_url}", @filter.absolute_url(page_url) + end + + should "ensure the leading slash" do + page_url = "about/my_favorite_page/" + assert_equal "http://example.com/base/#{page_url}", @filter.absolute_url(page_url) + end + + should "ensure the leading slash for the baseurl" do + page_url = "about/my_favorite_page/" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => "base" + }) + assert_equal "http://example.com/base/#{page_url}", filter.absolute_url(page_url) + end + + should "be ok with a blank but present 'url'" do + page_url = "about/my_favorite_page/" + filter = make_filter_mock({ + "url" => "", + "baseurl" => "base" + }) + assert_equal "/base/#{page_url}", filter.absolute_url(page_url) + end + + should "be ok with a nil 'url'" do + page_url = "about/my_favorite_page/" + filter = make_filter_mock({ + "url" => nil, + "baseurl" => "base" + }) + assert_equal "/base/#{page_url}", filter.absolute_url(page_url) + end + + should "be ok with a nil 'baseurl'" do + page_url = "about/my_favorite_page/" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => nil + }) + assert_equal "http://example.com/#{page_url}", filter.absolute_url(page_url) + end + + should "not prepend a forward slash if input is empty" do + page_url = "" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => "/base" + }) + assert_equal "http://example.com/base", filter.absolute_url(page_url) + end + end + + context "relative_url filter" do + should "produce a relative URL from a page URL" do + page_url = "/about/my_favorite_page/" + assert_equal "/base#{page_url}", @filter.relative_url(page_url) + end + + should "ensure the leading slash between baseurl and input" do + page_url = "about/my_favorite_page/" + assert_equal "/base/#{page_url}", @filter.relative_url(page_url) + end + + should "ensure the leading slash for the baseurl" do + page_url = "about/my_favorite_page/" + filter = make_filter_mock({ "baseurl" => "base" }) + assert_equal "/base/#{page_url}", filter.relative_url(page_url) + end + + should "be ok with a nil 'baseurl'" do + page_url = "about/my_favorite_page/" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => nil + }) + assert_equal "/#{page_url}", filter.relative_url(page_url) + end + + should "not prepend a forward slash if input is empty" do + page_url = "" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => "/base" + }) + assert_equal "/base", filter.relative_url(page_url) + end + end + context "jsonify filter" do should "convert hash to json" do assert_equal "{\"age\":18}", @filter.jsonify({ :age => 18 }) From eab6752f528c15752144d6dae369b52efbdfcc02 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 22 Sep 2016 14:40:20 -0700 Subject: [PATCH 1432/4996] Consolidate ensure_leading_slash to 2 lines. --- lib/jekyll/filters/url_filters.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index e907c91bf14..de700aa7c74 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -32,12 +32,8 @@ def relative_url(input) private def ensure_leading_slash(input) - return input if input.nil? || input.empty? - if input.start_with?("/") - input - else - "/#{input}" - end + return input if input.nil? || input.empty? || input.start_with?("/") + "/#{input}" end end From 081d7c016a647b17d39221a2027a621e2ec5be26 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 22 Sep 2016 16:56:05 -0700 Subject: [PATCH 1433/4996] Update history to reflect merge of #5397 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index de8c07feae2..e3788f5c37f 100644 --- a/History.markdown +++ b/History.markdown @@ -54,6 +54,7 @@ * Fix small typo in docs (#5347) * Add missing period to sentence in first paragraph. (#5372) * added jekyll-spotify plugin (#5369) + * Add jekyll-menus to the list of plugins. (#5397) ### Development Fixes From 6571ea0c1a6c7fef40516ce6445b3d07060b636f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 22 Sep 2016 20:50:48 -0700 Subject: [PATCH 1434/4996] Update history to reflect merge of #5338 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e3788f5c37f..b64bede5c93 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * Only complain about `kramdown.coderay` if it is actually in the config (#5380) * Clarify documentation in theme gem's README template (#5376) * Allow underscore in highlighter language (#5375) + * Site template: set empty url in config file by default (#5338) ### Site Enhancements From fa96843555091655fb028c9e9458735526e90449 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 22 Sep 2016 20:58:26 -0700 Subject: [PATCH 1435/4996] URLFilters: Simplify ensure_leading_slash calls. --- lib/jekyll/filters/url_filters.rb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index de700aa7c74..39f60230f55 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -22,12 +22,9 @@ def relative_url(input) return if input.nil? site = @context.registers[:site] return ensure_leading_slash(input.to_s) if site.config["baseurl"].nil? - ensure_leading_slash( # in case the baseurl doesn't have a leading slash - URI( - site.config["baseurl"] + ensure_leading_slash(input.to_s) - # in case the input doesn't have a leading slash - ).to_s - ) + URI( + ensure_leading_slash(site.config["baseurl"]) + ensure_leading_slash(input.to_s) + ).to_s end private From 0dc15dba881ef2a0577c9c90416dd9ed48d5ff1d Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 23 Sep 2016 18:00:13 +0530 Subject: [PATCH 1436/4996] remove `css/` from new site scaffolding css directory and its contents to be handled by theme's `assets/` directory. The directory removed here wil be added to minima gem. --- lib/site_template/css/main.scss | 39 --------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 lib/site_template/css/main.scss diff --git a/lib/site_template/css/main.scss b/lib/site_template/css/main.scss deleted file mode 100644 index c91fac8d134..00000000000 --- a/lib/site_template/css/main.scss +++ /dev/null @@ -1,39 +0,0 @@ ---- -# Only the main Sass file needs front matter (the dashes are enough) ---- -@charset "utf-8"; - -// Our variables -$base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -$base-font-size: 16px; -$base-font-weight: 400; -$small-font-size: $base-font-size * 0.875; -$base-line-height: 1.5; - -$spacing-unit: 30px; - -$text-color: #111; -$background-color: #fdfdfd; -$brand-color: #2a7ae2; - -$grey-color: #828282; -$grey-color-light: lighten($grey-color, 40%); -$grey-color-dark: darken($grey-color, 25%); - -// Width of the content area -$content-width: 800px; - -$on-palm: 600px; -$on-laptop: 800px; - -// Minima also includes a mixin for defining media queries. -// Use media queries like this: -// @include media-query($on-palm) { -// .wrapper { -// padding-right: $spacing-unit / 2; -// padding-left: $spacing-unit / 2; -// } -// } - -// Import partials from the `minima` theme. -@import "minima"; From 69937373bd88adbca2ed9190e41d5df513b68acb Mon Sep 17 00:00:00 2001 From: Chris Finazzo Date: Fri, 23 Sep 2016 14:47:23 -0400 Subject: [PATCH 1437/4996] macOS and one grammar fix --- site/_docs/installation.md | 6 +++--- site/_docs/troubleshooting.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/site/_docs/installation.md b/site/_docs/installation.md index 712e3bae6fc..676bccb4814 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -17,7 +17,7 @@ requirements you’ll need to make sure your system has before you start. - [Ruby](https://www.ruby-lang.org/en/downloads/) (including development headers, v1.9.3 or above for Jekyll 2 and v2 or above for Jekyll 3) - [RubyGems](https://rubygems.org/pages/download) -- Linux, Unix, or Mac OS X +- Linux, Unix, or macOS - [NodeJS](https://nodejs.org/), or another JavaScript runtime (Jekyll 2 and earlier, for CoffeeScript support). - [Python 2.7](https://www.python.org/downloads/) (for Jekyll 2 and earlier) @@ -51,8 +51,8 @@ community can improve the experience for everyone.
    Installing Xcode Command-Line Tools

    If you run into issues installing Jekyll's dependencies which make use of - native extensions and are using Mac OS X, you will need to install Xcode - and the Command-Line Tools it ships with. Download in + native extensions and are using macOS, you will need to install Xcode + and the Command-Line Tools it ships with. Download them in Preferences → Downloads → Components.

    diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index 3a2c61700fd..5a53a9ebab6 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -57,14 +57,14 @@ sudo emerge -av dev-ruby/rubygems On Windows, you may need to install [RubyInstaller DevKit](https://wiki.github.com/oneclick/rubyinstaller/development-kit). -On Mac OS X, you may need to update RubyGems (using `sudo` only if necessary): +On macOS, you may need to update RubyGems (using `sudo` only if necessary): ```sh sudo gem update --system ``` If you still have issues, you can download and install new Command Line -Tools (such as `gcc`) using the command +Tools (such as `gcc`) using the following command: ```sh xcode-select --install @@ -77,7 +77,7 @@ which may allow you to install native gems using this command (again using sudo gem install jekyll ``` -Note that upgrading Mac OS X does not automatically upgrade Xcode itself +Note that upgrading macOS does not automatically upgrade Xcode itself (that can be done separately via the App Store), and having an out-of-date Xcode.app can interfere with the command line tools downloaded above. If you run into this issue, upgrade Xcode and install the upgraded Command From f277baa9758217c55179a3ba125678343e398d8c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 23 Sep 2016 14:18:02 -0700 Subject: [PATCH 1438/4996] Update history to reflect merge of #5399 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b64bede5c93..9b308d35bfc 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,7 @@ * Exclude vendor by default (#5361) * Add ThemeAssetsReader which reads assets from a theme (#5364) * Add bundle install to jekyll new command (#5237) + * Add absolute_url and relative_url filters. (#5399) ### Bug Fixes From 8e027fced965bb4c0acde45b6cf9f8ecdcbbbba8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 23 Sep 2016 14:22:57 -0700 Subject: [PATCH 1439/4996] Add documentation for relative_url and absolute_url --- site/_docs/templates.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 59bb4b1815a..48d7cd7498c 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -21,6 +21,34 @@ common tasks easier. + + +

    Relative URL

    +

    Prepend the baseurl value to the input. Useful if your site is hosted at a subpath rather than the root of the domain.

    + + +

    + {% raw %}{{ "/assets/style.css" | relative_url }}{% endraw %} +

    +

    + /my-baseurl/assets/style.css +

    + + + + +

    Absolute URL

    +

    Prepend the url and baseurl value to the input.

    + + +

    + {% raw %}{{ "/assets/style.css" | absolute_url }}{% endraw %} +

    +

    + http://example.com/my-baseurl/assets/style.css +

    + +

    Date to XML Schema

    From 956478205415b735a078370140bf263aaf66681e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 23 Sep 2016 14:30:39 -0700 Subject: [PATCH 1440/4996] Update history to reflect merge of #5402 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9b308d35bfc..b7068125fe6 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Add ThemeAssetsReader which reads assets from a theme (#5364) * Add bundle install to jekyll new command (#5237) * Add absolute_url and relative_url filters. (#5399) + * Site template: remove `css/` from new site scaffolding (#5402) ### Bug Fixes From 93c5f71fafb7dd9cc20cadb4f5adce08e63a6d9d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 23 Sep 2016 17:46:41 -0700 Subject: [PATCH 1441/4996] Update history to reflect merge of #5403 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b7068125fe6..adf0f46df8d 100644 --- a/History.markdown +++ b/History.markdown @@ -58,6 +58,7 @@ * Add missing period to sentence in first paragraph. (#5372) * added jekyll-spotify plugin (#5369) * Add jekyll-menus to the list of plugins. (#5397) + * macOS and one grammar fix (#5403) ### Development Fixes From 3966a37d71c506266822586be911b0828c5753b5 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 24 Sep 2016 13:45:50 +0530 Subject: [PATCH 1442/4996] swallow bundle output in CI --- lib/jekyll/commands/new.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index c85691642fc..0a0c8b53c2e 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -133,7 +133,11 @@ def bundle_install(path) Jekyll::External.require_with_graceful_fail "bundler" Jekyll.logger.info "Running bundle install in #{path.cyan}..." Dir.chdir(path) do - system("bundle", "install") + if ENV["CI"] + system("bundle", "install", "--quiet") + else + system("bundle", "install") + end end end end From bacb300876b758b0ff1a27ed62e456757eea372e Mon Sep 17 00:00:00 2001 From: Heng Kwokfu Date: Sat, 24 Sep 2016 21:55:02 +0800 Subject: [PATCH 1443/4996] Skip Windows tests in non-Windows environment. --- test/test_path_sanitization.rb | 40 ++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/test/test_path_sanitization.rb b/test/test_path_sanitization.rb index a94fc0c52d1..31a4b92ebff 100644 --- a/test/test_path_sanitization.rb +++ b/test/test_path_sanitization.rb @@ -29,29 +29,31 @@ class TestPathSanitization < JekyllUnitTest Jekyll.sanitized_path(source_dir, "f./../../../../../../files/hi.txt") end - context "on Windows with absolute path" do - setup do - @base_path = "D:/demo" - @file_path = "D:/demo/_site" - allow(Dir).to receive(:pwd).and_return("D:/") - end + if Jekyll::Utils::Platforms.really_windows? + context "on Windows with absolute path" do + setup do + @base_path = "D:/demo" + @file_path = "D:/demo/_site" + allow(Dir).to receive(:pwd).and_return("D:/") + end - should "strip just the clean path drive name" do - assert_equal "D:/demo/_site", - Jekyll.sanitized_path(@base_path, @file_path) + should "strip just the clean path drive name" do + assert_equal "D:/demo/_site", + Jekyll.sanitized_path(@base_path, @file_path) + end end - end - context "on Windows with file path has matching prefix" do - setup do - @base_path = "D:/site" - @file_path = "D:/sitemap.xml" - allow(Dir).to receive(:pwd).and_return("D:/") - end + context "on Windows with file path has matching prefix" do + setup do + @base_path = "D:/site" + @file_path = "D:/sitemap.xml" + allow(Dir).to receive(:pwd).and_return("D:/") + end - should "not strip base path" do - assert_equal "D:/site/sitemap.xml", - Jekyll.sanitized_path(@base_path, @file_path) + should "not strip base path" do + assert_equal "D:/site/sitemap.xml", + Jekyll.sanitized_path(@base_path, @file_path) + end end end From aebf711c61c18fde414eb96916f5858fa92c63c1 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sat, 24 Sep 2016 15:11:04 -0500 Subject: [PATCH 1444/4996] Failing tests: URL filters choke on i18n --- test/test_filters.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/test_filters.rb b/test/test_filters.rb index d027cbb4f27..8ae69039f3d 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -367,6 +367,15 @@ def select; end }) assert_equal "http://example.com/base", filter.absolute_url(page_url) end + + should "normalize international URLs" do + page_url = "" + filter = make_filter_mock({ + "url" => "http://ümlaut.example.org/", + "baseurl" => nil + }) + assert_equal "http://xn--mlaut-jva.example.org/", filter.absolute_url(page_url) + end end context "relative_url filter" do @@ -386,6 +395,11 @@ def select; end assert_equal "/base/#{page_url}", filter.relative_url(page_url) end + should "normalize international URLs" do + page_url = "错误.html" + assert_equal "%E9%94%99%E8%AF%AF.html", @filter.relative_url(page_url) + end + should "be ok with a nil 'baseurl'" do page_url = "about/my_favorite_page/" filter = make_filter_mock({ From fc6f7802a2030e19bf4c07c80ab280a4942febac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zlatan=20Vasovi=C4=87?= Date: Sat, 24 Sep 2016 22:14:49 +0200 Subject: [PATCH 1445/4996] Replace classic box-sizing reset with inheritance reset Reference: https://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ --- site/_sass/_style.scss | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/site/_sass/_style.scss b/site/_sass/_style.scss index 528de7cbaf0..5e441924546 100644 --- a/site/_sass/_style.scss +++ b/site/_sass/_style.scss @@ -1,10 +1,14 @@ /* Base */ -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} + html { + box-sizing: border-box; + } + + *, + *:before, + *:after { + box-sizing: inherit; + } body { font: 300 21px Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; From 2b30c0614017d4805f368a279c88262f200a1f59 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Sat, 24 Sep 2016 15:34:00 -0500 Subject: [PATCH 1446/4996] Use Addressable to better deal with i18n URLs --- jekyll.gemspec | 1 + lib/jekyll/filters/url_filters.rb | 8 +++++--- test/test_filters.rb | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index b506ffa30c3..734df2e4934 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -38,4 +38,5 @@ Gem::Specification.new do |s| s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0') s.add_runtime_dependency('jekyll-watch', '~> 1.1') s.add_runtime_dependency("pathutil", "~> 0.9") + s.add_runtime_dependency('addressable', '~> 2.4') end diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index 39f60230f55..ccc4dcb9829 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -1,3 +1,5 @@ +require "addressable/uri" + module Jekyll module Filters module URLFilters @@ -10,7 +12,7 @@ def absolute_url(input) return if input.nil? site = @context.registers[:site] return relative_url(input).to_s if site.config["url"].nil? - URI(site.config["url"] + relative_url(input)).to_s + Addressable::URI.parse(site.config["url"] + relative_url(input)).normalize.to_s end # Produces a URL relative to the domain root based on site.baseurl. @@ -22,9 +24,9 @@ def relative_url(input) return if input.nil? site = @context.registers[:site] return ensure_leading_slash(input.to_s) if site.config["baseurl"].nil? - URI( + Addressable::URI.parse( ensure_leading_slash(site.config["baseurl"]) + ensure_leading_slash(input.to_s) - ).to_s + ).normalize.to_s end private diff --git a/test/test_filters.rb b/test/test_filters.rb index 8ae69039f3d..9a0f87d46b7 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -397,7 +397,7 @@ def select; end should "normalize international URLs" do page_url = "错误.html" - assert_equal "%E9%94%99%E8%AF%AF.html", @filter.relative_url(page_url) + assert_equal "/base/%E9%94%99%E8%AF%AF.html", @filter.relative_url(page_url) end should "be ok with a nil 'baseurl'" do From d79ca534e40d4d6ae4deb998b9f418f8ba5e3db4 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 24 Sep 2016 13:38:44 -0700 Subject: [PATCH 1447/4996] Update history to reflect merge of #5405 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index adf0f46df8d..ae2828e2264 100644 --- a/History.markdown +++ b/History.markdown @@ -59,6 +59,7 @@ * added jekyll-spotify plugin (#5369) * Add jekyll-menus to the list of plugins. (#5397) * macOS and one grammar fix (#5403) + * Add documentation for relative_url and absolute_url (#5405) ### Development Fixes From 5df8ef5717e0b1cde813ba597003fc3f9e754ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zlatan=20Vasovi=C4=87?= Date: Sat, 24 Sep 2016 23:21:33 +0200 Subject: [PATCH 1448/4996] Add .editorconfig --- .editorconfig | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000000..9d5248e86f3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false From 6366f56c214011665ba64cb56faeaef9d94bb677 Mon Sep 17 00:00:00 2001 From: Manmeet Gill Date: Sun, 25 Sep 2016 16:26:43 +1000 Subject: [PATCH 1449/4996] Fix Travis.ci documentation --- site/_docs/continuous-integration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/continuous-integration.md b/site/_docs/continuous-integration.md index 0fc951afa5e..e6a78a41c5d 100644 --- a/site/_docs/continuous-integration.md +++ b/site/_docs/continuous-integration.md @@ -94,7 +94,7 @@ Your `.travis.yml` file should look like this: ```yaml language: ruby rvm: -- 2.1 +- 2.2.2 before_script: - chmod +x ./script/cibuild # or do this locally and commit @@ -127,7 +127,7 @@ access to Bundler, RubyGems, and a Ruby runtime. ```yaml rvm: -- 2.1 +- 2.2.2 ``` RVM is a popular Ruby Version Manager (like rbenv, chruby, etc). This From 6b6ce3cf1857b5a64c022e0735530f1ff19b736c Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 25 Sep 2016 21:41:48 +0530 Subject: [PATCH 1450/4996] use UTC format in timezone --- features/site_configuration.feature | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/features/site_configuration.feature b/features/site_configuration.feature index 5c495356a61..8bfe0fdae2e 100644 --- a/features/site_configuration.feature +++ b/features/site_configuration.feature @@ -161,8 +161,8 @@ Feature: Site configuration And I have a post layout that contains "Post Layout: {{ content }} built at {{ page.date | date_to_xmlschema }}" And I have an "index.html" page with layout "page" that contains "site index page" And I have a configuration file with: - | key | value | - | timezone | America/New_York | + | key | value | + | timezone | UTC+04:00 | And I have a _posts directory And I have the following posts: | title | date | layout | content | @@ -181,8 +181,8 @@ Feature: Site configuration And I have a post layout that contains "Post Layout: {{ content }} built at {{ page.date | date_to_xmlschema }}" And I have an "index.html" page with layout "page" that contains "site index page" And I have a configuration file with: - | key | value | - | timezone | Pacific/Honolulu | + | key | value | + | timezone | UTC+10:00 | And I have a _posts directory And I have the following posts: | title | date | layout | content | From 81b16b24fc50ecc567e9e86a8cc2cd73f60fc397 Mon Sep 17 00:00:00 2001 From: Manmeet Gill Date: Mon, 26 Sep 2016 16:38:00 +1000 Subject: [PATCH 1451/4996] Change to 2.2.5 instead of 2.2.2 We don't need 2.2.2 exactly, switching to 2.2.5 shaves a solid 30 seconds off build time, as it is preinstalled on travis --- site/_docs/continuous-integration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/continuous-integration.md b/site/_docs/continuous-integration.md index e6a78a41c5d..4b5b2d4e334 100644 --- a/site/_docs/continuous-integration.md +++ b/site/_docs/continuous-integration.md @@ -94,7 +94,7 @@ Your `.travis.yml` file should look like this: ```yaml language: ruby rvm: -- 2.2.2 +- 2.2.5 before_script: - chmod +x ./script/cibuild # or do this locally and commit @@ -127,7 +127,7 @@ access to Bundler, RubyGems, and a Ruby runtime. ```yaml rvm: -- 2.2.2 +- 2.2.5 ``` RVM is a popular Ruby Version Manager (like rbenv, chruby, etc). This From 8321b14b29946675adfad125642873c610c39495 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 27 Sep 2016 08:24:58 +0200 Subject: [PATCH 1452/4996] Move contents of the index.html page to the 'home' layout --- lib/site_template/index.html | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/lib/site_template/index.html b/lib/site_template/index.html index 9fbc9b7011e..e4d427d215f 100644 --- a/lib/site_template/index.html +++ b/lib/site_template/index.html @@ -1,23 +1,3 @@ --- -layout: default +layout: home --- - -
    From 481901b413fffda8b1f2cdf0be50ac1baa0d4201 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Tue, 27 Sep 2016 15:38:25 +0800 Subject: [PATCH 1453/4996] Bugfix on logo in JSON-LD --- site/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_config.yml b/site/_config.yml index 722f712cc4a..5333c52ecba 100644 --- a/site/_config.yml +++ b/site/_config.yml @@ -22,7 +22,7 @@ url: https://jekyllrb.com twitter: username: jekyllrb -logo: img/logo-2x.png +logo: /img/logo-2x.png gems: - jekyll-feed From c4ccfae3af0994a7d69d573ed49e8fd2aef946b0 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 27 Sep 2016 11:12:29 +0200 Subject: [PATCH 1454/4996] rename index.html to index.md fix https://github.com/jekyll/minima/issues/13 --- lib/site_template/{index.html => index.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/site_template/{index.html => index.md} (100%) diff --git a/lib/site_template/index.html b/lib/site_template/index.md similarity index 100% rename from lib/site_template/index.html rename to lib/site_template/index.md From 6dbb5e2df17b37e84f65eed1827bffd145a7592c Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 27 Sep 2016 11:27:29 +0200 Subject: [PATCH 1455/4996] add contextual help for overriding theme's default --- lib/site_template/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/site_template/index.md b/lib/site_template/index.md index e4d427d215f..1eb5d6724d3 100644 --- a/lib/site_template/index.md +++ b/lib/site_template/index.md @@ -1,3 +1,6 @@ --- +# You don't need to edit this file, it's empty on purpose. +# Edit theme's home layout instead if you wanna make some changes +# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults layout: home --- From 157c8e888e63b6f0564b9a2e226266de20a68d26 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 27 Sep 2016 11:06:17 -0700 Subject: [PATCH 1456/4996] Update history to reflect merge of #5420 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ae2828e2264..1fc7e626304 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ * Add bundle install to jekyll new command (#5237) * Add absolute_url and relative_url filters. (#5399) * Site template: remove `css/` from new site scaffolding (#5402) + * Site template: Move contents of the index.html page to the 'home' layout (#5420) ### Bug Fixes From a920cf040b3ebbbca1b3ee4b6868dd6642b2ee85 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 27 Sep 2016 11:06:44 -0700 Subject: [PATCH 1457/4996] Update history to reflect merge of #5421 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1fc7e626304..0d8655e139c 100644 --- a/History.markdown +++ b/History.markdown @@ -61,6 +61,7 @@ * Add jekyll-menus to the list of plugins. (#5397) * macOS and one grammar fix (#5403) * Add documentation for relative_url and absolute_url (#5405) + * Bugfix on logo in JSON-LD (#5421) ### Development Fixes From 719c0938a51bec8331c411b5fc96f5f749eb8fae Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 28 Sep 2016 16:09:07 -0700 Subject: [PATCH 1458/4996] Update history to reflect merge of #5416 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0d8655e139c..0e00f09e296 100644 --- a/History.markdown +++ b/History.markdown @@ -78,6 +78,7 @@ * Run executable for Cucumber via Ruby instead of Shell (#5383) * Appease Rubocop (#5381) * remove features' directories on windows with proper access (#5389) + * site_configuration.feature: use UTC format in timezone (#5416) ## 3.2.1 / 2016-08-02 From 2f5b7dc1dc2a5250a351fc26d56ca61652384faa Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 28 Sep 2016 16:25:27 -0700 Subject: [PATCH 1459/4996] Update history to reflect merge of #5413 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0e00f09e296..123374f4179 100644 --- a/History.markdown +++ b/History.markdown @@ -79,6 +79,7 @@ * Appease Rubocop (#5381) * remove features' directories on windows with proper access (#5389) * site_configuration.feature: use UTC format in timezone (#5416) + * Fix Travis.ci documentation (#5413) ## 3.2.1 / 2016-08-02 From d57b04782d055206db8069a7afca4af2a49efb66 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 28 Sep 2016 16:28:12 -0700 Subject: [PATCH 1460/4996] Fix reference to #5413 --- History.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/History.markdown b/History.markdown index 123374f4179..a3f695a540f 100644 --- a/History.markdown +++ b/History.markdown @@ -60,8 +60,9 @@ * added jekyll-spotify plugin (#5369) * Add jekyll-menus to the list of plugins. (#5397) * macOS and one grammar fix (#5403) - * Add documentation for relative_url and absolute_url (#5405) + * Add documentation for `relative_url` and `absolute_url` (#5405) * Bugfix on logo in JSON-LD (#5421) + * Fix Travis.ci documentation (#5413) ### Development Fixes @@ -78,8 +79,7 @@ * Run executable for Cucumber via Ruby instead of Shell (#5383) * Appease Rubocop (#5381) * remove features' directories on windows with proper access (#5389) - * site_configuration.feature: use UTC format in timezone (#5416) - * Fix Travis.ci documentation (#5413) + * `site_configuration.feature`: use UTC format in timezone (#5416) ## 3.2.1 / 2016-08-02 From 79b0f27bf6f23fe8e2d1ea51d9ec4a4bc4c2c165 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 28 Sep 2016 16:31:09 -0700 Subject: [PATCH 1461/4996] Update history to reflect merge of #5408 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a3f695a540f..e33181411bb 100644 --- a/History.markdown +++ b/History.markdown @@ -80,6 +80,7 @@ * Appease Rubocop (#5381) * remove features' directories on windows with proper access (#5389) * `site_configuration.feature`: use UTC format in timezone (#5416) + * swallow bundle output from `jekyll new` while in CI (#5408) ## 3.2.1 / 2016-08-02 From b6d4ba56b7bffcbd23c36a7f67bf314846e6d119 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 28 Sep 2016 16:38:00 -0700 Subject: [PATCH 1462/4996] Update history to reflect merge of #5210 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e33181411bb..ad40aa33674 100644 --- a/History.markdown +++ b/History.markdown @@ -13,6 +13,7 @@ * Add absolute_url and relative_url filters. (#5399) * Site template: remove `css/` from new site scaffolding (#5402) * Site template: Move contents of the index.html page to the 'home' layout (#5420) + * Exclude node_modules by default (#5210) ### Bug Fixes From 682c0fc98fc6dda8397d6f072accaa6af6568c70 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 28 Sep 2016 16:39:45 -0700 Subject: [PATCH 1463/4996] Update history to reflect merge of #5157 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ad40aa33674..979413252c9 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ * Site template: remove `css/` from new site scaffolding (#5402) * Site template: Move contents of the index.html page to the 'home' layout (#5420) * Exclude node_modules by default (#5210) + * Run hooks in priority order. (#5157) ### Bug Fixes From fd5f2eb39932f313e5264f6c79b1c073aa7162d4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 28 Sep 2016 16:54:58 -0700 Subject: [PATCH 1464/4996] Add failing test for File.utime of a symlink in staticfile. --- test/test_static_file.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 285ec879ffe..71b3f31cd58 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -112,6 +112,14 @@ def setup_static_file_with_defaults(base, dir, name, defaults) assert_equal Time.new.to_i, @static_file.mtime end + should "only set modified time if not a symlink" do + expect(File).to receive(:symlink?).and_return(true) + expect(File).not_to receive(:utime) + @static_file.write(dest_dir) + + allow(File).to receive(:symlink?).and_call_original + end + should "known if the source path is modified, when it is" do sleep 1 modify_dummy_file(@filename) From 8e912630310f913d7fd7397dbd640853f2ebc7bb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 28 Sep 2016 16:55:57 -0700 Subject: [PATCH 1465/4996] StaticFile#copy_entry: don't mark modified time if path is a symlink --- lib/jekyll/static_file.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 0f8544ee7da..e11d6689720 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -146,7 +146,10 @@ def copy_file(dest_path) else FileUtils.copy_entry(path, dest_path) end - File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path) + + unless File.symlink?(dest_path) + File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path) + end end end end From 1b4b51236a6b58e818fe0773c0b8d5933cb68c80 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 19 Sep 2016 16:59:14 +0530 Subject: [PATCH 1466/4996] add theme-gem feature for bonafide theme gems this cucumber feature follows the likely steps a theme designer would take to build a Rubygem of his theme starting from the scaffolding generated by `jekyll new-theme` command and further checks if the gem built actually has the files he planned to include. --- features/step_definitions.rb | 26 ++++++++++++++++++++++++++ features/support/helpers.rb | 8 ++++++++ features/theme_gem.feature | 31 +++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 features/theme_gem.feature diff --git a/features/step_definitions.rb b/features/step_definitions.rb index ffe3fff53e3..e993b4f9839 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -156,6 +156,31 @@ # +When(%r!^I run gem(.*)$!) do |args| + run_rubygem(args) + if args.include?("--verbose") || ENV["DEBUG"] + $stderr.puts "\n#{jekyll_run_output}\n" + end +end + +# + +When(%r!^I run git add .$!) do + run_in_shell("git", "add", ".") +end + +# + +When(%r!^I decide to build the theme gem$!) do + Dir.chdir(Paths.theme_gem_dir) + gemspec = "my-cool-theme.gemspec" + File.write(gemspec, File.read(gemspec).sub("TODO: ", "")) + File.new("_includes/blank.html", "w") + File.new("_sass/blank.scss", "w") +end + +# + When(%r!^I change "(.*)" to contain "(.*)"$!) do |file, text| File.open(file, "a") do |f| f.write(text) @@ -179,6 +204,7 @@ end # + Then(%r!^I should (not )?see "(.*)" in "(.*)"$!) do |negative, text, file| step %(the "#{file}" file should exist) regexp = Regexp.new(text, Regexp::MULTILINE) diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 0d809bca985..e5d17bb2a1c 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -8,6 +8,8 @@ class Paths SOURCE_DIR = Pathname.new(File.expand_path("../..", __dir__)) def self.test_dir; source_dir.join("tmp", "jekyll"); end + def self.theme_gem_dir; source_dir.join("tmp", "jekyll", "my-cool-theme"); end + def self.output_file; test_dir.join("jekyll_output.txt"); end def self.status_file; test_dir.join("jekyll_status.txt"); end @@ -88,6 +90,12 @@ def run_bundle(args) # +def run_rubygem(args) + run_in_shell("gem", *args.strip.split(" ")) +end + +# + def run_jekyll(args) args = args.strip.split(" ") # Shellwords? process = run_in_shell("ruby", Paths.jekyll_bin.to_s, *args, "--trace") diff --git a/features/theme_gem.feature b/features/theme_gem.feature new file mode 100644 index 00000000000..b79d9c0be25 --- /dev/null +++ b/features/theme_gem.feature @@ -0,0 +1,31 @@ +Feature: Building Theme Gems + As a hacker who likes to share my expertise + I want to be able to make a bonafide rubygem off my theme + In order to share my awesome style skillz with other Jekyllites + + Scenario: Generating a new Jekyll Theme + When I run jekyll new-theme my-cool-theme + Then I should get a zero exit status + And the my-cool-theme directory should exist + + Scenario: Checking if a bonafide Theme gem will be built from generated scaffolding + When I run jekyll new-theme my-cool-theme + Then I should get a zero exit status + And the my-cool-theme directory should exist + When I decide to build the theme gem + Then I should get a zero exit status + When I run git add . + Then I should get a zero exit status + When I run gem build my-cool-theme.gemspec + Then I should get a zero exit status + And the "./my-cool-theme-0.1.0.gem" file should exist + When I run gem unpack my-cool-theme-0.1.0.gem + Then I should get a zero exit status + And the my-cool-theme-0.1.0 directory should exist + And the "my-cool-theme-0.1.0/_layouts/default.html" file should exist + And the "my-cool-theme-0.1.0/_includes/blank.html" file should exist + And the "my-cool-theme-0.1.0/_sass/blank.scss" file should exist + And the my-cool-theme-0.1.0/.git directory should not exist + And the "my-cool-theme-0.1.0/.gitignore" file should not exist + And the "my-cool-theme-0.1.0/Gemfile" file should not exist + And the "my-cool-theme-0.1.0/my-cool-theme.gemspec" file should not exist From 1fb4dce2f5b1d9618ef737469a3477eb1cbf93ef Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 23 Sep 2016 23:21:10 +0530 Subject: [PATCH 1467/4996] add a step to check contents in assets directory --- features/step_definitions.rb | 2 ++ features/theme_gem.feature | 1 + 2 files changed, 3 insertions(+) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index e993b4f9839..7d490cdaa0a 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -177,6 +177,8 @@ File.write(gemspec, File.read(gemspec).sub("TODO: ", "")) File.new("_includes/blank.html", "w") File.new("_sass/blank.scss", "w") + FileUtils.mkdir_p("assets/css") + File.new("assets/css/blank.scss", "w") end # diff --git a/features/theme_gem.feature b/features/theme_gem.feature index b79d9c0be25..d36c71ac549 100644 --- a/features/theme_gem.feature +++ b/features/theme_gem.feature @@ -25,6 +25,7 @@ Feature: Building Theme Gems And the "my-cool-theme-0.1.0/_layouts/default.html" file should exist And the "my-cool-theme-0.1.0/_includes/blank.html" file should exist And the "my-cool-theme-0.1.0/_sass/blank.scss" file should exist + And the "my-cool-theme-0.1.0/assets/css/blank.scss" file should exist And the my-cool-theme-0.1.0/.git directory should not exist And the "my-cool-theme-0.1.0/.gitignore" file should not exist And the "my-cool-theme-0.1.0/Gemfile" file should not exist From 5b4269eca50b61603917e11c065be16383e94731 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 29 Sep 2016 08:47:26 +0530 Subject: [PATCH 1468/4996] document automatic bundle install --- site/_docs/quickstart.md | 3 ++- site/index.html | 5 ----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/site/_docs/quickstart.md b/site/_docs/quickstart.md index b6cb5895599..969b5384ffd 100644 --- a/site/_docs/quickstart.md +++ b/site/_docs/quickstart.md @@ -10,11 +10,12 @@ For the impatient, here's how to get a boilerplate Jekyll site up and running. ~ $ gem install jekyll bundler ~ $ jekyll new myblog ~ $ cd myblog -~/myblog $ bundle install ~/myblog $ bundle exec jekyll serve # => Now browse to http://localhost:4000 ``` +The `jekyll new` command now automatically initiates `bundle install` and installs the dependencies required. To skip this, pass `--skip-bundle` option like so `jekyll new myblog --skip-bundle`. + If you wish to install jekyll into an existing directory, you can do so by running `jekyll new .` from within the directory instead of creating a new one. If the existing directory isn't empty, you'll also have to pass the `--force` option like so `jekyll new . --force`. That's nothing, though. The real magic happens when you start creating blog diff --git a/site/index.html b/site/index.html index 74bace334ca..88b31c5b330 100644 --- a/site/index.html +++ b/site/index.html @@ -57,11 +57,6 @@

    Get up and running in seconds.

    $ cd my-awesome-site

    -

    - ~/my-awesome-site - $ - bundle install -

    ~/my-awesome-site $ From 51695b2165c12bfe8acf1fd1f0b22904a0980e88 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Thu, 29 Sep 2016 11:17:17 -0500 Subject: [PATCH 1469/4996] Travis is entirely broken. I'm tired of getting emails from forks I don't even control or have commit to, it's not cool... at all. --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1b779c0c09f..6ff7022c7b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,10 +30,6 @@ branches: - themes notifications: - email: - recipients: - - jordon@envygeeks.io - slack: secure: "\ dNdKk6nahNURIUbO3ULhA09/vTEQjK0fNbgjVjeYPEvROHgQBP1cIP3AJy8aWs8rl5Yyow4Y\ From 69172bcc4a5377365d05b4afa83fa4376ba9c6d3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 29 Sep 2016 10:04:47 -0700 Subject: [PATCH 1470/4996] Update history to reflect merge of #5428 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 979413252c9..d73c59b1a23 100644 --- a/History.markdown +++ b/History.markdown @@ -65,6 +65,7 @@ * Add documentation for `relative_url` and `absolute_url` (#5405) * Bugfix on logo in JSON-LD (#5421) * Fix Travis.ci documentation (#5413) + * [docs] Update documentation regarding `bundle install` after `jekyll new` (#5428) ### Development Fixes From 91ef3a7cc9222f513e47f64bab33b4543883dfc7 Mon Sep 17 00:00:00 2001 From: Antonio Date: Fri, 30 Sep 2016 02:17:08 +0800 Subject: [PATCH 1471/4996] prepend 'jekyll serve' with 'bundle exec' Best not to send mixed messages and jekyllrb's quickstart message is "bundle exec jekyll serve" --- lib/site_template/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index 24a465185ff..9a2bee4530b 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -6,7 +6,7 @@ # feature for the data you need to update frequently. # # For technical reasons, this file is *NOT* reloaded automatically when you use -# 'jekyll serve'. If you change this file, please restart the server process. +# 'bundle exec jekyll serve'. If you change this file, please restart the server process. # Site settings # These are used to personalize your new site. If you look in the HTML files, From 1c7aa4729efce24dd0757c0ac4da800a530a0c3d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 29 Sep 2016 13:25:30 -0700 Subject: [PATCH 1472/4996] Update history to reflect merge of #5412 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d73c59b1a23..928ccab8fbf 100644 --- a/History.markdown +++ b/History.markdown @@ -84,6 +84,7 @@ * remove features' directories on windows with proper access (#5389) * `site_configuration.feature`: use UTC format in timezone (#5416) * swallow bundle output from `jekyll new` while in CI (#5408) + * Add .editorconfig (#5412) ## 3.2.1 / 2016-08-02 From b38ac5d9381febebff77a171ffc9c7e989cf7a6f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 29 Sep 2016 13:26:03 -0700 Subject: [PATCH 1473/4996] Update history to reflect merge of #5430 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 928ccab8fbf..4aab87b0181 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Clarify documentation in theme gem's README template (#5376) * Allow underscore in highlighter language (#5375) * Site template: set empty url in config file by default (#5338) + * Site template config: prepend 'jekyll serve' with 'bundle exec' (#5430) ### Site Enhancements From 459bc17019c7384a31470b23b4f310f2370c44b1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 29 Sep 2016 13:26:24 -0700 Subject: [PATCH 1474/4996] Update history to reflect merge of #5427 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4aab87b0181..38485e0b82a 100644 --- a/History.markdown +++ b/History.markdown @@ -26,6 +26,7 @@ * Allow underscore in highlighter language (#5375) * Site template: set empty url in config file by default (#5338) * Site template config: prepend 'jekyll serve' with 'bundle exec' (#5430) + * Don't call `File.utime` for StaticFiles if it's a symlink (#5427) ### Site Enhancements From 7118999958dc5a334e523941cfb06762e7622e99 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 29 Sep 2016 13:27:12 -0700 Subject: [PATCH 1475/4996] Update history to reflect merge of #5410 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 38485e0b82a..54ba5992f23 100644 --- a/History.markdown +++ b/History.markdown @@ -27,6 +27,7 @@ * Site template: set empty url in config file by default (#5338) * Site template config: prepend 'jekyll serve' with 'bundle exec' (#5430) * Don't call `File.utime` for StaticFiles if it's a symlink (#5427) + * Fix handling of non-ASCII characters in new `*_url` filters (#5410) ### Site Enhancements From d716d9b7be8ab67014d8c8048718ef7324793a4a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 29 Sep 2016 14:02:09 -0700 Subject: [PATCH 1476/4996] Update history to reflect merge of #5411 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 54ba5992f23..3487f70cf22 100644 --- a/History.markdown +++ b/History.markdown @@ -69,6 +69,7 @@ * Bugfix on logo in JSON-LD (#5421) * Fix Travis.ci documentation (#5413) * [docs] Update documentation regarding `bundle install` after `jekyll new` (#5428) + * Replace classic box-sizing reset with inheritance reset (#5411) ### Development Fixes From aa901cdaba54efcd430cd09e1aec09a9bedb3b9d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 29 Sep 2016 14:13:32 -0700 Subject: [PATCH 1477/4996] Update history to reflect merge of #5264 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3487f70cf22..2a04338a3a5 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ * Site template: Move contents of the index.html page to the 'home' layout (#5420) * Exclude node_modules by default (#5210) * Run hooks in priority order. (#5157) + * Add `static_file.name` and `.basename` Liquid attributes (#5264) ### Bug Fixes From 87a03f6c1a2c78628e1e9d39c1b04c5d7a95e5de Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 30 Sep 2016 15:23:08 +0530 Subject: [PATCH 1478/4996] replace zero exit status steps --- features/step_definitions.rb | 23 ++++++++++++++++++++++- features/theme_gem.feature | 15 +++++++-------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 7d490cdaa0a..bf6883af632 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -166,7 +166,7 @@ # When(%r!^I run git add .$!) do - run_in_shell("git", "add", ".") + run_in_shell("git", "add", ".", "--verbose") end # @@ -264,6 +264,27 @@ # +Then(%r!^I should get an updated git index$!) do + index = %w( + .gitignore + Gemfile + LICENSE.txt + README.md + _includes/blank.html + _layouts/default.html + _layouts/page.html + _layouts/post.html + _sass/blank.scss + assets/css/blank.scss + my-cool-theme.gemspec + ) + index.each do |file| + expect(jekyll_run_output).to match file + end +end + +# + Then(%r!^I should get a zero exit(?:\-| )status$!) do step %(I should see "EXIT STATUS: 0" in the build output) end diff --git a/features/theme_gem.feature b/features/theme_gem.feature index d36c71ac549..875a8568ca2 100644 --- a/features/theme_gem.feature +++ b/features/theme_gem.feature @@ -10,18 +10,17 @@ Feature: Building Theme Gems Scenario: Checking if a bonafide Theme gem will be built from generated scaffolding When I run jekyll new-theme my-cool-theme - Then I should get a zero exit status - And the my-cool-theme directory should exist + Then the my-cool-theme directory should exist When I decide to build the theme gem - Then I should get a zero exit status + Then the "_includes/blank.html" file should exist + Then the "_sass/blank.scss" file should exist + Then the "assets/css/blank.scss" file should exist When I run git add . - Then I should get a zero exit status + Then I should get an updated git index When I run gem build my-cool-theme.gemspec - Then I should get a zero exit status - And the "./my-cool-theme-0.1.0.gem" file should exist + Then the "./my-cool-theme-0.1.0.gem" file should exist When I run gem unpack my-cool-theme-0.1.0.gem - Then I should get a zero exit status - And the my-cool-theme-0.1.0 directory should exist + Then the my-cool-theme-0.1.0 directory should exist And the "my-cool-theme-0.1.0/_layouts/default.html" file should exist And the "my-cool-theme-0.1.0/_includes/blank.html" file should exist And the "my-cool-theme-0.1.0/_sass/blank.scss" file should exist From f636067661f2cad2c9c97e5526b3631c2e265dd2 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 30 Sep 2016 15:34:46 +0530 Subject: [PATCH 1479/4996] remove 'css' subdirectory from assets folder --- features/step_definitions.rb | 5 ++--- features/theme_gem.feature | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index bf6883af632..b57f5bb8d10 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -177,8 +177,7 @@ File.write(gemspec, File.read(gemspec).sub("TODO: ", "")) File.new("_includes/blank.html", "w") File.new("_sass/blank.scss", "w") - FileUtils.mkdir_p("assets/css") - File.new("assets/css/blank.scss", "w") + File.new("assets/blank.scss", "w") end # @@ -275,7 +274,7 @@ _layouts/page.html _layouts/post.html _sass/blank.scss - assets/css/blank.scss + assets/blank.scss my-cool-theme.gemspec ) index.each do |file| diff --git a/features/theme_gem.feature b/features/theme_gem.feature index 875a8568ca2..c46d37e040c 100644 --- a/features/theme_gem.feature +++ b/features/theme_gem.feature @@ -14,7 +14,7 @@ Feature: Building Theme Gems When I decide to build the theme gem Then the "_includes/blank.html" file should exist Then the "_sass/blank.scss" file should exist - Then the "assets/css/blank.scss" file should exist + Then the "assets/blank.scss" file should exist When I run git add . Then I should get an updated git index When I run gem build my-cool-theme.gemspec @@ -24,7 +24,7 @@ Feature: Building Theme Gems And the "my-cool-theme-0.1.0/_layouts/default.html" file should exist And the "my-cool-theme-0.1.0/_includes/blank.html" file should exist And the "my-cool-theme-0.1.0/_sass/blank.scss" file should exist - And the "my-cool-theme-0.1.0/assets/css/blank.scss" file should exist + And the "my-cool-theme-0.1.0/assets/blank.scss" file should exist And the my-cool-theme-0.1.0/.git directory should not exist And the "my-cool-theme-0.1.0/.gitignore" file should not exist And the "my-cool-theme-0.1.0/Gemfile" file should not exist From cff8f2994ceb727e465a6b2425625af89a63ef93 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Sat, 1 Oct 2016 13:09:50 +0100 Subject: [PATCH 1480/4996] Fix loading data from subdir with a period in name #5429 --- lib/jekyll/readers/data_reader.rb | 4 ++-- test/source/_data/categories.01/dairy.yaml | 6 ++++++ test/test_site.rb | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 test/source/_data/categories.01/dairy.yaml diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index 4c6495fd697..2047401121b 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -37,10 +37,10 @@ def read_data_to(dir, data) path = @site.in_source_dir(dir, entry) next if @entry_filter.symlink?(path) - key = sanitize_filename(File.basename(entry, ".*")) if File.directory?(path) - read_data_to(path, data[key] = {}) + read_data_to(path, data[entry] = {}) else + key = sanitize_filename(File.basename(entry, ".*")) data[key] = read_data_file(path) end end diff --git a/test/source/_data/categories.01/dairy.yaml b/test/source/_data/categories.01/dairy.yaml new file mode 100644 index 00000000000..30a09ba35af --- /dev/null +++ b/test/source/_data/categories.01/dairy.yaml @@ -0,0 +1,6 @@ +name: Dairy +products: +- name: cheese + price: 5.5 +- name: milk + price: 2.75 diff --git a/test/test_site.rb b/test/test_site.rb index 1f0d30a1835..5cd20b644ab 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -438,6 +438,21 @@ def convert(*_args) ) end + should "auto load yaml files in subdirectory with a period in the name" do + site = Site.new(site_configuration) + site.process + + file_content = SafeYAML.load_file(File.join( + source_dir, "_data", "categories.01", "dairy.yaml" + )) + + assert_equal site.data["categories.01"]["dairy"], file_content + assert_equal( + site.site_payload["site"]["data"]["categories.01"]["dairy"], + file_content + ) + end + should "load symlink files in unsafe mode" do site = Site.new(site_configuration("safe" => false)) site.process From a0a351aa7a0529c36b095f1a0bd0e4cfce9c5918 Mon Sep 17 00:00:00 2001 From: "Mark H. Wilkinson" Date: Mon, 3 Oct 2016 22:21:35 +0100 Subject: [PATCH 1481/4996] Remove autoload of Draft which no longer exists. --- lib/jekyll.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 3c4def1a426..aebf47094f7 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -41,7 +41,6 @@ module Jekyll autoload :Convertible, "jekyll/convertible" autoload :Deprecator, "jekyll/deprecator" autoload :Document, "jekyll/document" - autoload :Draft, "jekyll/draft" autoload :EntryFilter, "jekyll/entry_filter" autoload :Errors, "jekyll/errors" autoload :Excerpt, "jekyll/excerpt" From 274d350d614cba4a024c93f7bfcc37a37b462dc6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 3 Oct 2016 15:13:02 -0700 Subject: [PATCH 1482/4996] Update history to reflect merge of #5441 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2a04338a3a5..8d1acc73419 100644 --- a/History.markdown +++ b/History.markdown @@ -29,6 +29,7 @@ * Site template config: prepend 'jekyll serve' with 'bundle exec' (#5430) * Don't call `File.utime` for StaticFiles if it's a symlink (#5427) * Fix handling of non-ASCII characters in new `*_url` filters (#5410) + * Remove autoload of Draft which no longer exists. (#5441) ### Site Enhancements From 761ddcae24e11f11bdbe95b6516530c52876ba57 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 3 Oct 2016 17:44:47 -0700 Subject: [PATCH 1483/4996] Add Jekyll 3.3 release post --- .../2016-10-03-jekyll-3-3-0-released.markdown | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 site/_posts/2016-10-03-jekyll-3-3-0-released.markdown diff --git a/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown b/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown new file mode 100644 index 00000000000..d3e506b85ab --- /dev/null +++ b/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown @@ -0,0 +1,90 @@ +--- +layout: news_item +title: 'Jekyll 3.3 is here with better theme support, new URL filters, and tons more' +date: 2016-10-03 17:08:38 -0700 +author: parkr +version: 3.3.0 +categories: [release] +--- + +We have tons of new features for you in our latest release of Jekyll. Three +key things you might want to give a whirl: + +### 1. Themes can now ship static & dynamic assets in an `/assets` directory + +We're really stoked about this one. In Jekyll 3.2, we shipped the ability +to use a theme that was packaged as a gem. Due to security necessities and +ease-of-use concerns, this initial ship only included support for includes, +layouts, and sass partials. A theme couldn't write any CSS, JavaScript, or +content to your site. + +In an effort to make theme management a bit easier, any files you put into +`/assets` in your theme will be read in as though they were part of the +user's site. This means you can ship SCSS and CoffeeScript, images and +webfonts, JSON and other data. Same rules apply here as in a Jekyll site: +if it has YAML front matter, it will be converted and renderd. No YAML +front matter, and it will simply be copied over like a static asset. Neat, +huh? + +See our [documentation on the subject](/docs/assets#assets-directory) for +more info. + +### 2. `relative_url` and `absolute_url` filters + +Want a clean way to prepend the `baseurl` or `url` in your config? These +new filters have you covered. When working locally, if you set your +`baseurl` to match your deployment environment, say `baseurl: "/myproject"`, +then `relative_url` will ensure that this baseurl is prepended to anything +you pass it: + +{% highlight liquid %} +{% raw %} +{{ "/docs/assets/" | relative_url }} => /myproject/docs/assets +{% endraw %} +{% endhighlight %} + +A result of `relative_url` will safely always yield a link which is +relative to the domain root. A similar principle applies to `absolute_url`. +It prepends your `baseurl` and `url` values, making absolute URL's all the +easier to make: + +{% highlight liquid %} +{% raw %} +{{ "/docs/assets/" | absolute_url }} => http://jekyllrb.com/myproject/docs/assets +{% endraw %} +{% endhighlight %} + +### 3. `site.url` is set by the development server + +When you run `jekyll serve` locally, it starts a web server, usually at +`http://localhost:4000`, that you use to preview your site during +development. If you are using the new `absolute_url` filter, or using +`site.url` anywhere, you have probably had to create a development config +which resets the `url` value to point to `http://localhost:4000`. + +No longer! When you run `jekyll serve`, Jekyll will build your site with +the value of the `host`, `port`, and SSL-related options. This defaults to +`url: http://localhost:4000`. When you are developing locally, `site.url` +will yield `http://localhost:4000`. + +Note that this only applies when `JEKYLL_ENV` is equal to `development`. If +you set `JEKYLL_ENV=production` and run `jekyll serve`, it will not +overwrite the value of `url` in your config. And again, this only applies +to serving, not to building. + +## A *lot* more! + +There are dozens of bug fixes and minor improvements to make your Jekyll +experience better than ever. With every Jekyll release, we strive to bring +greater stability and reliability to your everyday development workflow. + +As always, thanks to our many contributors who contributed countless hours +of their free time to making this release happen: + +!! TODO: Add list of contributors for this release! + +[Full release notes]({{ "/docs/history/" | relative_url }}) are available +for your perusal. If you notice any issues, please don't hesitate to file a +bug report. + +Happy Jekylling! From a138b02b106d3456d6d3ed44adaba668fa12ffb6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 4 Oct 2016 11:35:42 -0700 Subject: [PATCH 1484/4996] Update links in 3.3 release post --- site/_posts/2016-10-03-jekyll-3-3-0-released.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown b/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown index d3e506b85ab..932d0105204 100644 --- a/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown +++ b/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown @@ -26,8 +26,8 @@ if it has YAML front matter, it will be converted and renderd. No YAML front matter, and it will simply be copied over like a static asset. Neat, huh? -See our [documentation on the subject](/docs/assets#assets-directory) for -more info. +See our [documentation on the subject]({{ "/docs/themes/#assets" | relative_url }}) +for more info. ### 2. `relative_url` and `absolute_url` filters @@ -83,7 +83,7 @@ of their free time to making this release happen: !! TODO: Add list of contributors for this release! -[Full release notes]({{ "/docs/history/" | relative_url }}) are available +[Full release notes]({{ "/docs/history/#v3-3-0" | relative_url }}) are available for your perusal. If you notice any issues, please don't hesitate to file a bug report. From 01c33907a38e3cd0fccfb1367c225c050dfd5bd4 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Fri, 30 Sep 2016 23:11:00 +0200 Subject: [PATCH 1485/4996] default site.url in dev environment to `http://localhost:4000` take `host`, `port` and `ssl` options into account --- lib/jekyll/commands/serve.rb | 28 +++++++++++++++++---- test/test_commands_serve.rb | 49 +++++++++++++++++++++++++++++++++--- 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 9042a4a0368..c3b99cba9e0 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -33,6 +33,7 @@ def init_with_program(prog) opts["serving"] = true opts["watch" ] = true unless opts.key?("watch") config = opts["config"] + opts["url"] = default_url(opts) if Jekyll.env == "development" Build.process(opts) opts["config"] = config Serve.process(opts) @@ -47,11 +48,7 @@ def process(opts) destination = opts["destination"] setup(destination) - server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } - server.mount(opts["baseurl"], Servlet, destination, file_handler_opts) - Jekyll.logger.info "Server address:", server_address(server, opts) - launch_browser server, opts if opts["open_url"] - boot_or_detach server, opts + start_up_webrick(opts, destination) end # Do a base pre-setup of WEBRick so that everything is in place @@ -101,6 +98,17 @@ def webrick_opts(opts) opts end + # + + private + def start_up_webrick(opts, destination) + server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } + server.mount(opts["baseurl"], Servlet, destination, file_handler_opts) + Jekyll.logger.info "Server address:", server_address(server, opts) + launch_browser server, opts if opts["open_url"] + boot_or_detach server, opts + end + # Recreate NondisclosureName under utf-8 circumstance private @@ -127,6 +135,16 @@ def server_address(server, opts) # + def default_url(opts) + config = configuration_from_options(opts) + host = config["host"] == "127.0.0.1" ? "localhost" : config["host"] + port = config["port"] + protocol = config["ssl_cert"] && config["ssl_key"] ? "https" : "http" + "#{protocol}://#{host}:#{port}" + end + + # + private def launch_browser(server, opts) address = server_address(server, opts) diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 7e8a7062bc4..143dc2a549f 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -19,6 +19,12 @@ def custom_opts(what) p ) end + Jekyll.sites.clear + allow(SafeYAML).to receive(:load_file).and_return({}) + allow(Jekyll::Commands::Build).to receive(:build).and_return("") + end + teardown do + Jekyll.sites.clear end should "label itself" do @@ -79,16 +85,53 @@ def custom_opts(what) custom_options = { "config" => %w(_config.yml _development.yml), "serving" => true, - "watch" => false # for not having guard output when running the tests + "watch" => false, # for not having guard output when running the tests + "url" => "http://localhost:4000" } - allow(SafeYAML).to receive(:load_file).and_return({}) - allow(Jekyll::Commands::Build).to receive(:build).and_return("") expect(Jekyll::Commands::Serve).to receive(:process).with(custom_options) @merc.execute(:serve, { "config" => %w(_config.yml _development.yml), "watch" => false }) end + context "in development environment" do + setup do + expect(Jekyll).to receive(:env).and_return("development") + expect(Jekyll::Commands::Serve).to receive(:start_up_webrick) + end + should "set the site url by default to `http://localhost:4000`" do + @merc.execute(:serve, { "watch" => false, "url" => "https://jekyllrb.com/" }) + + assert_equal 1, Jekyll.sites.count + assert_equal "http://localhost:4000", Jekyll.sites.first.config["url"] + end + + should "take `host`, `port` and `ssl` into consideration if set" do + @merc.execute(:serve, { + "watch" => false, + "host" => "example.com", + "port" => "9999", + "url" => "https://jekyllrb.com/", + "ssl_cert" => "foo", + "ssl_key" => "bar" + }) + + assert_equal 1, Jekyll.sites.count + assert_equal "https://example.com:9999", Jekyll.sites.first.config["url"] + end + end + + context "not in development environment" do + should "not update the site url" do + expect(Jekyll).to receive(:env).and_return("production") + expect(Jekyll::Commands::Serve).to receive(:start_up_webrick) + @merc.execute(:serve, { "watch" => false, "url" => "https://jekyllrb.com/" }) + + assert_equal 1, Jekyll.sites.count + assert_equal "https://jekyllrb.com/", Jekyll.sites.first.config["url"] + end + end + context "verbose" do should "debug when verbose" do assert_equal custom_opts({ "verbose" => true })[:Logger].level, 5 From e27a65d9e3ef674592e4584093f3445d2e0d8d37 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Tue, 4 Oct 2016 19:39:41 +0100 Subject: [PATCH 1486/4996] Sanitize directory name as a key --- lib/jekyll/readers/data_reader.rb | 2 +- test/test_site.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index 2047401121b..370a6893267 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -38,7 +38,7 @@ def read_data_to(dir, data) next if @entry_filter.symlink?(path) if File.directory?(path) - read_data_to(path, data[entry] = {}) + read_data_to(path, data[sanitize_filename(entry)] = {}) else key = sanitize_filename(File.basename(entry, ".*")) data[key] = read_data_file(path) diff --git a/test/test_site.rb b/test/test_site.rb index 5cd20b644ab..4f5272810df 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -446,9 +446,9 @@ def convert(*_args) source_dir, "_data", "categories.01", "dairy.yaml" )) - assert_equal site.data["categories.01"]["dairy"], file_content + assert_equal site.data["categories01"]["dairy"], file_content assert_equal( - site.site_payload["site"]["data"]["categories.01"]["dairy"], + site.site_payload["site"]["data"]["categories01"]["dairy"], file_content ) end From a945a658188d4cd8ac04f919ec2d0e0dc59e01e0 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Tue, 4 Oct 2016 20:39:36 +0200 Subject: [PATCH 1487/4996] refactor to use `server_address` --- lib/jekyll/commands/serve.rb | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index c3b99cba9e0..d8f5890ca7e 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -104,7 +104,12 @@ def webrick_opts(opts) def start_up_webrick(opts, destination) server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } server.mount(opts["baseurl"], Servlet, destination, file_handler_opts) - Jekyll.logger.info "Server address:", server_address(server, opts) + Jekyll.logger.info "Server address:", server_address( + server.config[:SSLEnable], + server.config[:BindAddress], + server.config[:Port], + opts["baseurl"] + ) launch_browser server, opts if opts["open_url"] boot_or_detach server, opts end @@ -124,23 +129,25 @@ def file_handler_opts # private - def server_address(server, opts) + def server_address(prefix, address, port, baseurl = nil) format("%{prefix}://%{address}:%{port}%{baseurl}", { - :prefix => server.config[:SSLEnable] ? "https" : "http", - :baseurl => opts["baseurl"] ? "#{opts["baseurl"]}/" : "", - :address => server.config[:BindAddress], - :port => server.config[:Port] + :prefix => prefix ? "https" : "http", + :address => address, + :port => port, + :baseurl => baseurl ? "#{baseurl}/" : "" }) end # + private def default_url(opts) config = configuration_from_options(opts) - host = config["host"] == "127.0.0.1" ? "localhost" : config["host"] - port = config["port"] - protocol = config["ssl_cert"] && config["ssl_key"] ? "https" : "http" - "#{protocol}://#{host}:#{port}" + server_address( + config["ssl_cert"] && config["ssl_key"], + config["host"] == "127.0.0.1" ? "localhost" : config["host"], + config["port"] + ) end # From 7ea610f8c0ea1449a5071d524c12c53c46e11171 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 5 Oct 2016 09:59:02 -0700 Subject: [PATCH 1488/4996] Update history to reflect merge of #5431 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8d1acc73419..f6fbc47a1c2 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Exclude node_modules by default (#5210) * Run hooks in priority order. (#5157) * Add `static_file.name` and `.basename` Liquid attributes (#5264) + * set site.url in dev environment to `http://localhost:4000` (#5431) ### Bug Fixes From 55257d2a142b55d42ae3ebf24b05da1ab2e57af4 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 5 Oct 2016 11:34:07 -0700 Subject: [PATCH 1489/4996] Update history to reflect merge of #5256 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f6fbc47a1c2..8e9219ecae0 100644 --- a/History.markdown +++ b/History.markdown @@ -31,6 +31,7 @@ * Don't call `File.utime` for StaticFiles if it's a symlink (#5427) * Fix handling of non-ASCII characters in new `*_url` filters (#5410) * Remove autoload of Draft which no longer exists. (#5441) + * Fix issue where Windows drive name is stripped from Jekyll.sanitized_path incorrectly (#5256) ### Site Enhancements From 38f9e93a10283b2ff4dab91d1eeab21c5d3efeb6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 5 Oct 2016 11:34:53 -0700 Subject: [PATCH 1490/4996] Update history to reflect merge of #5212 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8e9219ecae0..314b172df3d 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * Run hooks in priority order. (#5157) * Add `static_file.name` and `.basename` Liquid attributes (#5264) * set site.url in dev environment to `http://localhost:4000` (#5431) + * Add support for indented link references on excerpt (#5212) ### Bug Fixes From f67dfb71fe27d5f70726babaad795455cf0ade29 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 5 Oct 2016 11:40:06 -0700 Subject: [PATCH 1491/4996] Update history to reflect merge of #4873 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 314b172df3d..83bd53c9aa2 100644 --- a/History.markdown +++ b/History.markdown @@ -33,6 +33,7 @@ * Fix handling of non-ASCII characters in new `*_url` filters (#5410) * Remove autoload of Draft which no longer exists. (#5441) * Fix issue where Windows drive name is stripped from Jekyll.sanitized_path incorrectly (#5256) + * Fix bug where `post_url` tag matched incorrect post with subdirectory (#4873) ### Site Enhancements From 6f2d1591fcfb61e27347defb7e5f3df846fe6e9c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 5 Oct 2016 11:47:43 -0700 Subject: [PATCH 1492/4996] Release :gem: 3.3.0.pre.rc1 --- lib/jekyll/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 7c342718e04..3e382c0160f 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.2.1".freeze + VERSION = "3.3.0.pre.rc1".freeze end From fcef78c4b68a6b4609dabb00ef0ad2c4c1d5d2b3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 7 Aug 2016 11:54:32 -0700 Subject: [PATCH 1493/4996] Revert "templates.md: {% link %} tag only accepts collection documents" This reverts commit ab4abb19332c71307a3e052746e65ff62d305b38. --- site/_docs/templates.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index 48d7cd7498c..f95f2ca5db1 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -510,9 +510,7 @@ numbers from the highlighted code. ### Link -If you would like to include a link to a collection's document, or a post -the `link` tag will generate the correct permalink URL for the path you -specify. +If you would like to include a link to a collection's document, a post, a page or a file the `link` tag will generate the correct permalink URL for the path you specify. You must include the file extension when using the `link` tag. @@ -520,6 +518,8 @@ You must include the file extension when using the `link` tag. {% raw %} {% link _collection/name-of-document.md %} {% link _posts/2016-07-26-name-of-post.md %} +{% link news/index.html %} +{% link /assets/files/doc.pdf %} {% endraw %} ``` @@ -529,12 +529,11 @@ You can also use this tag to create a link in Markdown as follows: {% raw %} [Link to a document]({% link _collection/name-of-document.md %}) [Link to a post]({% link _posts/2016-07-26-name-of-post.md %}) +[Link to a page]({% link news/index.html %}) +[Link to a file]({% link /assets/files/doc.pdf %}) {% endraw %} ``` -Support for static files and pages is coming in a later release but is -**not** released as of v3.2.1. - ### Post URL If you would like to include a link to a post on your site, the `post_url` tag From c61752a336d21de4ccae10266aae23306423d974 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 6 Oct 2016 01:17:26 +0200 Subject: [PATCH 1494/4996] Fix line length --- site/_docs/templates.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/site/_docs/templates.md b/site/_docs/templates.md index f95f2ca5db1..54f914f7628 100644 --- a/site/_docs/templates.md +++ b/site/_docs/templates.md @@ -510,7 +510,9 @@ numbers from the highlighted code. ### Link -If you would like to include a link to a collection's document, a post, a page or a file the `link` tag will generate the correct permalink URL for the path you specify. +If you want to include a link to a collection's document, a post, a page +or a file the `link` tag will generate the correct permalink URL for the path +you specify. You must include the file extension when using the `link` tag. From 8ec7421c0389f91219a238e4238318f58d67a941 Mon Sep 17 00:00:00 2001 From: Daniel Chapman Date: Thu, 6 Oct 2016 17:49:27 +0900 Subject: [PATCH 1495/4996] Update Wikipedia YAML list link List no longer exists on that page as an id. Basic_components holds the lists now, and at the top conveniently :v: I also added a second link under the tags heading. --- site/_docs/frontmatter.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/site/_docs/frontmatter.md b/site/_docs/frontmatter.md index 7e427552a2f..72281e265df 100644 --- a/site/_docs/frontmatter.md +++ b/site/_docs/frontmatter.md @@ -156,7 +156,7 @@ These are available out-of-the-box to be used in the front matter for a post. more categories that the post belongs to. When the site is generated the post will act as though it had been set with these categories normally. Categories (plural key) can be specified as a YAML list or a + href="https://en.wikipedia.org/wiki/YAML#Basic_components">YAML list or a comma-separated string.

    @@ -170,7 +170,8 @@ These are available out-of-the-box to be used in the front matter for a post.

    Similar to categories, one or multiple tags can be added to a post. - Also like categories, tags can be specified as a YAML list or a + Also like categories, tags can be specified as a YAML list or a comma-separated string.

    From 7133bddfb2d7de422f0c86c89ac293a6354b626a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 6 Oct 2016 09:11:32 -0700 Subject: [PATCH 1496/4996] Update history to reflect merge of #5452 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 83bd53c9aa2..34173a4b6ef 100644 --- a/History.markdown +++ b/History.markdown @@ -76,6 +76,7 @@ * Fix Travis.ci documentation (#5413) * [docs] Update documentation regarding `bundle install` after `jekyll new` (#5428) * Replace classic box-sizing reset with inheritance reset (#5411) + * Update Wikipedia YAML list link (#5452) ### Development Fixes From c90d44d2bea94f8f6757f3fd3263c49a1416c5a6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 6 Oct 2016 09:36:56 -0700 Subject: [PATCH 1497/4996] Updates to 3.3.0 release post per comments. --- .../2016-10-03-jekyll-3-3-0-released.markdown | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown b/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown index 932d0105204..e4afb49c59f 100644 --- a/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown +++ b/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown @@ -7,24 +7,26 @@ version: 3.3.0 categories: [release] --- -We have tons of new features for you in our latest release of Jekyll. Three -key things you might want to give a whirl: +There are tons of great new quality-of-life features you can use in 3.3. +Three key things you might want to try: ### 1. Themes can now ship static & dynamic assets in an `/assets` directory -We're really stoked about this one. In Jekyll 3.2, we shipped the ability -to use a theme that was packaged as a gem. Due to security necessities and -ease-of-use concerns, this initial ship only included support for includes, -layouts, and sass partials. A theme couldn't write any CSS, JavaScript, or -content to your site. +In Jekyll 3.2, we shipped the ability to use a theme that was packaged as a +[gem](http://guides.rubygems.org/). 3.2 included support for includes, +layouts, and sass partials. In 3.3, we're adding assets to that list. In an effort to make theme management a bit easier, any files you put into `/assets` in your theme will be read in as though they were part of the user's site. This means you can ship SCSS and CoffeeScript, images and -webfonts, JSON and other data. Same rules apply here as in a Jekyll site: -if it has YAML front matter, it will be converted and renderd. No YAML -front matter, and it will simply be copied over like a static asset. Neat, -huh? +webfonts, and so on -- anything you'd consider a part of the +*presentation*. Same rules apply here as in a Jekyll site: if it has YAML +front matter, it will be converted and rendered. No YAML front matter, and +it will simply be copied over like a static asset. + +Note that if a user has a file of the same path, the theme content will not +be included in the site, i.e. a user's `/assets/main.scss` will be written +instead of a theme's `/assets/main.scss`. It's See our [documentation on the subject]({{ "/docs/themes/#assets" | relative_url }}) for more info. @@ -43,7 +45,16 @@ you pass it: {% endraw %} {% endhighlight %} -A result of `relative_url` will safely always yield a link which is +By default, `baseurl` is set to `""` and therefore yields (never set to +`"/"`): + +{% highlight liquid %} +{% raw %} +{{ "/docs/assets/" | relative_url }} => /docs/assets +{% endraw %} +{% endhighlight %} + +A result of `relative_url` will safely always produce a URL which is relative to the domain root. A similar principle applies to `absolute_url`. It prepends your `baseurl` and `url` values, making absolute URL's all the easier to make: @@ -67,8 +78,9 @@ the value of the `host`, `port`, and SSL-related options. This defaults to `url: http://localhost:4000`. When you are developing locally, `site.url` will yield `http://localhost:4000`. -Note that this only applies when `JEKYLL_ENV` is equal to `development`. If -you set `JEKYLL_ENV=production` and run `jekyll serve`, it will not +This happens by default when running Jekyll locally. It will not be set if +you set `JEKYLL_ENV=production` and run `jekyll serve`. If `JEKYLL_ENV` is +any value except `development` (its default value), Jekyll will not overwrite the value of `url` in your config. And again, this only applies to serving, not to building. From 6d1bc6c6ea79986a4d38ad588d632243d159ed79 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 6 Oct 2016 09:48:37 -0700 Subject: [PATCH 1498/4996] Revert Commands::Serve#server_address signature change. --- lib/jekyll/commands/serve.rb | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index d8f5890ca7e..d1b49f3df91 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -104,12 +104,7 @@ def webrick_opts(opts) def start_up_webrick(opts, destination) server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } server.mount(opts["baseurl"], Servlet, destination, file_handler_opts) - Jekyll.logger.info "Server address:", server_address( - server.config[:SSLEnable], - server.config[:BindAddress], - server.config[:Port], - opts["baseurl"] - ) + Jekyll.logger.info "Server address:", server_address(server, opts) launch_browser server, opts if opts["open_url"] boot_or_detach server, opts end @@ -129,9 +124,19 @@ def file_handler_opts # private - def server_address(prefix, address, port, baseurl = nil) + def server_address(server, options = {}) + format_url( + server.config[:SSLEnable], + server.config[:BindAddress], + server.config[:Port], + options["baseurl"], + ) + end + + private + def format_url(ssl_enabled, address, port, baseurl = nil) format("%{prefix}://%{address}:%{port}%{baseurl}", { - :prefix => prefix ? "https" : "http", + :prefix => ssl_enabled ? "https" : "http", :address => address, :port => port, :baseurl => baseurl ? "#{baseurl}/" : "" @@ -143,7 +148,7 @@ def server_address(prefix, address, port, baseurl = nil) private def default_url(opts) config = configuration_from_options(opts) - server_address( + format_url( config["ssl_cert"] && config["ssl_key"], config["host"] == "127.0.0.1" ? "localhost" : config["host"], config["port"] From 63e4e750ec47b4dc1d6fbe717da47f354d9b56fc Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 6 Oct 2016 09:58:16 -0700 Subject: [PATCH 1499/4996] New site: lock minima to v2.x --- lib/jekyll/commands/new.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 0a0c8b53c2e..8319bd7efff 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -74,7 +74,7 @@ def gemfile_contents gem "jekyll", "#{Jekyll::VERSION}" # This is the default theme for new Jekyll sites. You may change this to anything you like. -gem "minima" +gem "minima", "~> 2.0" # If you want to use GitHub Pages, remove the "gem "jekyll"" above and # uncomment the line below. To upgrade, run `bundle update github-pages`. From 7c8c825f27fd96b223e32855520ba4fa0c6d3588 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 6 Oct 2016 10:01:55 -0700 Subject: [PATCH 1500/4996] Fix. --- site/_posts/2016-10-03-jekyll-3-3-0-released.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown b/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown index e4afb49c59f..af3948d349e 100644 --- a/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown +++ b/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown @@ -25,8 +25,8 @@ front matter, it will be converted and rendered. No YAML front matter, and it will simply be copied over like a static asset. Note that if a user has a file of the same path, the theme content will not -be included in the site, i.e. a user's `/assets/main.scss` will be written -instead of a theme's `/assets/main.scss`. It's +be included in the site, i.e. a user's `/assets/main.scss` will be read and +processed if present instead of a theme's `/assets/main.scss`. See our [documentation on the subject]({{ "/docs/themes/#assets" | relative_url }}) for more info. From ed042de6c4b989a72edc3216d46a975a372d6a17 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 6 Oct 2016 10:15:45 -0700 Subject: [PATCH 1501/4996] Oh fine, rubocop. --- lib/jekyll/commands/serve.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index d1b49f3df91..e0da4807915 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -129,7 +129,7 @@ def server_address(server, options = {}) server.config[:SSLEnable], server.config[:BindAddress], server.config[:Port], - options["baseurl"], + options["baseurl"] ) end From b37d18234a1d60af5ce76b4af2ca631dfc701ca0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 6 Oct 2016 10:22:23 -0700 Subject: [PATCH 1502/4996] Update history to reflect merge of #5433 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 34173a4b6ef..6ccc6d57fdb 100644 --- a/History.markdown +++ b/History.markdown @@ -34,6 +34,7 @@ * Remove autoload of Draft which no longer exists. (#5441) * Fix issue where Windows drive name is stripped from Jekyll.sanitized_path incorrectly (#5256) * Fix bug where `post_url` tag matched incorrect post with subdirectory (#4873) + * Fix loading data from subdir with a period in name (#5433) ### Site Enhancements From dc554c2cd58547fb6f5ed745fc7c6dcd5f78cfbb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 6 Oct 2016 10:36:50 -0700 Subject: [PATCH 1503/4996] Update history to reflect merge of #5456 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6ccc6d57fdb..4fac6ddb705 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Fix issue where Windows drive name is stripped from Jekyll.sanitized_path incorrectly (#5256) * Fix bug where `post_url` tag matched incorrect post with subdirectory (#4873) * Fix loading data from subdir with a period in name (#5433) + * Revert Commands::Serve#server_address signature change. (#5456) ### Site Enhancements From 8bac0559d12796e1372c0414b17c03156d14512e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 6 Oct 2016 10:41:24 -0700 Subject: [PATCH 1504/4996] Update history to reflect merge of #5442 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4fac6ddb705..cf7e50a60a5 100644 --- a/History.markdown +++ b/History.markdown @@ -79,6 +79,7 @@ * [docs] Update documentation regarding `bundle install` after `jekyll new` (#5428) * Replace classic box-sizing reset with inheritance reset (#5411) * Update Wikipedia YAML list link (#5452) + * Add Jekyll 3.3 release post (#5442) ### Development Fixes From 5e93ca63538c2bb98d35c9e3f3996b6e8fe079b7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 6 Oct 2016 11:12:15 -0700 Subject: [PATCH 1505/4996] Release :gem: 3.3.0 --- History.markdown | 2 +- lib/jekyll/version.rb | 2 +- site/_docs/history.md | 108 ++++++++++++++++++ ...kdown => 2016-10-06-jekyll-3-3-is-here.md} | 12 +- site/latest_version.txt | 2 +- 5 files changed, 121 insertions(+), 5 deletions(-) rename site/_posts/{2016-10-03-jekyll-3-3-0-released.markdown => 2016-10-06-jekyll-3-3-is-here.md} (85%) diff --git a/History.markdown b/History.markdown index cf7e50a60a5..7b30bd4d239 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,4 @@ -## HEAD +## 3.3.0 / 2016-10-06 ### Minor Enhancements diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 3e382c0160f..848b513b738 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.3.0.pre.rc1".freeze + VERSION = "3.3.0".freeze end diff --git a/site/_docs/history.md b/site/_docs/history.md index f17b535e374..b272bd53de8 100644 --- a/site/_docs/history.md +++ b/site/_docs/history.md @@ -5,6 +5,114 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.3.0 / 2016-10-06 +{: #v3-3-0} + +### Minor Enhancements +{: #minor-enhancements-v3-3-0} + +- Colorize interpolated output in logger.info ([#5239]({{ site.repository }}/issues/5239)) +- Site template: exclude Gemfile and Gemfile.lock in site config ([#5293]({{ site.repository }}/issues/5293)) +- Fix [#5233]({{ site.repository }}/issues/5233): Increase our ability to detect Windows. ([#5235]({{ site.repository }}/issues/5235)) +- update gitignore template to ignore theme gems built by user ([#5326]({{ site.repository }}/issues/5326)) +- Adds ability to link to all files ([#5199]({{ site.repository }}/issues/5199)) +- Exclude vendor by default ([#5361]({{ site.repository }}/issues/5361)) +- Add ThemeAssetsReader which reads assets from a theme ([#5364]({{ site.repository }}/issues/5364)) +- Add bundle install to jekyll new command ([#5237]({{ site.repository }}/issues/5237)) +- Add absolute_url and relative_url filters. ([#5399]({{ site.repository }}/issues/5399)) +- Site template: remove `css/` from new site scaffolding ([#5402]({{ site.repository }}/issues/5402)) +- Site template: Move contents of the index.html page to the 'home' layout ([#5420]({{ site.repository }}/issues/5420)) +- Exclude node_modules by default ([#5210]({{ site.repository }}/issues/5210)) +- Run hooks in priority order. ([#5157]({{ site.repository }}/issues/5157)) +- Add `static_file.name` and `.basename` Liquid attributes ([#5264]({{ site.repository }}/issues/5264)) +- set site.url in dev environment to `http://localhost:4000` ([#5431]({{ site.repository }}/issues/5431)) +- Add support for indented link references on excerpt ([#5212]({{ site.repository }}/issues/5212)) + +### Bug Fixes +{: #bug-fixes-v3-3-0} + +- Use jekyll-feed to generate the default site's RSS feed ([#5196]({{ site.repository }}/issues/5196)) +- Site#configure_theme: do not set theme unless it's a string ([#5189]({{ site.repository }}/issues/5189)) +- Convertible: set self.output in #render_all_layouts and #do_layout ([#5337]({{ site.repository }}/issues/5337)) +- Only complain about `kramdown.coderay` if it is actually in the config ([#5380]({{ site.repository }}/issues/5380)) +- Clarify documentation in theme gem's README template ([#5376]({{ site.repository }}/issues/5376)) +- Allow underscore in highlighter language ([#5375]({{ site.repository }}/issues/5375)) +- Site template: set empty url in config file by default ([#5338]({{ site.repository }}/issues/5338)) +- Site template config: prepend 'jekyll serve' with 'bundle exec' ([#5430]({{ site.repository }}/issues/5430)) +- Don't call `File.utime` for StaticFiles if it's a symlink ([#5427]({{ site.repository }}/issues/5427)) +- Fix handling of non-ASCII characters in new `*_url` filters ([#5410]({{ site.repository }}/issues/5410)) +- Remove autoload of Draft which no longer exists. ([#5441]({{ site.repository }}/issues/5441)) +- Fix issue where Windows drive name is stripped from Jekyll.sanitized_path incorrectly ([#5256]({{ site.repository }}/issues/5256)) +- Fix bug where `post_url` tag matched incorrect post with subdirectory ([#4873]({{ site.repository }}/issues/4873)) +- Fix loading data from subdir with a period in name ([#5433]({{ site.repository }}/issues/5433)) +- Revert Commands::Serve#server_address signature change. ([#5456]({{ site.repository }}/issues/5456)) + +### Site Enhancements +{: #site-enhancements-v3-3-0} + +- Document `to_integer` and `inspect` filters ([#5185]({{ site.repository }}/issues/5185)) +- Fix path in the prompt ([#5194]({{ site.repository }}/issues/5194)) +- need subcommand build ([#5190]({{ site.repository }}/issues/5190)) +- Add the Jekyll Cloudinary plugin ([#5183]({{ site.repository }}/issues/5183)) +- Documentation : `new-theme` command ([#5205]({{ site.repository }}/issues/5205)) +- Document `link` Liquid tag ([#5182]({{ site.repository }}/issues/5182)) +- Remove mention of page for link tag in release post ([#5214]({{ site.repository }}/issues/5214)) +- fixed typo ([#5226]({{ site.repository }}/issues/5226)) +- Add missing comma ([#5222]({{ site.repository }}/issues/5222)) +- Maintain aspect ratio with `height: auto;` ([#5254]({{ site.repository }}/issues/5254)) +- Fix a link in deployment-methods.md ([#5244]({{ site.repository }}/issues/5244)) +- Documentation: improve highlight in `Creating a theme` ([#5249]({{ site.repository }}/issues/5249)) +- Bundler isn't installed by default ([#5258]({{ site.repository }}/issues/5258)) +- Update troubleshooting documentation to include fix for issue with vendored gems ([#5271]({{ site.repository }}/issues/5271)) +- Link `--lsi` option's description to Wikipedia docs on LSI ([#5274]({{ site.repository }}/issues/5274)) +- Document `--profile` option on the configuration page ([#5279]({{ site.repository }}/issues/5279)) +- Update homepage to sync with merge of [#5258]({{ site.repository }}/issues/5258) ([#5287]({{ site.repository }}/issues/5287)) +- Add post about Jekyll Admin initial release ([#5291]({{ site.repository }}/issues/5291)) +- Replace liquid highlight tag with backticks ([#5262]({{ site.repository }}/issues/5262)) +- Word update ([#5294]({{ site.repository }}/issues/5294)) +- Site documentation section links always point to https://jekyllrb.com ([#5281]({{ site.repository }}/issues/5281)) +- Missing `:site, :post_render` payload documentation on site ([#5280]({{ site.repository }}/issues/5280)) +- Site: exclude README.md and .gitignore ([#5304]({{ site.repository }}/issues/5304)) +- Add link to Staticman ([#5224]({{ site.repository }}/issues/5224)) +- Update url for OpenShift ([#5320]({{ site.repository }}/issues/5320)) +- [docs] add help for missing static_file e.g. on heroku ([#5334]({{ site.repository }}/issues/5334)) +- Add a line about updating theme-gems in the docs ([#5318]({{ site.repository }}/issues/5318)) +- Explain how to copy a theme's files ([#5335]({{ site.repository }}/issues/5335)) +- [docs] .md as default extension in examples ([#5316]({{ site.repository }}/issues/5316)) +- Fix small typo in docs ([#5347]({{ site.repository }}/issues/5347)) +- Add missing period to sentence in first paragraph. ([#5372]({{ site.repository }}/issues/5372)) +- added jekyll-spotify plugin ([#5369]({{ site.repository }}/issues/5369)) +- Add jekyll-menus to the list of plugins. ([#5397]({{ site.repository }}/issues/5397)) +- macOS and one grammar fix ([#5403]({{ site.repository }}/issues/5403)) +- Add documentation for `relative_url` and `absolute_url` ([#5405]({{ site.repository }}/issues/5405)) +- Bugfix on logo in JSON-LD ([#5421]({{ site.repository }}/issues/5421)) +- Fix Travis.ci documentation ([#5413]({{ site.repository }}/issues/5413)) +- [docs] Update documentation regarding `bundle install` after `jekyll new` ([#5428]({{ site.repository }}/issues/5428)) +- Replace classic box-sizing reset with inheritance reset ([#5411]({{ site.repository }}/issues/5411)) +- Update Wikipedia YAML list link ([#5452]({{ site.repository }}/issues/5452)) +- Add Jekyll 3.3 release post ([#5442]({{ site.repository }}/issues/5442)) + +### Development Fixes +{: #development-fixes-v3-3-0} + +- Update appveyor.yml and fix optional deps for Ruby x64 ([#5180]({{ site.repository }}/issues/5180)) +- Improve tests for Jekyll::PluginManager ([#5167]({{ site.repository }}/issues/5167)) +- Update Ruby versions in travis.yml ([#5221]({{ site.repository }}/issues/5221)) +- Avoid installing unecessary gems for site testing ([#5272]({{ site.repository }}/issues/5272)) +- Proposal: Affinity teams and their captains ([#5273]({{ site.repository }}/issues/5273)) +- Replace duplicate with postive local test in issue template ([#5286]({{ site.repository }}/issues/5286)) +- Update AppVeyor config. ([#5240]({{ site.repository }}/issues/5240)) +- Execute jekyll from clone instead of defined binary when running 'script/default-site' ([#5295]({{ site.repository }}/issues/5295)) +- rubocop: lib/jekyll/document.rb complexity fixes ([#5045]({{ site.repository }}/issues/5045)) +- Proxy a number of Convertible methods to Renderer ([#5308]({{ site.repository }}/issues/5308)) +- Run executable for Cucumber via Ruby instead of Shell ([#5383]({{ site.repository }}/issues/5383)) +- Appease Rubocop ([#5381]({{ site.repository }}/issues/5381)) +- remove features' directories on windows with proper access ([#5389]({{ site.repository }}/issues/5389)) +- `site_configuration.feature`: use UTC format in timezone ([#5416]({{ site.repository }}/issues/5416)) +- swallow bundle output from `jekyll new` while in CI ([#5408]({{ site.repository }}/issues/5408)) +- Add .editorconfig ([#5412]({{ site.repository }}/issues/5412)) + + ## 3.2.1 / 2016-08-02 {: #v3-2-1} diff --git a/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown b/site/_posts/2016-10-06-jekyll-3-3-is-here.md similarity index 85% rename from site/_posts/2016-10-03-jekyll-3-3-0-released.markdown rename to site/_posts/2016-10-06-jekyll-3-3-is-here.md index af3948d349e..93f366f1728 100644 --- a/site/_posts/2016-10-03-jekyll-3-3-0-released.markdown +++ b/site/_posts/2016-10-06-jekyll-3-3-is-here.md @@ -1,7 +1,7 @@ --- layout: news_item title: 'Jekyll 3.3 is here with better theme support, new URL filters, and tons more' -date: 2016-10-03 17:08:38 -0700 +date: 2016-10-06 11:10:38 -0700 author: parkr version: 3.3.0 categories: [release] @@ -93,7 +93,15 @@ greater stability and reliability to your everyday development workflow. As always, thanks to our many contributors who contributed countless hours of their free time to making this release happen: -!! TODO: Add list of contributors for this release! +Anatoliy Yastreb, Anthony Gaudino, Antonio, Ashwin Maroli, Ben Balter, +Charles Horn, Chris Finazzo, Daniel Chapman, David Zhang, Eduardo +Bouças, Edward Thomson, Eloy Espinaco, Florian Thomas, Frank Taillandier, +Gerardo, Heng Kwokfu, Heng, K. (Stephen), Jeff Kolesky, Jonathan Thornton, +Jordon Bedwell, Jussi Kinnula, Júnior Messias, Kyle O'Brien, Manmeet Gill, +Mark H. Wilkinson, Marko Locher, Mertcan GÖKGÖZ, Michal Švácha, Mike +Kasberg, Nadjib Amar, Nicolas Hoizey, Nicolas Porcel, Parker Moore, Pat +Hawks, Patrick Marsceill, Stephen Checkoway, Stuart Kent, XhmikosR, Zlatan +Vasović, mertkahyaoglu, shingo-nakanishi, and vohedge. [Full release notes]({{ "/docs/history/#v3-3-0" | relative_url }}) are available for your perusal. If you notice any issues, please don't hesitate to file a diff --git a/site/latest_version.txt b/site/latest_version.txt index e4604e3afd0..15a27998172 100644 --- a/site/latest_version.txt +++ b/site/latest_version.txt @@ -1 +1 @@ -3.2.1 +3.3.0 From 08b30056b74c242e60ee52ffe5ed1e6c2139c827 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 6 Oct 2016 23:42:16 +0530 Subject: [PATCH 1506/4996] replace development_dependency with runtime_dependency --- lib/theme_template/theme.gemspec.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/theme_template/theme.gemspec.erb b/lib/theme_template/theme.gemspec.erb index d0714ffce15..44c8feba61a 100644 --- a/lib/theme_template/theme.gemspec.erb +++ b/lib/theme_template/theme.gemspec.erb @@ -12,7 +12,8 @@ Gem::Specification.new do |spec| spec.files = `git ls-files -z`.split("\x0").select { |f| f.match(%r{^(<%= theme_directories.join("|") %>|LICENSE|README)}i) } - spec.add_development_dependency "jekyll", "~> <%= jekyll_version_with_minor %>" + spec.add_runtime_dependency "jekyll", "~> <%= jekyll_version_with_minor %>" + spec.add_development_dependency "bundler", "~> 1.12" spec.add_development_dependency "rake", "~> 10.0" end From 53d472b7e297f2e5267aebbd3e160cd9e88c82bd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 6 Oct 2016 11:45:20 -0700 Subject: [PATCH 1507/4996] Update history to reflect merge of #5449 [ci skip] --- History.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/History.markdown b/History.markdown index 7b30bd4d239..2cf97efdd7a 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,9 @@ +## HEAD + +### Site Enhancements + + * Documentation: {% link %} tag (#5449) + ## 3.3.0 / 2016-10-06 ### Minor Enhancements From 884962c20eb3d3de6b239a3a67cd3cb2876da21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zlatan=20Vasovi=C4=87?= Date: Fri, 7 Oct 2016 19:54:40 +0200 Subject: [PATCH 1508/4996] Fix broken forum link help.jekyllrb.com has been replaced with talk.jekyllrb.com :boom: --- docs/becoming-a-maintainer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/becoming-a-maintainer.md b/docs/becoming-a-maintainer.md index 28f1f70b5f8..f6473787294 100644 --- a/docs/becoming-a-maintainer.md +++ b/docs/becoming-a-maintainer.md @@ -32,4 +32,4 @@ We would love to expand the team and look forward to many more community members # Helping Out Elsewhere -In addition to maintainers of our core and plugin code, the Jekyll team is comprised of moderators for our forums. These helpful community members take a look at the topics posted to https://help.jekyllrb.com and ensure they are properly categorized and are acceptable under our Code of Conduct. If you would like to be a moderator, email one of the maintainers with links to where you have answered questions and a request to be added as a moderator. More help is always welcome. +In addition to maintainers of our core and plugin code, the Jekyll team is comprised of moderators for our forums. These helpful community members take a look at the topics posted to https://talk.jekyllrb.com and ensure they are properly categorized and are acceptable under our Code of Conduct. If you would like to be a moderator, email one of the maintainers with links to where you have answered questions and a request to be added as a moderator. More help is always welcome. From c569edcf0a87626bb8815b0cc78bc713ad961d9b Mon Sep 17 00:00:00 2001 From: chrisfinazzo Date: Sun, 9 Oct 2016 11:36:04 -0400 Subject: [PATCH 1509/4996] Update normalize.css to v5.0.0 --- site/_sass/_normalize.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_sass/_normalize.scss b/site/_sass/_normalize.scss index 8d46a8ee270..b1f94f9db46 100644 --- a/site/_sass/_normalize.scss +++ b/site/_sass/_normalize.scss @@ -1 +1 @@ -/*! normalize.css v4.2.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}template,[hidden]{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:0.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none} From f2fcd176270e35dbddbc92a0e05e5f5ba841bfcb Mon Sep 17 00:00:00 2001 From: Michael Large Date: Mon, 10 Oct 2016 11:10:41 -0400 Subject: [PATCH 1510/4996] Fix typo in theme_template README --- lib/theme_template/README.md.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/theme_template/README.md.erb b/lib/theme_template/README.md.erb index 71cf29d393c..dbcb9cdaa43 100644 --- a/lib/theme_template/README.md.erb +++ b/lib/theme_template/README.md.erb @@ -38,7 +38,7 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN To set up your environment to develop this theme, run `bundle install`. -You theme is setup just like a normal Jelyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal. +You theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal. When your theme is released, only the files in `_layouts`, `_includes`, and `_sass` tracked with Git will be released. From 6cec4aebc6ad485040a4ec731733942781e1acdc Mon Sep 17 00:00:00 2001 From: Michael Large Date: Tue, 11 Oct 2016 09:05:39 -0400 Subject: [PATCH 1511/4996] Additional typo related to pull request #5472 --- lib/theme_template/README.md.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/theme_template/README.md.erb b/lib/theme_template/README.md.erb index dbcb9cdaa43..5c86314426e 100644 --- a/lib/theme_template/README.md.erb +++ b/lib/theme_template/README.md.erb @@ -38,7 +38,7 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN To set up your environment to develop this theme, run `bundle install`. -You theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal. +Your theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal. When your theme is released, only the files in `_layouts`, `_includes`, and `_sass` tracked with Git will be released. From d4b7b4432874aedd15039d862258227a12654425 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 11 Oct 2016 08:46:53 -0700 Subject: [PATCH 1512/4996] Update history to reflect merge of #5475 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2cf97efdd7a..a0ccb2e0814 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Site Enhancements * Documentation: {% link %} tag (#5449) + * Updating install instruction link for Jekyll 3 on Windows (#5475) ## 3.3.0 / 2016-10-06 From 0d12a02893baad606b89c426973db640de7ab83a Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 12 Oct 2016 14:35:39 +0530 Subject: [PATCH 1513/4996] script/test: add missing whitespace --- script/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/test b/script/test index 133b9807657..09f7eaa66c4 100755 --- a/script/test +++ b/script/test @@ -50,7 +50,7 @@ for ruby in $rubies; do rake TESTOPTS=$testopts test else set -x - time $ruby -S bundle exec ruby -Itest \ + time $ruby -S bundle exec ruby -I test \ "$@" $testops fi done From aa97be3ab5f66fde36e2019f0167ef9d02e9e736 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 12 Oct 2016 15:34:51 -0700 Subject: [PATCH 1514/4996] Update history to reflect merge of #5471 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a0ccb2e0814..0f3d92f0638 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Documentation: {% link %} tag (#5449) * Updating install instruction link for Jekyll 3 on Windows (#5475) + * Update normalize.css to v5.0.0 (#5471) ## 3.3.0 / 2016-10-06 From c9d24b7d188f4547d3ab386cbd483a4628998fd6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 12 Oct 2016 17:53:51 -0700 Subject: [PATCH 1515/4996] Update history to reflect merge of #5472 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 0f3d92f0638..067f4c3d731 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,10 @@ * Updating install instruction link for Jekyll 3 on Windows (#5475) * Update normalize.css to v5.0.0 (#5471) +### Bug Fixes + + * Fix typo in theme_template README (#5472) + ## 3.3.0 / 2016-10-06 ### Minor Enhancements From d1f67bf85ad2302cc4f750f2ba260f0047eae462 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 17 Oct 2016 08:56:04 +0530 Subject: [PATCH 1516/4996] fix rubocop errors on testing with Rubocop 0.44 - have the new `Metrics/BlockLength` cop ignore test files and `jekyll/configuration.rb` - have `AllCops` ignore Jekyll Executable which is not going to be altered in the near future. --- .rubocop.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.rubocop.yml b/.rubocop.yml index b0fef47a254..0324c4121b8 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -6,6 +6,7 @@ AllCops: Exclude: - lib/jekyll/renderer.rb - bin/**/* + - exe/**/* - benchmark/**/* - script/**/* - vendor/**/* @@ -17,6 +18,10 @@ Lint/UselessAccessModifier: Enabled: false Metrics/AbcSize: Max: 21 +Metrics/BlockLength: + Exclude: + - test/**/*.rb + - lib/jekyll/configuration.rb Metrics/ClassLength: Exclude: - !ruby/regexp /features\/.*.rb$/ From 6ec86f42078afd07b739670e8d773b61ff840476 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Tue, 18 Oct 2016 16:20:41 +0530 Subject: [PATCH 1517/4996] Add jekyll-data to the list of plugins --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index f8909ddbeb0..58d61a49e43 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -912,6 +912,7 @@ LESS.js files during generation. - [generator-jekyllized](https://github.com/sondr3/generator-jekyllized): A Yeoman generator for rapidly developing sites with Gulp. Live reload your site, automatically minify and optimize your assets and much more. - [Jekyll-Spotify](https://github.com/MertcanGokgoz/Jekyll-Spotify): Easily output Spotify Embed Player for jekyll - [jekyll-menus](https://github.com/forestryio/jekyll-menus): Hugo style menus for your Jekyll site... recursive menus included. +- [jekyll-data](https://github.com/ashmaroli/jekyll-data): Read data files within Jekyll Theme Gems. #### Editors From 1f9c2b138040512d6385fc4f3252038dfde58e64 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 Oct 2016 09:49:12 -0700 Subject: [PATCH 1518/4996] Update history to reflect merge of #5491 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 067f4c3d731..885b2589b98 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,7 @@ * Documentation: {% link %} tag (#5449) * Updating install instruction link for Jekyll 3 on Windows (#5475) * Update normalize.css to v5.0.0 (#5471) + * Add jekyll-data to the list of plugins (#5491) ### Bug Fixes From 0a1c837755a437ce1683139bc784e90fc172af23 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 Oct 2016 09:50:50 -0700 Subject: [PATCH 1519/4996] Update history to reflect merge of #5489 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 885b2589b98..2ed9d98a75e 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,10 @@ * Fix typo in theme_template README (#5472) +### Development Fixes + + * fix rubocop errors on testing with Rubocop 0.44 (#5489) + ## 3.3.0 / 2016-10-06 ### Minor Enhancements From 00e3c979c92a684b00bbd126dbf6141dd856e0b5 Mon Sep 17 00:00:00 2001 From: Tan Nhu Date: Tue, 18 Oct 2016 09:51:16 -0700 Subject: [PATCH 1520/4996] Add jekyll-include-absolute-plugin --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 58d61a49e43..70d06f24d15 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -866,6 +866,7 @@ LESS.js files during generation. - [Jekyll Tags List Plugin](https://github.com/crispgm/jekyll-tags-list-plugin): A Liquid tag plugin that creates tags list in specific order. - [Jekyll Maps](https://github.com/ayastreb/jekyll-maps) by [Anatoliy Yastreb](https://github.com/ayastreb): A Jekyll plugin to easily embed maps with filterable locations. - [Jekyll Cloudinary](https://nhoizey.github.io/jekyll-cloudinary/) by [Nicolas Hoizey](https://nicolas-hoizey.com/): a Jekyll plugin adding a Liquid tag to ease the use of Cloudinary for responsive images in your Markdown/Kramdown posts. +- [jekyll-include-absolute-plugin](https://github.com/tnhu/jekyll-include-absolute-plugin) by [Tan Nhu](https://github.com/tnhu): A Jekyll to include a file from its path relate to Jekyll's source folder. #### Collections From 53d20bc77ef3a64bd6045268416c93e1e6e4df5d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 Oct 2016 09:51:45 -0700 Subject: [PATCH 1521/4996] Update history to reflect merge of #5479 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2ed9d98a75e..d096ad54455 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ ### Development Fixes * fix rubocop errors on testing with Rubocop 0.44 (#5489) + * script/test: add missing whitespace (#5479) ## 3.3.0 / 2016-10-06 From b9275920ddef681c652c89c11c1aa6e09571f133 Mon Sep 17 00:00:00 2001 From: Tan Nhu Date: Tue, 18 Oct 2016 09:52:57 -0700 Subject: [PATCH 1522/4996] Update jekyll-include-absolute-plugin description --- site/_docs/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 70d06f24d15..85d193ec4e1 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -866,7 +866,7 @@ LESS.js files during generation. - [Jekyll Tags List Plugin](https://github.com/crispgm/jekyll-tags-list-plugin): A Liquid tag plugin that creates tags list in specific order. - [Jekyll Maps](https://github.com/ayastreb/jekyll-maps) by [Anatoliy Yastreb](https://github.com/ayastreb): A Jekyll plugin to easily embed maps with filterable locations. - [Jekyll Cloudinary](https://nhoizey.github.io/jekyll-cloudinary/) by [Nicolas Hoizey](https://nicolas-hoizey.com/): a Jekyll plugin adding a Liquid tag to ease the use of Cloudinary for responsive images in your Markdown/Kramdown posts. -- [jekyll-include-absolute-plugin](https://github.com/tnhu/jekyll-include-absolute-plugin) by [Tan Nhu](https://github.com/tnhu): A Jekyll to include a file from its path relate to Jekyll's source folder. +- [jekyll-include-absolute-plugin](https://github.com/tnhu/jekyll-include-absolute-plugin) by [Tan Nhu](https://github.com/tnhu): A Jekyll plugin to include a file from its path relate to Jekyll's source folder. #### Collections From c4a23b4ced7341f83b0bd9b4915d6f860d583cc5 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 18 Oct 2016 18:53:54 -0500 Subject: [PATCH 1523/4996] Collapse gsub --- lib/jekyll/frontmatter_defaults.rb | 2 +- lib/jekyll/readers/data_reader.rb | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index 0614975ab00..7cbfa358677 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -188,7 +188,7 @@ def sanitize_path(path) if path.nil? || path.empty? "" else - path.gsub(%r!\A/!, "").gsub(%r!([^/])\z!, '\1') + path.gsub(%r!\A/|(?<=[^/])\z!, "".freeze) end end end diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index 370a6893267..0afbad61274 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -62,8 +62,7 @@ def read_data_file(path) end def sanitize_filename(name) - name.gsub!(%r![^\w\s-]+!, "") - name.gsub!(%r!(^|\b\s)\s+($|\s?\b)!, '\\1\\2') + name.gsub!(%r![^\w\s-]+|(?<=^|\b\s)\s+(?=$|\s?\b)!, "".freeze) name.gsub(%r!\s+!, "_") end end From 51d9be83a10a976499c42339310e519855f684e4 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 18 Oct 2016 19:45:03 -0500 Subject: [PATCH 1524/4996] Do not swallow all exceptions on render --- lib/jekyll/site.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 661365416d9..7f6531bca0f 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -191,11 +191,7 @@ def render render_pages(payload) Jekyll::Hooks.trigger :site, :post_render, self, payload - # rubocop: disable HandleExceptions - rescue Errno::ENOENT - # ignore missing layout dir end - # rubocop: enable HandleExceptions # Remove orphaned files and empty directories in destination. # From cc1972848d97d5a409d48cc3606e8659f720cd8f Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 18 Oct 2016 19:51:54 -0500 Subject: [PATCH 1525/4996] Restrict Rubocop version --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index f1a4afb7682..464ab468f69 100644 --- a/Gemfile +++ b/Gemfile @@ -18,7 +18,7 @@ end # group :test do - gem "rubocop" + gem "rubocop", "~> 0.44.1" gem "cucumber", "~> 2.1" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" From 8a4edc550bb02c973fc87b09f92ef80201295594 Mon Sep 17 00:00:00 2001 From: Scott King Date: Tue, 18 Oct 2016 21:07:58 -0400 Subject: [PATCH 1526/4996] Add info about checking version + updating --- site/_docs/installation.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/site/_docs/installation.md b/site/_docs/installation.md index 676bccb4814..b8b8eeef393 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -103,4 +103,25 @@ Check out [the extras page](../extras/) for more information.

    -Now that you’ve got everything installed, let’s get to work! +## Already Have Jekyll? + +Before you start developing with Jekyll, you may want to check that you're up to date with the latest version. To find your version of Jekyll, run one of these commands: + +```sh +$ jekyll --version +$ gem list jekyll +``` + +You can always use RubyGems to find the current stable version of the Jekyll gem. But you can also use the `gem` command line tool: + +```sh +$ gem search jekyll --remote +``` + +and you'll search for just the name `Jekyll`, and in brackets will be latest version. If you aren't running the latest version, run the update command: + +```sh +$ gem update jekyll +``` + +Now that you’ve got everything up-to-date and installed, let’s get to work! From e6829b594984d4a2e744d6d09fbd8e63024f88dc Mon Sep 17 00:00:00 2001 From: Scott King Date: Tue, 18 Oct 2016 21:15:50 -0400 Subject: [PATCH 1527/4996] Fix some typos --- site/_docs/installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_docs/installation.md b/site/_docs/installation.md index b8b8eeef393..5c618a874b9 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -112,13 +112,13 @@ $ jekyll --version $ gem list jekyll ``` -You can always use RubyGems to find the current stable version of the Jekyll gem. But you can also use the `gem` command line tool: +You can also use RubyGems to find the current versioning of any gem. But you can also use the `gem` command line tool: ```sh $ gem search jekyll --remote ``` -and you'll search for just the name `Jekyll`, and in brackets will be latest version. If you aren't running the latest version, run the update command: +and you'll search for just the name `jekyll`, and in brackets will be latest version. If you aren't running the latest version, run the update command: ```sh $ gem update jekyll From 2be5d560598002146c4f9e11568929eac02c5e44 Mon Sep 17 00:00:00 2001 From: Scott King Date: Tue, 18 Oct 2016 21:32:40 -0400 Subject: [PATCH 1528/4996] Fix some typos --- site/_docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/installation.md b/site/_docs/installation.md index 5c618a874b9..b61f439fe20 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -112,7 +112,7 @@ $ jekyll --version $ gem list jekyll ``` -You can also use RubyGems to find the current versioning of any gem. But you can also use the `gem` command line tool: +You can also use [RubyGems](https://rubygems.org/gems/jekyll) to find the current versioning of any gem. But you can also use the `gem` command line tool: ```sh $ gem search jekyll --remote From 0f5c34d16d957247bbb396b093320a9fc777f912 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 Oct 2016 18:38:14 -0700 Subject: [PATCH 1529/4996] Update history to reflect merge of #5494 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index d096ad54455..06660408799 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,10 @@ * fix rubocop errors on testing with Rubocop 0.44 (#5489) * script/test: add missing whitespace (#5479) +### Minor Enhancements + + * Collapse `gsub` (#5494) + ## 3.3.0 / 2016-10-06 ### Minor Enhancements From ea72f98609b09fe25a89c1f20a4bfe079b5d029c Mon Sep 17 00:00:00 2001 From: Tan Nhu Date: Wed, 19 Oct 2016 00:53:44 -0700 Subject: [PATCH 1530/4996] Fix typo --- site/_docs/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 85d193ec4e1..6e5bbf23847 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -866,7 +866,7 @@ LESS.js files during generation. - [Jekyll Tags List Plugin](https://github.com/crispgm/jekyll-tags-list-plugin): A Liquid tag plugin that creates tags list in specific order. - [Jekyll Maps](https://github.com/ayastreb/jekyll-maps) by [Anatoliy Yastreb](https://github.com/ayastreb): A Jekyll plugin to easily embed maps with filterable locations. - [Jekyll Cloudinary](https://nhoizey.github.io/jekyll-cloudinary/) by [Nicolas Hoizey](https://nicolas-hoizey.com/): a Jekyll plugin adding a Liquid tag to ease the use of Cloudinary for responsive images in your Markdown/Kramdown posts. -- [jekyll-include-absolute-plugin](https://github.com/tnhu/jekyll-include-absolute-plugin) by [Tan Nhu](https://github.com/tnhu): A Jekyll plugin to include a file from its path relate to Jekyll's source folder. +- [jekyll-include-absolute-plugin](https://github.com/tnhu/jekyll-include-absolute-plugin) by [Tan Nhu](https://github.com/tnhu): A Jekyll plugin to include a file from its path relative to Jekyll's source folder. #### Collections From c7d0dda5a76db5360348bc9487d5171573b9ed9a Mon Sep 17 00:00:00 2001 From: Scott King Date: Wed, 19 Oct 2016 09:40:43 -0400 Subject: [PATCH 1531/4996] Add comment about gem outdated --- site/_docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/installation.md b/site/_docs/installation.md index b61f439fe20..ee27f15f6f0 100644 --- a/site/_docs/installation.md +++ b/site/_docs/installation.md @@ -118,7 +118,7 @@ You can also use [RubyGems](https://rubygems.org/gems/jekyll) to find the curren $ gem search jekyll --remote ``` -and you'll search for just the name `jekyll`, and in brackets will be latest version. If you aren't running the latest version, run the update command: +and you'll search for just the name `jekyll`, and in brackets will be latest version. Another way to check if you have the latest version is to run the command `gem outdated`. This will provide a list of all the gems on your system that need to be updated. If you aren't running the latest version, run this command: ```sh $ gem update jekyll From 344d07cb559076069c0cb689a06156315ce6f8d5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 19 Oct 2016 10:40:43 -0700 Subject: [PATCH 1532/4996] Update history to reflect merge of #5497 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 06660408799..74512c74fcf 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,7 @@ * Updating install instruction link for Jekyll 3 on Windows (#5475) * Update normalize.css to v5.0.0 (#5471) * Add jekyll-data to the list of plugins (#5491) + * Add info about checking version + updating (#5497) ### Bug Fixes From 124c63fd59d9b16b741613787200421dca36ed7a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 19 Oct 2016 10:58:48 -0700 Subject: [PATCH 1533/4996] Update history to reflect merge of #5492 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 74512c74fcf..d30ca866f02 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * Update normalize.css to v5.0.0 (#5471) * Add jekyll-data to the list of plugins (#5491) * Add info about checking version + updating (#5497) + * Add jekyll-include-absolute-plugin to list of third-party plugins (#5492) ### Bug Fixes From 821a84516677966a1f3b527d9d9daa5623a3452f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 19 Oct 2016 12:10:11 -0700 Subject: [PATCH 1534/4996] Update history to reflect merge of #5496 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d30ca866f02..89b25a3668f 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * fix rubocop errors on testing with Rubocop 0.44 (#5489) * script/test: add missing whitespace (#5479) + * Restrict Rubocop version (#5496) ### Minor Enhancements From 3431c9f7b8093c9f4fb90d87d909c982541a5a95 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 19 Oct 2016 21:24:11 -0700 Subject: [PATCH 1535/4996] Update history to reflect merge of #5495 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 89b25a3668f..d646d09d521 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ ### Bug Fixes * Fix typo in theme_template README (#5472) + * Do not swallow all exceptions on render (#5495) ### Development Fixes From 11a0b6578ebb9fae24189e7a1b3ed50f4532408f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 20 Oct 2016 21:12:16 +0200 Subject: [PATCH 1536/4996] Remove jekyll-hook from deployment methods --- site/_docs/deployment-methods.md | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index ad73c337295..937e418f10b 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -72,19 +72,6 @@ Deploying is now as easy as telling nginx or Apache to look at laptops$ git push deploy master ``` -### Jekyll-hook - -You can also use jekyll-hook, a server that listens for webhook posts from -GitHub, generates a website with Jekyll, and moves it somewhere to be -published. Use this to run your own GitHub Pages-style web server. - -This method is useful if you need to serve your websites behind a firewall, -need extra server-level features like HTTP basic authentication or want to -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). From 4d597643ecb7f318b45048649b17cfaba9b9173e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 20 Oct 2016 13:12:08 -0700 Subject: [PATCH 1537/4996] Update history to reflect merge of #5502 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d646d09d521..8994d803680 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * Add jekyll-data to the list of plugins (#5491) * Add info about checking version + updating (#5497) * Add jekyll-include-absolute-plugin to list of third-party plugins (#5492) + * Remove jekyll-hook from deployment methods (#5502) ### Bug Fixes From d6844d284ce1572257ee06402b5def9996a26838 Mon Sep 17 00:00:00 2001 From: baiyangcao Date: Fri, 21 Oct 2016 13:30:26 +0800 Subject: [PATCH 1538/4996] Update deployment-methods.md --- site/_docs/deployment-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index 937e418f10b..d3cf35a0c8d 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -89,7 +89,7 @@ Once you’ve generated the `_site` directory, you can easily scp it using a need to change the values to reflect your site’s details. There is even [a matching TextMate command][] that will help you run this script. -[this deploy script here]: https://github.com/henrik/henrik.nyh.se/blob/master/script/deploy +[this deploy script]: https://github.com/henrik/henrik.nyh.se/blob/master/script/deploy [a matching TextMate command]: https://gist.github.com/henrik/214959 From 8ed9863f078e9c3166fe16f20d9ac99e911d5ce1 Mon Sep 17 00:00:00 2001 From: Matthew Gifford Date: Tue, 18 Oct 2016 12:59:32 -0700 Subject: [PATCH 1539/4996] Add two plugins to the plugins page --- site/_docs/plugins.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 6e5bbf23847..9d76a6b322a 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -804,6 +804,7 @@ LESS.js files during generation. - [jekyll-roman](https://github.com/paulrobertlloyd/jekyll-roman): A liquid filter for Jekyll that converts numbers into Roman numerals. - [jekyll-typogrify](https://github.com/myles/jekyll-typogrify): A Jekyll plugin that brings the functions of [typogruby](http://avdgaag.github.io/typogruby/). - [Jekyll Email Protect](https://github.com/vwochnik/jekyll-email-protect): Email protection liquid filter for Jekyll +- [Jekyll Uglify Filter](https://github.com/mattg/jekyll-uglify-filter): A Liquid filter that runs your JavaScript through UglifyJS. #### Tags @@ -867,6 +868,7 @@ LESS.js files during generation. - [Jekyll Maps](https://github.com/ayastreb/jekyll-maps) by [Anatoliy Yastreb](https://github.com/ayastreb): A Jekyll plugin to easily embed maps with filterable locations. - [Jekyll Cloudinary](https://nhoizey.github.io/jekyll-cloudinary/) by [Nicolas Hoizey](https://nicolas-hoizey.com/): a Jekyll plugin adding a Liquid tag to ease the use of Cloudinary for responsive images in your Markdown/Kramdown posts. - [jekyll-include-absolute-plugin](https://github.com/tnhu/jekyll-include-absolute-plugin) by [Tan Nhu](https://github.com/tnhu): A Jekyll plugin to include a file from its path relative to Jekyll's source folder. +- [Jekyll Download Tag](https://github.com/mattg/jekyll-download-tag): A Liquid tag that acts like `include`, but for external resources. #### Collections From 12a86c1298f31f2e210c48c5fa433eae2e18a74a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 21 Oct 2016 13:58:47 -0700 Subject: [PATCH 1540/4996] Update history to reflect merge of #5504 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8994d803680..43014a64708 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,7 @@ * Add info about checking version + updating (#5497) * Add jekyll-include-absolute-plugin to list of third-party plugins (#5492) * Remove jekyll-hook from deployment methods (#5502) + * Update deployment-methods.md (#5504) ### Bug Fixes From 7729d12cdcd55059c1628d088d68cedf51073d2d Mon Sep 17 00:00:00 2001 From: fen Date: Sat, 22 Oct 2016 03:13:30 +0200 Subject: [PATCH 1541/4996] include a hashbang for all benchmark scripts this also makes every benchmark script executable --- benchmark/capture-assign.rb | 1 + benchmark/end-with-vs-regexp | 1 + benchmark/file-dir-ensure-trailing-slash | 0 benchmark/flat-map | 1 + benchmark/hash-fetch | 1 + benchmark/jekyll-sanitize-path | 0 benchmark/proc-call-vs-yield | 1 + benchmark/regexp-vs-include.rb | 0 benchmark/sequential-assignment | 1 + benchmark/string-concat | 1 + benchmark/string-replacement | 1 + benchmark/symbol-to-proc | 1 + 12 files changed, 9 insertions(+) mode change 100644 => 100755 benchmark/capture-assign.rb mode change 100644 => 100755 benchmark/end-with-vs-regexp mode change 100644 => 100755 benchmark/file-dir-ensure-trailing-slash mode change 100644 => 100755 benchmark/flat-map mode change 100644 => 100755 benchmark/hash-fetch mode change 100644 => 100755 benchmark/jekyll-sanitize-path mode change 100644 => 100755 benchmark/proc-call-vs-yield mode change 100644 => 100755 benchmark/regexp-vs-include.rb mode change 100644 => 100755 benchmark/sequential-assignment mode change 100644 => 100755 benchmark/string-concat mode change 100644 => 100755 benchmark/string-replacement mode change 100644 => 100755 benchmark/symbol-to-proc diff --git a/benchmark/capture-assign.rb b/benchmark/capture-assign.rb old mode 100644 new mode 100755 index e7ad49ba116..7a127ad218a --- a/benchmark/capture-assign.rb +++ b/benchmark/capture-assign.rb @@ -1,3 +1,4 @@ +#!/usr/bin/env ruby require "liquid" require "benchmark/ips" diff --git a/benchmark/end-with-vs-regexp b/benchmark/end-with-vs-regexp old mode 100644 new mode 100755 index 76f0312b93b..2ba5a3078c1 --- a/benchmark/end-with-vs-regexp +++ b/benchmark/end-with-vs-regexp @@ -1,3 +1,4 @@ +#!/usr/bin/env ruby require 'benchmark/ips' Benchmark.ips do |x| diff --git a/benchmark/file-dir-ensure-trailing-slash b/benchmark/file-dir-ensure-trailing-slash old mode 100644 new mode 100755 diff --git a/benchmark/flat-map b/benchmark/flat-map old mode 100644 new mode 100755 index 547bcee12de..18f0cfdbe03 --- a/benchmark/flat-map +++ b/benchmark/flat-map @@ -1,3 +1,4 @@ +#!/usr/bin/env ruby require 'benchmark/ips' enum = (0..50).to_a diff --git a/benchmark/hash-fetch b/benchmark/hash-fetch old mode 100644 new mode 100755 index 357083576ca..d7427d5364a --- a/benchmark/hash-fetch +++ b/benchmark/hash-fetch @@ -1,3 +1,4 @@ +#!/usr/bin/env ruby require 'benchmark/ips' h = {:bar => 'uco'} diff --git a/benchmark/jekyll-sanitize-path b/benchmark/jekyll-sanitize-path old mode 100644 new mode 100755 diff --git a/benchmark/proc-call-vs-yield b/benchmark/proc-call-vs-yield old mode 100644 new mode 100755 index 3d55979bab1..9b4ad3755ae --- a/benchmark/proc-call-vs-yield +++ b/benchmark/proc-call-vs-yield @@ -1,3 +1,4 @@ +#!/usr/bin/env ruby require 'benchmark/ips' def fast diff --git a/benchmark/regexp-vs-include.rb b/benchmark/regexp-vs-include.rb old mode 100644 new mode 100755 diff --git a/benchmark/sequential-assignment b/benchmark/sequential-assignment old mode 100644 new mode 100755 index 945e982b25f..790e995c367 --- a/benchmark/sequential-assignment +++ b/benchmark/sequential-assignment @@ -1,3 +1,4 @@ +#!/usr/bin/env ruby require 'benchmark/ips' Benchmark.ips do |x| diff --git a/benchmark/string-concat b/benchmark/string-concat old mode 100644 new mode 100755 index c4a9174836d..c5397088764 --- a/benchmark/string-concat +++ b/benchmark/string-concat @@ -1,3 +1,4 @@ +#!/usr/bin/env ruby require 'benchmark/ips' url = "http://jekyllrb.com" diff --git a/benchmark/string-replacement b/benchmark/string-replacement old mode 100644 new mode 100755 index 36de613c31e..f522cfef517 --- a/benchmark/string-replacement +++ b/benchmark/string-replacement @@ -1,3 +1,4 @@ +#!/usr/bin/env ruby require 'benchmark/ips' def str diff --git a/benchmark/symbol-to-proc b/benchmark/symbol-to-proc old mode 100644 new mode 100755 index bc08b2f29a2..7b568c474f1 --- a/benchmark/symbol-to-proc +++ b/benchmark/symbol-to-proc @@ -1,3 +1,4 @@ +#!/usr/bin/env ruby require 'benchmark/ips' Benchmark.ips do |x| From 3689844597d88d74d34d02124a9bcbe7359040b0 Mon Sep 17 00:00:00 2001 From: "Spencer A. Bywater" Date: Sat, 22 Oct 2016 09:54:35 -0700 Subject: [PATCH 1542/4996] Update 2-to-3.md I was reading through the "Upgrading from 2.x to 3.x" page in the docs and noticed some of the markdown was janky. I made these small edits to fix the formatting and conform with how it's done elsewhere. --- site/_docs/upgrading/2-to-3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/upgrading/2-to-3.md b/site/_docs/upgrading/2-to-3.md index 9e7b0a6ee71..dfc93dff6bc 100644 --- a/site/_docs/upgrading/2-to-3.md +++ b/site/_docs/upgrading/2-to-3.md @@ -68,7 +68,7 @@ generate when running `jekyll build` or `jekyll serve`.
    Future Posts on GitHub Pages

    - An exception to the above rule are GitHub Pages sites, where the `--future` flag remains _enabled_ + An exception to the above rule are GitHub Pages sites, where the --future flag remains enabled by default to maintain historical consistency for those sites.

    From 9bb242b44ab3bf3c247f72b97a9b34a33cf530c8 Mon Sep 17 00:00:00 2001 From: Chris Stein Date: Sun, 23 Oct 2016 15:26:50 -0500 Subject: [PATCH 1543/4996] fix _config.yml typo in site_template Found a typo when going through a tutorial. Replacing `these this` with `this` --- lib/site_template/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index 9a2bee4530b..f5df9830896 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -2,7 +2,7 @@ # # This config file is meant for settings that affect your whole blog, values # which you are expected to set up once and rarely edit after that. If you find -# yourself editing these this file very often, consider using Jekyll's data files +# yourself editing this file very often, consider using Jekyll's data files # feature for the data you need to update frequently. # # For technical reasons, this file is *NOT* reloaded automatically when you use From a87cfec587a6e6b6988d680d7e35ecd1b7913e11 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 23 Oct 2016 18:52:47 -0700 Subject: [PATCH 1544/4996] Update history to reflect merge of #5511 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 43014a64708..7716265e0da 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ * Fix typo in theme_template README (#5472) * Do not swallow all exceptions on render (#5495) + * Site template: fixed `_config.yml` comment typo (#5511) ### Development Fixes From ce6f20f187af0facb4ccf420f6d0694fb15e034d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 24 Oct 2016 14:48:05 -0700 Subject: [PATCH 1545/4996] Update history to reflect merge of #5505 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7716265e0da..db05d3e04a0 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * fix rubocop errors on testing with Rubocop 0.44 (#5489) * script/test: add missing whitespace (#5479) * Restrict Rubocop version (#5496) + * include a hashbang for all benchmark scripts & make them executable (#5505) ### Minor Enhancements From 81535dc18830877b0ffd8580120b80da27a74f49 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 24 Oct 2016 14:49:19 -0700 Subject: [PATCH 1546/4996] Update history to reflect merge of #5457 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index db05d3e04a0..06722ca2c4e 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Fix typo in theme_template README (#5472) * Do not swallow all exceptions on render (#5495) * Site template: fixed `_config.yml` comment typo (#5511) + * `jekyll new-theme` should specify Jekyll as a runtime dependency for the theme (#5457) ### Development Fixes From fcec2a6af93d28a3545f9bceb14823d7ee024154 Mon Sep 17 00:00:00 2001 From: 5jt Date: Tue, 25 Oct 2016 09:40:56 +0200 Subject: [PATCH 1547/4996] Update troubleshooting.md `sudo apt-get install ruby2.0.0-dev` reports _Unable to locate package ruby2.0.0-dev_ --- site/_docs/troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md index 5a53a9ebab6..191953ec668 100644 --- a/site/_docs/troubleshooting.md +++ b/site/_docs/troubleshooting.md @@ -22,7 +22,7 @@ the header files for compiling extension modules for Ruby 2.0.0. This can be done on Ubuntu or Debian by running: ```sh -sudo apt-get install ruby2.0.0-dev +sudo apt-get install ruby2.3-dev ``` On Red Hat, CentOS, and Fedora systems you can do this by running: From 803c8827e35ca9b9973427c4d7bf05f96ddf4348 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Oct 2016 12:06:24 -0700 Subject: [PATCH 1548/4996] Update history to reflect merge of #5512 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 06722ca2c4e..123f38945c2 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,7 @@ * Add jekyll-include-absolute-plugin to list of third-party plugins (#5492) * Remove jekyll-hook from deployment methods (#5502) * Update deployment-methods.md (#5504) + * Ubuntu users should install ruby2.3-dev (#5512) ### Bug Fixes From 762bf18d25e47c986c494a67ad346d77374397e7 Mon Sep 17 00:00:00 2001 From: George Mandis Date: Tue, 25 Oct 2016 13:54:43 -0700 Subject: [PATCH 1549/4996] Added jekyll-pinboard. Added link to my Jekyll plugin: https://github.com/snaptortoise/jekyll-pinboard-plugin. Interfaces with the Pinboard API to make data for specified tags available to the template, sort of similar to the built-in Data Files support. --- site/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/_docs/plugins.md b/site/_docs/plugins.md index 6e5bbf23847..9b7de42859d 100644 --- a/site/_docs/plugins.md +++ b/site/_docs/plugins.md @@ -914,6 +914,7 @@ LESS.js files during generation. - [Jekyll-Spotify](https://github.com/MertcanGokgoz/Jekyll-Spotify): Easily output Spotify Embed Player for jekyll - [jekyll-menus](https://github.com/forestryio/jekyll-menus): Hugo style menus for your Jekyll site... recursive menus included. - [jekyll-data](https://github.com/ashmaroli/jekyll-data): Read data files within Jekyll Theme Gems. +- [jekyll-pinboard(https://github.com/snaptortoise/jekyll-pinboard-plugin): Access your Pinboard bookmarks within your Jekyll theme. #### Editors From 26144645d83bae6499f644f9ff5bebc036886f48 Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 29 Oct 2016 14:45:18 +0100 Subject: [PATCH 1550/4996] Remove Glynn as deployment option Remove Glynn as deployment option since that gem is no longer actively maintained. See notes on readme in repository: https://github.com/dmathieu/glynn and https://github.com/dmathieu/glynn/issues/67 --- site/_docs/deployment-methods.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/site/_docs/deployment-methods.md b/site/_docs/deployment-methods.md index d3cf35a0c8d..09116824843 100644 --- a/site/_docs/deployment-methods.md +++ b/site/_docs/deployment-methods.md @@ -10,11 +10,6 @@ Sites built using Jekyll can be deployed in a large number of ways due to the st Just about any traditional web hosting provider will let you upload files to their servers over FTP. To upload a Jekyll site to a web host using FTP, simply run the `jekyll build` command and copy the generated `_site` folder to the root folder of your hosting account. This is most likely to be the `httpdocs` or `public_html` folder on most hosting providers. -### FTP using Glynn - -There is a project called [Glynn](https://github.com/dmathieu/glynn), which lets you easily generate your Jekyll powered website’s static files and -send them to your host through FTP. - ## Self-managed web server If you have direct access to the deployment web server, the process is essentially the same, except you might have other methods available to you (such as `scp`, or even direct filesystem access) for transferring the files. Just remember to make sure the contents of the generated `_site` folder get placed in the appropriate web root directory for your web server. From a1bdd312496d6822a2155050025b24a8f7524ab2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 30 Oct 2016 02:49:26 -0700 Subject: [PATCH 1551/4996] Update history to reflect merge of #5519 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 123f38945c2..f02fc174eb8 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Remove jekyll-hook from deployment methods (#5502) * Update deployment-methods.md (#5504) * Ubuntu users should install ruby2.3-dev (#5512) + * Remove Glynn as deployment option (#5519) ### Bug Fixes From a856a948c9674713f48e69684c89ab7c7fd3b0be Mon Sep 17 00:00:00 2001 From: Pierre-Alexandre Date: Sun, 30 Oct 2016 11:41:15 +0000 Subject: [PATCH 1552/4996] no more invalid US-ASCII on lines 30 and 97 Avoiding errors on `jekyll serve` ``` # jekyll serve -H 0.0.0.0 Configuration file: /jekyll-offline-docs/site/_config.yml Configuration file: /jekyll-offline-docs/site/_config.yml Source: /jekyll-offline-docs/site Destination: /jekyll-offline-docs/site/_site Incremental build: disabled. Enable with --incremental Generating... Conversion error: Jekyll::Converters::Scss encountered an error while converting 'css/screen.scss': Invalid US-ASCII character "\xE2" on line 30 jekyll 3.3.0 | Error: Invalid US-ASCII character "\xE2" on line 30 ``` And line 97 when 30 is adjusted... --- site/_sass/_gridism.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/_sass/_gridism.scss b/site/_sass/_gridism.scss index fa47dd2f533..4c4ce3219f0 100644 --- a/site/_sass/_gridism.scss +++ b/site/_sass/_gridism.scss @@ -27,7 +27,7 @@ .grid .unit:first-child { padding-left: 20px; } .grid .unit:last-child { padding-right: 20px; } -/* Nested grids already have padding though, so let’s nuke it */ +/* Nested grids already have padding though, so let's nuke it */ .unit .unit:first-child { padding-left: 0; } .unit .unit:last-child { padding-right: 0; } .unit .grid:first-child > .unit { padding-top: 0; } @@ -94,7 +94,7 @@ /* Responsive Stuff */ @media screen and (max-width: 568px) { - /* Stack anything that isn’t full-width on smaller screens + /* Stack anything that isn't full-width on smaller screens and doesn't provide the no-stacking-on-mobiles class */ .grid:not(.no-stacking-on-mobiles) > .unit { width: 100% !important; From 1bb2259a103edcfb16a0886afb26f2ee99a9fb62 Mon Sep 17 00:00:00 2001 From: fen Date: Wed, 2 Nov 2016 00:00:38 +0100 Subject: [PATCH 1553/4996] add failing test --- test/test_url.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/test_url.rb b/test/test_url.rb index f5a77622fd1..5f983909447 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -80,5 +80,26 @@ class TestURL < JekyllUnitTest url.to_s end end + + should "ignore NoMethodErrors when a placeholder is not found" do + site = fixture_site({ + "collections" => { + "methods" => { + "output" => true + } + } + }) + site.read + matching_doc = site.collections["methods"].docs.find do |doc| + doc.relative_path == "_methods/escape-+ #%20[].md" + end + out, err = capture_io do + URL.new( + :template => "/methods/:title/:headline", + :placeholders => matching_doc.url_placeholders + ).to_s + end + assert out.include? ":headline is not defined!" + end end end From a2ffde8f1423a250c921b6e23693a38b33235eaf Mon Sep 17 00:00:00 2001 From: fen Date: Wed, 2 Nov 2016 00:22:20 +0100 Subject: [PATCH 1554/4996] rewrite test to only not throw error --- test/test_url.rb | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/test/test_url.rb b/test/test_url.rb index 5f983909447..28fab43d557 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -93,13 +93,11 @@ class TestURL < JekyllUnitTest matching_doc = site.collections["methods"].docs.find do |doc| doc.relative_path == "_methods/escape-+ #%20[].md" end - out, err = capture_io do - URL.new( - :template => "/methods/:title/:headline", - :placeholders => matching_doc.url_placeholders - ).to_s - end - assert out.include? ":headline is not defined!" + URL.new( + :template => "/methods/:title/:headline", + :placeholders => matching_doc.url_placeholders + ).to_s + pass end end end From 2d35364c02003ccbb9c5b06c291b65c2f6c3b278 Mon Sep 17 00:00:00 2001 From: fen Date: Wed, 2 Nov 2016 00:22:41 +0100 Subject: [PATCH 1555/4996] implement warning about missing keys in url drops --- lib/jekyll/url.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index c74e11c8bd4..32bcfb8f66e 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -86,7 +86,11 @@ def generate_url_from_hash(template) def generate_url_from_drop(template) template.gsub(%r!:([a-z_]+)!) do |match| - replacement = @placeholders.public_send(match.sub(":".freeze, "".freeze)) + begin + replacement = @placeholders.public_send(match.sub(":".freeze, "".freeze)) + rescue NoMethodError + Jekyll.logger.warn "", "#{match} is not defined!" + end if replacement.nil? "".freeze else From 0c234c90a90e3799bd237c3391d1c58c6ad8cdb4 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 2 Nov 2016 12:18:05 +0530 Subject: [PATCH 1556/4996] TestGeneratedSite: add "|" to preserve newline adding a pipe character ('|') preserves the formatting of 'expected_output' with a trailing newline bit, in windows. --- test/test_generated_site.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 31784054fd6..112cf9d3c09 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -50,11 +50,13 @@ class TestGeneratedSite < JekyllUnitTest should "print a nice list of static files" do time_regexp = "\\d+:\\d+" + # + # adding a pipe character at the beginning preserves formatting with newlines expected_output = Regexp.new <<-OUTPUT -- /css/screen.css last edited at #{time_regexp} with extname .css -- /pgp.key last edited at #{time_regexp} with extname .key -- /products.yml last edited at #{time_regexp} with extname .yml -- /symlink-test/symlinked-dir/screen.css last edited at #{time_regexp} with extname .css +| - /css/screen.css last edited at #{time_regexp} with extname .css + - /pgp.key last edited at #{time_regexp} with extname .key + - /products.yml last edited at #{time_regexp} with extname .yml + - /symlink-test/symlinked-dir/screen.css last edited at #{time_regexp} with extname .css OUTPUT assert_match expected_output, File.read(dest_dir("static_files.html")) end From 257e60b9a7629d04c244c22673fe4f4ffc1c3970 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 2 Nov 2016 12:25:50 +0530 Subject: [PATCH 1557/4996] TestSite: add symlinked files only if not Windows add symlinked files to "sorted_pages" array only when testing on non-windows platforms. --- test/test_site.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/test_site.rb b/test/test_site.rb index 4f5272810df..efe7076ac95 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -175,7 +175,8 @@ def generate(site) method.call(*args, &block).reverse end @site.process - # files in symlinked directories may appear twice + # exclude files in symlinked directories here and insert them in the + # following step when not on Windows. sorted_pages = %w( %#\ +.md .htaccess @@ -194,12 +195,14 @@ def generate(site) index.html info.md main.scss - main.scss properties.html sitemap.xml static_files.html - symlinked-file ) + unless Utils::Platforms.really_windows? + # files in symlinked directories may appear twice + sorted_pages.push("main.scss", "symlinked-file").sort! + end assert_equal sorted_pages, @site.pages.map(&:name) end From e6b9dd1cc147a881ef39b36977c705ef2b76c63c Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 2 Nov 2016 12:54:47 +0530 Subject: [PATCH 1558/4996] TestFilters: adjust array size to ignore symlinks Adjust the size of grouped-items array as it won't include symlinked pages in Windows. --- test/test_filters.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index 9a0f87d46b7..20587610beb 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -575,7 +575,9 @@ def to_liquid g["items"].is_a?(Array), "The list of grouped items for 'default' is not an Array." ) - assert_equal 5, g["items"].size + # adjust array.size to ignore symlinked page in Windows + qty = Utils::Platforms.really_windows? ? 4 : 5 + assert_equal qty, g["items"].size when "nil" assert( g["items"].is_a?(Array), @@ -587,7 +589,9 @@ def to_liquid g["items"].is_a?(Array), "The list of grouped items for '' is not an Array." ) - assert_equal 15, g["items"].size + # adjust array.size to ignore symlinked page in Windows + qty = Utils::Platforms.really_windows? ? 14 : 15 + assert_equal qty, g["items"].size end end end From e92dd2055dd0e64dff66a6ec58ed3dce5b7af5bb Mon Sep 17 00:00:00 2001 From: fen Date: Wed, 2 Nov 2016 21:30:23 +0100 Subject: [PATCH 1559/4996] check for the urldrop key first --- lib/jekyll/drops/url_drop.rb | 5 +++++ lib/jekyll/url.rb | 11 +++++------ test/test_url.rb | 11 ++++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb index 04e48a206d8..5c97190da59 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -78,6 +78,11 @@ def short_year def y_day @obj.date.strftime("%j") end + + private + def fallback_data + {} + end end end end diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 32bcfb8f66e..291f6e5865d 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -86,15 +86,14 @@ def generate_url_from_hash(template) def generate_url_from_drop(template) template.gsub(%r!:([a-z_]+)!) do |match| - begin - replacement = @placeholders.public_send(match.sub(":".freeze, "".freeze)) - rescue NoMethodError - Jekyll.logger.warn "", "#{match} is not defined!" + key = match.sub(":".freeze, "".freeze) + unless @placeholders.key?(key) + raise NoMethodError, "The URL template key #{key} doesn't exist!" end - if replacement.nil? + if @placeholders[key].nil? "".freeze else - self.class.escape_path(replacement) + self.class.escape_path(@placeholders[key]) end end.gsub(%r!//!, "/".freeze) end diff --git a/test/test_url.rb b/test/test_url.rb index 28fab43d557..1a4471162f3 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -93,11 +93,12 @@ class TestURL < JekyllUnitTest matching_doc = site.collections["methods"].docs.find do |doc| doc.relative_path == "_methods/escape-+ #%20[].md" end - URL.new( - :template => "/methods/:title/:headline", - :placeholders => matching_doc.url_placeholders - ).to_s - pass + assert_raises NoMethodError do + URL.new( + :template => "/methods/:headline", + :placeholders => matching_doc.url_placeholders + ).to_s + end end end end From 16217b2ed76dc76af1f54e3a6e28bb592b988363 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 2 Nov 2016 13:40:22 -0700 Subject: [PATCH 1560/4996] Update history to reflect merge of #5466 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f02fc174eb8..711367a82a5 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ * Update deployment-methods.md (#5504) * Ubuntu users should install ruby2.3-dev (#5512) * Remove Glynn as deployment option (#5519) + * Fix broken forum link (#5466) ### Bug Fixes From 3eedfd8fe08a2e7a9cc44c89acb60de0f2c7d2f7 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 6 Oct 2016 14:41:23 -0400 Subject: [PATCH 1561/4996] abstract site directory to variable --- Rakefile | 6 +++++- rake/site.rake | 14 +++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Rakefile b/Rakefile index 4e9a1057771..de2aa441ec7 100644 --- a/Rakefile +++ b/Rakefile @@ -27,6 +27,10 @@ def docs_name "#{name}-docs" end +def docs_folder + "site" +end + def gemspec_file "#{name}.gemspec" end @@ -102,7 +106,7 @@ def siteify_file(file, overrides_front_matter = {}) "note" => "This file is autogenerated. Edit /#{file} instead." }.merge(overrides_front_matter) contents = "#{front_matter.to_yaml}---\n\n#{content_for(file)}" - File.write("site/_docs/#{slug}.md", contents) + File.write("#{docs_folder}/_docs/#{slug}.md", contents) end def content_for(file) diff --git a/rake/site.rake b/rake/site.rake index 8dd283fb566..283b4a9c30a 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -23,8 +23,8 @@ namespace :site do # Generate the site in server mode. puts "Running Jekyll..." options = { - "source" => File.expand_path("site"), - "destination" => File.expand_path("site/_site"), + "source" => File.expand_path(docs_folder), + "destination" => File.expand_path("#{docs_folder}/_site"), "watch" => true, "serving" => true } @@ -37,15 +37,15 @@ namespace :site do require "jekyll" Jekyll::Commands::Build.process({ "profile" => true, - "source" => File.expand_path("site"), - "destination" => File.expand_path("site/_site") + "source" => File.expand_path(docs_folder), + "destination" => File.expand_path("#{docs_folder}/_site") }) end task :build => :generate desc "Update normalize.css library to the latest version and minify" task :update_normalize_css do - Dir.chdir("site/_sass") do + Dir.chdir("#{docs_folder}/_sass") do sh 'curl "http://necolas.github.io/normalize.css/latest/normalize.css" -o "normalize.scss"' sh 'sass "normalize.scss":"_normalize.scss" --style compressed' rm ['normalize.scss', Dir.glob('*.map')].flatten @@ -84,7 +84,7 @@ namespace :site do ENV['JEKYLL_ENV'] = 'production' require "jekyll" Jekyll::Commands::Build.process({ - "source" => File.expand_path("site"), + "source" => File.expand_path(docs_folder), "destination" => File.expand_path("gh-pages"), "sass" => { "style" => "compressed" } }) @@ -132,7 +132,7 @@ namespace :site do raise "Specify a version: rake site:releases:new['1.2.3']" unless args.version today = Time.new.strftime('%Y-%m-%d') release = args.version.to_s - filename = "site/_posts/#{today}-jekyll-#{release.split('.').join('-')}-released.markdown" + filename = "#{docs_folder}/_posts/#{today}-jekyll-#{release.split('.').join('-')}-released.markdown" File.open(filename, "wb") do |post| post.puts("---") From 8b9391da9899711620543235eb34c6d97da5a05a Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 6 Oct 2016 14:42:57 -0400 Subject: [PATCH 1562/4996] abstract one last site reference --- rake/site.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rake/site.rake b/rake/site.rake index 283b4a9c30a..eb08cc7f9b2 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -123,7 +123,7 @@ namespace :site do desc "Write the site latest_version.txt file" task :version_file do - File.open('site/latest_version.txt', 'wb') { |f| f.puts(version) } unless version =~ /(beta|rc|alpha)/i + File.open("#{docs_folder}/latest_version.txt", 'wb') { |f| f.puts(version) } unless version =~ /(beta|rc|alpha)/i end namespace :releases do From a087d34ece2662a31ecf15a5464f806e5bd1aaf5 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 6 Oct 2016 15:26:26 -0400 Subject: [PATCH 1563/4996] update rake task to use docs folder --- rake/site.rake | 46 ++++------------------------------------------ 1 file changed, 4 insertions(+), 42 deletions(-) diff --git a/rake/site.rake b/rake/site.rake index eb08cc7f9b2..679e4bf0768 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -52,52 +52,14 @@ namespace :site do end end - desc "Commit the local site to the gh-pages branch and publish to GitHub Pages" + desc "Generate generated pages and publish to GitHub Pages" task :publish => :generated_pages do - # Ensure the gh-pages dir exists so we can generate into it. - puts "Checking for gh-pages dir..." - unless File.exist?("./gh-pages") - puts "Creating gh-pages dir..." - sh "git clone git@github.com:jekyll/jekyll gh-pages" - end - - # Ensure latest gh-pages branch history. - Dir.chdir('gh-pages') do - sh "git checkout gh-pages" - sh "git pull origin gh-pages" - end - - # Proceed to purge all files in case we removed a file in this release. - puts "Cleaning gh-pages directory..." - purge_exclude = %w[ - gh-pages/. - gh-pages/.. - gh-pages/.git - gh-pages/.gitignore - ] - FileList["gh-pages/{*,.*}"].exclude(*purge_exclude).each do |path| - sh "rm -rf #{path}" - end - - # Copy site to gh-pages dir. - puts "Building site into gh-pages branch..." - ENV['JEKYLL_ENV'] = 'production' - require "jekyll" - Jekyll::Commands::Build.process({ - "source" => File.expand_path(docs_folder), - "destination" => File.expand_path("gh-pages"), - "sass" => { "style" => "compressed" } - }) - - File.open('gh-pages/.nojekyll', 'wb') { |f| f.puts(":dog: food.") } - - # Commit and push. puts "Committing and pushing to GitHub Pages..." sha = `git rev-parse HEAD`.strip Dir.chdir('gh-pages') do - sh "git add ." - sh "git commit --allow-empty -m 'Updating to #{sha}.'" - sh "git push origin gh-pages" + sh "git add docs/" + sh "git commit --allow-empty -m 'Generating pages for #{sha}.'" + sh "git push origin master" end puts 'Done.' end From 6be62def90e1b379b72f9b656094117d0dad4a74 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 6 Oct 2016 15:26:35 -0400 Subject: [PATCH 1564/4996] move site to docs folder --- Rakefile | 2 +- {site => docs}/.gitignore | 0 {site => docs}/404.html | 0 {site => docs}/CNAME | 0 {site => docs}/_config.yml | 0 {site => docs}/_data/docs.yml | 1 + {site => docs}/_data/jekyllconf-talks.yml | 0 {site => docs}/_docs/assets.md | 0 {site => docs}/_docs/collections.md | 0 {site => docs}/_docs/conduct.md | 0 {site => docs}/_docs/configuration.md | 0 .../_docs/continuous-integration.md | 0 {site => docs}/_docs/contributing.md | 0 {site => docs}/_docs/datafiles.md | 0 {site => docs}/_docs/deployment-methods.md | 0 .../development}/affinity-team-captain.md | 7 +++++- .../development}/avoiding-burnout.md | 7 +++++- .../development}/becoming-a-maintainer.md | 7 +++++- docs/_docs/development/index.md | 20 +++++++++++++++++ .../development}/merging-a-pull-request.md | 7 +++++- .../development}/reviewing-a-pull-request.md | 8 +++++-- .../{ => _docs/development}/special-labels.md | 7 +++++- .../development}/triaging-an-issue.md | 7 +++++- {site => docs}/_docs/drafts.md | 0 {site => docs}/_docs/extras.md | 0 {site => docs}/_docs/frontmatter.md | 0 {site => docs}/_docs/github-pages.md | 0 {site => docs}/_docs/history.md | 0 {site => docs}/_docs/index.md | 0 {site => docs}/_docs/installation.md | 0 {site => docs}/_docs/migrations.md | 0 {site => docs}/_docs/pages.md | 0 {site => docs}/_docs/pagination.md | 0 {site => docs}/_docs/permalinks.md | 0 {site => docs}/_docs/plugins.md | 0 {site => docs}/_docs/posts.md | 0 {site => docs}/_docs/quickstart.md | 0 {site => docs}/_docs/resources.md | 0 {site => docs}/_docs/sites.md | 0 {site => docs}/_docs/static_files.md | 0 {site => docs}/_docs/structure.md | 0 {site => docs}/_docs/templates.md | 0 {site => docs}/_docs/themes.md | 0 {site => docs}/_docs/troubleshooting.md | 0 {site => docs}/_docs/upgrading.md | 0 {site => docs}/_docs/upgrading/0-to-2.md | 0 {site => docs}/_docs/upgrading/2-to-3.md | 0 {site => docs}/_docs/usage.md | 0 {site => docs}/_docs/variables.md | 0 {site => docs}/_docs/windows.md | 0 {site => docs}/_includes/analytics.html | 0 {site => docs}/_includes/anchor_links.html | 0 {site => docs}/_includes/docs_contents.html | 0 .../_includes/docs_contents_mobile.html | 0 {site => docs}/_includes/docs_option.html | 0 {site => docs}/_includes/docs_ul.html | 0 {site => docs}/_includes/footer.html | 0 {site => docs}/_includes/header.html | 0 {site => docs}/_includes/news_contents.html | 0 .../_includes/news_contents_mobile.html | 0 {site => docs}/_includes/news_item.html | 0 .../_includes/primary-nav-items.html | 0 {site => docs}/_includes/section_nav.html | 0 {site => docs}/_includes/top.html | 0 {site => docs}/_layouts/default.html | 0 {site => docs}/_layouts/docs.html | 0 {site => docs}/_layouts/error.html | 0 {site => docs}/_layouts/news.html | 0 {site => docs}/_layouts/news_item.html | 0 {site => docs}/_layouts/page.html | 0 .../2013-05-06-jekyll-1-0-0-released.markdown | 0 .../2013-05-08-jekyll-1-0-1-released.markdown | 0 .../2013-05-12-jekyll-1-0-2-released.markdown | 0 .../2013-06-07-jekyll-1-0-3-released.markdown | 0 .../2013-07-14-jekyll-1-1-0-released.markdown | 0 .../2013-07-24-jekyll-1-1-1-released.markdown | 0 .../2013-07-25-jekyll-1-0-4-released.markdown | 0 .../2013-07-25-jekyll-1-1-2-released.markdown | 0 .../2013-09-06-jekyll-1-2-0-released.markdown | 0 .../2013-09-14-jekyll-1-2-1-released.markdown | 0 ...3-10-28-jekyll-1-3-0-rc1-released.markdown | 0 .../2013-11-04-jekyll-1-3-0-released.markdown | 0 .../2013-11-26-jekyll-1-3-1-released.markdown | 0 .../2013-12-07-jekyll-1-4-0-released.markdown | 0 .../2013-12-09-jekyll-1-4-1-released.markdown | 0 .../2013-12-16-jekyll-1-4-2-released.markdown | 0 .../2014-01-13-jekyll-1-4-3-released.markdown | 0 .../2014-03-24-jekyll-1-5-0-released.markdown | 0 .../2014-03-27-jekyll-1-5-1-released.markdown | 0 .../2014-05-06-jekyll-turns-2-0-0.markdown | 0 .../2014-05-08-jekyll-2-0-3-released.markdown | 0 ...yll-stickers-1-dollar-stickermule.markdown | 0 ...6-28-jekyll-turns-21-i-mean-2-1-0.markdown | 0 .../2014-07-01-jekyll-2-1-1-released.markdown | 0 .../2014-07-29-jekyll-2-2-0-released.markdown | 0 .../2014-08-10-jekyll-2-3-0-released.markdown | 0 .../2014-09-09-jekyll-2-4-0-released.markdown | 0 ...midlife-crisis-jekyll-turns-2-5-0.markdown | 0 .../2014-11-08-jekyll-2-5-1-released.markdown | 0 .../2014-11-12-jekyll-2-5-2-released.markdown | 0 ...12-17-alfredxing-welcome-to-jekyll-core.md | 0 .../2014-12-22-jekyll-2-5-3-released.markdown | 0 .../2015-01-20-jekyll-meet-and-greet.markdown | 0 ...01-24-jekyll-3-0-0-beta1-released.markdown | 0 ...015-02-26-introducing-jekyll-talk.markdown | 0 .../2015-10-26-jekyll-3-0-released.markdown | 0 .../2015-11-17-jekyll-3-0-1-released.markdown | 0 .../2016-01-20-jekyll-3-0-2-released.markdown | 0 .../2016-01-24-jekyll-3-1-0-released.markdown | 0 .../2016-01-28-jekyll-3-1-1-released.markdown | 0 .../2016-02-08-jekyll-3-0-3-released.markdown | 0 .../2016-02-19-jekyll-3-1-2-released.markdown | 0 ...aking-it-easier-to-contribute-to-jekyll.md | 0 .../2016-04-19-jekyll-3-0-4-released.markdown | 0 .../2016-04-19-jekyll-3-1-3-released.markdown | 0 .../2016-04-26-jekyll-3-0-5-released.markdown | 0 .../2016-05-18-jekyll-3-1-4-released.markdown | 0 .../2016-05-18-jekyll-3-1-5-released.markdown | 0 .../2016-05-19-jekyll-3-1-6-released.markdown | 0 ...-s-google-summer-of-code-projects.markdown | 0 .../2016-07-26-jekyll-3-2-0-released.markdown | 0 .../2016-08-02-jekyll-3-2-1-released.markdown | 0 ...8-24-jekyll-admin-initial-release.markdown | 0 .../_posts/2016-10-06-jekyll-3-3-is-here.md | 0 {site => docs}/_sass/_font-awesome.scss | 0 {site => docs}/_sass/_gridism.scss | 0 {site => docs}/_sass/_mixins.scss | 0 {site => docs}/_sass/_normalize.scss | 0 {site => docs}/_sass/_pygments.scss | 0 {site => docs}/_sass/_style.scss | 0 {site => docs}/community/index.md | 0 {site => docs}/css/screen.scss | 0 {site => docs}/favicon.ico | Bin {site => docs}/fonts/fontawesome-webfont.eot | Bin {site => docs}/fonts/fontawesome-webfont.svg | 0 {site => docs}/fonts/fontawesome-webfont.ttf | Bin {site => docs}/fonts/fontawesome-webfont.woff | Bin .../fonts/fontawesome-webfont.woff2 | Bin {site => docs}/freenode.txt | 0 {site => docs}/help/index.md | 0 {site => docs}/img/article-footer.png | Bin {site => docs}/img/footer-arrow.png | Bin {site => docs}/img/footer-logo.png | Bin {site => docs}/img/jekyll-sticker.jpg | Bin {site => docs}/img/logo-2x.png | Bin {site => docs}/img/logo-rss.png | Bin {site => docs}/img/octojekyll.png | Bin {site => docs}/index.html | 0 {site => docs}/js/html5shiv.min.js | 0 {site => docs}/js/respond.min.js | 0 {site => docs}/latest_version.txt | 0 {site => docs}/news/index.html | 0 {site => docs}/news/releases/index.html | 0 docs/readme.md | 21 ++++++++++-------- {site => docs}/redirects/github.html | 0 {site => docs}/redirects/issues.html | 0 site/README.md | 16 ------------- 157 files changed, 76 insertions(+), 34 deletions(-) rename {site => docs}/.gitignore (100%) rename {site => docs}/404.html (100%) rename {site => docs}/CNAME (100%) rename {site => docs}/_config.yml (100%) rename {site => docs}/_data/docs.yml (97%) rename {site => docs}/_data/jekyllconf-talks.yml (100%) rename {site => docs}/_docs/assets.md (100%) rename {site => docs}/_docs/collections.md (100%) rename {site => docs}/_docs/conduct.md (100%) rename {site => docs}/_docs/configuration.md (100%) rename {site => docs}/_docs/continuous-integration.md (100%) rename {site => docs}/_docs/contributing.md (100%) rename {site => docs}/_docs/datafiles.md (100%) rename {site => docs}/_docs/deployment-methods.md (100%) rename docs/{ => _docs/development}/affinity-team-captain.md (94%) rename docs/{ => _docs/development}/avoiding-burnout.md (95%) rename docs/{ => _docs/development}/becoming-a-maintainer.md (96%) create mode 100644 docs/_docs/development/index.md rename docs/{ => _docs/development}/merging-a-pull-request.md (96%) rename docs/{ => _docs/development}/reviewing-a-pull-request.md (96%) rename docs/{ => _docs/development}/special-labels.md (93%) rename docs/{ => _docs/development}/triaging-an-issue.md (97%) rename {site => docs}/_docs/drafts.md (100%) rename {site => docs}/_docs/extras.md (100%) rename {site => docs}/_docs/frontmatter.md (100%) rename {site => docs}/_docs/github-pages.md (100%) rename {site => docs}/_docs/history.md (100%) rename {site => docs}/_docs/index.md (100%) rename {site => docs}/_docs/installation.md (100%) rename {site => docs}/_docs/migrations.md (100%) rename {site => docs}/_docs/pages.md (100%) rename {site => docs}/_docs/pagination.md (100%) rename {site => docs}/_docs/permalinks.md (100%) rename {site => docs}/_docs/plugins.md (100%) rename {site => docs}/_docs/posts.md (100%) rename {site => docs}/_docs/quickstart.md (100%) rename {site => docs}/_docs/resources.md (100%) rename {site => docs}/_docs/sites.md (100%) rename {site => docs}/_docs/static_files.md (100%) rename {site => docs}/_docs/structure.md (100%) rename {site => docs}/_docs/templates.md (100%) rename {site => docs}/_docs/themes.md (100%) rename {site => docs}/_docs/troubleshooting.md (100%) rename {site => docs}/_docs/upgrading.md (100%) rename {site => docs}/_docs/upgrading/0-to-2.md (100%) rename {site => docs}/_docs/upgrading/2-to-3.md (100%) rename {site => docs}/_docs/usage.md (100%) rename {site => docs}/_docs/variables.md (100%) rename {site => docs}/_docs/windows.md (100%) rename {site => docs}/_includes/analytics.html (100%) rename {site => docs}/_includes/anchor_links.html (100%) rename {site => docs}/_includes/docs_contents.html (100%) rename {site => docs}/_includes/docs_contents_mobile.html (100%) rename {site => docs}/_includes/docs_option.html (100%) rename {site => docs}/_includes/docs_ul.html (100%) rename {site => docs}/_includes/footer.html (100%) rename {site => docs}/_includes/header.html (100%) rename {site => docs}/_includes/news_contents.html (100%) rename {site => docs}/_includes/news_contents_mobile.html (100%) rename {site => docs}/_includes/news_item.html (100%) rename {site => docs}/_includes/primary-nav-items.html (100%) rename {site => docs}/_includes/section_nav.html (100%) rename {site => docs}/_includes/top.html (100%) rename {site => docs}/_layouts/default.html (100%) rename {site => docs}/_layouts/docs.html (100%) rename {site => docs}/_layouts/error.html (100%) rename {site => docs}/_layouts/news.html (100%) rename {site => docs}/_layouts/news_item.html (100%) rename {site => docs}/_layouts/page.html (100%) rename {site => docs}/_posts/2013-05-06-jekyll-1-0-0-released.markdown (100%) rename {site => docs}/_posts/2013-05-08-jekyll-1-0-1-released.markdown (100%) rename {site => docs}/_posts/2013-05-12-jekyll-1-0-2-released.markdown (100%) rename {site => docs}/_posts/2013-06-07-jekyll-1-0-3-released.markdown (100%) rename {site => docs}/_posts/2013-07-14-jekyll-1-1-0-released.markdown (100%) rename {site => docs}/_posts/2013-07-24-jekyll-1-1-1-released.markdown (100%) rename {site => docs}/_posts/2013-07-25-jekyll-1-0-4-released.markdown (100%) rename {site => docs}/_posts/2013-07-25-jekyll-1-1-2-released.markdown (100%) rename {site => docs}/_posts/2013-09-06-jekyll-1-2-0-released.markdown (100%) rename {site => docs}/_posts/2013-09-14-jekyll-1-2-1-released.markdown (100%) rename {site => docs}/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown (100%) rename {site => docs}/_posts/2013-11-04-jekyll-1-3-0-released.markdown (100%) rename {site => docs}/_posts/2013-11-26-jekyll-1-3-1-released.markdown (100%) rename {site => docs}/_posts/2013-12-07-jekyll-1-4-0-released.markdown (100%) rename {site => docs}/_posts/2013-12-09-jekyll-1-4-1-released.markdown (100%) rename {site => docs}/_posts/2013-12-16-jekyll-1-4-2-released.markdown (100%) rename {site => docs}/_posts/2014-01-13-jekyll-1-4-3-released.markdown (100%) rename {site => docs}/_posts/2014-03-24-jekyll-1-5-0-released.markdown (100%) rename {site => docs}/_posts/2014-03-27-jekyll-1-5-1-released.markdown (100%) rename {site => docs}/_posts/2014-05-06-jekyll-turns-2-0-0.markdown (100%) rename {site => docs}/_posts/2014-05-08-jekyll-2-0-3-released.markdown (100%) rename {site => docs}/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown (100%) rename {site => docs}/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown (100%) rename {site => docs}/_posts/2014-07-01-jekyll-2-1-1-released.markdown (100%) rename {site => docs}/_posts/2014-07-29-jekyll-2-2-0-released.markdown (100%) rename {site => docs}/_posts/2014-08-10-jekyll-2-3-0-released.markdown (100%) rename {site => docs}/_posts/2014-09-09-jekyll-2-4-0-released.markdown (100%) rename {site => docs}/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown (100%) rename {site => docs}/_posts/2014-11-08-jekyll-2-5-1-released.markdown (100%) rename {site => docs}/_posts/2014-11-12-jekyll-2-5-2-released.markdown (100%) rename {site => docs}/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md (100%) rename {site => docs}/_posts/2014-12-22-jekyll-2-5-3-released.markdown (100%) rename {site => docs}/_posts/2015-01-20-jekyll-meet-and-greet.markdown (100%) rename {site => docs}/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown (100%) rename {site => docs}/_posts/2015-02-26-introducing-jekyll-talk.markdown (100%) rename {site => docs}/_posts/2015-10-26-jekyll-3-0-released.markdown (100%) rename {site => docs}/_posts/2015-11-17-jekyll-3-0-1-released.markdown (100%) rename {site => docs}/_posts/2016-01-20-jekyll-3-0-2-released.markdown (100%) rename {site => docs}/_posts/2016-01-24-jekyll-3-1-0-released.markdown (100%) rename {site => docs}/_posts/2016-01-28-jekyll-3-1-1-released.markdown (100%) rename {site => docs}/_posts/2016-02-08-jekyll-3-0-3-released.markdown (100%) rename {site => docs}/_posts/2016-02-19-jekyll-3-1-2-released.markdown (100%) rename {site => docs}/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md (100%) rename {site => docs}/_posts/2016-04-19-jekyll-3-0-4-released.markdown (100%) rename {site => docs}/_posts/2016-04-19-jekyll-3-1-3-released.markdown (100%) rename {site => docs}/_posts/2016-04-26-jekyll-3-0-5-released.markdown (100%) rename {site => docs}/_posts/2016-05-18-jekyll-3-1-4-released.markdown (100%) rename {site => docs}/_posts/2016-05-18-jekyll-3-1-5-released.markdown (100%) rename {site => docs}/_posts/2016-05-19-jekyll-3-1-6-released.markdown (100%) rename {site => docs}/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown (100%) rename {site => docs}/_posts/2016-07-26-jekyll-3-2-0-released.markdown (100%) rename {site => docs}/_posts/2016-08-02-jekyll-3-2-1-released.markdown (100%) rename {site => docs}/_posts/2016-08-24-jekyll-admin-initial-release.markdown (100%) rename {site => docs}/_posts/2016-10-06-jekyll-3-3-is-here.md (100%) rename {site => docs}/_sass/_font-awesome.scss (100%) rename {site => docs}/_sass/_gridism.scss (100%) rename {site => docs}/_sass/_mixins.scss (100%) rename {site => docs}/_sass/_normalize.scss (100%) rename {site => docs}/_sass/_pygments.scss (100%) rename {site => docs}/_sass/_style.scss (100%) rename {site => docs}/community/index.md (100%) rename {site => docs}/css/screen.scss (100%) rename {site => docs}/favicon.ico (100%) rename {site => docs}/fonts/fontawesome-webfont.eot (100%) rename {site => docs}/fonts/fontawesome-webfont.svg (100%) rename {site => docs}/fonts/fontawesome-webfont.ttf (100%) rename {site => docs}/fonts/fontawesome-webfont.woff (100%) rename {site => docs}/fonts/fontawesome-webfont.woff2 (100%) rename {site => docs}/freenode.txt (100%) rename {site => docs}/help/index.md (100%) rename {site => docs}/img/article-footer.png (100%) rename {site => docs}/img/footer-arrow.png (100%) rename {site => docs}/img/footer-logo.png (100%) rename {site => docs}/img/jekyll-sticker.jpg (100%) rename {site => docs}/img/logo-2x.png (100%) rename {site => docs}/img/logo-rss.png (100%) rename {site => docs}/img/octojekyll.png (100%) rename {site => docs}/index.html (100%) rename {site => docs}/js/html5shiv.min.js (100%) rename {site => docs}/js/respond.min.js (100%) rename {site => docs}/latest_version.txt (100%) rename {site => docs}/news/index.html (100%) rename {site => docs}/news/releases/index.html (100%) rename {site => docs}/redirects/github.html (100%) rename {site => docs}/redirects/issues.html (100%) delete mode 100644 site/README.md diff --git a/Rakefile b/Rakefile index de2aa441ec7..58aecfaf767 100644 --- a/Rakefile +++ b/Rakefile @@ -28,7 +28,7 @@ def docs_name end def docs_folder - "site" + "docs" end def gemspec_file diff --git a/site/.gitignore b/docs/.gitignore similarity index 100% rename from site/.gitignore rename to docs/.gitignore diff --git a/site/404.html b/docs/404.html similarity index 100% rename from site/404.html rename to docs/404.html diff --git a/site/CNAME b/docs/CNAME similarity index 100% rename from site/CNAME rename to docs/CNAME diff --git a/site/_config.yml b/docs/_config.yml similarity index 100% rename from site/_config.yml rename to docs/_config.yml diff --git a/site/_data/docs.yml b/docs/_data/docs.yml similarity index 97% rename from site/_data/docs.yml rename to docs/_data/docs.yml index 071b5a14c72..950d2a6c7c0 100644 --- a/site/_data/docs.yml +++ b/docs/_data/docs.yml @@ -46,5 +46,6 @@ - title: Meta docs: - contributing + - development - conduct - history diff --git a/site/_data/jekyllconf-talks.yml b/docs/_data/jekyllconf-talks.yml similarity index 100% rename from site/_data/jekyllconf-talks.yml rename to docs/_data/jekyllconf-talks.yml diff --git a/site/_docs/assets.md b/docs/_docs/assets.md similarity index 100% rename from site/_docs/assets.md rename to docs/_docs/assets.md diff --git a/site/_docs/collections.md b/docs/_docs/collections.md similarity index 100% rename from site/_docs/collections.md rename to docs/_docs/collections.md diff --git a/site/_docs/conduct.md b/docs/_docs/conduct.md similarity index 100% rename from site/_docs/conduct.md rename to docs/_docs/conduct.md diff --git a/site/_docs/configuration.md b/docs/_docs/configuration.md similarity index 100% rename from site/_docs/configuration.md rename to docs/_docs/configuration.md diff --git a/site/_docs/continuous-integration.md b/docs/_docs/continuous-integration.md similarity index 100% rename from site/_docs/continuous-integration.md rename to docs/_docs/continuous-integration.md diff --git a/site/_docs/contributing.md b/docs/_docs/contributing.md similarity index 100% rename from site/_docs/contributing.md rename to docs/_docs/contributing.md diff --git a/site/_docs/datafiles.md b/docs/_docs/datafiles.md similarity index 100% rename from site/_docs/datafiles.md rename to docs/_docs/datafiles.md diff --git a/site/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md similarity index 100% rename from site/_docs/deployment-methods.md rename to docs/_docs/deployment-methods.md diff --git a/docs/affinity-team-captain.md b/docs/_docs/development/affinity-team-captain.md similarity index 94% rename from docs/affinity-team-captain.md rename to docs/_docs/development/affinity-team-captain.md index ccdcec7a689..addfececc58 100644 --- a/docs/affinity-team-captain.md +++ b/docs/_docs/development/affinity-team-captain.md @@ -1,6 +1,11 @@ -# Affinity Team Captains +--- +title: Affinity Team Captains +layout: docs +permalink: /docs/development/affinity-team-captain/ +--- **This guide is for affinity team captains.** These special people are **team maintainers** of one of our [affinity teams][] and help triage and evaluate the issues and contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. +{: .note .info } ## Affinity teams & their captains diff --git a/docs/avoiding-burnout.md b/docs/_docs/development/avoiding-burnout.md similarity index 95% rename from docs/avoiding-burnout.md rename to docs/_docs/development/avoiding-burnout.md index f5625e6891e..34d878f706b 100644 --- a/docs/avoiding-burnout.md +++ b/docs/_docs/development/avoiding-burnout.md @@ -1,6 +1,11 @@ -# Maintainers: Avoiding Burnout +--- +title: "Avoiding Burnout" +layout: docs +permalink: /docs/development/avoiding-burnout/ +--- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. +{: .note .info } # 1. Use Jekyll diff --git a/docs/becoming-a-maintainer.md b/docs/_docs/development/becoming-a-maintainer.md similarity index 96% rename from docs/becoming-a-maintainer.md rename to docs/_docs/development/becoming-a-maintainer.md index f6473787294..e15ac3e41b6 100644 --- a/docs/becoming-a-maintainer.md +++ b/docs/_docs/development/becoming-a-maintainer.md @@ -1,6 +1,11 @@ -# Contributors: Becoming a Maintainer +--- +title: "Becoming a Maintainer" +layout: docs +permalink: /docs/development/becoming-a-maintainer/ +--- **This guide is for contributors.** These special people have contributed to one or more of Jekyll's repositories, but do not yet have write access to any. You may find what is written here interesting, but it’s definitely not for everyone. +{: .note .info } So you want to become a maintainer of a Jekyll project? We'd love to have you! Here are some things we like to see from community members before we promote them to maintainers. diff --git a/docs/_docs/development/index.md b/docs/_docs/development/index.md new file mode 100644 index 00000000000..4b585c832f2 --- /dev/null +++ b/docs/_docs/development/index.md @@ -0,0 +1,20 @@ +--- +layout: docs +title: Maintaining Jekyll +permalink: /docs/development/ +--- + +**This guide is for Jekyll contributors and maintainers.** These special people contribute to one or more of Jekyll's repositories or help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. +{: .note .info } + +Hello! This is where we document various processes for maintaining Jekyll. Being a maintainer for any Jekyll project is a big responsibility, so we put together some helpful documentation for various tasks you might do as a maintainer. + +1. [Triaging and issue](triaging-an-issue/) +2. [Reviewing a pull request](reviewing-a-pull-request/) +3. [Merging a pull request](merging-a-pull-request/) +4. [Avoiding burnout](avoiding-burnout/) +5. [Special Labels](special-labels/) + +Interested in becoming a maintainer? Here is some documentation for **contributors**: + +1. [Becoming a maintainer](becoming-a-maintainer/) diff --git a/docs/merging-a-pull-request.md b/docs/_docs/development/merging-a-pull-request.md similarity index 96% rename from docs/merging-a-pull-request.md rename to docs/_docs/development/merging-a-pull-request.md index 3d56b09660d..37970c4de92 100644 --- a/docs/merging-a-pull-request.md +++ b/docs/_docs/development/merging-a-pull-request.md @@ -1,6 +1,11 @@ -# Maintainers: Merging a Pull Request +--- +title: "Merging a Pull Request" +layout: docs +permalink: /docs/development/merging-a-pull-request/ +--- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. +{: .note .info } ## Code Review diff --git a/docs/reviewing-a-pull-request.md b/docs/_docs/development/reviewing-a-pull-request.md similarity index 96% rename from docs/reviewing-a-pull-request.md rename to docs/_docs/development/reviewing-a-pull-request.md index b2c3e0def61..a6a26f423a9 100644 --- a/docs/reviewing-a-pull-request.md +++ b/docs/_docs/development/reviewing-a-pull-request.md @@ -1,6 +1,11 @@ -# Maintainers: Reviewing a Pull Request +--- +title: "Reviewing a Pull Request" +layout: docs +permalink: /docs/development/reviewing-a-pull-request/ +--- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. +{: .note .info } ## Respond Kindly @@ -41,4 +46,3 @@ A pull request may be merged once two maintainers have reviewed the pull request ## Think Security We owe it to our users to ensure that using a theme from the community or building someone else's site doesn't come with built-in security vulnerabilities. Things like where files may be read from and written to are important to keep secure. Jekyll is also the basis for hosted services such as [GitHub Pages](https://pages.github.com), which cannot upgrade when security issues are introduced. - diff --git a/docs/special-labels.md b/docs/_docs/development/special-labels.md similarity index 93% rename from docs/special-labels.md rename to docs/_docs/development/special-labels.md index 8ce525977e6..ba39cdc30d6 100644 --- a/docs/special-labels.md +++ b/docs/_docs/development/special-labels.md @@ -1,6 +1,11 @@ -# Maintainers: Special Labels +--- +title: "Special Labels" +layout: docs +permalink: /docs/development/special-labels/ +--- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. +{: .note .info } We use a series of "special labels" on GitHub.com to automate handling of some parts of the pull request and issue process. @jekyllbot may automatically apply or remove certain labels based on actions taken by users or maintainers. Below are the labels and how they work: diff --git a/docs/triaging-an-issue.md b/docs/_docs/development/triaging-an-issue.md similarity index 97% rename from docs/triaging-an-issue.md rename to docs/_docs/development/triaging-an-issue.md index 405dffaf45f..a919d4bbe5f 100644 --- a/docs/triaging-an-issue.md +++ b/docs/_docs/development/triaging-an-issue.md @@ -1,6 +1,11 @@ -# Maintainers: Triaging an Issue +--- +title: "Triaging an Issue" +layout: docs +permalink: /docs/development/triaging-an-issue/ +--- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. +{: .note .info } Before evaluating an issue, it is important to identify if it is a feature request or a bug. For the Jekyll project the following definitions are used diff --git a/site/_docs/drafts.md b/docs/_docs/drafts.md similarity index 100% rename from site/_docs/drafts.md rename to docs/_docs/drafts.md diff --git a/site/_docs/extras.md b/docs/_docs/extras.md similarity index 100% rename from site/_docs/extras.md rename to docs/_docs/extras.md diff --git a/site/_docs/frontmatter.md b/docs/_docs/frontmatter.md similarity index 100% rename from site/_docs/frontmatter.md rename to docs/_docs/frontmatter.md diff --git a/site/_docs/github-pages.md b/docs/_docs/github-pages.md similarity index 100% rename from site/_docs/github-pages.md rename to docs/_docs/github-pages.md diff --git a/site/_docs/history.md b/docs/_docs/history.md similarity index 100% rename from site/_docs/history.md rename to docs/_docs/history.md diff --git a/site/_docs/index.md b/docs/_docs/index.md similarity index 100% rename from site/_docs/index.md rename to docs/_docs/index.md diff --git a/site/_docs/installation.md b/docs/_docs/installation.md similarity index 100% rename from site/_docs/installation.md rename to docs/_docs/installation.md diff --git a/site/_docs/migrations.md b/docs/_docs/migrations.md similarity index 100% rename from site/_docs/migrations.md rename to docs/_docs/migrations.md diff --git a/site/_docs/pages.md b/docs/_docs/pages.md similarity index 100% rename from site/_docs/pages.md rename to docs/_docs/pages.md diff --git a/site/_docs/pagination.md b/docs/_docs/pagination.md similarity index 100% rename from site/_docs/pagination.md rename to docs/_docs/pagination.md diff --git a/site/_docs/permalinks.md b/docs/_docs/permalinks.md similarity index 100% rename from site/_docs/permalinks.md rename to docs/_docs/permalinks.md diff --git a/site/_docs/plugins.md b/docs/_docs/plugins.md similarity index 100% rename from site/_docs/plugins.md rename to docs/_docs/plugins.md diff --git a/site/_docs/posts.md b/docs/_docs/posts.md similarity index 100% rename from site/_docs/posts.md rename to docs/_docs/posts.md diff --git a/site/_docs/quickstart.md b/docs/_docs/quickstart.md similarity index 100% rename from site/_docs/quickstart.md rename to docs/_docs/quickstart.md diff --git a/site/_docs/resources.md b/docs/_docs/resources.md similarity index 100% rename from site/_docs/resources.md rename to docs/_docs/resources.md diff --git a/site/_docs/sites.md b/docs/_docs/sites.md similarity index 100% rename from site/_docs/sites.md rename to docs/_docs/sites.md diff --git a/site/_docs/static_files.md b/docs/_docs/static_files.md similarity index 100% rename from site/_docs/static_files.md rename to docs/_docs/static_files.md diff --git a/site/_docs/structure.md b/docs/_docs/structure.md similarity index 100% rename from site/_docs/structure.md rename to docs/_docs/structure.md diff --git a/site/_docs/templates.md b/docs/_docs/templates.md similarity index 100% rename from site/_docs/templates.md rename to docs/_docs/templates.md diff --git a/site/_docs/themes.md b/docs/_docs/themes.md similarity index 100% rename from site/_docs/themes.md rename to docs/_docs/themes.md diff --git a/site/_docs/troubleshooting.md b/docs/_docs/troubleshooting.md similarity index 100% rename from site/_docs/troubleshooting.md rename to docs/_docs/troubleshooting.md diff --git a/site/_docs/upgrading.md b/docs/_docs/upgrading.md similarity index 100% rename from site/_docs/upgrading.md rename to docs/_docs/upgrading.md diff --git a/site/_docs/upgrading/0-to-2.md b/docs/_docs/upgrading/0-to-2.md similarity index 100% rename from site/_docs/upgrading/0-to-2.md rename to docs/_docs/upgrading/0-to-2.md diff --git a/site/_docs/upgrading/2-to-3.md b/docs/_docs/upgrading/2-to-3.md similarity index 100% rename from site/_docs/upgrading/2-to-3.md rename to docs/_docs/upgrading/2-to-3.md diff --git a/site/_docs/usage.md b/docs/_docs/usage.md similarity index 100% rename from site/_docs/usage.md rename to docs/_docs/usage.md diff --git a/site/_docs/variables.md b/docs/_docs/variables.md similarity index 100% rename from site/_docs/variables.md rename to docs/_docs/variables.md diff --git a/site/_docs/windows.md b/docs/_docs/windows.md similarity index 100% rename from site/_docs/windows.md rename to docs/_docs/windows.md diff --git a/site/_includes/analytics.html b/docs/_includes/analytics.html similarity index 100% rename from site/_includes/analytics.html rename to docs/_includes/analytics.html diff --git a/site/_includes/anchor_links.html b/docs/_includes/anchor_links.html similarity index 100% rename from site/_includes/anchor_links.html rename to docs/_includes/anchor_links.html diff --git a/site/_includes/docs_contents.html b/docs/_includes/docs_contents.html similarity index 100% rename from site/_includes/docs_contents.html rename to docs/_includes/docs_contents.html diff --git a/site/_includes/docs_contents_mobile.html b/docs/_includes/docs_contents_mobile.html similarity index 100% rename from site/_includes/docs_contents_mobile.html rename to docs/_includes/docs_contents_mobile.html diff --git a/site/_includes/docs_option.html b/docs/_includes/docs_option.html similarity index 100% rename from site/_includes/docs_option.html rename to docs/_includes/docs_option.html diff --git a/site/_includes/docs_ul.html b/docs/_includes/docs_ul.html similarity index 100% rename from site/_includes/docs_ul.html rename to docs/_includes/docs_ul.html diff --git a/site/_includes/footer.html b/docs/_includes/footer.html similarity index 100% rename from site/_includes/footer.html rename to docs/_includes/footer.html diff --git a/site/_includes/header.html b/docs/_includes/header.html similarity index 100% rename from site/_includes/header.html rename to docs/_includes/header.html diff --git a/site/_includes/news_contents.html b/docs/_includes/news_contents.html similarity index 100% rename from site/_includes/news_contents.html rename to docs/_includes/news_contents.html diff --git a/site/_includes/news_contents_mobile.html b/docs/_includes/news_contents_mobile.html similarity index 100% rename from site/_includes/news_contents_mobile.html rename to docs/_includes/news_contents_mobile.html diff --git a/site/_includes/news_item.html b/docs/_includes/news_item.html similarity index 100% rename from site/_includes/news_item.html rename to docs/_includes/news_item.html diff --git a/site/_includes/primary-nav-items.html b/docs/_includes/primary-nav-items.html similarity index 100% rename from site/_includes/primary-nav-items.html rename to docs/_includes/primary-nav-items.html diff --git a/site/_includes/section_nav.html b/docs/_includes/section_nav.html similarity index 100% rename from site/_includes/section_nav.html rename to docs/_includes/section_nav.html diff --git a/site/_includes/top.html b/docs/_includes/top.html similarity index 100% rename from site/_includes/top.html rename to docs/_includes/top.html diff --git a/site/_layouts/default.html b/docs/_layouts/default.html similarity index 100% rename from site/_layouts/default.html rename to docs/_layouts/default.html diff --git a/site/_layouts/docs.html b/docs/_layouts/docs.html similarity index 100% rename from site/_layouts/docs.html rename to docs/_layouts/docs.html diff --git a/site/_layouts/error.html b/docs/_layouts/error.html similarity index 100% rename from site/_layouts/error.html rename to docs/_layouts/error.html diff --git a/site/_layouts/news.html b/docs/_layouts/news.html similarity index 100% rename from site/_layouts/news.html rename to docs/_layouts/news.html diff --git a/site/_layouts/news_item.html b/docs/_layouts/news_item.html similarity index 100% rename from site/_layouts/news_item.html rename to docs/_layouts/news_item.html diff --git a/site/_layouts/page.html b/docs/_layouts/page.html similarity index 100% rename from site/_layouts/page.html rename to docs/_layouts/page.html diff --git a/site/_posts/2013-05-06-jekyll-1-0-0-released.markdown b/docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown similarity index 100% rename from site/_posts/2013-05-06-jekyll-1-0-0-released.markdown rename to docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown diff --git a/site/_posts/2013-05-08-jekyll-1-0-1-released.markdown b/docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown similarity index 100% rename from site/_posts/2013-05-08-jekyll-1-0-1-released.markdown rename to docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown diff --git a/site/_posts/2013-05-12-jekyll-1-0-2-released.markdown b/docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown similarity index 100% rename from site/_posts/2013-05-12-jekyll-1-0-2-released.markdown rename to docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown diff --git a/site/_posts/2013-06-07-jekyll-1-0-3-released.markdown b/docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown similarity index 100% rename from site/_posts/2013-06-07-jekyll-1-0-3-released.markdown rename to docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown diff --git a/site/_posts/2013-07-14-jekyll-1-1-0-released.markdown b/docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown similarity index 100% rename from site/_posts/2013-07-14-jekyll-1-1-0-released.markdown rename to docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown diff --git a/site/_posts/2013-07-24-jekyll-1-1-1-released.markdown b/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown similarity index 100% rename from site/_posts/2013-07-24-jekyll-1-1-1-released.markdown rename to docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown diff --git a/site/_posts/2013-07-25-jekyll-1-0-4-released.markdown b/docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown similarity index 100% rename from site/_posts/2013-07-25-jekyll-1-0-4-released.markdown rename to docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown diff --git a/site/_posts/2013-07-25-jekyll-1-1-2-released.markdown b/docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown similarity index 100% rename from site/_posts/2013-07-25-jekyll-1-1-2-released.markdown rename to docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown diff --git a/site/_posts/2013-09-06-jekyll-1-2-0-released.markdown b/docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown similarity index 100% rename from site/_posts/2013-09-06-jekyll-1-2-0-released.markdown rename to docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown diff --git a/site/_posts/2013-09-14-jekyll-1-2-1-released.markdown b/docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown similarity index 100% rename from site/_posts/2013-09-14-jekyll-1-2-1-released.markdown rename to docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown diff --git a/site/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown b/docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown similarity index 100% rename from site/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown rename to docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown diff --git a/site/_posts/2013-11-04-jekyll-1-3-0-released.markdown b/docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown similarity index 100% rename from site/_posts/2013-11-04-jekyll-1-3-0-released.markdown rename to docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown diff --git a/site/_posts/2013-11-26-jekyll-1-3-1-released.markdown b/docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown similarity index 100% rename from site/_posts/2013-11-26-jekyll-1-3-1-released.markdown rename to docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown diff --git a/site/_posts/2013-12-07-jekyll-1-4-0-released.markdown b/docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown similarity index 100% rename from site/_posts/2013-12-07-jekyll-1-4-0-released.markdown rename to docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown diff --git a/site/_posts/2013-12-09-jekyll-1-4-1-released.markdown b/docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown similarity index 100% rename from site/_posts/2013-12-09-jekyll-1-4-1-released.markdown rename to docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown diff --git a/site/_posts/2013-12-16-jekyll-1-4-2-released.markdown b/docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown similarity index 100% rename from site/_posts/2013-12-16-jekyll-1-4-2-released.markdown rename to docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown diff --git a/site/_posts/2014-01-13-jekyll-1-4-3-released.markdown b/docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown similarity index 100% rename from site/_posts/2014-01-13-jekyll-1-4-3-released.markdown rename to docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown diff --git a/site/_posts/2014-03-24-jekyll-1-5-0-released.markdown b/docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown similarity index 100% rename from site/_posts/2014-03-24-jekyll-1-5-0-released.markdown rename to docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown diff --git a/site/_posts/2014-03-27-jekyll-1-5-1-released.markdown b/docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown similarity index 100% rename from site/_posts/2014-03-27-jekyll-1-5-1-released.markdown rename to docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown diff --git a/site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown b/docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown similarity index 100% rename from site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown rename to docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown diff --git a/site/_posts/2014-05-08-jekyll-2-0-3-released.markdown b/docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown similarity index 100% rename from site/_posts/2014-05-08-jekyll-2-0-3-released.markdown rename to docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown diff --git a/site/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown b/docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown similarity index 100% rename from site/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown rename to docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown diff --git a/site/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown b/docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown similarity index 100% rename from site/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown rename to docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown diff --git a/site/_posts/2014-07-01-jekyll-2-1-1-released.markdown b/docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown similarity index 100% rename from site/_posts/2014-07-01-jekyll-2-1-1-released.markdown rename to docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown diff --git a/site/_posts/2014-07-29-jekyll-2-2-0-released.markdown b/docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown similarity index 100% rename from site/_posts/2014-07-29-jekyll-2-2-0-released.markdown rename to docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown diff --git a/site/_posts/2014-08-10-jekyll-2-3-0-released.markdown b/docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown similarity index 100% rename from site/_posts/2014-08-10-jekyll-2-3-0-released.markdown rename to docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown diff --git a/site/_posts/2014-09-09-jekyll-2-4-0-released.markdown b/docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown similarity index 100% rename from site/_posts/2014-09-09-jekyll-2-4-0-released.markdown rename to docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown diff --git a/site/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown b/docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown similarity index 100% rename from site/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown rename to docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown diff --git a/site/_posts/2014-11-08-jekyll-2-5-1-released.markdown b/docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown similarity index 100% rename from site/_posts/2014-11-08-jekyll-2-5-1-released.markdown rename to docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown diff --git a/site/_posts/2014-11-12-jekyll-2-5-2-released.markdown b/docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown similarity index 100% rename from site/_posts/2014-11-12-jekyll-2-5-2-released.markdown rename to docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown diff --git a/site/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md b/docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md similarity index 100% rename from site/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md rename to docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md diff --git a/site/_posts/2014-12-22-jekyll-2-5-3-released.markdown b/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown similarity index 100% rename from site/_posts/2014-12-22-jekyll-2-5-3-released.markdown rename to docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown diff --git a/site/_posts/2015-01-20-jekyll-meet-and-greet.markdown b/docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown similarity index 100% rename from site/_posts/2015-01-20-jekyll-meet-and-greet.markdown rename to docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown diff --git a/site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown b/docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown similarity index 100% rename from site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown rename to docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown diff --git a/site/_posts/2015-02-26-introducing-jekyll-talk.markdown b/docs/_posts/2015-02-26-introducing-jekyll-talk.markdown similarity index 100% rename from site/_posts/2015-02-26-introducing-jekyll-talk.markdown rename to docs/_posts/2015-02-26-introducing-jekyll-talk.markdown diff --git a/site/_posts/2015-10-26-jekyll-3-0-released.markdown b/docs/_posts/2015-10-26-jekyll-3-0-released.markdown similarity index 100% rename from site/_posts/2015-10-26-jekyll-3-0-released.markdown rename to docs/_posts/2015-10-26-jekyll-3-0-released.markdown diff --git a/site/_posts/2015-11-17-jekyll-3-0-1-released.markdown b/docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown similarity index 100% rename from site/_posts/2015-11-17-jekyll-3-0-1-released.markdown rename to docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown diff --git a/site/_posts/2016-01-20-jekyll-3-0-2-released.markdown b/docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown similarity index 100% rename from site/_posts/2016-01-20-jekyll-3-0-2-released.markdown rename to docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown diff --git a/site/_posts/2016-01-24-jekyll-3-1-0-released.markdown b/docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown similarity index 100% rename from site/_posts/2016-01-24-jekyll-3-1-0-released.markdown rename to docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown diff --git a/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown b/docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown similarity index 100% rename from site/_posts/2016-01-28-jekyll-3-1-1-released.markdown rename to docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown diff --git a/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown b/docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown similarity index 100% rename from site/_posts/2016-02-08-jekyll-3-0-3-released.markdown rename to docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown diff --git a/site/_posts/2016-02-19-jekyll-3-1-2-released.markdown b/docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown similarity index 100% rename from site/_posts/2016-02-19-jekyll-3-1-2-released.markdown rename to docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown diff --git a/site/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md b/docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md similarity index 100% rename from site/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md rename to docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md diff --git a/site/_posts/2016-04-19-jekyll-3-0-4-released.markdown b/docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown similarity index 100% rename from site/_posts/2016-04-19-jekyll-3-0-4-released.markdown rename to docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown diff --git a/site/_posts/2016-04-19-jekyll-3-1-3-released.markdown b/docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown similarity index 100% rename from site/_posts/2016-04-19-jekyll-3-1-3-released.markdown rename to docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown diff --git a/site/_posts/2016-04-26-jekyll-3-0-5-released.markdown b/docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown similarity index 100% rename from site/_posts/2016-04-26-jekyll-3-0-5-released.markdown rename to docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown diff --git a/site/_posts/2016-05-18-jekyll-3-1-4-released.markdown b/docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown similarity index 100% rename from site/_posts/2016-05-18-jekyll-3-1-4-released.markdown rename to docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown diff --git a/site/_posts/2016-05-18-jekyll-3-1-5-released.markdown b/docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown similarity index 100% rename from site/_posts/2016-05-18-jekyll-3-1-5-released.markdown rename to docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown diff --git a/site/_posts/2016-05-19-jekyll-3-1-6-released.markdown b/docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown similarity index 100% rename from site/_posts/2016-05-19-jekyll-3-1-6-released.markdown rename to docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown diff --git a/site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown b/docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown similarity index 100% rename from site/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown rename to docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown diff --git a/site/_posts/2016-07-26-jekyll-3-2-0-released.markdown b/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown similarity index 100% rename from site/_posts/2016-07-26-jekyll-3-2-0-released.markdown rename to docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown diff --git a/site/_posts/2016-08-02-jekyll-3-2-1-released.markdown b/docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown similarity index 100% rename from site/_posts/2016-08-02-jekyll-3-2-1-released.markdown rename to docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown diff --git a/site/_posts/2016-08-24-jekyll-admin-initial-release.markdown b/docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown similarity index 100% rename from site/_posts/2016-08-24-jekyll-admin-initial-release.markdown rename to docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown diff --git a/site/_posts/2016-10-06-jekyll-3-3-is-here.md b/docs/_posts/2016-10-06-jekyll-3-3-is-here.md similarity index 100% rename from site/_posts/2016-10-06-jekyll-3-3-is-here.md rename to docs/_posts/2016-10-06-jekyll-3-3-is-here.md diff --git a/site/_sass/_font-awesome.scss b/docs/_sass/_font-awesome.scss similarity index 100% rename from site/_sass/_font-awesome.scss rename to docs/_sass/_font-awesome.scss diff --git a/site/_sass/_gridism.scss b/docs/_sass/_gridism.scss similarity index 100% rename from site/_sass/_gridism.scss rename to docs/_sass/_gridism.scss diff --git a/site/_sass/_mixins.scss b/docs/_sass/_mixins.scss similarity index 100% rename from site/_sass/_mixins.scss rename to docs/_sass/_mixins.scss diff --git a/site/_sass/_normalize.scss b/docs/_sass/_normalize.scss similarity index 100% rename from site/_sass/_normalize.scss rename to docs/_sass/_normalize.scss diff --git a/site/_sass/_pygments.scss b/docs/_sass/_pygments.scss similarity index 100% rename from site/_sass/_pygments.scss rename to docs/_sass/_pygments.scss diff --git a/site/_sass/_style.scss b/docs/_sass/_style.scss similarity index 100% rename from site/_sass/_style.scss rename to docs/_sass/_style.scss diff --git a/site/community/index.md b/docs/community/index.md similarity index 100% rename from site/community/index.md rename to docs/community/index.md diff --git a/site/css/screen.scss b/docs/css/screen.scss similarity index 100% rename from site/css/screen.scss rename to docs/css/screen.scss diff --git a/site/favicon.ico b/docs/favicon.ico similarity index 100% rename from site/favicon.ico rename to docs/favicon.ico diff --git a/site/fonts/fontawesome-webfont.eot b/docs/fonts/fontawesome-webfont.eot similarity index 100% rename from site/fonts/fontawesome-webfont.eot rename to docs/fonts/fontawesome-webfont.eot diff --git a/site/fonts/fontawesome-webfont.svg b/docs/fonts/fontawesome-webfont.svg similarity index 100% rename from site/fonts/fontawesome-webfont.svg rename to docs/fonts/fontawesome-webfont.svg diff --git a/site/fonts/fontawesome-webfont.ttf b/docs/fonts/fontawesome-webfont.ttf similarity index 100% rename from site/fonts/fontawesome-webfont.ttf rename to docs/fonts/fontawesome-webfont.ttf diff --git a/site/fonts/fontawesome-webfont.woff b/docs/fonts/fontawesome-webfont.woff similarity index 100% rename from site/fonts/fontawesome-webfont.woff rename to docs/fonts/fontawesome-webfont.woff diff --git a/site/fonts/fontawesome-webfont.woff2 b/docs/fonts/fontawesome-webfont.woff2 similarity index 100% rename from site/fonts/fontawesome-webfont.woff2 rename to docs/fonts/fontawesome-webfont.woff2 diff --git a/site/freenode.txt b/docs/freenode.txt similarity index 100% rename from site/freenode.txt rename to docs/freenode.txt diff --git a/site/help/index.md b/docs/help/index.md similarity index 100% rename from site/help/index.md rename to docs/help/index.md diff --git a/site/img/article-footer.png b/docs/img/article-footer.png similarity index 100% rename from site/img/article-footer.png rename to docs/img/article-footer.png diff --git a/site/img/footer-arrow.png b/docs/img/footer-arrow.png similarity index 100% rename from site/img/footer-arrow.png rename to docs/img/footer-arrow.png diff --git a/site/img/footer-logo.png b/docs/img/footer-logo.png similarity index 100% rename from site/img/footer-logo.png rename to docs/img/footer-logo.png diff --git a/site/img/jekyll-sticker.jpg b/docs/img/jekyll-sticker.jpg similarity index 100% rename from site/img/jekyll-sticker.jpg rename to docs/img/jekyll-sticker.jpg diff --git a/site/img/logo-2x.png b/docs/img/logo-2x.png similarity index 100% rename from site/img/logo-2x.png rename to docs/img/logo-2x.png diff --git a/site/img/logo-rss.png b/docs/img/logo-rss.png similarity index 100% rename from site/img/logo-rss.png rename to docs/img/logo-rss.png diff --git a/site/img/octojekyll.png b/docs/img/octojekyll.png similarity index 100% rename from site/img/octojekyll.png rename to docs/img/octojekyll.png diff --git a/site/index.html b/docs/index.html similarity index 100% rename from site/index.html rename to docs/index.html diff --git a/site/js/html5shiv.min.js b/docs/js/html5shiv.min.js similarity index 100% rename from site/js/html5shiv.min.js rename to docs/js/html5shiv.min.js diff --git a/site/js/respond.min.js b/docs/js/respond.min.js similarity index 100% rename from site/js/respond.min.js rename to docs/js/respond.min.js diff --git a/site/latest_version.txt b/docs/latest_version.txt similarity index 100% rename from site/latest_version.txt rename to docs/latest_version.txt diff --git a/site/news/index.html b/docs/news/index.html similarity index 100% rename from site/news/index.html rename to docs/news/index.html diff --git a/site/news/releases/index.html b/docs/news/releases/index.html similarity index 100% rename from site/news/releases/index.html rename to docs/news/releases/index.html diff --git a/docs/readme.md b/docs/readme.md index f2cb1fed2b5..674d8b36dcf 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1,13 +1,16 @@ -# Maintaining Jekyll +# Jekyll docs site -Hello! This is where we document various processes for maintaining Jekyll. Being a maintainer for any Jekyll project is a big responsibility, so we put together some helpful documentation for various tasks you might do as a maintainer. +This directory contains the code for the Jekyll docs site, [jekyllrb.com](http://jekyllrb.com/). -1. [Triaging and issue](triaging-an-issue.md) -2. [Reviewing a pull request](reviewing-a-pull-request.md) -3. [Merging a pull request](merging-a-pull-request.md) -4. [Avoiding burnout](avoiding-burnout.md) -5. [Special Labels](special-labels.md) +## Contributing -Interested in becoming a maintainer? Here is some documentation for **contributors**: +For information about contributing, see the [Contributing page](http://jekyllrb.com/docs/contributing/). -1. [Becoming a maintainer](becoming-a-maintainer.md) +## Running locally + +You can preview your contributions before opening a pull request by running from within the directory: + +1. `bundle install --without test test_legacy benchmark` +2. `bundle exec rake site:preview` + +It's just a jekyll site, afterall! :wink: diff --git a/site/redirects/github.html b/docs/redirects/github.html similarity index 100% rename from site/redirects/github.html rename to docs/redirects/github.html diff --git a/site/redirects/issues.html b/docs/redirects/issues.html similarity index 100% rename from site/redirects/issues.html rename to docs/redirects/issues.html diff --git a/site/README.md b/site/README.md deleted file mode 100644 index 674d8b36dcf..00000000000 --- a/site/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Jekyll docs site - -This directory contains the code for the Jekyll docs site, [jekyllrb.com](http://jekyllrb.com/). - -## Contributing - -For information about contributing, see the [Contributing page](http://jekyllrb.com/docs/contributing/). - -## Running locally - -You can preview your contributions before opening a pull request by running from within the directory: - -1. `bundle install --without test test_legacy benchmark` -2. `bundle exec rake site:preview` - -It's just a jekyll site, afterall! :wink: From db4c5710208fb95cfe8c2ba4bfd74a1eb827be9c Mon Sep 17 00:00:00 2001 From: Sverrir Sigmundarson Date: Mon, 10 Oct 2016 23:10:49 +0200 Subject: [PATCH 1565/4996] Updating install instruction link Adding a link to updated installation instructions for Jekyll 3 and Ruby 2.2.5. These instructions were adapted and significantly updated from the earlier work of Julian Thilo which is now outdated. --- docs/_docs/windows.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index f64ac6d49d3..68edd8ef69d 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -16,8 +16,10 @@ A quick way to install Jekyll is to follow the [installation instructions by Dav 2. Install Ruby via Chocolatey: `choco install ruby -y` 3. Reopen a command prompt and install Jekyll: `gem install jekyll` -For a more conventional way of installing Jekyll you can follow the [installation instruction by Julian Thilo][windows-installation]. The instructions were written for Ruby 2.0.0, but should work for later -versions [prior to 2.2][hitimes-issue]. +For a more conventional way of installing Jekyll you can follow the [installation instructions by Sverrir Sigmundarson][windows-installjekyll3]. These instructions are for newer versions of Ruby 2.2.5 and Jekyll 3. + +For instructions for older versions of Ruby 2.0.0 ([prior to 2.2][hitimes-issue]) and Jekyll 2 and older you should follow the [installation instruction by Julian Thilo][windows-installation]. + ## Encoding @@ -34,6 +36,7 @@ $ chcp 65001 ``` [windows-installation]: http://jekyll-windows.juthilo.com/ +[windows-installjekyll3]: https://labs.sverrirs.com/jekyll/ [hitimes-issue]: https://github.com/copiousfreetime/hitimes/issues/40 ## Auto-regeneration From b108f4c87e6806c2b7f11e74ad6f426c9cc3b495 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 2 Nov 2016 14:03:08 -0700 Subject: [PATCH 1566/4996] Move docs/development to docs/maintaining --- docs/_data/docs.yml | 2 +- .../affinity-team-captain.md | 1 - .../avoiding-burnout.md | 1 - .../becoming-a-maintainer.md | 1 - docs/_docs/{development => maintaining}/index.md | 13 +++++++------ .../merging-a-pull-request.md | 1 - .../reviewing-a-pull-request.md | 1 - .../{development => maintaining}/special-labels.md | 1 - .../triaging-an-issue.md | 1 - 9 files changed, 8 insertions(+), 14 deletions(-) rename docs/_docs/{development => maintaining}/affinity-team-captain.md (97%) rename docs/_docs/{development => maintaining}/avoiding-burnout.md (98%) rename docs/_docs/{development => maintaining}/becoming-a-maintainer.md (98%) rename docs/_docs/{development => maintaining}/index.md (68%) rename docs/_docs/{development => maintaining}/merging-a-pull-request.md (98%) rename docs/_docs/{development => maintaining}/reviewing-a-pull-request.md (98%) rename docs/_docs/{development => maintaining}/special-labels.md (97%) rename docs/_docs/{development => maintaining}/triaging-an-issue.md (98%) diff --git a/docs/_data/docs.yml b/docs/_data/docs.yml index 950d2a6c7c0..4ff28ba2a68 100644 --- a/docs/_data/docs.yml +++ b/docs/_data/docs.yml @@ -46,6 +46,6 @@ - title: Meta docs: - contributing - - development + - maintaining - conduct - history diff --git a/docs/_docs/development/affinity-team-captain.md b/docs/_docs/maintaining/affinity-team-captain.md similarity index 97% rename from docs/_docs/development/affinity-team-captain.md rename to docs/_docs/maintaining/affinity-team-captain.md index addfececc58..02247d2d17c 100644 --- a/docs/_docs/development/affinity-team-captain.md +++ b/docs/_docs/maintaining/affinity-team-captain.md @@ -1,7 +1,6 @@ --- title: Affinity Team Captains layout: docs -permalink: /docs/development/affinity-team-captain/ --- **This guide is for affinity team captains.** These special people are **team maintainers** of one of our [affinity teams][] and help triage and evaluate the issues and contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/development/avoiding-burnout.md b/docs/_docs/maintaining/avoiding-burnout.md similarity index 98% rename from docs/_docs/development/avoiding-burnout.md rename to docs/_docs/maintaining/avoiding-burnout.md index 34d878f706b..a418cefdb5e 100644 --- a/docs/_docs/development/avoiding-burnout.md +++ b/docs/_docs/maintaining/avoiding-burnout.md @@ -1,7 +1,6 @@ --- title: "Avoiding Burnout" layout: docs -permalink: /docs/development/avoiding-burnout/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/development/becoming-a-maintainer.md b/docs/_docs/maintaining/becoming-a-maintainer.md similarity index 98% rename from docs/_docs/development/becoming-a-maintainer.md rename to docs/_docs/maintaining/becoming-a-maintainer.md index e15ac3e41b6..c4a262b930c 100644 --- a/docs/_docs/development/becoming-a-maintainer.md +++ b/docs/_docs/maintaining/becoming-a-maintainer.md @@ -1,7 +1,6 @@ --- title: "Becoming a Maintainer" layout: docs -permalink: /docs/development/becoming-a-maintainer/ --- **This guide is for contributors.** These special people have contributed to one or more of Jekyll's repositories, but do not yet have write access to any. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/development/index.md b/docs/_docs/maintaining/index.md similarity index 68% rename from docs/_docs/development/index.md rename to docs/_docs/maintaining/index.md index 4b585c832f2..5c4da4db308 100644 --- a/docs/_docs/development/index.md +++ b/docs/_docs/maintaining/index.md @@ -1,7 +1,7 @@ --- layout: docs title: Maintaining Jekyll -permalink: /docs/development/ +permalink: /docs/maintaining/ --- **This guide is for Jekyll contributors and maintainers.** These special people contribute to one or more of Jekyll's repositories or help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. @@ -9,11 +9,12 @@ permalink: /docs/development/ Hello! This is where we document various processes for maintaining Jekyll. Being a maintainer for any Jekyll project is a big responsibility, so we put together some helpful documentation for various tasks you might do as a maintainer. -1. [Triaging and issue](triaging-an-issue/) -2. [Reviewing a pull request](reviewing-a-pull-request/) -3. [Merging a pull request](merging-a-pull-request/) -4. [Avoiding burnout](avoiding-burnout/) -5. [Special Labels](special-labels/) +1. [Affinity teams & their captains](affinity-team-captain/) +2. [Triaging and issue](triaging-an-issue/) +3. [Reviewing a pull request](reviewing-a-pull-request/) +4. [Merging a pull request](merging-a-pull-request/) +5. [Avoiding burnout](avoiding-burnout/) +6. [Special Labels](special-labels/) Interested in becoming a maintainer? Here is some documentation for **contributors**: diff --git a/docs/_docs/development/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md similarity index 98% rename from docs/_docs/development/merging-a-pull-request.md rename to docs/_docs/maintaining/merging-a-pull-request.md index 37970c4de92..7265c6f857c 100644 --- a/docs/_docs/development/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -1,7 +1,6 @@ --- title: "Merging a Pull Request" layout: docs -permalink: /docs/development/merging-a-pull-request/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/development/reviewing-a-pull-request.md b/docs/_docs/maintaining/reviewing-a-pull-request.md similarity index 98% rename from docs/_docs/development/reviewing-a-pull-request.md rename to docs/_docs/maintaining/reviewing-a-pull-request.md index a6a26f423a9..1ecaeea9899 100644 --- a/docs/_docs/development/reviewing-a-pull-request.md +++ b/docs/_docs/maintaining/reviewing-a-pull-request.md @@ -1,7 +1,6 @@ --- title: "Reviewing a Pull Request" layout: docs -permalink: /docs/development/reviewing-a-pull-request/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/development/special-labels.md b/docs/_docs/maintaining/special-labels.md similarity index 97% rename from docs/_docs/development/special-labels.md rename to docs/_docs/maintaining/special-labels.md index ba39cdc30d6..ff8a623f858 100644 --- a/docs/_docs/development/special-labels.md +++ b/docs/_docs/maintaining/special-labels.md @@ -1,7 +1,6 @@ --- title: "Special Labels" layout: docs -permalink: /docs/development/special-labels/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/development/triaging-an-issue.md b/docs/_docs/maintaining/triaging-an-issue.md similarity index 98% rename from docs/_docs/development/triaging-an-issue.md rename to docs/_docs/maintaining/triaging-an-issue.md index a919d4bbe5f..4802b61b486 100644 --- a/docs/_docs/development/triaging-an-issue.md +++ b/docs/_docs/maintaining/triaging-an-issue.md @@ -1,7 +1,6 @@ --- title: "Triaging an Issue" layout: docs -permalink: /docs/development/triaging-an-issue/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. From 8b2a35dc509d0ec826a22c63193576df5f723917 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 2 Nov 2016 14:11:40 -0700 Subject: [PATCH 1567/4996] Instead of a sleep hack, just use a Jekyll hook! :smile: --- rake/site.rake | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/rake/site.rake b/rake/site.rake index 679e4bf0768..45b0cac2f41 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -12,11 +12,11 @@ namespace :site do require "launchy" require "jekyll" - # Yep, it's a hack! Wait a few seconds for the Jekyll site to generate and - # then open it in a browser. Someday we can do better than this, I hope. - Thread.new do - sleep 4 - puts "Opening in browser..." + browser_launched = false + Jekyll::Hooks.register :site, :post_write do |site| + next if browser_launched + browser_launched = true + Jekyll.logger.info "Opening in browser..." Launchy.open("http://localhost:4000") end @@ -36,7 +36,7 @@ namespace :site do task :generate => :generated_pages do require "jekyll" Jekyll::Commands::Build.process({ - "profile" => true, + "profile" => true, "source" => File.expand_path(docs_folder), "destination" => File.expand_path("#{docs_folder}/_site") }) @@ -54,14 +54,8 @@ namespace :site do desc "Generate generated pages and publish to GitHub Pages" task :publish => :generated_pages do - puts "Committing and pushing to GitHub Pages..." - sha = `git rev-parse HEAD`.strip - Dir.chdir('gh-pages') do - sh "git add docs/" - sh "git commit --allow-empty -m 'Generating pages for #{sha}.'" - sh "git push origin master" - end - puts 'Done.' + puts "GitHub Pages now compiles our docs site on every push to the `master` branch. Cool, huh?" + exit 1 end desc "Create a nicely formatted history page for the jekyll site based on the repo history." From 1669f944d16e71350a1c162f725689849cf7e399 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 2 Nov 2016 14:12:03 -0700 Subject: [PATCH 1568/4996] Move posts-specific permalink into collections metadata. Way better. :dizzy: --- docs/_config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 5333c52ecba..6f57710aa2e 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,6 +1,5 @@ markdown: kramdown highlighter: rouge -permalink: /news/:year/:month/:day/:title/ gauges_id: 503c5af6613f5d0f19000027 google_analytics_id: UA-50755011-1 @@ -14,6 +13,9 @@ timezone: America/Los_Angeles collections: docs: output: true + posts: + permalink: /news/:year/:month/:day/:title/ + output: true name: Jekyll • Simple, blog-aware, static sites description: Transform your plain text into static websites and blogs From 2adac58b41a788eef41a6db1d4588a667de611da Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 2 Nov 2016 14:48:06 -0700 Subject: [PATCH 1569/4996] Update history to reflect merge of #5459 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 711367a82a5..8c51f23a3ef 100644 --- a/History.markdown +++ b/History.markdown @@ -13,6 +13,7 @@ * Ubuntu users should install ruby2.3-dev (#5512) * Remove Glynn as deployment option (#5519) * Fix broken forum link (#5466) + * Move documentation to docs folder (#5459) ### Bug Fixes From 3e2139e8940a38d2cd513dd38fc4517ad7a8af63 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 2 Nov 2016 15:09:46 -0700 Subject: [PATCH 1570/4996] Fix 'Improve this page' link. Fixes #5529 --- docs/_layouts/docs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_layouts/docs.html b/docs/_layouts/docs.html index 0456c4cc9ae..7a6b052061d 100644 --- a/docs/_layouts/docs.html +++ b/docs/_layouts/docs.html @@ -10,7 +10,7 @@

    {{ page.title }}

    {{ content }} From acc00e41fb841a626a50ba37992363235966f98e Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 3 Nov 2016 07:00:55 +0530 Subject: [PATCH 1571/4996] add permalinks to docs in '/maintaining/' --- docs/_docs/maintaining/affinity-team-captain.md | 1 + docs/_docs/maintaining/avoiding-burnout.md | 1 + docs/_docs/maintaining/becoming-a-maintainer.md | 1 + docs/_docs/maintaining/merging-a-pull-request.md | 1 + docs/_docs/maintaining/reviewing-a-pull-request.md | 1 + docs/_docs/maintaining/special-labels.md | 1 + docs/_docs/maintaining/triaging-an-issue.md | 1 + 7 files changed, 7 insertions(+) diff --git a/docs/_docs/maintaining/affinity-team-captain.md b/docs/_docs/maintaining/affinity-team-captain.md index 02247d2d17c..0554fdc63e1 100644 --- a/docs/_docs/maintaining/affinity-team-captain.md +++ b/docs/_docs/maintaining/affinity-team-captain.md @@ -1,6 +1,7 @@ --- title: Affinity Team Captains layout: docs +permalink: /docs/maintaining/affinity-team-captain/ --- **This guide is for affinity team captains.** These special people are **team maintainers** of one of our [affinity teams][] and help triage and evaluate the issues and contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/avoiding-burnout.md b/docs/_docs/maintaining/avoiding-burnout.md index a418cefdb5e..72e46e1ac41 100644 --- a/docs/_docs/maintaining/avoiding-burnout.md +++ b/docs/_docs/maintaining/avoiding-burnout.md @@ -1,6 +1,7 @@ --- title: "Avoiding Burnout" layout: docs +permalink: /docs/maintaining/avoiding-burnout/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/becoming-a-maintainer.md b/docs/_docs/maintaining/becoming-a-maintainer.md index c4a262b930c..61b19e2cd20 100644 --- a/docs/_docs/maintaining/becoming-a-maintainer.md +++ b/docs/_docs/maintaining/becoming-a-maintainer.md @@ -1,6 +1,7 @@ --- title: "Becoming a Maintainer" layout: docs +permalink: /docs/maintaining/becoming-a-maintainer/ --- **This guide is for contributors.** These special people have contributed to one or more of Jekyll's repositories, but do not yet have write access to any. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md index 7265c6f857c..e5c5eacfef8 100644 --- a/docs/_docs/maintaining/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -1,6 +1,7 @@ --- title: "Merging a Pull Request" layout: docs +permalink: /docs/maintaining/merging-a-pull-request/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/reviewing-a-pull-request.md b/docs/_docs/maintaining/reviewing-a-pull-request.md index 1ecaeea9899..3185a19ef43 100644 --- a/docs/_docs/maintaining/reviewing-a-pull-request.md +++ b/docs/_docs/maintaining/reviewing-a-pull-request.md @@ -1,6 +1,7 @@ --- title: "Reviewing a Pull Request" layout: docs +permalink: /docs/maintaining/reviewing-a-pull-request/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/special-labels.md b/docs/_docs/maintaining/special-labels.md index ff8a623f858..7a32a1fa4c7 100644 --- a/docs/_docs/maintaining/special-labels.md +++ b/docs/_docs/maintaining/special-labels.md @@ -1,6 +1,7 @@ --- title: "Special Labels" layout: docs +permalink: /docs/maintaining/special-labels/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/triaging-an-issue.md b/docs/_docs/maintaining/triaging-an-issue.md index 4802b61b486..6c97f967cba 100644 --- a/docs/_docs/maintaining/triaging-an-issue.md +++ b/docs/_docs/maintaining/triaging-an-issue.md @@ -1,6 +1,7 @@ --- title: "Triaging an Issue" layout: docs +permalink: /docs/maintaining/triaging-an-issue/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. From e523b2251073cf0a85e546c60bab655f47d588c9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 2 Nov 2016 18:55:48 -0700 Subject: [PATCH 1572/4996] Update history to reflect merge of #5532 [ci skip] --- History.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/History.markdown b/History.markdown index 8c51f23a3ef..f6832ba6764 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,7 @@ ## HEAD + * Add permalinks to docs in '/maintaining/' (#5532) + ### Site Enhancements * Documentation: {% link %} tag (#5449) From 0a17b0ab0ad0f47e759d814e5a7ef8746a83eed3 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 3 Nov 2016 10:49:40 +0800 Subject: [PATCH 1573/4996] Fix broken links --- .github/CONTRIBUTING.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/CONTRIBUTING.markdown b/.github/CONTRIBUTING.markdown index 15f2fcce5ea..9e9e479cf77 100644 --- a/.github/CONTRIBUTING.markdown +++ b/.github/CONTRIBUTING.markdown @@ -62,13 +62,13 @@ We want the Jekyll documentation to be the best it can be. We've open-sourced ou ### How to submit changes -You can find the documentation for jekyllrb.com in the [site](https://github.com/jekyll/jekyll/tree/master/site) directory. See the section above, [submitting a pull request](#submitting-a-pull-request) for information on how to propose a change. +You can find the documentation for jekyllrb.com in the [docs](https://github.com/jekyll/jekyll/tree/master/docs) directory. See the section above, [submitting a pull request](#submitting-a-pull-request) for information on how to propose a change. One gotcha, all pull requests should be directed at the `master` branch (the default branch). ### Adding plugins -If you want to add your plugin to the [list of plugins](https://jekyllrb.com/docs/plugins/#available-plugins), please submit a pull request modifying the [plugins page source file](https://github.com/jekyll/jekyll/blob/master/site/_docs/plugins.md) by adding a link to your plugin under the proper subheading depending upon its type. +If you want to add your plugin to the [list of plugins](https://jekyllrb.com/docs/plugins/#available-plugins), please submit a pull request modifying the [plugins page source file](https://github.com/jekyll/jekyll/blob/master/docs/_docs/plugins.md) by adding a link to your plugin under the proper subheading depending upon its type. ## Code Contributions @@ -80,7 +80,7 @@ Any time you propose a code change, you should also include updates to the docum #### Documentation -If your contribution changes any Jekyll behavior, make sure to update the documentation. Documentation lives in the `site/_docs` folder (spoiler alert: it's a Jekyll site!). If the docs are missing information, please feel free to add it in. Great docs make a great project. Include changes to the documentation within your pull request, and once merged, `jekyllrb.com` will be updated. +If your contribution changes any Jekyll behavior, make sure to update the documentation. Documentation lives in the `docs/_docs` folder (spoiler alert: it's a Jekyll site!). If the docs are missing information, please feel free to add it in. Great docs make a great project. Include changes to the documentation within your pull request, and once merged, `jekyllrb.com` will be updated. #### Tests From 55887194cdd25ffa83e02912560e021949911a66 Mon Sep 17 00:00:00 2001 From: Mathieu Malaterre Date: Thu, 3 Nov 2016 10:00:35 +0100 Subject: [PATCH 1574/4996] Fix HTML rendering Previously the YAML example would contains the string 'yaml' at the top of the file. Very confusing for newcomers. --- docs/_docs/datafiles.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index d61c1bfaf48..daf5e4b1776 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -125,6 +125,7 @@ file name: Pages and posts can also access a specific data item. The example below shows how to access a specific item: `_data/people.yml`: + ```yaml dave: name: David Smith From 52e189c46adb621e7cac565373dc7405c8f0c28c Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 3 Nov 2016 14:54:11 +0100 Subject: [PATCH 1575/4996] update source in script/proof --- script/proof | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/proof b/script/proof index 95cffc0bf62..8e7e899da19 100755 --- a/script/proof +++ b/script/proof @@ -16,7 +16,7 @@ INGORE_HREFS=$(ruby -e 'puts %w{ eduardoboucas.com github.com\/matrix9180 }.map{|h| "/#{h}/"}.join(",")') -SOURCE="site" +SOURCE="docs" DESTINATION="_site" export PROOF=true From d55cfe51544f90ded9c29721b735ddc615a80215 Mon Sep 17 00:00:00 2001 From: Matthew Du Date: Thu, 3 Nov 2016 22:02:46 +0800 Subject: [PATCH 1576/4996] Update doc about categories and tags --- docs/_docs/frontmatter.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/frontmatter.md b/docs/_docs/frontmatter.md index 72281e265df..6dd8e5fe2ba 100644 --- a/docs/_docs/frontmatter.md +++ b/docs/_docs/frontmatter.md @@ -157,7 +157,7 @@ These are available out-of-the-box to be used in the front matter for a post. the post will act as though it had been set with these categories normally. Categories (plural key) can be specified as a YAML list or a - comma-separated string. + space-separated string.

    @@ -172,7 +172,7 @@ These are available out-of-the-box to be used in the front matter for a post. Similar to categories, one or multiple tags can be added to a post. Also like categories, tags can be specified as a YAML list or a - comma-separated string. + space-separated string.

    From 5237040b44fbd02745c8b7876634fa6b6e9a205f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 3 Nov 2016 08:37:46 -0700 Subject: [PATCH 1577/4996] Update history to reflect merge of #5538 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f6832ba6764..c43b91e6bf5 100644 --- a/History.markdown +++ b/History.markdown @@ -30,6 +30,7 @@ * script/test: add missing whitespace (#5479) * Restrict Rubocop version (#5496) * include a hashbang for all benchmark scripts & make them executable (#5505) + * Update source in script/proof (#5538) ### Minor Enhancements From 7298da6de44df2ce8c65da40bcd19ab3fa8dde55 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 3 Nov 2016 08:38:28 -0700 Subject: [PATCH 1578/4996] Update history to reflect merge of #5533 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c43b91e6bf5..14c2cbb0a7b 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Remove Glynn as deployment option (#5519) * Fix broken forum link (#5466) * Move documentation to docs folder (#5459) + * Fix broken links in CONTRIBUTING (#5533) ### Bug Fixes From b30c499196571db81c02e031d9b664084f59ef90 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 3 Nov 2016 09:53:43 -0700 Subject: [PATCH 1579/4996] Update history to reflect merge of #5540 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 14c2cbb0a7b..89e33d9eb8a 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * Fix broken forum link (#5466) * Move documentation to docs folder (#5459) * Fix broken links in CONTRIBUTING (#5533) + * Update documentation on jekyllrb.com (#5540) ### Bug Fixes From 894d2a0415a64b3a40840b5adbe11523b5eff097 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 4 Nov 2016 00:50:54 +0530 Subject: [PATCH 1580/4996] test double slash when input = '/' --- test/test_filters.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/test_filters.rb b/test/test_filters.rb index 9a0f87d46b7..380f1d23f9f 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -368,6 +368,24 @@ def select; end assert_equal "http://example.com/base", filter.absolute_url(page_url) end + should "not append a forward slash if input is '/'" do + page_url = "/" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => "/base" + }) + refute_equal "http://example.com/base//", filter.absolute_url(page_url) + end + + should "not append a forward slash if input is '/' and nil 'baseurl'" do + page_url = "/" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => nil + }) + refute_equal "http://example.com//", filter.absolute_url(page_url) + end + should "normalize international URLs" do page_url = "" filter = make_filter_mock({ From 9192e66b7b9cdbeff43598c55d4a34f67a83f888 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 4 Nov 2016 01:17:54 +0530 Subject: [PATCH 1581/4996] assert instead of refuting --- test/test_filters.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index 380f1d23f9f..66091c28c15 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -374,7 +374,7 @@ def select; end "url" => "http://example.com", "baseurl" => "/base" }) - refute_equal "http://example.com/base//", filter.absolute_url(page_url) + assert_equal "http://example.com/base/", filter.absolute_url(page_url) end should "not append a forward slash if input is '/' and nil 'baseurl'" do @@ -383,7 +383,7 @@ def select; end "url" => "http://example.com", "baseurl" => nil }) - refute_equal "http://example.com//", filter.absolute_url(page_url) + assert_equal "http://example.com/", filter.absolute_url(page_url) end should "normalize international URLs" do From 2dafd50664c687531c6bb4b787b206e49b6248e3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 3 Nov 2016 13:32:20 -0700 Subject: [PATCH 1582/4996] Remove freenode.txt from jekyllrb.com. Fixes #5539. --- docs/freenode.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 docs/freenode.txt diff --git a/docs/freenode.txt b/docs/freenode.txt deleted file mode 100644 index 898ed7291d6..00000000000 --- a/docs/freenode.txt +++ /dev/null @@ -1 +0,0 @@ -aS3gAc4g From e1eff52cd2eb9e7508269a2f25d9761653a0360e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 3 Nov 2016 15:22:56 -0700 Subject: [PATCH 1583/4996] Update history to reflect merge of #5536 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 89e33d9eb8a..d81fdbd320c 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ * Move documentation to docs folder (#5459) * Fix broken links in CONTRIBUTING (#5533) * Update documentation on jekyllrb.com (#5540) + * Fix HTML rendering (#5536) ### Bug Fixes From da762eaa42f0410dcd6c254c4f020d0f63532330 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 3 Nov 2016 15:48:37 -0700 Subject: [PATCH 1584/4996] Revert "Add permalinks to docs in '/maintaining/'" --- docs/_docs/maintaining/affinity-team-captain.md | 1 - docs/_docs/maintaining/avoiding-burnout.md | 1 - docs/_docs/maintaining/becoming-a-maintainer.md | 1 - docs/_docs/maintaining/merging-a-pull-request.md | 1 - docs/_docs/maintaining/reviewing-a-pull-request.md | 1 - docs/_docs/maintaining/special-labels.md | 1 - docs/_docs/maintaining/triaging-an-issue.md | 1 - 7 files changed, 7 deletions(-) diff --git a/docs/_docs/maintaining/affinity-team-captain.md b/docs/_docs/maintaining/affinity-team-captain.md index 0554fdc63e1..02247d2d17c 100644 --- a/docs/_docs/maintaining/affinity-team-captain.md +++ b/docs/_docs/maintaining/affinity-team-captain.md @@ -1,7 +1,6 @@ --- title: Affinity Team Captains layout: docs -permalink: /docs/maintaining/affinity-team-captain/ --- **This guide is for affinity team captains.** These special people are **team maintainers** of one of our [affinity teams][] and help triage and evaluate the issues and contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/avoiding-burnout.md b/docs/_docs/maintaining/avoiding-burnout.md index 72e46e1ac41..a418cefdb5e 100644 --- a/docs/_docs/maintaining/avoiding-burnout.md +++ b/docs/_docs/maintaining/avoiding-burnout.md @@ -1,7 +1,6 @@ --- title: "Avoiding Burnout" layout: docs -permalink: /docs/maintaining/avoiding-burnout/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/becoming-a-maintainer.md b/docs/_docs/maintaining/becoming-a-maintainer.md index 61b19e2cd20..c4a262b930c 100644 --- a/docs/_docs/maintaining/becoming-a-maintainer.md +++ b/docs/_docs/maintaining/becoming-a-maintainer.md @@ -1,7 +1,6 @@ --- title: "Becoming a Maintainer" layout: docs -permalink: /docs/maintaining/becoming-a-maintainer/ --- **This guide is for contributors.** These special people have contributed to one or more of Jekyll's repositories, but do not yet have write access to any. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md index e5c5eacfef8..7265c6f857c 100644 --- a/docs/_docs/maintaining/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -1,7 +1,6 @@ --- title: "Merging a Pull Request" layout: docs -permalink: /docs/maintaining/merging-a-pull-request/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/reviewing-a-pull-request.md b/docs/_docs/maintaining/reviewing-a-pull-request.md index 3185a19ef43..1ecaeea9899 100644 --- a/docs/_docs/maintaining/reviewing-a-pull-request.md +++ b/docs/_docs/maintaining/reviewing-a-pull-request.md @@ -1,7 +1,6 @@ --- title: "Reviewing a Pull Request" layout: docs -permalink: /docs/maintaining/reviewing-a-pull-request/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/special-labels.md b/docs/_docs/maintaining/special-labels.md index 7a32a1fa4c7..ff8a623f858 100644 --- a/docs/_docs/maintaining/special-labels.md +++ b/docs/_docs/maintaining/special-labels.md @@ -1,7 +1,6 @@ --- title: "Special Labels" layout: docs -permalink: /docs/maintaining/special-labels/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/triaging-an-issue.md b/docs/_docs/maintaining/triaging-an-issue.md index 6c97f967cba..4802b61b486 100644 --- a/docs/_docs/maintaining/triaging-an-issue.md +++ b/docs/_docs/maintaining/triaging-an-issue.md @@ -1,7 +1,6 @@ --- title: "Triaging an Issue" layout: docs -permalink: /docs/maintaining/triaging-an-issue/ --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. From 8d1e0433061b1ebae06d5755dc05edf7ecdbe3da Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 3 Nov 2016 15:49:21 -0700 Subject: [PATCH 1585/4996] Set docs permalink in config --- docs/_config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_config.yml b/docs/_config.yml index 6f57710aa2e..32ae74bb0d4 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -12,6 +12,7 @@ timezone: America/Los_Angeles collections: docs: + permalink: /:collection/:path/ output: true posts: permalink: /news/:year/:month/:day/:title/ From 8157d53af0e9d2a5493b44245fa5303421b365ed Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 3 Nov 2016 15:53:00 -0700 Subject: [PATCH 1586/4996] Update contributing documentation based on .github/CONTRIBUTING.md --- docs/_docs/contributing.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index a317631c89a..c5a377226d8 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -67,13 +67,13 @@ We want the Jekyll documentation to be the best it can be. We've open-sourced ou ### How to submit changes -You can find the documentation for jekyllrb.com in the [site](https://github.com/jekyll/jekyll/tree/master/site) directory. See the section above, [submitting a pull request](#submitting-a-pull-request) for information on how to propose a change. +You can find the documentation for jekyllrb.com in the [docs](https://github.com/jekyll/jekyll/tree/master/docs) directory. See the section above, [submitting a pull request](#submitting-a-pull-request) for information on how to propose a change. One gotcha, all pull requests should be directed at the `master` branch (the default branch). ### Adding plugins -If you want to add your plugin to the [list of plugins](https://jekyllrb.com/docs/plugins/#available-plugins), please submit a pull request modifying the [plugins page source file](https://github.com/jekyll/jekyll/blob/master/site/_docs/plugins.md) by adding a link to your plugin under the proper subheading depending upon its type. +If you want to add your plugin to the [list of plugins](https://jekyllrb.com/docs/plugins/#available-plugins), please submit a pull request modifying the [plugins page source file](https://github.com/jekyll/jekyll/blob/master/docs/_docs/plugins.md) by adding a link to your plugin under the proper subheading depending upon its type. ## Code Contributions @@ -85,7 +85,7 @@ Any time you propose a code change, you should also include updates to the docum #### Documentation -If your contribution changes any Jekyll behavior, make sure to update the documentation. Documentation lives in the `site/_docs` folder (spoiler alert: it's a Jekyll site!). If the docs are missing information, please feel free to add it in. Great docs make a great project. Include changes to the documentation within your pull request, and once merged, `jekyllrb.com` will be updated. +If your contribution changes any Jekyll behavior, make sure to update the documentation. Documentation lives in the `docs/_docs` folder (spoiler alert: it's a Jekyll site!). If the docs are missing information, please feel free to add it in. Great docs make a great project. Include changes to the documentation within your pull request, and once merged, `jekyllrb.com` will be updated. #### Tests From 9824c3103bd7ffcc78c4a6c671a27efea5ce21e1 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 3 Nov 2016 16:26:16 -0700 Subject: [PATCH 1587/4996] Allow us to specify other options to pass to htmlproofer. --- script/proof | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/proof b/script/proof index 8e7e899da19..1dd63a28925 100755 --- a/script/proof +++ b/script/proof @@ -32,4 +32,4 @@ bundle exec jekyll build -s $SOURCE -d $DESTINATION --trace # 3. msg "Proofing..." -time bundle exec htmlproof ./$DESTINATION --url-ignore $INGORE_HREFS +time bundle exec htmlproof ./$DESTINATION --url-ignore $INGORE_HREFS $@ From 7af41649e953bb2da4743db6f5b8a7fc477fca86 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 3 Nov 2016 16:26:21 -0700 Subject: [PATCH 1588/4996] Fix internal links. --- docs/_docs/maintaining/becoming-a-maintainer.md | 4 ++-- docs/_docs/maintaining/merging-a-pull-request.md | 2 +- docs/_docs/maintaining/reviewing-a-pull-request.md | 2 +- docs/_docs/maintaining/special-labels.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/_docs/maintaining/becoming-a-maintainer.md b/docs/_docs/maintaining/becoming-a-maintainer.md index 61b19e2cd20..a303d940267 100644 --- a/docs/_docs/maintaining/becoming-a-maintainer.md +++ b/docs/_docs/maintaining/becoming-a-maintainer.md @@ -15,7 +15,7 @@ You want to maintain Jekyll? Use it often. Do weird things with it. Do normal th ## 2. Help Triage Issues -Watch the repository you're interested in. Join [an Affinity Team](https://teams.jekyllrb.com) and receive mentions regarding a particular interest area of the project. When you receive a notification for an issue that has not been triaged by a maintainer, dive in. Can you reproduce the issue? Can you determine the fix? [More tips on Triaging an Issue in our maintainer guide](triaging-an-issue.md). Every maintainer loves an issue that is resolved before they get to it. :smiley: +Watch the repository you're interested in. Join [an Affinity Team](https://teams.jekyllrb.com) and receive mentions regarding a particular interest area of the project. When you receive a notification for an issue that has not been triaged by a maintainer, dive in. Can you reproduce the issue? Can you determine the fix? [More tips on Triaging an Issue in our maintainer guide](../triaging-an-issue). Every maintainer loves an issue that is resolved before they get to it. :smiley: ## 3. Write Documentation @@ -27,7 +27,7 @@ As a maintainer, you will be reviewing pull requests which update code. You shou ## 5. Review Pull Requests -Start by reviewing one pull request a week. Leave detailed comments and [follow our guide for reviewing pull requests](reviewing-a-pull-request.md). +Start by reviewing one pull request a week. Leave detailed comments and [follow our guide for reviewing pull requests](../reviewing-a-pull-request). ## 6. Ask! diff --git a/docs/_docs/maintaining/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md index e5c5eacfef8..9d6c82c45d4 100644 --- a/docs/_docs/maintaining/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -11,7 +11,7 @@ permalink: /docs/maintaining/merging-a-pull-request/ All pull requests should be subject to code review. Code review is a [foundational value](https://blog.fullstory.com/what-we-learned-from-google-code-reviews-arent-just-for-catching-bugs-b125a13aa292) of good engineering teams. Besides providing validation of correctness, it promotes a sense of community and gives other maintainers understanding of all parts of the code base. In short, code review is crucial to a healthy open source project. -**Read our guide for [Reviewing a pull request](reviewing-a-pull-request.md) before merging.** Notably, the change must have tests if for code, and at least two maintainers must give it an OK. +**Read our guide for [Reviewing a pull request](../reviewing-a-pull-request) before merging.** Notably, the change must have tests if for code, and at least two maintainers must give it an OK. ## Merging diff --git a/docs/_docs/maintaining/reviewing-a-pull-request.md b/docs/_docs/maintaining/reviewing-a-pull-request.md index 3185a19ef43..fef21d7a33f 100644 --- a/docs/_docs/maintaining/reviewing-a-pull-request.md +++ b/docs/_docs/maintaining/reviewing-a-pull-request.md @@ -9,7 +9,7 @@ permalink: /docs/maintaining/reviewing-a-pull-request/ ## Respond Kindly -Above all else, please review a pull request kindly. Our community can only be strong if we make it a welcoming and inclusive environment. To further promote this, the Jekyll community is governed by a [Code of Conduct](../CONDUCT.markdown) by which all community members must abide. +Above all else, please review a pull request kindly. Our community can only be strong if we make it a welcoming and inclusive environment. To further promote this, the Jekyll community is governed by a [Code of Conduct](/docs/conduct/) by which all community members must abide. Use emoji liberally :heart: :tada: :sparkles: :confetti_ball: and feel free to be emotive!! Contributions keep this project moving forward and we're always happy to receive them, even if the pull request isn't ultimately merged. diff --git a/docs/_docs/maintaining/special-labels.md b/docs/_docs/maintaining/special-labels.md index 7a32a1fa4c7..7f0ff12ea6c 100644 --- a/docs/_docs/maintaining/special-labels.md +++ b/docs/_docs/maintaining/special-labels.md @@ -19,4 +19,4 @@ These labels are used to indicate that the Git state of a pull request must chan ## `stale` -This label is automatically added and removed by @jekyllbot based on activity on an issue or pull request. The rules for this label are laid out in [Triaging an Issue: Staleness and automatic closure](triaging-an-issue.md#staleness-and-automatic-closure). +This label is automatically added and removed by @jekyllbot based on activity on an issue or pull request. The rules for this label are laid out in [Triaging an Issue: Staleness and automatic closure](../triaging-an-issue/#staleness-and-automatic-closure). From 57a6847165b75fb6c8c37c0ec32326ca0920432d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 3 Nov 2016 16:29:50 -0700 Subject: [PATCH 1589/4996] Fix some external links. --- docs/_docs/continuous-integration.md | 2 +- docs/_docs/maintaining/avoiding-burnout.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/continuous-integration.md b/docs/_docs/continuous-integration.md index 4b5b2d4e334..54b3466cb7c 100644 --- a/docs/_docs/continuous-integration.md +++ b/docs/_docs/continuous-integration.md @@ -229,5 +229,5 @@ an entry in the `.gitignore` file to avoid it from being checked in again. 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 +[3]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration.md [4]: https://jekyllrb.com/help/ diff --git a/docs/_docs/maintaining/avoiding-burnout.md b/docs/_docs/maintaining/avoiding-burnout.md index 72e46e1ac41..86c5530b56a 100644 --- a/docs/_docs/maintaining/avoiding-burnout.md +++ b/docs/_docs/maintaining/avoiding-burnout.md @@ -29,4 +29,4 @@ Jekyll gets a lot of feature requests, non-reproducible bug reports, usage quest Thanks to https://gist.github.com/ryanflorence/124070e7c4b3839d4573 which influenced this document. -Thanks to [Homebrew's "Avoiding Burnout" document](https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Maintainers-Avoiding-Burnout.md) for providing a perfect base for this document. +Thanks to [Homebrew's "Avoiding Burnout" document](https://github.com/Homebrew/brew/blob/master/docs/Maintainers-Avoiding-Burnout.md) for providing a perfect base for this document. From 1852e54d102f3877ebad04134db3296178458a74 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 2 Nov 2016 14:18:07 +0530 Subject: [PATCH 1590/4996] add and use 'skip_if_windows' helper method - add a new helper method to skip tests if on Windows platform - skip those tests that fail due to lack of support for symlinked files on Windows. --- test/helper.rb | 7 +++++++ test/test_collections.rb | 3 +++ test/test_entry_filter.rb | 6 ++++++ test/test_theme.rb | 3 +++ 4 files changed, 19 insertions(+) diff --git a/test/helper.rb b/test/helper.rb index 8fc43d6733d..ad88b5d04a7 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -158,4 +158,11 @@ def nokogiri_fragment(str) str ) end + + def skip_if_windows(msg = nil) + if Utils::Platforms.really_windows? + msg ||= "Jekyll does not currently support this feature on Windows." + skip msg.to_s.magenta + end + end end diff --git a/test/test_collections.rb b/test/test_collections.rb index 3ae1ab12d4a..45e2a51192b 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -186,6 +186,9 @@ class TestCollections < JekyllUnitTest end should "include the symlinked file from site.source in the list of docs" do + # no support for including symlinked file on Windows + skip_if_windows "Jekyll does not currently support symlinks on Windows." + assert_includes @collection.docs.map(&:relative_path), "_methods/um_hi.md" end end diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb index eed245674a8..f65badc67ea 100644 --- a/test/test_entry_filter.rb +++ b/test/test_entry_filter.rb @@ -82,6 +82,9 @@ class TestEntryFilter < JekyllUnitTest # rubocop:disable Performance/FixedSize should "include only safe symlinks in safe mode" do + # no support for symlinks on Windows + skip_if_windows "Jekyll does not currently support symlinks on Windows." + site = Site.new(site_configuration("safe" => true)) site.reader.read_directories("symlink-test") @@ -91,6 +94,9 @@ class TestEntryFilter < JekyllUnitTest # rubocop:enable Performance/FixedSize should "include symlinks in unsafe mode" do + # no support for symlinks on Windows + skip_if_windows "Jekyll does not currently support symlinks on Windows." + site = Site.new(site_configuration) site.reader.read_directories("symlink-test") diff --git a/test/test_theme.rb b/test/test_theme.rb index fd380d95090..918d01f69c0 100644 --- a/test/test_theme.rb +++ b/test/test_theme.rb @@ -55,6 +55,9 @@ def setup end should "return the resolved path when a symlink & resolved path exists" do + # no support for symlinks on Windows + skip_if_windows "Jekyll does not currently support symlinks on Windows." + expected = File.expand_path("./_layouts", @expected_root) assert_equal expected, @theme.send(:path_for, :_symlink) end From 2c68069a4151d4dc08e0b46e0f24a5e4c49c80b6 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 3 Nov 2016 23:10:22 +0530 Subject: [PATCH 1591/4996] TestSite: consider dive-letter in Windows The array of plugins will contain current drive-letter in Windows --- test/test_site.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/test_site.rb b/test/test_site.rb index efe7076ac95..105e086a62b 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -14,14 +14,20 @@ class TestSite < JekyllUnitTest should "have an array for plugins if passed as a string" do site = Site.new(site_configuration({ "plugins_dir" => "/tmp/plugins" })) - assert_equal ["/tmp/plugins"], site.plugins + array = Utils::Platforms.windows? ? ["C:/tmp/plugins"] : ["/tmp/plugins"] + assert_equal array, site.plugins end should "have an array for plugins if passed as an array" do site = Site.new(site_configuration({ "plugins_dir" => ["/tmp/plugins", "/tmp/otherplugins"] })) - assert_equal ["/tmp/plugins", "/tmp/otherplugins"], site.plugins + array = if Utils::Platforms.windows? + ["C:/tmp/plugins", "C:/tmp/otherplugins"] + else + ["/tmp/plugins", "/tmp/otherplugins"] + end + assert_equal array, site.plugins end should "have an empty array for plugins if nothing is passed" do From 7314e4a5dbcdbb2984bafb743a8a5da540aef9d8 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 4 Nov 2016 12:29:48 +0530 Subject: [PATCH 1592/4996] collections.feature: conditional steps --- features/collections.feature | 15 ++++++++++----- features/step_definitions.rb | 29 +++++++++++++++++++++++++++++ features/support/helpers.rb | 2 +- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/features/collections.feature b/features/collections.feature index ac67611edd6..60bba8a17fa 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -77,7 +77,8 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status Then the _site directory should exist - And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" + And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows + And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows Scenario: Collections specified as an hash Given I have an "index.html" page that contains "Collections: {% for method in site.methods %}{{ method.relative_path }} {% endfor %}" @@ -90,7 +91,8 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status Then the _site directory should exist - And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" + And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows + And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows Scenario: All the documents Given I have an "index.html" page that contains "All documents: {% for doc in site.documents %}{{ doc.relative_path }} {% endfor %}" @@ -103,7 +105,8 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status Then the _site directory should exist - And I should see "All documents: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" + And I should see "All documents: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows + And I should see "All documents: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows Scenario: Documents have an output attribute, which is the converted HTML Given I have an "index.html" page that contains "Second document's output: {{ site.documents[1].output }}" @@ -142,7 +145,8 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status And the _site directory should exist - And I should see "2. of 8:

    Page without title.

    " in "_site/index.html" + And I should see "2. of 8:

    Page without title.

    " in "_site/index.html" unless Windows + And I should see "2. of 7:

    Page without title.

    " in "_site/index.html" if on Windows Scenario: Sort by relative_path Given I have an "index.html" page that contains "Collections: {% assign methods = site.methods | sort: 'relative_path' %}{{ methods | map:"title" | join: ", " }}" @@ -155,7 +159,8 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status Then the _site directory should exist - And I should see "Collections: Collection#entries, Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, Site#generate," in "_site/index.html" + And I should see "Collections: Collection#entries, Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, Site#generate," in "_site/index.html" unless Windows + And I should see "Collections: Collection#entries, Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, YAML with Dots" in "_site/index.html" if on Windows Scenario: Rendered collection with date/dateless filename Given I have an "index.html" page that contains "Collections: {% for method in site.thanksgiving %}{{ method.title }} {% endfor %}" diff --git a/features/step_definitions.rb b/features/step_definitions.rb index ffe3fff53e3..c685008948d 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -179,6 +179,7 @@ end # + Then(%r!^I should (not )?see "(.*)" in "(.*)"$!) do |negative, text, file| step %(the "#{file}" file should exist) regexp = Regexp.new(text, Regexp::MULTILINE) @@ -191,6 +192,34 @@ # +Then(%r!^I should (not )?see "(.*)" in "(.*)" if on Windows$!) do |negative, text, file| + step %(the "#{file}" file should exist) + regexp = Regexp.new(text, Regexp::MULTILINE) + if negative.nil? || negative.empty? + if Jekyll::Utils::Platforms.really_windows? + expect(file_contents(file)).to match regexp + else + expect(file_contents(file)).not_to match regexp + end + end +end + +# + +Then(%r!^I should (not )?see "(.*)" in "(.*)" unless Windows$!) do |negative, text, file| + step %(the "#{file}" file should exist) + regexp = Regexp.new(text, Regexp::MULTILINE) + if negative.nil? || negative.empty? + if Jekyll::Utils::Platforms.really_windows? + expect(file_contents(file)).not_to match regexp + else + expect(file_contents(file)).to match regexp + end + end +end + +# + Then(%r!^I should see exactly "(.*)" in "(.*)"$!) do |text, file| step %(the "#{file}" file should exist) expect(file_contents(file).strip).to eq text diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 0d809bca985..11ae777b98e 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -1,5 +1,5 @@ require "fileutils" -require "jekyll/utils" +require "jekyll" require "open3" require "time" require "safe_yaml/load" From 7f18ac8f9943a88f29a9f8e61bc6dc7cd3fa2e20 Mon Sep 17 00:00:00 2001 From: Thiago Arrais Date: Tue, 25 Oct 2016 17:38:22 -0300 Subject: [PATCH 1593/4996] Group using arbitraty Liquid expressions --- docs/_docs/templates.md | 16 +++++ lib/jekyll/filters.rb | 31 +--------- lib/jekyll/filters/grouping_filters.rb | 56 ++++++++++++++++++ test/test_filters.rb | 82 ++++++++++++++++++++++++++ 4 files changed, 157 insertions(+), 28 deletions(-) create mode 100644 lib/jekyll/filters/grouping_filters.rb diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 54f914f7628..0d37f8e1274 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -147,6 +147,22 @@ common tasks easier.

    + + +

    Group By Expression

    +

    Group an array's items using a Liquid expression.

    + + +

    + {% raw %}{{ site.members | group_by_exp:"item", +"item.graduation_year | truncate: 3, \"\"" }}{% endraw %} +

    +

    + [{"name"=>"201...", "items"=>[...]}, +{"name"=>"200...", "items"=>[...]}] +

    + +

    XML Escape

    diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 29f2a2b5e1a..f1467fa5e23 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -8,6 +8,8 @@ module Jekyll module Filters include URLFilters + include GroupingFilters + # Convert a Markdown string into HTML output. # # input - The Markdown String to convert. @@ -205,29 +207,6 @@ def jsonify(input) as_liquid(input).to_json end - # Group an array of items by a property - # - # input - the inputted Enumerable - # property - the property - # - # Returns an array of Hashes, each looking something like this: - # {"name" => "larry" - # "items" => [...] } # all the items where `property` == "larry" - def group_by(input, property) - if groupable?(input) - input.group_by { |item| item_property(item, property).to_s } - .each_with_object([]) do |item, array| - array << { - "name" => item.first, - "items" => item.last, - "size" => item.last.size - } - end - else - input - end - end - # Filter an array of objects # # input - the object array @@ -381,11 +360,6 @@ def time(input) end.localtime end - private - def groupable?(element) - element.respond_to?(:group_by) - end - private def item_property(item, property) if item.respond_to?(:to_liquid) @@ -436,6 +410,7 @@ def parse_condition(exp) condition end + end end diff --git a/lib/jekyll/filters/grouping_filters.rb b/lib/jekyll/filters/grouping_filters.rb new file mode 100644 index 00000000000..372b1e7bc39 --- /dev/null +++ b/lib/jekyll/filters/grouping_filters.rb @@ -0,0 +1,56 @@ +module Jekyll + module Filters + module GroupingFilters + # Group an array of items by a property + # + # input - the inputted Enumerable + # property - the property + # + # Returns an array of Hashes, each looking something like this: + # {"name" => "larry" + # "items" => [...] } # all the items where `property` == "larry" + def group_by(input, property) + if groupable?(input) + groups = input.group_by { |item| item_property(item, property).to_s } + make_grouped_array(groups) + else + input + end + end + + def group_by_exp(input, variable, expression) + return input unless groupable?(input) + + parsed_expr = parse_expression(expression) + @context.stack do + groups = input.group_by do |item| + @context[variable] = item + parsed_expr.render(@context) + end + make_grouped_array(groups) + end + end + + private + def parse_expression(str) + Liquid::Variable.new(str, {}) + end + + private + def groupable?(element) + element.respond_to?(:group_by) + end + + private + def make_grouped_array(groups) + groups.each_with_object([]) do |item, array| + array << { + "name" => item.first, + "items" => item.last, + "size" => item.last.size + } + end + end + end + end +end diff --git a/test/test_filters.rb b/test/test_filters.rb index 9a0f87d46b7..9a2909ef44a 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -747,6 +747,88 @@ def to_liquid end end + context "group_by_exp filter" do + should "successfully group array of Jekyll::Page's" do + @filter.site.process + groups = @filter.group_by_exp(@filter.site.pages, "page", "page.layout | upcase") + groups.each do |g| + assert( + ["DEFAULT", "NIL", ""].include?(g["name"]), + "#{g["name"]} isn't a valid grouping." + ) + case g["name"] + when "DEFAULT" + assert( + g["items"].is_a?(Array), + "The list of grouped items for 'default' is not an Array." + ) + assert_equal 5, g["items"].size + when "nil" + assert( + g["items"].is_a?(Array), + "The list of grouped items for 'nil' is not an Array." + ) + assert_equal 2, g["items"].size + when "" + assert( + g["items"].is_a?(Array), + "The list of grouped items for '' is not an Array." + ) + assert_equal 15, g["items"].size + end + end + end + + should "include the size of each grouping" do + groups = @filter.group_by_exp(@filter.site.pages, "page", "page.layout") + groups.each do |g| + p g + assert_equal( + g["items"].size, + g["size"], + "The size property for '#{g["name"]}' doesn't match the size of the Array." + ) + end + end + + should "allow more complex filters" do + items = [ + { "version"=>"1.0", "result"=>"slow" }, + { "version"=>"1.1.5", "result"=>"medium" }, + { "version"=>"2.7.3", "result"=>"fast" } + ] + + result = @filter.group_by_exp(items, "item", "item.version | split: '.' | first") + assert_equal 2, result.size + end + + should "be equivalent of group_by" do + actual = @filter.group_by_exp(@filter.site.pages, "page", "page.layout") + expected = @filter.group_by(@filter.site.pages, "layout") + + assert_equal expected, actual + end + + should "return any input that is not an array" do + assert_equal "some string", @filter.group_by_exp("some string", "la", "le") + end + + should "group by full element (as opposed to a field of the element)" do + items = %w(a b c d) + + result = @filter.group_by_exp(items, "item", "item") + assert_equal 4, result.length + assert_equal ["a"], result.first["items"] + end + + should "accept hashes" do + hash = { 1 => "a", 2 => "b", 3 => "c", 4 => "d" } + + result = @filter.group_by_exp(hash, "item", "item") + assert_equal 4, result.length + end + end + context "sort filter" do should "raise Exception when input is nil" do err = assert_raises ArgumentError do From 7ac9653f4efe61f12b27adb0a7261547c17e266c Mon Sep 17 00:00:00 2001 From: Thiago Arrais Date: Fri, 4 Nov 2016 18:32:52 -0300 Subject: [PATCH 1594/4996] RDoc for group_by_exp --- lib/jekyll/filters/grouping_filters.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/jekyll/filters/grouping_filters.rb b/lib/jekyll/filters/grouping_filters.rb index 372b1e7bc39..804c65593f7 100644 --- a/lib/jekyll/filters/grouping_filters.rb +++ b/lib/jekyll/filters/grouping_filters.rb @@ -18,6 +18,13 @@ def group_by(input, property) end end + # Group an array of items by an expression + # + # input - the object array + # variable - the variable to assign each item to in the expression + # expression -a Liquid comparison expression passed in as a string + # + # Returns the filtered array of objects def group_by_exp(input, variable, expression) return input unless groupable?(input) From 1bafbd91fadad9ddcebea43fc5cb352ffb9f1111 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 5 Nov 2016 15:00:40 +0530 Subject: [PATCH 1595/4996] create orphan files with touch method --- test/test_site.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_site.rb b/test/test_site.rb index 105e086a62b..81da363d2d6 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -277,19 +277,19 @@ def generate(site) @site.process # generate some orphaned files: # single file - File.open(dest_dir("obsolete.html"), "w") + FileUtils.touch(dest_dir("obsolete.html")) # single file in sub directory FileUtils.mkdir(dest_dir("qux")) - File.open(dest_dir("qux/obsolete.html"), "w") + FileUtils.touch(dest_dir("qux/obsolete.html")) # empty directory FileUtils.mkdir(dest_dir("quux")) FileUtils.mkdir(dest_dir(".git")) FileUtils.mkdir(dest_dir(".svn")) FileUtils.mkdir(dest_dir(".hg")) # single file in repository - File.open(dest_dir(".git/HEAD"), "w") - File.open(dest_dir(".svn/HEAD"), "w") - File.open(dest_dir(".hg/HEAD"), "w") + FileUtils.touch(dest_dir(".git/HEAD")) + FileUtils.touch(dest_dir(".svn/HEAD")) + FileUtils.touch(dest_dir(".hg/HEAD")) end teardown do From 303580682684cdca11f3bb7222bca56faa43be51 Mon Sep 17 00:00:00 2001 From: Owen Walters Date: Mon, 7 Nov 2016 11:29:03 -0500 Subject: [PATCH 1596/4996] R.I.P. Startups --- docs/_docs/deployment-methods.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/docs/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md index 09116824843..cefb4d32d79 100644 --- a/docs/_docs/deployment-methods.md +++ b/docs/_docs/deployment-methods.md @@ -208,12 +208,3 @@ Setting up Kickster is very easy, just install the gem and you are good to go. M Automating the build and deployment of a Jekyll site is just as simple as GitHub Pages - push your changes to your repo (excluding the `_site` directory) and within seconds a build will be triggered and your built site deployed to our highly- available, globally distributed hosting service. The build process will even install and execute custom Ruby plugins. See our [Jekyll docs](https://www.aerobatic.com/docs/static-generators#jekyll) for more details. -## PubStorm - -[PubStorm](https://www.pubstorm.com) is a free front-end and static-site publishing platform built by [Nitrous](https://www.nitrous.io). PubStorm is distributed as a node package and can be installed by running `npm install -g pubstorm`. You can create a free account by running `storm signup`. - -To publish your site, run `storm init` from the root of your project and enter `_site` as the project path when prompted. You can the run `jekyll build` to build your site and then run `storm deploy` to publish your site in seconds. - -PubStorm offers a pre-configured CDN, free custom domains, SSL certs, rollbacks, collaboration and more. To configure additional features, [follow the instructions on the PubStorm help site](http://help.pubstorm.com). - -You can also use the [Nitrous Jekyll Template](https://www.nitrous.io/quickstarts) to develop your Jekyll project and deploy to PubStorm directly from Nitrous. This is a great option for developing Jekyll projects on Windows. From 70fae19b88152f578be2869d042d87abdf2e3127 Mon Sep 17 00:00:00 2001 From: Ryan Schmidt Date: Mon, 7 Nov 2016 23:27:33 -0600 Subject: [PATCH 1597/4996] Use site.baseurl before link tag --- docs/_docs/templates.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 54f914f7628..4ae26d2a2ae 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -518,10 +518,10 @@ You must include the file extension when using the `link` tag. ```liquid {% raw %} -{% link _collection/name-of-document.md %} -{% link _posts/2016-07-26-name-of-post.md %} -{% link news/index.html %} -{% link /assets/files/doc.pdf %} +{{ site.baseurl }}{% link _collection/name-of-document.md %} +{{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %} +{{ site.baseurl }}{% link news/index.html %} +{{ site.baseurl }}{% link /assets/files/doc.pdf %} {% endraw %} ``` @@ -529,10 +529,10 @@ You can also use this tag to create a link in Markdown as follows: ```liquid {% raw %} -[Link to a document]({% link _collection/name-of-document.md %}) -[Link to a post]({% link _posts/2016-07-26-name-of-post.md %}) -[Link to a page]({% link news/index.html %}) -[Link to a file]({% link /assets/files/doc.pdf %}) +[Link to a document]({{ site.baseurl }}{% link _collection/name-of-document.md %}) +[Link to a post]({{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %}) +[Link to a page]({{ site.baseurl }}{% link news/index.html %}) +[Link to a file]({{ site.baseurl }}{% link /assets/files/doc.pdf %}) {% endraw %} ``` From 92354fa7fc9f87d86ddddb6edd0519600c749974 Mon Sep 17 00:00:00 2001 From: Ryan Schmidt Date: Mon, 7 Nov 2016 23:29:49 -0600 Subject: [PATCH 1598/4996] Use site.baseurl before post_url tag --- docs/_docs/templates.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 4ae26d2a2ae..daae34c2771 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -543,7 +543,7 @@ will generate the correct permalink URL for the post you specify. ```liquid {% raw %} -{% post_url 2010-07-21-name-of-post %} +{{ site.baseurl }}{% post_url 2010-07-21-name-of-post %} {% endraw %} ``` @@ -552,7 +552,7 @@ path to the post: ```liquid {% raw %} -{% post_url /subdir/2010-07-21-name-of-post %} +{{ site.baseurl }}{% post_url /subdir/2010-07-21-name-of-post %} {% endraw %} ``` @@ -562,7 +562,7 @@ You can also use this tag to create a link to a post in Markdown as follows: ```liquid {% raw %} -[Name of Link]({% post_url 2010-07-21-name-of-post %}) +[Name of Link]({{ site.baseurl }}{% post_url 2010-07-21-name-of-post %}) {% endraw %} ``` From ca3aaec7b5a47af7b6b7bce1d1ce4f1801d4b9f5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 8 Nov 2016 12:35:43 -0800 Subject: [PATCH 1599/4996] Update history to reflect merge of #5557 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d81fdbd320c..4185302a75f 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * Fix broken links in CONTRIBUTING (#5533) * Update documentation on jekyllrb.com (#5540) * Fix HTML rendering (#5536) + * Remove outdated deployment information (#5557) ### Bug Fixes From 0de653d18647e4d15b5dd5d66674daf3a3b84809 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 8 Nov 2016 17:05:19 -0800 Subject: [PATCH 1600/4996] Update history to reflect merge of #5524 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4185302a75f..f603840ef6f 100644 --- a/History.markdown +++ b/History.markdown @@ -39,6 +39,7 @@ ### Minor Enhancements * Collapse `gsub` (#5494) + * URL: warn if key doesn't exist in url drop (#5524) ## 3.3.0 / 2016-10-06 From 74a5297c192044c82c47cb30955f59d2a4247be0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 9 Nov 2016 09:41:55 -0800 Subject: [PATCH 1601/4996] Lock to codeclimate-test-reporter ~> 0.6.0. /cc #5565 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 464ab468f69..92797b42676 100644 --- a/Gemfile +++ b/Gemfile @@ -22,7 +22,7 @@ group :test do gem "cucumber", "~> 2.1" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" - gem "codeclimate-test-reporter" + gem "codeclimate-test-reporter", "~> 0.6.0" gem "rspec-mocks" gem "nokogiri" gem "rspec" From b194211a32f3da646bf96ef58d4081ea3a2da130 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 9 Nov 2016 08:15:55 -0800 Subject: [PATCH 1602/4996] Be much more specific about ignoring vendored directories. --- lib/jekyll/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 196cf5876e7..e66d504c747 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -17,7 +17,7 @@ class Configuration < Hash # Handling Reading "safe" => false, "include" => [".htaccess"], - "exclude" => %w(node_modules vendor), + "exclude" => %w(node_modules vendor/bundle vendor/ruby vendor/cache), "keep_files" => [".git", ".svn"], "encoding" => "utf-8", "markdown_ext" => "markdown,mkdown,mkdn,mkd,md", From 7bf46270468b837cdf97a0a870e9e4fc5a3a16d9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 9 Nov 2016 09:22:00 -0800 Subject: [PATCH 1603/4996] Add vendor/gems to the list of excluded & do some refactoring. --- lib/jekyll/configuration.rb | 4 +++- lib/jekyll/entry_filter.rb | 17 ++++++++--------- test/test_configuration.rb | 8 ++++++++ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index e66d504c747..8dc1807d14a 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -17,7 +17,9 @@ class Configuration < Hash # Handling Reading "safe" => false, "include" => [".htaccess"], - "exclude" => %w(node_modules vendor/bundle vendor/ruby vendor/cache), + "exclude" => %w( + node_modules vendor/bundle/ vendor/cache/ vendor/gems/ vendor/ruby/ + ), "keep_files" => [".git", ".svn"], "encoding" => "utf-8", "markdown_ext" => "markdown,mkdown,mkdn,mkd,md", diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index 6063607edfe..5f3431d8ed3 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -36,8 +36,7 @@ def filter(entries) end def included?(entry) - glob_include?(site.include, - entry) + glob_include?(site.include, entry) end def special?(entry) @@ -50,14 +49,14 @@ def backup?(entry) end def excluded?(entry) - excluded = glob_include?(site.exclude, relative_to_source(entry)) - if excluded - Jekyll.logger.debug( - "EntryFilter:", - "excluded #{relative_to_source(entry)}" - ) + glob_include?(site.exclude, relative_to_source(entry)).tap do |excluded| + if excluded + Jekyll.logger.debug( + "EntryFilter:", + "excluded #{relative_to_source(entry)}" + ) + end end - excluded end # -- diff --git a/test/test_configuration.rb b/test/test_configuration.rb index b0b34cce7c6..696fc3e9f63 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -52,6 +52,14 @@ class TestConfiguration < JekyllUnitTest should "exclude node_modules" do assert_includes Configuration.from({})["exclude"], "node_modules" end + + should "exclude ruby vendor directories" do + exclude = Configuration.from({})["exclude"] + assert_includes exclude, "vendor/bundle/" + assert_includes exclude, "vendor/cache/" + assert_includes exclude, "vendor/gems/" + assert_includes exclude, "vendor/ruby/" + end end context "#add_default_collections" do From 47e400549a7af16c953f2f158c68ec5b1f012d3a Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 9 Nov 2016 22:42:14 +0100 Subject: [PATCH 1604/4996] [docs] info about the help command usage --- docs/_docs/quickstart.md | 2 ++ docs/_docs/usage.md | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index 969b5384ffd..2d341cc0d79 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -25,4 +25,6 @@ advantage of all the awesome configuration options Jekyll makes available. If you're running into problems, ensure you have all the [requirements installed][Installation]. +When in doubt, use the help command to remind you of all available options and usage, it also works with the new, build and serve subcommands, e.g. jekyll help new or jekyll help build. + [Installation]: /docs/installation/ diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index 3d2413d444b..9f91d437c35 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -97,5 +97,12 @@ $ jekyll build --source _source --destination _deploy For more about the possible configuration options, see the [configuration](../configuration/) page. +
    +
    Call for help
    +

    + The help command is always here to remind you of all available options and usage, and also works with the build, serve and new subcommands, e.g jekyll help new or jekyll help build. +

    +
    + If you're interested in browsing these docs on-the-go, install the `jekyll-docs` gem and run `jekyll docs` in your terminal. From 820b704e3f9f2a05541d90988ef36bf2ecd29466 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 10 Nov 2016 00:00:26 +0100 Subject: [PATCH 1605/4996] appease script/proof --disable-external --- docs/_docs/continuous-integration.md | 2 +- docs/_docs/contributing.md | 6 +++--- docs/_docs/github-pages.md | 6 +++--- docs/_docs/maintaining/avoiding-burnout.md | 2 +- docs/_docs/maintaining/becoming-a-maintainer.md | 6 +++--- docs/_docs/maintaining/merging-a-pull-request.md | 2 +- docs/_docs/maintaining/reviewing-a-pull-request.md | 2 +- docs/_docs/maintaining/special-labels.md | 2 +- docs/_docs/plugins.md | 1 - 9 files changed, 14 insertions(+), 15 deletions(-) diff --git a/docs/_docs/continuous-integration.md b/docs/_docs/continuous-integration.md index 4b5b2d4e334..54b3466cb7c 100644 --- a/docs/_docs/continuous-integration.md +++ b/docs/_docs/continuous-integration.md @@ -229,5 +229,5 @@ an entry in the `.gitignore` file to avoid it from being checked in again. 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 +[3]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration.md [4]: https://jekyllrb.com/help/ diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index a317631c89a..c5a377226d8 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -67,13 +67,13 @@ We want the Jekyll documentation to be the best it can be. We've open-sourced ou ### How to submit changes -You can find the documentation for jekyllrb.com in the [site](https://github.com/jekyll/jekyll/tree/master/site) directory. See the section above, [submitting a pull request](#submitting-a-pull-request) for information on how to propose a change. +You can find the documentation for jekyllrb.com in the [docs](https://github.com/jekyll/jekyll/tree/master/docs) directory. See the section above, [submitting a pull request](#submitting-a-pull-request) for information on how to propose a change. One gotcha, all pull requests should be directed at the `master` branch (the default branch). ### Adding plugins -If you want to add your plugin to the [list of plugins](https://jekyllrb.com/docs/plugins/#available-plugins), please submit a pull request modifying the [plugins page source file](https://github.com/jekyll/jekyll/blob/master/site/_docs/plugins.md) by adding a link to your plugin under the proper subheading depending upon its type. +If you want to add your plugin to the [list of plugins](https://jekyllrb.com/docs/plugins/#available-plugins), please submit a pull request modifying the [plugins page source file](https://github.com/jekyll/jekyll/blob/master/docs/_docs/plugins.md) by adding a link to your plugin under the proper subheading depending upon its type. ## Code Contributions @@ -85,7 +85,7 @@ Any time you propose a code change, you should also include updates to the docum #### Documentation -If your contribution changes any Jekyll behavior, make sure to update the documentation. Documentation lives in the `site/_docs` folder (spoiler alert: it's a Jekyll site!). If the docs are missing information, please feel free to add it in. Great docs make a great project. Include changes to the documentation within your pull request, and once merged, `jekyllrb.com` will be updated. +If your contribution changes any Jekyll behavior, make sure to update the documentation. Documentation lives in the `docs/_docs` folder (spoiler alert: it's a Jekyll site!). If the docs are missing information, please feel free to add it in. Great docs make a great project. Include changes to the documentation within your pull request, and once merged, `jekyllrb.com` will be updated. #### Tests diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 6a449d682e2..7a90b8bb2d2 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -122,9 +122,9 @@ custom domain is specified—see below). The Jekyll project repository itself is a perfect example of this branch structure—the [master branch]({{ site.repository }}) contains the -actual software project for Jekyll, however the Jekyll website (that you’re -looking at right now) is contained in the [gh-pages -branch]({{ site.repository }}/tree/gh-pages) of the same repository. +actual software project for Jekyll, and the Jekyll website that you’re +looking at right now is contained in the [docs +folder]({{ site.repository }}/tree/master/docs) of the same repository.
    Source Files Must be in the Root Directory
    diff --git a/docs/_docs/maintaining/avoiding-burnout.md b/docs/_docs/maintaining/avoiding-burnout.md index a418cefdb5e..1d1d93b17e5 100644 --- a/docs/_docs/maintaining/avoiding-burnout.md +++ b/docs/_docs/maintaining/avoiding-burnout.md @@ -28,4 +28,4 @@ Jekyll gets a lot of feature requests, non-reproducible bug reports, usage quest Thanks to https://gist.github.com/ryanflorence/124070e7c4b3839d4573 which influenced this document. -Thanks to [Homebrew's "Avoiding Burnout" document](https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Maintainers-Avoiding-Burnout.md) for providing a perfect base for this document. +Thanks to [Homebrew's "Avoiding Burnout" document](https://github.com/Homebrew/brew/blob/master/docs/Maintainers-Avoiding-Burnout.md) for providing a perfect base for this document. diff --git a/docs/_docs/maintaining/becoming-a-maintainer.md b/docs/_docs/maintaining/becoming-a-maintainer.md index c4a262b930c..e4a1840ca7a 100644 --- a/docs/_docs/maintaining/becoming-a-maintainer.md +++ b/docs/_docs/maintaining/becoming-a-maintainer.md @@ -14,7 +14,7 @@ You want to maintain Jekyll? Use it often. Do weird things with it. Do normal th ## 2. Help Triage Issues -Watch the repository you're interested in. Join [an Affinity Team](https://teams.jekyllrb.com) and receive mentions regarding a particular interest area of the project. When you receive a notification for an issue that has not been triaged by a maintainer, dive in. Can you reproduce the issue? Can you determine the fix? [More tips on Triaging an Issue in our maintainer guide](triaging-an-issue.md). Every maintainer loves an issue that is resolved before they get to it. :smiley: +Watch the repository you're interested in. Join [an Affinity Team](https://teams.jekyllrb.com) and receive mentions regarding a particular interest area of the project. When you receive a notification for an issue that has not been triaged by a maintainer, dive in. Can you reproduce the issue? Can you determine the fix? [More tips on Triaging an Issue in our maintainer guide](../triaging-an-issue). Every maintainer loves an issue that is resolved before they get to it. :smiley: ## 3. Write Documentation @@ -26,7 +26,7 @@ As a maintainer, you will be reviewing pull requests which update code. You shou ## 5. Review Pull Requests -Start by reviewing one pull request a week. Leave detailed comments and [follow our guide for reviewing pull requests](reviewing-a-pull-request.md). +Start by reviewing one pull request a week. Leave detailed comments and [follow our guide for reviewing pull requests](../reviewing-a-pull-request). ## 6. Ask! @@ -36,4 +36,4 @@ We would love to expand the team and look forward to many more community members # Helping Out Elsewhere -In addition to maintainers of our core and plugin code, the Jekyll team is comprised of moderators for our forums. These helpful community members take a look at the topics posted to https://talk.jekyllrb.com and ensure they are properly categorized and are acceptable under our Code of Conduct. If you would like to be a moderator, email one of the maintainers with links to where you have answered questions and a request to be added as a moderator. More help is always welcome. +In addition to maintainers of our core and plugin code, the Jekyll team is comprised of moderators for our forums. These helpful community members take a look at the topics posted to [https://talk.jekyllrb.com](https://talk.jekyllrb.com) and ensure they are properly categorized and are acceptable under our Code of Conduct. If you would like to be a moderator, email one of the maintainers with links to where you have answered questions and a request to be added as a moderator. More help is always welcome. diff --git a/docs/_docs/maintaining/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md index 7265c6f857c..80ad6f7c5e3 100644 --- a/docs/_docs/maintaining/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -10,7 +10,7 @@ layout: docs All pull requests should be subject to code review. Code review is a [foundational value](https://blog.fullstory.com/what-we-learned-from-google-code-reviews-arent-just-for-catching-bugs-b125a13aa292) of good engineering teams. Besides providing validation of correctness, it promotes a sense of community and gives other maintainers understanding of all parts of the code base. In short, code review is crucial to a healthy open source project. -**Read our guide for [Reviewing a pull request](reviewing-a-pull-request.md) before merging.** Notably, the change must have tests if for code, and at least two maintainers must give it an OK. +**Read our guide for [Reviewing a pull request](../reviewing-a-pull-request) before merging.** Notably, the change must have tests if for code, and at least two maintainers must give it an OK. ## Merging diff --git a/docs/_docs/maintaining/reviewing-a-pull-request.md b/docs/_docs/maintaining/reviewing-a-pull-request.md index 1ecaeea9899..ebdd7a3c41b 100644 --- a/docs/_docs/maintaining/reviewing-a-pull-request.md +++ b/docs/_docs/maintaining/reviewing-a-pull-request.md @@ -8,7 +8,7 @@ layout: docs ## Respond Kindly -Above all else, please review a pull request kindly. Our community can only be strong if we make it a welcoming and inclusive environment. To further promote this, the Jekyll community is governed by a [Code of Conduct](../CONDUCT.markdown) by which all community members must abide. +Above all else, please review a pull request kindly. Our community can only be strong if we make it a welcoming and inclusive environment. To further promote this, the Jekyll community is governed by a [Code of Conduct](/docs/conduct) by which all community members must abide. Use emoji liberally :heart: :tada: :sparkles: :confetti_ball: and feel free to be emotive!! Contributions keep this project moving forward and we're always happy to receive them, even if the pull request isn't ultimately merged. diff --git a/docs/_docs/maintaining/special-labels.md b/docs/_docs/maintaining/special-labels.md index ff8a623f858..eea366e96be 100644 --- a/docs/_docs/maintaining/special-labels.md +++ b/docs/_docs/maintaining/special-labels.md @@ -18,4 +18,4 @@ These labels are used to indicate that the Git state of a pull request must chan ## `stale` -This label is automatically added and removed by @jekyllbot based on activity on an issue or pull request. The rules for this label are laid out in [Triaging an Issue: Staleness and automatic closure](triaging-an-issue.md#staleness-and-automatic-closure). +This label is automatically added and removed by @jekyllbot based on activity on an issue or pull request. The rules for this label are laid out in [Triaging an Issue: Staleness and automatic closure](../triaging-an-issue/#staleness-and-automatic-closure). diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 6e5bbf23847..e546396f210 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -771,7 +771,6 @@ LESS.js files during generation. - [Markdown References by Olov Lassus](https://github.com/olov/jekyll-references): Keep all your markdown reference-style link definitions in one \_references.md file. - [Stylus Converter](https://gist.github.com/988201): Convert .styl to .css. - [ReStructuredText Converter](https://github.com/xdissent/jekyll-rst): Converts ReST documents to HTML with Pygments syntax highlighting. -- [Jekyll-pandoc-plugin](https://github.com/dsanson/jekyll-pandoc-plugin): Use pandoc for rendering markdown. - [Jekyll-pandoc-multiple-formats](https://github.com/fauno/jekyll-pandoc-multiple-formats) by [edsl](https://github.com/edsl): Use pandoc to generate your site in multiple formats. Supports pandoc’s markdown extensions. - [Transform Layouts](https://gist.github.com/1472645): Allows HAML layouts (you need a HAML Converter plugin for this to work). - [Org-mode Converter](https://gist.github.com/abhiyerra/7377603): Org-mode converter for Jekyll. From d71dff74ae89498c6df4755029b6965229f482a2 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 7 Oct 2016 07:53:07 -0500 Subject: [PATCH 1606/4996] Fix #5462: Only shutdown watch in Bash On Windows. --- lib/jekyll/commands/build.rb | 8 ++++---- lib/jekyll/utils/platforms.rb | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb index 3e43f955b7e..d291663239a 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -71,10 +71,10 @@ def build(site, options) # # Returns nothing. def watch(site, options) - if Utils::Platforms.windows? - Jekyll.logger.warn "", "--watch arg is unsupported on Windows. " - Jekyll.logger.warn "", "If you are on Windows Bash, please see: " \ - "https://github.com/Microsoft/BashOnWindows/issues/216" + if Utils::Platforms.bash_on_windows? + Jekyll.logger.warn "", "--watch arg is unsupported in Bash on Windows. " + Jekyll.logger.warn "", "Please see: https://github.com/Microsoft/BashOnWindows/issues/216" + Jekyll.logger.warn "", "If iNotify is fixed, please file a ticket." else External.require_with_graceful_fail "jekyll-watch" diff --git a/lib/jekyll/utils/platforms.rb b/lib/jekyll/utils/platforms.rb index a16c239bcf0..f66ef795bbd 100644 --- a/lib/jekyll/utils/platforms.rb +++ b/lib/jekyll/utils/platforms.rb @@ -19,20 +19,33 @@ module Platforms # /proc/version returns nothing to us. # -- - def really_windows? + def vanilla_windows? RbConfig::CONFIG["host_os"] =~ %r!mswin|mingw|cygwin!i && \ !proc_version end + # -- + # XXX: Remove in 4.0 + # -- + + alias_method :really_windows?, \ + :vanilla_windows? + # - def windows? - RbConfig::CONFIG["host_os"] =~ %r!mswin|mingw|cygwin!i || \ + def bash_on_windows? + RbConfig::CONFIG["host_os"] =~ %r!linux! && \ proc_version =~ %r!microsoft!i end # + def windows? + vanilla_windows? || bash_on_windows? + end + + # + def linux? RbConfig::CONFIG["host_os"] =~ %r!linux! && \ proc_version !~ %r!microsoft!i From df45f2618790922e6f704d301628d0169346a1a3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 12:54:30 -0800 Subject: [PATCH 1607/4996] Builder.watch: only warn for Bash on Windows, still try watching. --- lib/jekyll/commands/build.rb | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb index d291663239a..3cea607cbd0 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -71,23 +71,27 @@ def build(site, options) # # Returns nothing. def watch(site, options) + # Warn Windows users that they might need to upgrade. if Utils::Platforms.bash_on_windows? - Jekyll.logger.warn "", "--watch arg is unsupported in Bash on Windows. " - Jekyll.logger.warn "", "Please see: https://github.com/Microsoft/BashOnWindows/issues/216" - Jekyll.logger.warn "", "If iNotify is fixed, please file a ticket." + Jekyll.logger.warn "", + "Auto-regeneration may not work on some Windows versions." + Jekyll.logger.warn "", + "Please see: https://github.com/Microsoft/BashOnWindows/issues/216" + Jekyll.logger.warn "", + "If it does not work, please upgrade Bash on Windows or "\ + "run Jekyll with --no-watch." + end + External.require_with_graceful_fail "jekyll-watch" + watch_method = Jekyll::Watcher.method(:watch) + if watch_method.parameters.size == 1 + watch_method.call( + options + ) else - External.require_with_graceful_fail "jekyll-watch" - watch_method = Jekyll::Watcher.method(:watch) - if watch_method.parameters.size == 1 - watch_method.call( - options - ) - else - watch_method.call( - options, site - ) - end + watch_method.call( + options, site + ) end end end # end of class << self From 2d1a50c21214659a89c2e6f36e68cd7c257dd23a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Nov 2016 13:00:40 -0800 Subject: [PATCH 1608/4996] Update history to reflect merge of #5564 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f603840ef6f..b2ae50f0877 100644 --- a/History.markdown +++ b/History.markdown @@ -27,6 +27,7 @@ * Do not swallow all exceptions on render (#5495) * Site template: fixed `_config.yml` comment typo (#5511) * `jekyll new-theme` should specify Jekyll as a runtime dependency for the theme (#5457) + * Be much more specific about ignoring specific vendored directories. (#5564) ### Development Fixes From 426830107116edb91a8c14e56ae390ba9ae7e3a2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Nov 2016 13:02:10 -0800 Subject: [PATCH 1609/4996] Update history to reflect merge of #5546 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b2ae50f0877..16af17c8dcd 100644 --- a/History.markdown +++ b/History.markdown @@ -36,6 +36,7 @@ * Restrict Rubocop version (#5496) * include a hashbang for all benchmark scripts & make them executable (#5505) * Update source in script/proof (#5538) + * Collections.feature: conditional steps to have it pass on Windows (#5546) ### Minor Enhancements From fc66991243ec66ed7a7de53d37bff2080bb6859d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Nov 2016 13:02:49 -0800 Subject: [PATCH 1610/4996] Update history to reflect merge of #5526 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 16af17c8dcd..f1962af2d28 100644 --- a/History.markdown +++ b/History.markdown @@ -37,6 +37,7 @@ * include a hashbang for all benchmark scripts & make them executable (#5505) * Update source in script/proof (#5538) * Collections.feature: conditional steps to have it pass on Windows (#5546) + * Fix tests to get script/test to pass on Windows (#5526) ### Minor Enhancements From bafe37cc9d70fa7a2d6708510e0c1c7860e8d07e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 13:12:29 -0800 Subject: [PATCH 1611/4996] Update history to reflect merge of #5520 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f1962af2d28..e31d2b0e510 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * Update documentation on jekyllrb.com (#5540) * Fix HTML rendering (#5536) * Remove outdated deployment information (#5557) + * no more invalid US-ASCII on lines 30 and 97 (#5520) ### Bug Fixes From 6110002d1e3cfb44a8ee3178300d360cc7be2531 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 13:13:11 -0800 Subject: [PATCH 1612/4996] Fix history reference to #5532. --- History.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/History.markdown b/History.markdown index e31d2b0e510..6239f78877e 100644 --- a/History.markdown +++ b/History.markdown @@ -1,7 +1,5 @@ ## HEAD - * Add permalinks to docs in '/maintaining/' (#5532) - ### Site Enhancements * Documentation: {% link %} tag (#5449) @@ -21,6 +19,7 @@ * Fix HTML rendering (#5536) * Remove outdated deployment information (#5557) * no more invalid US-ASCII on lines 30 and 97 (#5520) + * Add permalinks to docs in '/maintaining/' (#5532) ### Bug Fixes From fcbbc4d0bc37a5b89c154c2c2436a71cca8298a8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 13:15:20 -0800 Subject: [PATCH 1613/4996] Update history to reflect merge of #5514 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6239f78877e..353ba7a3d25 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * Remove outdated deployment information (#5557) * no more invalid US-ASCII on lines 30 and 97 (#5520) * Add permalinks to docs in '/maintaining/' (#5532) + * Add jekyll-pinboard to list of third-party plugins (#5514) ### Bug Fixes From 09ec7c81f2b6e085425a962c5f791de5f078e10b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 13:15:54 -0800 Subject: [PATCH 1614/4996] Update history to reflect merge of #5507 --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 353ba7a3d25..d2ba094c0f0 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,7 @@ * no more invalid US-ASCII on lines 30 and 97 (#5520) * Add permalinks to docs in '/maintaining/' (#5532) * Add jekyll-pinboard to list of third-party plugins (#5514) + * Fix formatting in 2-to-3.md (#5507) ### Bug Fixes From d050f6de10c7dcbe4b38c1bc1c1a39b0b19420cb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 13:18:17 -0800 Subject: [PATCH 1615/4996] Update history to reflect merge of #5493 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d2ba094c0f0..5a68072c06a 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * Add permalinks to docs in '/maintaining/' (#5532) * Add jekyll-pinboard to list of third-party plugins (#5514) * Fix formatting in 2-to-3.md (#5507) + * Add two plugins to the plugins page (#5493) ### Bug Fixes From e515ddeb293cfdf9840f1d748f21b1f97d57f988 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 10 Nov 2016 23:13:34 +0100 Subject: [PATCH 1616/4996] fix link to jekyll-pinboard plugin --- docs/_docs/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index a28b90cadd6..6c5a9f9f13a 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -916,7 +916,7 @@ LESS.js files during generation. - [Jekyll-Spotify](https://github.com/MertcanGokgoz/Jekyll-Spotify): Easily output Spotify Embed Player for jekyll - [jekyll-menus](https://github.com/forestryio/jekyll-menus): Hugo style menus for your Jekyll site... recursive menus included. - [jekyll-data](https://github.com/ashmaroli/jekyll-data): Read data files within Jekyll Theme Gems. -- [jekyll-pinboard(https://github.com/snaptortoise/jekyll-pinboard-plugin): Access your Pinboard bookmarks within your Jekyll theme. +- [jekyll-pinboard](https://github.com/snaptortoise/jekyll-pinboard-plugin): Access your Pinboard bookmarks within your Jekyll theme. #### Editors From 262ebbb9f0fb782a970c9d8dab9a355ca996b9c1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Nov 2016 14:32:55 -0800 Subject: [PATCH 1617/4996] Update history to reflect merge of #5559 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5a68072c06a..8fefb05710d 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * Add jekyll-pinboard to list of third-party plugins (#5514) * Fix formatting in 2-to-3.md (#5507) * Add two plugins to the plugins page (#5493) + * Use site.baseurl before link and post_url tags (#5559) ### Bug Fixes From 3e504f083717f6295cfee8a9903348b9d6e3bffc Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 10 Nov 2016 23:42:01 +0100 Subject: [PATCH 1618/4996] mention `docs` folder to deploy on GitHub Pages fix #5543 --- docs/_docs/github-pages.md | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 6a449d682e2..b65bad904b8 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -115,21 +115,28 @@ publish the GitHub Pages site, so make sure your Jekyll site is stored there. Unlike user and organization Pages, Project Pages are kept in the same repository as the project they are for, except that the website content is -stored in a specially named `gh-pages` branch. The content of this branch will -be rendered using Jekyll, and the output will become available under a subpath -of your user pages subdomain, such as `username.github.io/project` (unless a -custom domain is specified—see below). +stored in a specially named `gh-pages` branch or in a `docs` folder on the +`master` branch. The content will be rendered using Jekyll, and the output +will become available under a subpath of your user pages subdomain, such as +`username.github.io/project` (unless a custom domain is specified). -The Jekyll project repository itself is a perfect example of this branch -structure—the [master branch]({{ site.repository }}) contains the -actual software project for Jekyll, however the Jekyll website (that you’re -looking at right now) is contained in the [gh-pages -branch]({{ site.repository }}/tree/gh-pages) of the same repository. +The Jekyll project repository itself is a perfect example: the +[master branch]({{ site.repository }}) contains the actual software project +for Jekyll, however the Jekyll website (that you’re looking at right now) is +contained in the [docs folder]({{ site.repository }}/tree/master/docs) of the +same repository. + +Please refer to GitHub official documentation on +[user, organization and projets pages](https://help.github.com/articles/user-organization-and-project-pages/) +to see more detailed examples.
    Source Files Must be in the Root Directory

    -GitHub Pages overrides the “Site Source” configuration value, so if you locate your files anywhere other than the root directory, your site may not build correctly. + GitHub Pages overrides + the “Site Source” + configuration value, so if you locate your files anywhere other than the + root directory, your site may not build correctly.

    From dbfe0cdf56eb933b973cd626f8e01dd69301a9cc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Nov 2016 14:50:39 -0800 Subject: [PATCH 1619/4996] Update history to reflect merge of #5570 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8fefb05710d..aaac384b477 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * Fix formatting in 2-to-3.md (#5507) * Add two plugins to the plugins page (#5493) * Use site.baseurl before link and post_url tags (#5559) + * Fix link to jekyll-pinboard plugin (#5570) ### Bug Fixes From 07d4333579f0024f913c2dbb22c40145163d0a83 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Nov 2016 15:05:42 -0800 Subject: [PATCH 1620/4996] Update history to reflect merge of #5464 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index aaac384b477..138d4cf7dc4 100644 --- a/History.markdown +++ b/History.markdown @@ -33,6 +33,7 @@ * Site template: fixed `_config.yml` comment typo (#5511) * `jekyll new-theme` should specify Jekyll as a runtime dependency for the theme (#5457) * Be much more specific about ignoring specific vendored directories. (#5564) + * Only warn about auto-regeneration bug on Bash On Windows. (#5464) ### Development Fixes From 51d04cbd00deab11918cee382c393d56159736f2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Nov 2016 15:22:13 -0800 Subject: [PATCH 1621/4996] Update history to reflect merge of #5571 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 138d4cf7dc4..a408b0f29c5 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Add two plugins to the plugins page (#5493) * Use site.baseurl before link and post_url tags (#5559) * Fix link to jekyll-pinboard plugin (#5570) + * mention `docs` folder as a way to deploy on GitHub Pages (#5571) ### Bug Fixes From f27eb77d0bbbffaa2317f90b790be3b0491aa464 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 15:20:11 -0800 Subject: [PATCH 1622/4996] Add failing test for permalink templates with trailing underscores --- test/helper.rb | 15 +++++++++++++++ test/test_url.rb | 34 +++++++++++----------------------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index ad88b5d04a7..0c6935a03fb 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -103,6 +103,21 @@ def after_teardown RSpec::Mocks.teardown end + def fixture_document(relative_path) + site = fixture_site({ + "collections" => { + "methods" => { + "output" => true + } + } + }) + site.read + matching_doc = site.collections["methods"].docs.find do |doc| + doc.relative_path == relative_path + end + [site, matching_doc] + end + def fixture_site(overrides = {}) Jekyll::Site.new(site_configuration(overrides)) end diff --git a/test/test_url.rb b/test/test_url.rb index 1a4471162f3..c39e51f2f96 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -54,17 +54,7 @@ class TestURL < JekyllUnitTest end should "handle UrlDrop as a placeholder in addition to a hash" do - site = fixture_site({ - "collections" => { - "methods" => { - "output" => true - } - } - }) - site.read - matching_doc = site.collections["methods"].docs.find do |doc| - doc.relative_path == "_methods/escape-+ #%20[].md" - end + _, matching_doc = fixture_document("_methods/escape-+ #%20[].md") assert_equal "/methods/escape-+-20/escape-20.html", URL.new( :template => "/methods/:title/:name:output_ext", :placeholders => matching_doc.url_placeholders @@ -81,18 +71,16 @@ class TestURL < JekyllUnitTest end end - should "ignore NoMethodErrors when a placeholder is not found" do - site = fixture_site({ - "collections" => { - "methods" => { - "output" => true - } - } - }) - site.read - matching_doc = site.collections["methods"].docs.find do |doc| - doc.relative_path == "_methods/escape-+ #%20[].md" - end + should "check for key without trailing underscore" do + _, matching_doc = fixture_document("_methods/configuration.md") + assert_equal "/lol", URL.new( + :template => "/:year-:month-:day_:title", + :placeholders => matching_doc.url_placeholders + ).to_s + end + + should "raise custom error when URL placeholder doesn't have key" do + _, matching_doc = fixture_document("_methods/escape-+ #%20[].md") assert_raises NoMethodError do URL.new( :template => "/methods/:headline", From 9f8f0314693c61f516af7fe68e1022acb508b2d0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 15:30:51 -0800 Subject: [PATCH 1623/4996] Whoops, an *actually useful* failing test. --- test/test_url.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_url.rb b/test/test_url.rb index c39e51f2f96..4c0320a76f7 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -73,8 +73,8 @@ class TestURL < JekyllUnitTest should "check for key without trailing underscore" do _, matching_doc = fixture_document("_methods/configuration.md") - assert_equal "/lol", URL.new( - :template => "/:year-:month-:day_:title", + assert_equal "/methods/2016-11-10_configuration", URL.new( + :template => "/methods/:year-:month-:day_:title", :placeholders => matching_doc.url_placeholders ).to_s end From 347651e5716c768efbc4f613b242bd55ed55bfea Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 15:34:03 -0800 Subject: [PATCH 1624/4996] URL#generate_url_from_drop: be smarter about replacing *just* the keys --- lib/jekyll/url.rb | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 291f6e5865d..e4a93fba5a3 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -84,17 +84,29 @@ def generate_url_from_hash(template) end end + def possible_keys(key) + if key.end_with?("_") + [key, key.chomp("_")] + else + [key] + end + end + def generate_url_from_drop(template) template.gsub(%r!:([a-z_]+)!) do |match| - key = match.sub(":".freeze, "".freeze) - unless @placeholders.key?(key) - raise NoMethodError, "The URL template key #{key} doesn't exist!" - end - if @placeholders[key].nil? - "".freeze - else - self.class.escape_path(@placeholders[key]) + pool = possible_keys(match.sub(":".freeze, "".freeze)) + + winner = pool.find { |key| @placeholders.key?(key) } + if winner.nil? + raise NoMethodError, + "The URL template doesn't have #{pool.join(" or ")} keys. Check your permalink template!" end + + value = @placeholders[winner] + value = "" if value.nil? + replacement = self.class.escape_path(value) + + match.sub(":#{winner}", replacement) end.gsub(%r!//!, "/".freeze) end From d50ef0e3dd00a39fd9b3e19049ca2f52d06ac43a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 15:36:05 -0800 Subject: [PATCH 1625/4996] Add useful comment. --- lib/jekyll/url.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index e4a93fba5a3..9e49cc408d0 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -84,6 +84,12 @@ def generate_url_from_hash(template) end end + # We include underscores in keys to allow for 'i_month' and so forth. + # This poses a problem for keys which are followed by and underscore + # but the underscore is not part of the key, e.g. '/:month_:day'. + # That should be :month and :day, but our key extraction regexp isn't + # smart enough to know that so we have to make it an explicit + # possibility. def possible_keys(key) if key.end_with?("_") [key, key.chomp("_")] From ff012e795aabad96cb7d124061acc278d5888f8a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Nov 2016 15:57:45 -0800 Subject: [PATCH 1626/4996] Fix fmt error. --- lib/jekyll/url.rb | 3 ++- test/test_url.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 9e49cc408d0..404b27283ca 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -105,7 +105,8 @@ def generate_url_from_drop(template) winner = pool.find { |key| @placeholders.key?(key) } if winner.nil? raise NoMethodError, - "The URL template doesn't have #{pool.join(" or ")} keys. Check your permalink template!" + "The URL template doesn't have #{pool.join(" or ")} keys. "\ + "Check your permalink template!" end value = @placeholders[winner] diff --git a/test/test_url.rb b/test/test_url.rb index 4c0320a76f7..e9987b15a1b 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -74,7 +74,7 @@ class TestURL < JekyllUnitTest should "check for key without trailing underscore" do _, matching_doc = fixture_document("_methods/configuration.md") assert_equal "/methods/2016-11-10_configuration", URL.new( - :template => "/methods/:year-:month-:day_:title", + :template => "/methods/:year-:month-:day_:title", :placeholders => matching_doc.url_placeholders ).to_s end From cb6724046de0dbae828d609edea11e796979cb37 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 11 Nov 2016 16:30:44 -0800 Subject: [PATCH 1627/4996] Dates are _the worst_ --- test/test_url.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_url.rb b/test/test_url.rb index e9987b15a1b..fc3678d70d0 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -73,8 +73,8 @@ class TestURL < JekyllUnitTest should "check for key without trailing underscore" do _, matching_doc = fixture_document("_methods/configuration.md") - assert_equal "/methods/2016-11-10_configuration", URL.new( - :template => "/methods/:year-:month-:day_:title", + assert_equal "/methods/configuration-configuration_methods_configuration", URL.new( + :template => "/methods/:name-:slug_:collection_:title", :placeholders => matching_doc.url_placeholders ).to_s end From 15bdd8149913bbf33411711365b385a21e262625 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 12 Nov 2016 23:28:57 +0530 Subject: [PATCH 1628/4996] bring docs on 'structure' up-to-date --- docs/_docs/structure.md | 45 ++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/docs/_docs/structure.md b/docs/_docs/structure.md index b21cb1b27be..0d205361be0 100644 --- a/docs/_docs/structure.md +++ b/docs/_docs/structure.md @@ -17,6 +17,8 @@ A basic Jekyll site usually looks something like this: ```sh . ├── _config.yml +├── _data +| └── members.yml ├── _drafts | ├── begin-with-the-crazy-ideas.md | └── on-simplicity-in-technology.md @@ -29,13 +31,28 @@ A basic Jekyll site usually looks something like this: ├── _posts | ├── 2007-10-29-why-every-programmer-should-play-nethack.md | └── 2009-04-26-barcamp-boston-4-roundup.md -├── _data -| └── members.yml +├── _sass +| ├── _base.scss +| └── _layout.scss ├── _site ├── .jekyll-metadata -└── index.html +└── index.html # can also be an 'index.md' with valid YAML Frontmatter ``` +
    +
    Directory Structure of Jekyll Sites using Theme Gems
    +

    + Starting v3.2, a new Jekyll Project installed by jekyll new uses gem-based themes to define the look of the site, and would have a slightly changed directory structure.
    _layouts, _includes and _sass are now part of the gem-based theme, which by default, is minima. +

    +

    + With v3.3, the css directory has been renamed to assets, and moved to minima as well. Moreover, index.html is now an index.md. +


    +

    + You can easily find the path to your local installation of minima gem by executing bundle show minima. + For further information, refer our documentation on theme-gems. +

    +
    + An overview of what each of these does:
    @@ -133,9 +150,9 @@ An overview of what each of these does:

    Well-formatted site data should be placed here. The Jekyll engine - will autoload all YAML files in this directory (using either the - .yml, .yaml, .json or - .csv formats and extensions) and they will be + will autoload all data files (using either the .yml, + .yaml, .json or .csv + formats and extensions) in this directory, and they will be accessible via `site.data`. If there's a file members.yml under the directory, then you can access contents of the file through site.data.members. @@ -143,6 +160,20 @@ An overview of what each of these does:

    + + +

    _sass

    + + +

    + + These are sass partials that can be imported into your main.scss + which will then be processed into a single stylesheet main.css + that defines the styles to be used by your site. + +

    + +

    _site

    @@ -175,7 +206,7 @@ An overview of what each of these does: -

    index.html and other HTML, Markdown, Textile files

    +

    index.html or index.md and other HTML, Markdown, Textile files

    From 5d1f2bceeac33f5f48be5eebf805cf18ccc9a929 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 12 Nov 2016 20:51:55 +0100 Subject: [PATCH 1629/4996] update directory structure documentation --- docs/_docs/structure.md | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/docs/_docs/structure.md b/docs/_docs/structure.md index 0d205361be0..cbc8b6eeb8a 100644 --- a/docs/_docs/structure.md +++ b/docs/_docs/structure.md @@ -40,16 +40,13 @@ A basic Jekyll site usually looks something like this: ```

    -
    Directory Structure of Jekyll Sites using Theme Gems
    +
    Directory structure of Jekyll sites using gem themes

    - Starting v3.2, a new Jekyll Project installed by jekyll new uses gem-based themes to define the look of the site, and would have a slightly changed directory structure.
    _layouts, _includes and _sass are now part of the gem-based theme, which by default, is minima. + Starting Jekyll 3.2, a new Jekyll project boostraped with jekyll new uses gem-based themes to define the look of the site. This results in a lighter default directory structure : _layouts, _includes and _sass are stored by default in the gem theme path.

    +

    - With v3.3, the css directory has been renamed to assets, and moved to minima as well. Moreover, index.html is now an index.md. -


    -

    - You can easily find the path to your local installation of minima gem by executing bundle show minima. - For further information, refer our documentation on theme-gems. + minima is the current default theme, bundle show minima will show you where minima theme's files are stored on your computer.

    @@ -70,11 +67,9 @@ An overview of what each of these does:

    - Stores configuration data. Many of these options can be specified from the command line executable but it’s easier to specify them here so you don’t have to remember them. -

    @@ -84,11 +79,9 @@ An overview of what each of these does:

    - Drafts are unpublished posts. The format of these files is without a date: title.MARKUP. Learn how to work with drafts. -

    @@ -98,13 +91,11 @@ An overview of what each of these does:

    - These are the partials that can be mixed and matched by your layouts and posts to facilitate reuse. The liquid tag {% raw %}{% include file.ext %}{% endraw %} can be used to include the partial in _includes/file.ext. -

    @@ -114,14 +105,12 @@ An overview of what each of these does:

    - These are the templates that wrap posts. Layouts are chosen on a post-by-post basis in the YAML Front Matter, which is described in the next section. The liquid tag {% raw %}{{ content }}{% endraw %} is used to inject content into the web page. -

    @@ -131,14 +120,12 @@ An overview of what each of these does:

    - Your dynamic content, so to speak. The naming convention of these files is important, and must follow the format: YEAR-MONTH-DAY-title.MARKUP. The permalinks can be customized for each post, but the date and markup language are determined solely by the file name. -

    @@ -148,7 +135,6 @@ An overview of what each of these does:

    - Well-formatted site data should be placed here. The Jekyll engine will autoload all data files (using either the .yml, .yaml, .json or .csv @@ -156,7 +142,6 @@ An overview of what each of these does: accessible via `site.data`. If there's a file members.yml under the directory, then you can access contents of the file through site.data.members. -

    @@ -166,11 +151,10 @@ An overview of what each of these does:

    - These are sass partials that can be imported into your main.scss - which will then be processed into a single stylesheet main.css + which will then be processed into a single stylesheet + main.css that defines the styles to be used by your site. -

    @@ -180,11 +164,9 @@ An overview of what each of these does:

    - This is where the generated site will be placed (by default) once Jekyll is done transforming it. It’s probably a good idea to add this to your .gitignore file. -

    @@ -194,13 +176,11 @@ An overview of what each of these does:

    - This helps Jekyll keep track of which files have not been modified since the site was last built, and which files will need to be regenerated on the next build. This file will not be included in the generated site. It’s probably a good idea to add this to your .gitignore file. -

    @@ -210,13 +190,11 @@ An overview of what each of these does:

    - Provided that the file has a YAML Front Matter section, it will be transformed by Jekyll. The same will happen for any .html, .markdown, .md, or .textile file in your site’s root directory or directories not listed above. -

    @@ -226,14 +204,12 @@ An overview of what each of these does:

    - Every other directory and file except for those listed above—such as css and images folders, favicon.ico files, and so forth—will be copied verbatim to the generated site. There are plenty of sites already using Jekyll if you’re curious to see how they’re laid out. -

    From 365ecb7c37417a983886a25d9523f201dbf9a708 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 13 Nov 2016 07:41:50 +0530 Subject: [PATCH 1630/4996] a few more edits --- docs/_docs/structure.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/_docs/structure.md b/docs/_docs/structure.md index cbc8b6eeb8a..bdfaab59a7a 100644 --- a/docs/_docs/structure.md +++ b/docs/_docs/structure.md @@ -40,13 +40,13 @@ A basic Jekyll site usually looks something like this: ```
    -
    Directory structure of Jekyll sites using gem themes
    +
    Directory structure of Jekyll sites using gem-based themes

    - Starting Jekyll 3.2, a new Jekyll project boostraped with jekyll new uses gem-based themes to define the look of the site. This results in a lighter default directory structure : _layouts, _includes and _sass are stored by default in the gem theme path. + Starting Jekyll 3.2, a new Jekyll project bootstrapped with jekyll new uses gem-based themes to define the look of the site. This results in a lighter default directory structure : _layouts, _includes and _sass are stored in the theme-gem, by default.


    - minima is the current default theme, bundle show minima will show you where minima theme's files are stored on your computer. + minima is the current default theme, and bundle show minima will show you where minima theme's files are stored on your computer.

    @@ -153,8 +153,7 @@ An overview of what each of these does:

    These are sass partials that can be imported into your main.scss which will then be processed into a single stylesheet - main.css - that defines the styles to be used by your site. + main.css that defines the styles to be used by your site.

    @@ -186,7 +185,8 @@ An overview of what each of these does: -

    index.html or index.md and other HTML, Markdown, Textile files

    +

    index.html or index.md and other HTML, + Markdown, Textile files

    From d3e387d14628cdec6863c2ee4ce55852eb7e4bc5 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 14 Nov 2016 13:30:14 -0800 Subject: [PATCH 1631/4996] Fix typo. --- lib/jekyll/url.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 404b27283ca..4504574f451 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -85,7 +85,7 @@ def generate_url_from_hash(template) end # We include underscores in keys to allow for 'i_month' and so forth. - # This poses a problem for keys which are followed by and underscore + # This poses a problem for keys which are followed by an underscore # but the underscore is not part of the key, e.g. '/:month_:day'. # That should be :month and :day, but our key extraction regexp isn't # smart enough to know that so we have to make it an explicit From cd3831296a5cb1be176db4d97daf69d9ebd238d5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 14 Nov 2016 14:28:37 -0800 Subject: [PATCH 1632/4996] Update history to reflect merge of #5572 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a408b0f29c5..b5714d0bc2b 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * `jekyll new-theme` should specify Jekyll as a runtime dependency for the theme (#5457) * Be much more specific about ignoring specific vendored directories. (#5564) * Only warn about auto-regeneration bug on Bash On Windows. (#5464) + * Allow permalink template to have underscores (#5572) ### Development Fixes From 7c44c5a56d104181216a053355357dac4b1b093d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 14 Nov 2016 14:36:05 -0800 Subject: [PATCH 1633/4996] Release :gem: 3.3.1 --- History.markdown | 34 +++++------ docs/_docs/configuration.md | 2 +- docs/_docs/history.md | 60 +++++++++++++++++++ .../2016-11-14-jekyll-3-3-1-released.markdown | 19 ++++++ docs/latest_version.txt | 2 +- lib/jekyll/version.rb | 2 +- 6 files changed, 99 insertions(+), 20 deletions(-) create mode 100644 docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown diff --git a/History.markdown b/History.markdown index b5714d0bc2b..caa4911133f 100644 --- a/History.markdown +++ b/History.markdown @@ -1,8 +1,23 @@ -## HEAD +## 3.3.1 / 2016-11-14 + +### Minor Enhancements + + * Collapse `gsub` for performance (#5494) + * URL: warn if key doesn't exist in url drop (#5524) + +### Bug Fixes + + * Fix typo in `theme_template` README (#5472) + * Do not swallow all exceptions on render (#5495) + * Site template: fixed `_config.yml` comment typo (#5511) + * `jekyll new-theme` should specify Jekyll as a runtime dependency for the theme (#5457) + * Be much more specific about ignoring specific vendored directories. (#5564) + * Only warn about auto-regeneration bug on Bash On Windows. (#5464) + * Allow permalink template to have underscores (#5572) ### Site Enhancements - * Documentation: {% link %} tag (#5449) + * Documentation: `link` Liquid tag (#5449) * Updating install instruction link for Jekyll 3 on Windows (#5475) * Update normalize.css to v5.0.0 (#5471) * Add jekyll-data to the list of plugins (#5491) @@ -27,16 +42,6 @@ * Fix link to jekyll-pinboard plugin (#5570) * mention `docs` folder as a way to deploy on GitHub Pages (#5571) -### Bug Fixes - - * Fix typo in theme_template README (#5472) - * Do not swallow all exceptions on render (#5495) - * Site template: fixed `_config.yml` comment typo (#5511) - * `jekyll new-theme` should specify Jekyll as a runtime dependency for the theme (#5457) - * Be much more specific about ignoring specific vendored directories. (#5564) - * Only warn about auto-regeneration bug on Bash On Windows. (#5464) - * Allow permalink template to have underscores (#5572) - ### Development Fixes * fix rubocop errors on testing with Rubocop 0.44 (#5489) @@ -47,11 +52,6 @@ * Collections.feature: conditional steps to have it pass on Windows (#5546) * Fix tests to get script/test to pass on Windows (#5526) -### Minor Enhancements - - * Collapse `gsub` (#5494) - * URL: warn if key doesn't exist in url drop (#5524) - ## 3.3.0 / 2016-10-06 ### Minor Enhancements diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index a244e1ab1fd..41fed98037e 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -594,7 +594,7 @@ collections: # Handling Reading safe: false include: [".htaccess"] -exclude: ["node_modules", "vendor"] +exclude: ["node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"] keep_files: [".git", ".svn"] encoding: "utf-8" markdown_ext: "markdown,mkdown,mkdn,mkd,md" diff --git a/docs/_docs/history.md b/docs/_docs/history.md index b272bd53de8..5d07eb4009b 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -5,6 +5,66 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.3.1 / 2016-11-14 +{: #v3-3-1} + +### Minor Enhancements +{: #minor-enhancements-v3-3-1} + +- Collapse `gsub` for performance ([#5494]({{ site.repository }}/issues/5494)) +- URL: warn if key doesn't exist in url drop ([#5524]({{ site.repository }}/issues/5524)) + +### Bug Fixes +{: #bug-fixes-v3-3-1} + +- Fix typo in `theme_template` README ([#5472]({{ site.repository }}/issues/5472)) +- Do not swallow all exceptions on render ([#5495]({{ site.repository }}/issues/5495)) +- Site template: fixed `_config.yml` comment typo ([#5511]({{ site.repository }}/issues/5511)) +- `jekyll new-theme` should specify Jekyll as a runtime dependency for the theme ([#5457]({{ site.repository }}/issues/5457)) +- Be much more specific about ignoring specific vendored directories. ([#5564]({{ site.repository }}/issues/5564)) +- Only warn about auto-regeneration bug on Bash On Windows. ([#5464]({{ site.repository }}/issues/5464)) +- Allow permalink template to have underscores ([#5572]({{ site.repository }}/issues/5572)) + +### Site Enhancements +{: #site-enhancements-v3-3-1} + +- Documentation: `link` Liquid tag ([#5449]({{ site.repository }}/issues/5449)) +- Updating install instruction link for Jekyll 3 on Windows ([#5475]({{ site.repository }}/issues/5475)) +- Update normalize.css to v5.0.0 ([#5471]({{ site.repository }}/issues/5471)) +- Add jekyll-data to the list of plugins ([#5491]({{ site.repository }}/issues/5491)) +- Add info about checking version + updating ([#5497]({{ site.repository }}/issues/5497)) +- Add jekyll-include-absolute-plugin to list of third-party plugins ([#5492]({{ site.repository }}/issues/5492)) +- Remove jekyll-hook from deployment methods ([#5502]({{ site.repository }}/issues/5502)) +- Update deployment-methods.md ([#5504]({{ site.repository }}/issues/5504)) +- Ubuntu users should install ruby2.3-dev ([#5512]({{ site.repository }}/issues/5512)) +- Remove Glynn as deployment option ([#5519]({{ site.repository }}/issues/5519)) +- Fix broken forum link ([#5466]({{ site.repository }}/issues/5466)) +- Move documentation to docs folder ([#5459]({{ site.repository }}/issues/5459)) +- Fix broken links in CONTRIBUTING ([#5533]({{ site.repository }}/issues/5533)) +- Update documentation on jekyllrb.com ([#5540]({{ site.repository }}/issues/5540)) +- Fix HTML rendering ([#5536]({{ site.repository }}/issues/5536)) +- Remove outdated deployment information ([#5557]({{ site.repository }}/issues/5557)) +- no more invalid US-ASCII on lines 30 and 97 ([#5520]({{ site.repository }}/issues/5520)) +- Add permalinks to docs in '/maintaining/' ([#5532]({{ site.repository }}/issues/5532)) +- Add jekyll-pinboard to list of third-party plugins ([#5514]({{ site.repository }}/issues/5514)) +- Fix formatting in 2-to-3.md ([#5507]({{ site.repository }}/issues/5507)) +- Add two plugins to the plugins page ([#5493]({{ site.repository }}/issues/5493)) +- Use site.baseurl before link and post_url tags ([#5559]({{ site.repository }}/issues/5559)) +- Fix link to jekyll-pinboard plugin ([#5570]({{ site.repository }}/issues/5570)) +- mention `docs` folder as a way to deploy on GitHub Pages ([#5571]({{ site.repository }}/issues/5571)) + +### Development Fixes +{: #development-fixes-v3-3-1} + +- fix rubocop errors on testing with Rubocop 0.44 ([#5489]({{ site.repository }}/issues/5489)) +- script/test: add missing whitespace ([#5479]({{ site.repository }}/issues/5479)) +- Restrict Rubocop version ([#5496]({{ site.repository }}/issues/5496)) +- include a hashbang for all benchmark scripts & make them executable ([#5505]({{ site.repository }}/issues/5505)) +- Update source in script/proof ([#5538]({{ site.repository }}/issues/5538)) +- Collections.feature: conditional steps to have it pass on Windows ([#5546]({{ site.repository }}/issues/5546)) +- Fix tests to get script/test to pass on Windows ([#5526]({{ site.repository }}/issues/5526)) + + ## 3.3.0 / 2016-10-06 {: #v3-3-0} diff --git a/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown b/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown new file mode 100644 index 00000000000..a5a88376c94 --- /dev/null +++ b/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown @@ -0,0 +1,19 @@ +--- +layout: news_item +title: 'Jekyll 3.3.1 Released' +date: 2016-11-14 14:29:59 -0800 +author: parkr +version: 3.3.1 +categories: [release] +--- + +Hello! We have a bugfix release of Jekyll hot off the presses for you. Key +fixes to call out: + +1. Only warn about auto-regeneration issues on Windows instead of disabling +2. Exclude very specific `vendor/` subdirectories instead of all of `vendor/` +3. Allow permalink templates to have plaintext underscores + +..and lots more! Check out the [full history for more](/docs/history/#v3-3-1). + +Happy Jekylling! diff --git a/docs/latest_version.txt b/docs/latest_version.txt index 15a27998172..bea438e9ade 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.3.0 +3.3.1 diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 848b513b738..a01e787a21d 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.3.0".freeze + VERSION = "3.3.1".freeze end From 5defc4782afdd03c4f38b704862092f01c56d70f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 15 Nov 2016 20:35:48 +0100 Subject: [PATCH 1634/4996] remove instructions for Jekyll 2 --- docs/_docs/windows.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 68edd8ef69d..4ae1fd5e055 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -16,10 +16,9 @@ A quick way to install Jekyll is to follow the [installation instructions by Dav 2. Install Ruby via Chocolatey: `choco install ruby -y` 3. Reopen a command prompt and install Jekyll: `gem install jekyll` -For a more conventional way of installing Jekyll you can follow the [installation instructions by Sverrir Sigmundarson][windows-installjekyll3]. These instructions are for newer versions of Ruby 2.2.5 and Jekyll 3. - -For instructions for older versions of Ruby 2.0.0 ([prior to 2.2][hitimes-issue]) and Jekyll 2 and older you should follow the [installation instruction by Julian Thilo][windows-installation]. +For a more conventional way of installing Jekyll you can follow this [complete guide to install Jekyll 3 on Windows by Sverrir Sigmundarson][windows-installjekyll3]. +[windows-installjekyll3]: https://labs.sverrirs.com/jekyll/ ## Encoding @@ -35,10 +34,6 @@ the site generation process. It can be done with the following command: $ chcp 65001 ``` -[windows-installation]: http://jekyll-windows.juthilo.com/ -[windows-installjekyll3]: https://labs.sverrirs.com/jekyll/ -[hitimes-issue]: https://github.com/copiousfreetime/hitimes/issues/40 - ## Auto-regeneration As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the @@ -103,7 +98,7 @@ This gem is also needed in the github-pages and to get it running on Windows x64 ```ruby source 'http://rubygems.org' -gem 'github-pages' +gem 'github-pages', group: :jekyll_plugins ``` * **Note:** We use an unsecure connection because SSL throws exceptions in the version of Ruby From 575c23e547991116e7059d4582fa7fd8071d7dd3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 15 Nov 2016 13:55:41 -0800 Subject: [PATCH 1635/4996] Update history to reflect merge of #5582 [ci skip] --- History.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/History.markdown b/History.markdown index caa4911133f..29302ef7109 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,9 @@ +## HEAD + +### Site Enhancements + + * Remove instructions to install Jekyll 2 on Windows (#5582) + ## 3.3.1 / 2016-11-14 ### Minor Enhancements From 52742e049668b8c92d7bb439f7d7d17179c999c9 Mon Sep 17 00:00:00 2001 From: Don Denton Date: Thu, 17 Nov 2016 01:12:41 -0600 Subject: [PATCH 1636/4996] Fix bad config YAML in collections example If you add the previous version to your config file, you'd get an error on build/serve. --- docs/_docs/configuration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 41fed98037e..9dca5cea6dc 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -513,8 +513,8 @@ With these defaults, all posts would use the `my-site` layout. Any html files th ```yaml collections: - - my_collection: - output: true + my_collection: + output: true defaults: - From 195770f7f619dddaae4630b9b734a7c6b90484e2 Mon Sep 17 00:00:00 2001 From: brainscript Date: Sun, 20 Nov 2016 13:43:36 +0100 Subject: [PATCH 1637/4996] Fix example URL inconsistency In case of the GitHub example links like `` with the full URL plus the variable were used, but for the Twitter example link only the `{{ author.name }}` was set as `href`. --- docs/_docs/datafiles.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index daf5e4b1776..21799169e92 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -143,7 +143,7 @@ author: dave {% assign author = site.data.people[page.author] %} From 8d4803eb6dea2f7c54ca5bad00f9b47e6cdf71e1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 20 Nov 2016 11:21:53 -0800 Subject: [PATCH 1638/4996] Update history to reflect merge of #5592 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 29302ef7109..ecda830ceae 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Site Enhancements * Remove instructions to install Jekyll 2 on Windows (#5582) + * Fix example URL inconsistency (#5592) ## 3.3.1 / 2016-11-14 From 127704ad1775eade80bc4a920de73ed0e0970e13 Mon Sep 17 00:00:00 2001 From: alexmalik Date: Sat, 1 Oct 2016 23:14:12 +0100 Subject: [PATCH 1639/4996] Replace backticks with HTML tags Prior to the change backticks were used in an attempt to create a code block. The problem is that inside block level HTML tags Markdown is not supported. I have replaced the backticks with a combination of HTML tags in order to approximately simulate the appearance of a code block. The docs suggest possible use of span tags in place of the surrounding div tags as a solution to getting the Markdown to render. I tried this but no success. This change improves the readers understanding of the information, because the reader doesn't have to make sense of raw markdown. --- docs/_docs/github-pages.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index b65bad904b8..f07af766be1 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -54,26 +54,22 @@ few minor details. currently-deployed version of the gem in your project, add the following to your Gemfile: -```ruby -source 'https://rubygems.org' +

    source 'https://rubygems.org'

    -require 'json' -require 'open-uri' -versions = JSON.parse(open('https://pages.github.com/versions.json').read) +

    require 'json'

    +

    require 'open-uri'

    +

    versions = JSON.parse(open('https://pages.github.com/versions.json').read)

    -gem 'github-pages', versions['github-pages'] -``` +

    gem 'github-pages', versions['github-pages']

    This will ensure that when you run bundle install, you have the correct version of the github-pages gem. If that fails, simplify it: -```ruby -source 'https://rubygems.org' +

    source 'https://rubygems.org'

    -gem 'github-pages' -``` +

    gem 'github-pages'

    And be sure to run bundle update often. From c47ae465ad6e27f5f335f96f5834da8c2959cfc9 Mon Sep 17 00:00:00 2001 From: alexmalik Date: Sun, 2 Oct 2016 13:31:15 +0100 Subject: [PATCH 1640/4996] Replace p and code tags with {% highlight %} --- docs/_docs/github-pages.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index f07af766be1..449e45152b2 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -53,24 +53,33 @@ few minor details. differences between various versions of the gems. To use the currently-deployed version of the gem in your project, add the following to your Gemfile: +

    -

    source 'https://rubygems.org'

    + {% highlight ruby %} + source 'https://rubygems.org' -

    require 'json'

    -

    require 'open-uri'

    -

    versions = JSON.parse(open('https://pages.github.com/versions.json').read)

    + require 'json' + require 'open-uri' + versions = JSON.parse(open('https://pages.github.com/versions.json').read) -

    gem 'github-pages', versions['github-pages']

    + gem 'github-pages', versions['github-pages'] + {% endhighlight %} +

    This will ensure that when you run bundle install, you have the correct version of the github-pages gem. If that fails, simplify it: +

    -

    source 'https://rubygems.org'

    -

    gem 'github-pages'

    + {% highlight ruby %} + source 'https://rubygems.org' + gem 'github-pages' + {% endhighlight %} + +

    And be sure to run bundle update often. If you like to install pages-gem on Windows you can find instructions by Jens Willmer on how to install github-pages gem on Windows (x64). From a41b46ff35e375ba5847abe5af1671c35aa21fa8 Mon Sep 17 00:00:00 2001 From: alexmalik Date: Tue, 4 Oct 2016 12:11:52 +0100 Subject: [PATCH 1641/4996] replace {% %} with bacticks for nested code-block uses Kramdown with the markdown="1" attribute, as suggested by @mmistakes. This allows rendering of code blocks which are nested inside HTML tags. --- docs/_docs/github-pages.md | 70 ++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 449e45152b2..b82baa186fb 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -42,48 +42,46 @@ There are two basic types available: user/organization pages and project pages. The way to deploy these two types of sites are nearly identical, except for a few minor details. -

    -
    Use the github-pages gem
    -

    - Our friends at GitHub have provided the - github-pages - gem which is used to manage Jekyll and its dependencies on - GitHub Pages. Using it in your projects means that when you deploy - your site to GitHub Pages, you will not be caught by unexpected - differences between various versions of the gems. To use the - currently-deployed version of the gem in your project, add the - following to your Gemfile: -

    - - {% highlight ruby %} - source 'https://rubygems.org' - - require 'json' - require 'open-uri' - versions = JSON.parse(open('https://pages.github.com/versions.json').read) - - gem 'github-pages', versions['github-pages'] - {% endhighlight %} - -

    - This will ensure that when you run bundle install, you - have the correct version of the github-pages gem. +

    +##### Use the `github-pages` gem + +Our friends at GitHub have provided the +github-pages +gem which is used to manage Jekyll and its dependencies on +GitHub Pages. Using it in your projects means that when you deploy +your site to GitHub Pages, you will not be caught by unexpected +differences between various versions of the gems. To use the +currently-deployed version of the gem in your project, add the +following to your `Gemfile`: + +
    +```ruby +source 'https://rubygems.org' + +require 'json' +require 'open-uri' +versions = JSON.parse(open('https://pages.github.com/versions.json').read) + +gem 'github-pages', versions['github-pages'] +``` +
    - If that fails, simplify it: -

    +This will ensure that when you run `bundle install`, you +have the correct version of the `github-pages` gem. +If that fails, simplify it: - {% highlight ruby %} - source 'https://rubygems.org' +
    +```ruby +source 'https://rubygems.org' - gem 'github-pages' - {% endhighlight %} +gem 'github-pages' +``` +
    -

    - And be sure to run bundle update often. +And be sure to run `bundle update` often. - If you like to install pages-gem on Windows you can find instructions by Jens Willmer on how to install github-pages gem on Windows (x64). -

    +If you like to install `pages-gem` on Windows you can find instructions by Jens Willmer on how to install github-pages gem on Windows (x64).
    From 2009749e58bad922e697eb0f5d4206f0b84c2bf7 Mon Sep 17 00:00:00 2001 From: alexmalik Date: Tue, 4 Oct 2016 12:19:30 +0100 Subject: [PATCH 1642/4996] add new style rule for .code-block class as suggested by @ashmaroli --- docs/_sass/_style.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 5e441924546..f1e3de5f327 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -670,6 +670,11 @@ h5 > code, font-size: 0.8em; } +.code-block { + margin: 10px 0; + code { background: none; } +} + .highlight { margin: 1em 0; padding: 10px 0; From 9cd71aaea9e8f780e2789cbc3a5d02ad92927e27 Mon Sep 17 00:00:00 2001 From: alexmalik Date: Tue, 4 Oct 2016 14:34:24 +0100 Subject: [PATCH 1643/4996] add empty div with markdown="1" attribute an empty div is necessary in order for the code blocks to render correctly when not displayed on the jekyllrb site. --- docs/_docs/github-pages.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index b82baa186fb..a93b65b5b35 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -43,6 +43,9 @@ The way to deploy these two types of sites are nearly identical, except for a few minor details.
    +
    +
    + ##### Use the `github-pages` gem Our friends at GitHub have provided the @@ -55,6 +58,9 @@ currently-deployed version of the gem in your project, add the following to your `Gemfile`:
    +
    +
    + ```ruby source 'https://rubygems.org' @@ -72,6 +78,9 @@ have the correct version of the `github-pages` gem. If that fails, simplify it:
    +
    +
    + ```ruby source 'https://rubygems.org' From df80f6fd2a70cde7eaa305dda4d157dcfab1c251 Mon Sep 17 00:00:00 2001 From: alexmalik Date: Tue, 25 Oct 2016 12:10:31 +0100 Subject: [PATCH 1644/4996] Replace html links with markdown links --- docs/_docs/github-pages.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index a93b65b5b35..b046f0f9173 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -27,7 +27,7 @@ site builds properly, use `site.github.url` in your URL's. -{{ page.title }} +[{{ page.title }}]("{{ page.url | prepend: site.github.url }}") {% endraw %} ``` @@ -49,7 +49,7 @@ few minor details. ##### Use the `github-pages` gem Our friends at GitHub have provided the -github-pages +[github-pages](https://github.com/github/pages-gem) gem which is used to manage Jekyll and its dependencies on GitHub Pages. Using it in your projects means that when you deploy your site to GitHub Pages, you will not be caught by unexpected @@ -90,7 +90,8 @@ gem 'github-pages' And be sure to run `bundle update` often. -If you like to install `pages-gem` on Windows you can find instructions by Jens Willmer on how to install github-pages gem on Windows (x64). +If you like to install `pages-gem` on Windows you can find instructions by Jens Willmer on +[how to install github-pages gem on Windows (x64)]("http://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46#github-pages-and-plugins").
    @@ -107,8 +108,7 @@ If you like to install `pages-gem` on Windows you can find instructions by Jens User and organization pages live in a special GitHub repository dedicated to only the GitHub Pages files. This repository must be named after the account -name. For example, [@mojombo’s user page -repository](https://github.com/mojombo/mojombo.github.io) has the name +name. For example, [@mojombo’s user page repository](https://github.com/mojombo/mojombo.github.io) has the name `mojombo.github.io`. Content from the `master` branch of your repository will be used to build and @@ -156,9 +156,8 @@ to see more detailed examples.
    GitHub Pages Documentation, Help, and Support

    For more information about what you can do with GitHub Pages, as well as for - troubleshooting guides, you should check out GitHub’s Pages Help - section. If all else fails, you should contact GitHub Support. + troubleshooting guides, you should check out + GitHub’s Pages Help section. + If all else fails, you should contact GitHub Support.

    From 8a08bb417e4cb70a3cf77c958b55183c5706aaa3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 20 Nov 2016 15:06:46 -0800 Subject: [PATCH 1645/4996] Update history to reflect merge of #5435 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ecda830ceae..cde0bd3180b 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Remove instructions to install Jekyll 2 on Windows (#5582) * Fix example URL inconsistency (#5592) + * Replace backticks within HTML blocks with HTML tags (#5435) ## 3.3.1 / 2016-11-14 From 5c965d6a203d66a4543c11032f3912209782a748 Mon Sep 17 00:00:00 2001 From: Tim Banks Date: Tue, 22 Nov 2016 17:38:33 -0600 Subject: [PATCH 1646/4996] Add connector param to array_to_sentence_string filter --- docs/_docs/templates.md | 8 +++++++- lib/jekyll/filters.rb | 4 ++-- test/test_filters.rb | 5 +++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index daae34c2771..a203172eb64 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -208,7 +208,7 @@ common tasks easier.

    Array to Sentence

    -

    Convert an array into a sentence. Useful for listing tags.

    +

    Convert an array into a sentence. Useful for listing tags. Optional argument for connector.

    @@ -217,6 +217,12 @@ common tasks easier.

    foo, bar, and baz

    +

    + {% raw %}{{ page.tags | array_to_sentence_string: 'or' }}{% endraw %} +

    +

    + foo, bar, or baz +

    diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 29f2a2b5e1a..ddd4fea981e 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -175,6 +175,7 @@ def number_of_words(input) # word "and" for the last one. # # array - The Array of Strings to join. + # connector - Word used to connect the last 2 items in the array # # Examples # @@ -182,8 +183,7 @@ def number_of_words(input) # # => "apples, oranges, and grapes" # # Returns the formatted String. - def array_to_sentence_string(array) - connector = "and" + def array_to_sentence_string(array, connector = "and") case array.length when 0 "" diff --git a/test/test_filters.rb b/test/test_filters.rb index 20587610beb..48f90bbb741 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -143,6 +143,11 @@ def select; end ) end + should "convert array to sentence string with different connector" do + assert_equal "1 or 2", @filter.array_to_sentence_string([1, 2], "or") + assert_equal "1, 2, 3, or 4", @filter.array_to_sentence_string([1, 2, 3, 4], "or") + end + context "normalize_whitespace filter" do should "replace newlines with a space" do assert_equal "a b", @filter.normalize_whitespace("a\nb") From fabce98c54ed09b14052f11a9c9dff9d1e304253 Mon Sep 17 00:00:00 2001 From: Max Chadwick Date: Wed, 23 Nov 2016 05:52:51 -0500 Subject: [PATCH 1647/4996] Add jekyll-migrate-permalink --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 6c5a9f9f13a..b68d7bba780 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -917,6 +917,7 @@ LESS.js files during generation. - [jekyll-menus](https://github.com/forestryio/jekyll-menus): Hugo style menus for your Jekyll site... recursive menus included. - [jekyll-data](https://github.com/ashmaroli/jekyll-data): Read data files within Jekyll Theme Gems. - [jekyll-pinboard](https://github.com/snaptortoise/jekyll-pinboard-plugin): Access your Pinboard bookmarks within your Jekyll theme. +- [jekyll-migrate-permalink](https://github.com/mpchadwick/jekyll-migrate-permalink): Adds a `migrate-permalink` sub-command to help deal with side effects of changing your permalink. #### Editors From ce67da0f80058f579630e0adcec538facd8418a8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 23 Nov 2016 08:23:02 -0800 Subject: [PATCH 1648/4996] Update history to reflect merge of #5597 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index cde0bd3180b..afc76af4998 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,10 @@ * Fix example URL inconsistency (#5592) * Replace backticks within HTML blocks with HTML tags (#5435) +### Minor Enhancements + + * Add connector param to array_to_sentence_string filter (#5597) + ## 3.3.1 / 2016-11-14 ### Minor Enhancements From bbdeb32f38727113b274367c340599bcb9c54014 Mon Sep 17 00:00:00 2001 From: Eldritch Cheese Date: Sat, 26 Nov 2016 16:51:01 -0500 Subject: [PATCH 1649/4996] Escaped regular expressions when using post_url. Previously, the post_url function would give error messages when the post being listed contained special characters for use in regular expressions. These special characters are now escaped using Regexp.escape. --- lib/jekyll/tags/post_url.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index b865cd67fdf..9b4203d6bf4 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -14,7 +14,8 @@ def initialize(name) "'#{name}' does not contain valid date and/or title." end - @name_regex = %r!^_posts/#{path}#{date}-#{slug}\.[^.]+| + escaped_slug = Regexp.escape(slug) + @name_regex = %r!^_posts/#{path}#{date}-#{escaped_slug}\.[^.]+| ^#{path}_posts/?#{date}-#{slug}\.[^.]+!x end From a55760d4ad9fe3a00d4bfcd6e74512f4132d8cfe Mon Sep 17 00:00:00 2001 From: Eldritch Cheese Date: Sat, 26 Nov 2016 22:31:03 -0500 Subject: [PATCH 1650/4996] Added unit test for special character, fixed error that it exposed. --- lib/jekyll/tags/post_url.rb | 2 +- .../2016-11-26-special-chars-(+).markdown | 8 ++++++ test/test_tags.rb | 26 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/source/_posts/2016-11-26-special-chars-(+).markdown diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index 9b4203d6bf4..37c7e56546b 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -16,7 +16,7 @@ def initialize(name) escaped_slug = Regexp.escape(slug) @name_regex = %r!^_posts/#{path}#{date}-#{escaped_slug}\.[^.]+| - ^#{path}_posts/?#{date}-#{slug}\.[^.]+!x + ^#{path}_posts/?#{date}-#{escaped_slug}\.[^.]+!x end def post_date diff --git a/test/source/_posts/2016-11-26-special-chars-(+).markdown b/test/source/_posts/2016-11-26-special-chars-(+).markdown new file mode 100644 index 00000000000..21cc7714620 --- /dev/null +++ b/test/source/_posts/2016-11-26-special-chars-(+).markdown @@ -0,0 +1,8 @@ +--- +layout: default +title: Special Characters +--- + +url: {{ page.url }} +date: {{ page.date }} +id: {{ page.id }} \ No newline at end of file diff --git a/test/test_tags.rb b/test/test_tags.rb index 6bf4b84b1e9..0a277173e49 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -554,6 +554,32 @@ def highlight_block_with_opts(options_string) end end + context "simple page with post linking containing special characters" do + setup do + content = < "pretty", + "source" => source_dir, + "destination" => dest_dir, + "read_posts" => true + }) + end + + should "not cause an error" do + refute_match(%r!markdown\-html\-error!, @result) + end + + should "have the URL to the \"complex\" post from 2008-11-21" do + assert_match %r!/2016/11/26/special-chars-\(\+\)/!, @result + end + end + context "simple page with nested post linking" do setup do content = < Date: Sun, 27 Nov 2016 07:59:56 -0500 Subject: [PATCH 1651/4996] Increased number of posts in test_generated_site to account for special chars test --- test/test_generated_site.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 112cf9d3c09..3a520b24cc3 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -11,7 +11,7 @@ class TestGeneratedSite < JekyllUnitTest end should "ensure post count is as expected" do - assert_equal 50, @site.posts.size + assert_equal 51, @site.posts.size end should "insert site.posts into the index" do From 467bd5bb321a94a5aae0812f55f45b6ca3c273bc Mon Sep 17 00:00:00 2001 From: Eldritch Cheese Date: Mon, 28 Nov 2016 07:35:48 -0500 Subject: [PATCH 1652/4996] Updated test name, using single quotes for cleanliness. --- test/test_tags.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_tags.rb b/test/test_tags.rb index 0a277173e49..bd75cb53030 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -575,7 +575,7 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the URL to the \"complex\" post from 2008-11-21" do + should 'have the URL to the "special-chars" post from 2016-11-26' do assert_match %r!/2016/11/26/special-chars-\(\+\)/!, @result end end From 4c634d1d6654dc625c2403c6ccfa4a9863c7a579 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 28 Nov 2016 09:25:12 -0800 Subject: [PATCH 1653/4996] Update history to reflect merge of #5605 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index afc76af4998..a20e68b4afb 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,10 @@ * Add connector param to array_to_sentence_string filter (#5597) +### Bug Fixes + + * Escaped regular expressions when using post_url. (#5605) + ## 3.3.1 / 2016-11-14 ### Minor Enhancements From d175ba2cb8c50ca74fc0badf916ecdb8aede5447 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 28 Nov 2016 23:05:47 +0530 Subject: [PATCH 1654/4996] clean unit-test-names --- test/test_tags.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/test_tags.rb b/test/test_tags.rb index bd75cb53030..fd6dcb9783e 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -549,7 +549,7 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the URL to the \"complex\" post from 2008-11-21" do + should "have the URL to the 'complex' post from 2008-11-21" do assert_match %r!/2008/11/21/complex/!, @result end end @@ -575,7 +575,7 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should 'have the URL to the "special-chars" post from 2016-11-26' do + should "have the URL to the 'special-chars' post from 2016-11-26" do assert_match %r!/2016/11/26/special-chars-\(\+\)/!, @result end end @@ -604,12 +604,12 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the URL to the \"complex\" post from 2008-11-21" do + should "have the URL to the 'complex' post from 2008-11-21" do assert_match %r!1\s/2008/11/21/complex/!, @result assert_match %r!2\s/2008/11/21/complex/!, @result end - should "have the URL to the \"nested\" post from 2008-11-21" do + should "have the URL to the 'nested' post from 2008-11-21" do assert_match %r!3\s/2008/11/21/nested/!, @result assert_match %r!4\s/2008/11/21/nested/!, @result end @@ -636,7 +636,7 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the url to the \"nested\" post from 2008-11-21" do + should "have the url to the 'nested' post from 2008-11-21" do assert_match %r!1\s/2008/11/21/nested/!, @result end @@ -711,15 +711,15 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the URL to the \"contacts\" item" do + should "have the URL to the 'contacts' item" do assert_match(%r!/contacts\.html!, @result) end - should "have the URL to the \"info\" item" do + should "have the URL to the 'info' item" do assert_match(%r!/info\.html!, @result) end - should "have the URL to the \"screen.css\" item" do + should "have the URL to the 'screen.css' item" do assert_match(%r!/css/screen\.css!, @result) end end @@ -745,7 +745,7 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the URL to the \"yaml_with_dots\" item" do + should "have the URL to the 'yaml_with_dots' item" do assert_match(%r!/methods/yaml_with_dots\.html!, @result) end end @@ -772,11 +772,11 @@ def highlight_block_with_opts(options_string) refute_match(%r!markdown\-html\-error!, @result) end - should "have the URL to the \"sanitized_path\" item" do + should "have the URL to the 'sanitized_path' item" do assert_match %r!1\s/methods/sanitized_path\.html!, @result end - should "have the URL to the \"site/generate\" item" do + should "have the URL to the 'site/generate' item" do assert_match %r!2\s/methods/site/generate\.html!, @result end end From 6bf1522de94cd7de6b43d268536d1636c5fd1d8c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 28 Nov 2016 21:16:24 -0800 Subject: [PATCH 1655/4996] Update history to reflect merge of #5608 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index a20e68b4afb..2b1ebabe805 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,10 @@ * Escaped regular expressions when using post_url. (#5605) +### Development Fixes + + * clean unit-test names in `test/test_tags.rb` (#5608) + ## 3.3.1 / 2016-11-14 ### Minor Enhancements From bf3134f5cff219e2f820011c0585751c35ec3789 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 28 Nov 2016 21:24:29 -0800 Subject: [PATCH 1656/4996] Update history to reflect merge of #5600 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2b1ebabe805..751ad640047 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,7 @@ * Remove instructions to install Jekyll 2 on Windows (#5582) * Fix example URL inconsistency (#5592) * Replace backticks within HTML blocks with HTML tags (#5435) + * Add jekyll-migrate-permalink (#5600) ### Minor Enhancements From 5c69924484d6e0e6c976a256fc2f65bfc6470d0c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 28 Nov 2016 21:25:11 -0800 Subject: [PATCH 1657/4996] Update history to reflect merge of #5587 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 751ad640047..d68e15b1b0c 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,7 @@ * Fix example URL inconsistency (#5592) * Replace backticks within HTML blocks with HTML tags (#5435) * Add jekyll-migrate-permalink (#5600) + * Fix bad config YAML in collections example (#5587) ### Minor Enhancements From 65b845470e6d0251bac050befc2db996cf3f4ca1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 28 Nov 2016 21:26:47 -0800 Subject: [PATCH 1658/4996] Update history to reflect merge of #5573 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d68e15b1b0c..bf59c3119da 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * Replace backticks within HTML blocks with HTML tags (#5435) * Add jekyll-migrate-permalink (#5600) * Fix bad config YAML in collections example (#5587) + * Bring documentation on 'Directory Structure' up-to-date (#5573) ### Minor Enhancements From 4bd6240a1d3680a2aeb7ccf1249f450d8ca85edc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 28 Nov 2016 21:38:17 -0800 Subject: [PATCH 1659/4996] Update history to reflect merge of #5384 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bf59c3119da..3d87b54b020 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ ### Development Fixes * clean unit-test names in `test/test_tags.rb` (#5608) + * Add cucumber feature to test for bonafide theme gems (#5384) ## 3.3.1 / 2016-11-14 From fac041933c3e328ff73dc91faeaeb08182ae3c74 Mon Sep 17 00:00:00 2001 From: jona Date: Tue, 29 Nov 2016 09:14:03 +0100 Subject: [PATCH 1660/4996] fix date parsing in file names --- lib/jekyll/document.rb | 2 +- .../3940394-21-9393050-fifif1323-test.md | 5 ++++ test/test_document.rb | 29 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/source/_methods/3940394-21-9393050-fifif1323-test.md diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index f35cdb0e061..ad5884efb68 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -9,7 +9,7 @@ class Document YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m DATELESS_FILENAME_MATCHER = %r!^(?:.+/)*(.*)(\.[^.]+)$! - DATE_FILENAME_MATCHER = %r!^(?:.+/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$! + DATE_FILENAME_MATCHER = %r!^(?:.+/)*(\d{4}-\d{2}-\d{2})-(.*)(\.[^.]+)$! # Create a new Document. # diff --git a/test/source/_methods/3940394-21-9393050-fifif1323-test.md b/test/source/_methods/3940394-21-9393050-fifif1323-test.md new file mode 100644 index 00000000000..848d0204cc4 --- /dev/null +++ b/test/source/_methods/3940394-21-9393050-fifif1323-test.md @@ -0,0 +1,5 @@ +--- +title: "this is a test!" +--- + +wheee diff --git a/test/test_document.rb b/test/test_document.rb index e4d7abbfdac..5b9156f3e39 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -492,4 +492,33 @@ def assert_equal_value(key, one, other) assert_equal true, File.file?(@dest_file) end end + + context "a document in a collection with dash-separated numeric file name" do + setup do + @site = fixture_site({ + "collections" => { + "methods" => { + "output" => true + } + } + }) + @site.process + @document = @site.collections["methods"].docs.find do |doc| + doc.relative_path == "_methods/3940394-21-9393050-fifif1323-test.md" + end + @dest_file = dest_dir("methods/3940394-21-9393050-fifif1323-test.html") + end + + should "produce the right URL" do + assert_equal "/methods/3940394-21-9393050-fifif1323-test.html", @document.url + end + + should "produce the right destination" do + assert_equal @dest_file, @document.destination(dest_dir) + end + + should "be output in the correct place" do + assert_equal true, File.file?(@dest_file) + end + end end From dc4e77c1e226c0acc28123c7700c3bc409e7c376 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Thu, 3 Nov 2016 00:08:26 +0200 Subject: [PATCH 1661/4996] Use only the used Font Awesome icons. The font is generated with https://icomoon.io/app/. This saves ~50KB. --- docs/_sass/_font-awesome.scss | 11 +- docs/fonts/FontAwesome.eot | Bin 0 -> 1804 bytes docs/fonts/FontAwesome.svg | 12 + docs/fonts/FontAwesome.ttf | Bin 0 -> 1624 bytes docs/fonts/FontAwesome.woff | Bin 0 -> 1700 bytes docs/fonts/fontawesome-webfont.eot | Bin 68875 -> 0 bytes docs/fonts/fontawesome-webfont.svg | 640 --------------------------- docs/fonts/fontawesome-webfont.ttf | Bin 138204 -> 0 bytes docs/fonts/fontawesome-webfont.woff | Bin 81284 -> 0 bytes docs/fonts/fontawesome-webfont.woff2 | Bin 64464 -> 0 bytes docs/icomoon-selection.json | 96 ++++ docs/readme.md | 7 + 12 files changed, 120 insertions(+), 646 deletions(-) create mode 100644 docs/fonts/FontAwesome.eot create mode 100644 docs/fonts/FontAwesome.svg create mode 100644 docs/fonts/FontAwesome.ttf create mode 100644 docs/fonts/FontAwesome.woff delete mode 100755 docs/fonts/fontawesome-webfont.eot delete mode 100755 docs/fonts/fontawesome-webfont.svg delete mode 100755 docs/fonts/fontawesome-webfont.ttf delete mode 100755 docs/fonts/fontawesome-webfont.woff delete mode 100644 docs/fonts/fontawesome-webfont.woff2 create mode 100644 docs/icomoon-selection.json diff --git a/docs/_sass/_font-awesome.scss b/docs/_sass/_font-awesome.scss index 681011e131d..9e6b285bbd3 100644 --- a/docs/_sass/_font-awesome.scss +++ b/docs/_sass/_font-awesome.scss @@ -1,11 +1,10 @@ -/*! - * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ @font-face { font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.4.0'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg'); + src: url('../fonts/FontAwesome.eot?9h6hxj'); + src: url('../fonts/FontAwesome.eot?9h6hxj#iefix') format('embedded-opentype'), + url('../fonts/FontAwesome.ttf?9h6hxj') format('truetype'), + url('../fonts/FontAwesome.woff?9h6hxj') format('woff'), + url('../fonts/FontAwesome.svg?9h6hxj#FontAwesome') format('svg'); font-weight: normal; font-style: normal; } diff --git a/docs/fonts/FontAwesome.eot b/docs/fonts/FontAwesome.eot new file mode 100644 index 0000000000000000000000000000000000000000..4f0b1de2bd3b048212f62503d9463d277b987758 GIT binary patch literal 1804 zcmah~Pi)&%82_G~_+K&`Rws6vXmeUv51_1T(iWyB%MhA~v4dwLL4?R2?-%_*%9rsBT^NCc3i{n+0N3ypii>j@B4j!-+P~* z<1*3v5)mVTMhBx?j5C+t8|AreFs$2G&;L_Ll%z}KQIk4!k-Fqk8&U%^kxthz*J+D3 zs7fs`Nm>Teg3V3e$DwnSqiJ9BUs0gs1;l8NM4Eng@$8IoGX58sAMxB+ZB#dV&w78t zCDhHc`tbkZ(YCn$?E;+1F3UAnzf^cbi_jgE}!J z?(dK&D(n_Tk^7GDE10i>nf*a|hAbn4q3qF7Ch9#9@AvOhS;Pb7;4rwI!(V{(1f0_=_a5}0_4~fxP-6Wj#zW(6cpr_ZXC@~kndvNHCi63M^Q^>Xrz|!(%S_2&Q}ZR3pGlr( zr&!{*!hWGrWUt9lF)AGXA_%f1L`60$2&WGYUp)|OadqWjMN8{OTKim$S72VO2qz_3 z;MP%r12zZHl2}%hu42aG zrmCkME0Hl&RZ+IU#7t#LQ4X72N@#%uTR9QhCX*Rm)dU*1maK(rcEQ@VQfWJHm9p8Q z)wNPbczfKQv5OM{&j_))vZ|?iCYf~7x@w*Pv#ltKyd<0Ko9BWu#*64GvZ5N9gcX<` zHjrx3wo~>t(oU4Dyq!*2U3($x6s<)o#rdK$Q9{OX+upVp_`dT#!gK!WZEM9?cuFz9 zVdzo$XLQQ&NdCE(Q%Ycx(j@GmZ+f=NOX zU;)?W7a + + +Generated by IcoMoon + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/FontAwesome.ttf b/docs/fonts/FontAwesome.ttf new file mode 100644 index 0000000000000000000000000000000000000000..47e2443e99084e51e746397225bb4d6dabc43b16 GIT binary patch literal 1624 zcmah}Ply{;82{c(GXIj!Xm^sCY(hKP)$Tz_w@G%RlBB6fFRjPK?~yU`sz9sNzjGT=8_jeZyV3*dX$mDcwDM<2{Q`X2m% zNVu`(Ha27Lw0g<9k#S@j=PYVzL|`@NE3cKo{(yZBxWkBigMiHETIJqwsIo0 zO(rwCstGh}ty<-5wruTMskB|Ns@ZJC8d|9na(mX!+m*RM&IqxFvZ|?iCYf~7x@w+* zWLHrXc~v&qch872!;2UyvZ5N9gcX<`w~=bawo~>l(#}<_f}KuTL%W=HD%OgX;_`|! zS4GBI+upUy{M`8*;d|r#Z>)8r{Dfluz|h0mi(hi}WcP0d?-`REEcp2E0)x#L?rl1e zfrS)k0>a%egCzdQ-!_&;CY_@m%K>vwi9QZPO)_w+$OA7=z%kW0W!e;Q&D@;5^q z0lppLC~!8!67WWdHJYWL_=}6EkR+iAus}L}5n>VYYaxyR-wAOP_|*_gz?~3lRHTPj zz0Tmu(CvF|m#&fr<$$ixkX-76waHy`d;MEp$GMbSq&0|pP~7qj9lAt0T0AwvsRq~G z*3NdLN7oU)MLV=j4eFih#SNU6+i`o1fxGE6_nrENcg^!Uxo3?y2rg@BS}moa+w& literal 0 HcmV?d00001 diff --git a/docs/fonts/FontAwesome.woff b/docs/fonts/FontAwesome.woff new file mode 100644 index 0000000000000000000000000000000000000000..bec5c4fe77ce01bf6d1dfe7240cc78b10c9eb535 GIT binary patch literal 1700 zcmah}O=ufO6n?WS?Vl8F8n3h~OC&3~wF@muV#yXQlA@GiDrg9ejVUzLk?gG;u(U>! zt@zf`)IGG&LVF36o_uS`v4x%z8VHm^FFE(pW5I})9AovH*;VXb;s>n2EWw_v}_Ro#{!Z*~TEz};82(S#PzdppH6N2{Q>6X`GPnZ zNR~DBHAT_eJqgkDRq$qiQ<3SgPYOGG(&D&IGZMW5-=loR3AMYKO2w5x?_ut|1uw$Z-?uIQ#=?k#F{5+N<`&1L<`4#yqJsd zOma(Zk&2FTgp84Tw}%g)CG2) zCI2Yxml{>}ni`d(($Q~{q$*NWW($&Z;qd5{L%9{#*ACZ=Ov201k!mADGoT5rR zIx2C%76H0EoE;=G#@gYBMm%op8yQoyNIL2Aefd7k&^z=oHo7!>krf#45Di$$On!Dw zbjlk-w^z{Zaf}&E5&FsnwoqC`^EM_D!z7SMaH}pg{m2xu)-8utiSJO0gMYY)X&kb#gH!;*yO*gYiI|x1M zpwzPCq@7)q&DZRrlS$h{r;>B4_OhMkeAUg@P;uIEcAW~}cYcqcZ@%}9y=GRPQcPSJ zdQyMsOYWY$#mVq*9=A;h)`;%{7n=*t?f6CthLpe)7yCIgrzZK#L@VyX6fpZ~NfY(E8&@}zRzqp7FCIwG` zCH!~32(b+QT8JaS2O*9EzaC-*xEo@FO7vvO?+&gGy}pkh)Drn{4(KWk$)i534tc9y zuYcR`x|a)=Xccr1j@u&8rOQ;HOQ&WyHQw(ciqHb9&M0IE!xAgfxY#yU%r@ypDX_xzCiv1z)bL# literal 0 HcmV?d00001 diff --git a/docs/fonts/fontawesome-webfont.eot b/docs/fonts/fontawesome-webfont.eot deleted file mode 100755 index a30335d748c65c0bab5880b4e6dba53f5c79206c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68875 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

    7r8$?kb-D3z%-c} zLGfT`Wgm|$rwl&#jtEO8m)B!}oJ%(Y(1ZpeX!jfRK-wF?K|$LJuR~GdFpZL6EFp`H zFKc0?nf7)Jf~F8p9HP&6>OukC5dGx?Lbp8aZlyokWnzO{9f)9Eq=#VZ7oiJ19s_!U zKW^~F>qJP)$b+)$=5eqeuG%y_w~>W__r-D==WEwAxVHj#)B_QUqxOXBKA6BVKtLV$ zeYs+6ok?ZcBZ_E1nA7T;NjXlMlK3JMiknHuDCa2YDNa?#w8DpW+T2cSC2M~TY-&wp zU=khxHW;gbNOh@tL0WYr7+)8f*BopgUOjD}9Sue!X}rYPSzzq`X6Jr9J^El!nt7rV z-_LH88z|i8Lf(KFYzaW0B#NadwasYMt8x{fU74SMic0x(f<}NeWU2xUzMvPuQlu^W z0H(G%lz`WhgCVEdN1-&y%W8{_2{ggKk(d32qf0jMy*XA;L`zXPgJ=&K3E8Hl5-dQw zYQV(9u;^tEc=1P+CI+eu?p|QD(P+jL$ekSt-ql0w(gO@4M}h)q)&}d|3_!rXg}SO zNrzoRU12}4XW<~;c*q6wOIJih1VWbs-|gw$+;G&(?Hva3U%)z=Vh`p2;zsw{Hia)# zA#g}8ml%R60_?+hRS2l4a4$KYl)Ar6n>>S|?D|w-aL1fcG9nG7sr zTsw*AJG|Ot+~KTnGQA$0gs|wP60!-?EDjgUs=(5%o3HZAv%UlZTETO4?{?>IU^*c$ zfI|HiFZLfT*?tJjLjJKzEz1;a__-+ROUle%X|Srh0}`8Aj*dpURv9Y}D~%N~Jt|-< ztFc(?yokf2zSQEgU4vSB1^L4&cCo%Cs4sz(S3$BalWL$y}7Ymr_P(^@sQPB(NB&YK}P)MVu%NjiN0U^T{=6 zuS3%ou{xqv054t-X;k2$#}2uVv;ZVZ$qM9f1Pwe=2>tcwlQhdOypTc9CvkuayHdcn z?cQHu@yNNnk6J*e7KI}R;;@6(k{MnT1tV}p*H`1=gdlI;KroJR{d1w1c%Z<>;Fr$$ zs~90Ny7d$SuD78XKdMr2NEFSr5~W9sXq9Vu-{^0563Au-`^3zbOaY3z>Hn@Zfb4Vu z0vg(ibV4S=RWdkhXl9HOTqp$%L?T3UJ9sZNfOm6_G+1&Z;*!bXNn#N|Pb7-Ts3UwQ zlBN5KkHZ?Uu;26>j4v4(hfJe{BrX&)v5zCy46fxA;*~QI-Cl|W#u5mLj-~E)QKvSw zOOwMx{})jtMuUEhEr~mXgD(_GZ*&m323pEfy~k0lv?5}Fvx2unbibC6goRL|a%8nu z=*Q^2BR0hUy;^`y2E0jS21cpCNS%Z2M@zjqG(t_%z{;6R{yoI6_J4+g+TTFUm&lSns6m zq4GMm<~1lyAz(q0@V~M9JRA9en=atSBLeaV&5|?7T&A$5*E~ku>Se*PK@F4J-of3p zf~ygQi3`DA@C44^I%LxJ7y)YA!v9AESFFiht%#6SCSSKbfek0%ejZyN8^m$aKU?8$ zcjacpKYtPLq@Kf&zA>70>DFUyErOR_`|yPCaTR!BU(U^o(j%Kfkg%r`A~;@>bJdA= z5qTVKdeXKw1MYMYTOMdc%QTJsC@VIfbm0vP>MVm@SSV^mxu3Q-#H7#JOyGKum3p-c zAVeAc_ztmuUAH~7dZScBmu;za+5`?ik}!aX!d9}{FSAU&Wn!%+)%RQNb zT_Xye1j{iwDhEY!jB`%A6T+Ka(!P1O+`#6UfNR7DQ~#EvmO>FqoYLNr~%f zs#%lQ)PV-=$0~k4X>DgE>2Q~&+~uwM)>KNDr(q5ufV4i*%1QsZQz{%4zL|UH&*fN> zf(?GPYfb=nOgs(wG5lYvr8uXQdnE&!HF`xt4nU@iaZfV6C57t=1ljdfgph9_d+^8q z(y<*q^!66w^iZBre=<3`;8`#sVuA^{89TAE6ATz`9X#(jR5dgqK7EaWG}F+YoCY!N z`;_JGRWmbEPRL;rs;qqj}L8pX>m zEwAIf4GtC#>rV*KCAU5*TaAyOE(Bn0glhjI==&aL<`-jCu{)*Tqyos291*VDcpaGB z0$$9Kyaa4z-@t&NT*LNT@Jz&z$J~~>__hQKJp6Zoe9+K=gJjAO;1gGq$sUvC$f-HJ zP>R!Eq(NI><#-6P%1^Is)DaI1&oc8POdmv@yVeP6KNanDP9Z0!um?Z zc5slMebvf6YIx@ChBH+t=`PN5m4o0slgMbI7X1%oqLD~o6&dU;+l{(MgejrWOMtkT zmZcDZku1>I0;a(kqPGVH!SDlnOW=~-Is4S6?O31kvhr}@StWb@iqR$5mY=AB6nsm~Nb5t$9St z@eYSL5kh5A2)VEVYlfSJdbV%rWZcNJ9AnUe*S#N{t@b6!KBQ3OqP& zUx|4l$L*A~mO|JNL9V0FpT{iniWdzS#IQBfc(N5v!QMD1^SmfwAOm9naPgjwf$t)l z`m1{tO_`T*Q$kW`nGhK9p_X~vlSTMwhZ6l?u3Q(vv^wPm0Q_=r2pah~F`+5jhIHgZ z8!V!L)DztZ^W6z{YBml5vUOX57)z3cf8JKr8_@j9xyM$5EhIvV$a^^*dBy884CWJ? zU=rY|LIWU zdBFpUnN_6q$a+dnT%%G^{Y+C<^wp%|VFlmHiCe}O>V87Z2s$vjP#jVhCW@w8B>UK) zb1r+kijSezY^24mTH|%LrW;+o%T3c3M1$2ei4PZQAXjYY z@HpNqnxL{%JW2pl=mP=|jwU6Zff~Kc6rO~OA$TdqBXa*Z(%KDx)ksig&FLhatrf5S zp7O`6w+(y`Hv=|w902p$Vq86I=J}xXiOUh<1Ye06ZJP6*wq{@JhzD`A=bQL6wQnN)%L;ny86~&w(e6lpf6rgSMlK($cT7ZDxHy!-$NZ z;8RHh_@mL~;va@!^AfcGw%rJ~52_#3I%;=RF^rp+{e7Nt8l}U?I2ARzS)(+@u*ayy zV6QGW`1Fbj1W&gbCRQZ0g+{5Nh#|i11$3yAfAGW1AVl6hhZ zQY+R)U5<;guJ=AsmFf)*9-hbp;!wm!CCf4KWo|4STIYr^)in2Jp5%sr4{u)#C+%09 z&VYEaHx&b{H8BQx(i)OmQ%17S(L9b}5L|N@VeW~P=+Ybwb3KcteJme*66AuP0bO&+ z1qGc)mtFXcax{h9UDs~4XZ-s48Ffh9mx52Iqn;ko@>^0px$=WIWR2ushg`eLTqM*u z8U&H-_DZH}UvM1VQf_X40*tRMpX<*XM>W%=9D?wF5t{f#6yv1AQP8cyVZb^*wUWNs zJ?48?7M@otux$tctK54-&d&zj;%x3(PB7BII}Y^0tX$d+F3QUCh2x*Q)hdS=USu08 z>>tsjNey`}5UjvlpeAV-Ix34#2D4uhK;zi?nA#BIA)x+|=Kah&yaI*Uq76#HkXkr5 zvZ~)_HSF=bX-&r`v!SR9(|TQf%q#%oi70t({vz5d#QTZIwRNT27Nir>OV3?`~heshF0py}zPek+rr5>cmZOn;jN=P8kG&r-ObOMse zDP~Dvn6cj*?Cw2cSx?os_tHvT<^&~;;Px%HU4?hO3NZSGtRM?&=?TSQ@A6&fUF{20 zy6KX|S|CU)UB2AUj4g4m=JB%@2dB&dQm8{eagfplfC&wAy+ff<=Ob9oN< zJRsjeh_oweHD+~)o^FyWc>FLpVrOycmN-p52o8ntgH@IGwBL1*H(b_e{E^`vvbLYs zgPY$TWB{8dYYZlgv?GMIuGgqqUCFt=zWT#LU9X*V&pYxH5GWM?hzU&WrCygo6=H9J zs!g@a*XER-h`nby-V$>A4Y@4Ss5QySDPdf^6Pqac=K_vZaML*ZL;wUfO)F_-f~M!t z1AvqA|EK64{`pP-W6u%LK=WD^v5C2s0tE&iRi32A!Yr?*|KnxS+dNzp9UF}T*l3a&_Cj0-Ok z30BYpB9R%4Jz%py0!deR%^EP|>o@nJN!81B7;4HgWK>!blIn3UfmAtjQnMu1tfDLzFG-WP|_Sz7*N^2 zGu$?)ROl6z9WGeua1I#m&ht<6>v?sOHf1#Lis-eR?!ypl;z@7@?xZnLvjBx)Hi9a; znU}K*Hi(q)hZa0O!JxW)DUQoGRx#MwE5w{thSo`oVlVEWQTD@yQs?gf1V808s>9ml zsEwOyRC(YSFYcy92ez1kxzF$K&@%W0F+nt12LQ$TjM4f=m&Zp1Ocj<4LppWFk8!ad z?gjm%1-`*hs}_Fhdl(Th8rnHP;5si&S*iR<4fBHVJJubn>I<-7dtE*W#VTlwV)wX} z*~Ytx63Q)LTP&yu4&zEe%ljq@y7x0kw`=P?2S6n*S*%7XL^8`LWZtyvk&>`2R-tz* zB%s|H!xrDzqI@bRodF&tsC!F5oG>O_$qvFOOHv!s9=`Qw-5E`TP{dw=#Pj)bN4$R0 zbEg&*jF3O&xH(a$x;0Awk=kg<`M%`yd_o>5?Bwg?f&_TTqa#69Fs74$IKusCdxZg~ zGL*^y0Qj~P(9(EBCeFGvuUGd3V+I8T2Ib|;!+5&l;JQ*yO+BJFIRQyafGB}>wFf|& zK#w-U#;W1*uzP=wl%@etoDi&>yCDeW>Eu;640Zet*KCPQq)#%-Ui>=vA#Rsm&EUEZ zUBluAjdI0oScHG^L2!M^U7-sADVr5fBQ4BaZJ?+s2$<4rTN9` zA>>P3A8n%;77miy@5N2{~_ul&~<^3`%Uu zf}j{8PxGM&kL=IkUV2(ma3!v(Q6KH-kJR-5S3|YDGUsA!WI$+q@-`(Cc>(mm&rle! z<&woxb>T6H4QDLf0gF=~csU?S!(|drODqh@vG$>u4G0;c8osP}N>c)foMNL3Q=W@L zQj9c;=Fl#(OrZ`ou^Cm?;JB3eYcAg7kH^~Z9X8qZwUK*1Aj)Ckl({9T(F&yhZ*;NG zveM(U5f4+;rW|OHNhutQ0fIrU#5rNOVL5W+IETcE*QG@;Q5H|=TENP4MzI_E10P46 z^q@wn3W;Isn#yLtB0Ud(`dcjDX7abxd&_ZbhM+Uihl76QL91bOv_oA8de_f5uUl6| zJC`4AkYy3T%yf|H#Q?KF zc>|D!QUZe57A?+B4zGMt_{?pzX2D!jeKn>%FnHlVxKWn6q(0 zz^qZiN)4oRXt)*%$YMN*X^5pV?T)i%Kqp=r6D{Y`S#N12mMr7)K}i;!f#txTF9m)n za&wS|l7=K$r#tzB=l~1(D5Mi6bx@vu8l@B@rJ>^(1#Iz22?l^zfd|l_-rF<-Z8w4# z`*lDcGLan|piQ(paY%7>*8MFY^JN>=L^B<4+aAf(3wc!oKi#H`3z}h-8f-m-+alLl z0HAO}4~#8Jc|K`zCG2D!muGE( zpoM+XExtwX#OgsrYKA7s?PMdm61z=SvRFY5{)xX=a8XtqdlzPt@Q^($mV;|-kyvGX znn(buMZ`2la-vvp*KO&3F@a_*ZNfX(gHY^TfF8y82Pj#?I2LmCxhOshlbw+uj_8F@ zRV4FI$$!b`cfk5Yg*cN*0!{OvbKVymfoM4mhzRdqkX0;#P51^KmS|Cy$dcU;^o}gm zn$d6FdScdCgdKAZ_unA;o<7=}8#J()$s42`R@kKYD1ui?Xw_TMQCwp)Wx49kFW#;I zL_oX0X{o-zTzAD(xcIzZG$WZHI5ZhFH!R~GpXD~eTTRC`f|9cCz&AIG#dq{{7U(QV z%OGES*-MBPIYF@@&=RLeHxL#g4{UA8h=2SF5ks-5iTiGxWHL4dckua~h{73TQ;l>N zZZ4vntRzX@XeZRT3r{C|2ASJwA);D*5qKN~KHmc>G|xxxkzMBeVU$7LlXn^vb(RL7B00FD9kM!;Vc(&G6@)D z=mR+z7oysFLeZ1o4I#z?fHyG9ZS9dbeV0|WaC}ChQ*f} zDg>8(>;2*GIO%R@PlOkoqnU~H8;uxtyO0KxvCCQ-ze%A0&DCKF5xkR12#z7~-0Imz zCsk5jhq-ycveW@DyBwV*(%@ilBxTRdBe29UD3D4G2MHP(25^-fTktw1H9M|73@s`wqfCjwVb?fn zi{ey4n7TL&nU|fa17a}UxhQB5{6xXoYdQu9bLcDvTn0);*N2JKFihv3CBtA|`+|Ps zxKv&TA`*B@o#DaMR~a3XNO5nGy5S_@Zz>ZwWkE&@)jtmk=D65ELKb|da}jzQUU=I| zYle}r!-i#IKel8(OtL81EpwBWX#CdXEecJGH3^~AaUxk+i>3{N#(pX!5(@F+4U5qu z3pHdaT{7fdFd@JYl-|r=`USwU;VmrN6p!fmPUOG3?aUqEQWnBuwk5&v+W;xL8F#*N zP!AKz97%42zIYI*b2MZraa?^%n(f2CA>KDaL^Y}7V)Zf%>@BJu6pS4eBHIWUXh}oQ zdQEpi0<*Mu8)bDzTd{clcnwP(SLb+O70^F@2^nv9B9)b@o5$#z4L1Xg*U`%l;nuT~ zMiV^f;*BEqQ~Jd`^jsGy+ur zc)SrgxpTM2+|Ax8;YUl$2=B`Xm^>+eP;@y}Dt(hT+k^-z`1^!h2>am$uI#ayEHrAO z3mK6kc94CaW$0#EhyZCy;ONyOC=h4D&kk7nJ!zom!MLA0Yy{WRixS65ri1R#^79tN zFi97UdnXkhyl_L*A}L24hjDW)%D=fdEd)JcLI z3%4;_F~{3a>W;=WYYkw^K(ImeG&F=Z_iavcWG1Xx+@;#MU*Ic6Xnrh=E<50I!oe;? zpsYoz&o`ja1c+PKM2A@y1`+6;vj&IcJN=XC(Dl1HmDlG>(C~8# zCr`=B0BS_ljF(VNp&`8Nv>}ROI|M8f=nWCe3I?A*A!Lz`wp2zGeaSu0oZrBp0P?*L z-ogyHa8jXf0%K@nRjgibYe10LsgF7Q{z5@9wTMKA8GOElKW%2`jGz_a()K&ujX!3V zWSv)DgJD+DKS>@OZjc!(CejMO_!oyx?$L*&hPc5^W`J3LYXMEv@`Nd4W0TlhiUol) z)E8o5PM%4p+O>o*@vEo;LK=?r1|&s|$^3nw~wpz>4s6 zJ`%@)DLvS6e3&EY1)=`Xfw0 z2!ME9Xnjwfdtp^dl~w66n$1io2|=vx8`0bdwu5W~ZcB;iPydvHypJHq&$mEpiKl9z z(Dn#ITWB+c07f&!aA$OzGJ5fvM9gP2Jk0%QBdOwp%4DU{`wdl$dq| zn>9gPRKT;d{z;Y|HqLGKO-_XbbmAK7So?5}MzDlIyhvylvLJVi#fZplgDO4PEnMf2 zdU3e~`!xS7bF?fYNR}fRkO+g%)P0iQV$L$1b@XXUCG+INR#w|&*$n;GYLiZ;_S1N& z)q5^c9V##Zurw&>$!d!QLT}=!OcD^gx!N-naOyOIUGP50UTXFhf=p5r0+*Di{N62Z z;s;3_L-Rky8Og6Zay`)+l$Zw^uq8@>w07MQuxYJL0wcW@dv~%2>@ux+A(7ZS$vnTl zj+%WtudH%MAa&=>FR%>sldQ^S``Qgtu(Z;7I_kR)!36`?rr(M`%}ab&qoRpMH=*Kl z3zM3-5~UH66Ko^FNid1$Jmy;0gLR-ub!<+~N%0%EqbQK_lHlxZpYSa=T;v#=G)U~u z@*D_~tl`HTEps^ZZMh2%TH0aBXRI?7Y-5c_&_NnRQcn`&$HeKxW`GCzLAWb`hnu`O z3xy#oIF|y->4S`To>nFTB0uwcawgAa^w_dp#UUT-lmpskAYxYuN2p(ClW9Z4vU+p> z5G)dJ$YvA}nLmIOafAh~-*WUbN>KTJ=HLiKL`2WNb&(peqh=*8p9a@eRe9eGHZ#>w z_Z3oALz>+|-=er)p-^2z=Rggud}d@@sRncP!ucAObXGv;wWgx&H6lQT2w_IWpitr1 zEMa0IAZl3*0t6`dQ1xgdoJzdZqfc0(tA=`we*A<>)oH@$so_2!?HTX`(Gyz$WHkM`f@eO>9sGuVn3;L)7 z(6fnQt71xc!Ci?kP^Q<0up=8+v~T*@5=C!91Scq%TN?twj4tNfElc5cJlOm93o+!- zYQTU+MM(ge2xJ>tzm_U8Nr7b~fUepp{Kia1yn6z^Y&DiJ3FMse{^9>xDo4o4Nr_

    MjT~HDem)#YNV}!)%NKBV=*$fkx6QQ6i^s@BkxFILM`8jk0 zXfbG4v}Z)>x$wz^PH_GfGtqXHRL40&M7JO~)rSEaEZ0E@6$9`JxSP^s64mfytiXHk zA6&_+{8+6;s+y1njZeo*P%_N>eI9ogXDBVGbyoQ}_rcx#l9(k25m?v$fQE`1ztn2Q`2oKv>Do9)hPk<^Qx$>9&lE>b2tCthjiiX{sD8i#ETOtCPf*vJ< zO8LANSRS4Q&Y934kDrsV$KiMkAPUHl`TULmIzOyG8~!wdj3)F3MX*A!;0p9;f>;CI zA(ny=3Zy5K4Ve!9?ocPK!;TV|St)lI!J@5P#{Gpj);bVufO_N%3KrF(0BDj!@{;=1 zm5_+|75R#bi%e8k>pv{G&pRXxSyBD4=D%|k*!5`?fSdb)nQI|q-zffG6JpxdO4Zp& z28pAg3@;u}5~1AvH+m%F>XB1&R3^7o3y^>^+$Ucul)CulvZ!K}R);CP+DLU-U>%bN zh!3hxug<4g7)MzFF)((8%_QiH(F`T(tSz|BY-BUE$aZziC^!O|n^R91`_C{OInEyS znDS;$emf+ji3p>}s9iBIgWVj712V~)qY)t(3han(m8)EXgV9VTw6bpiYBumb}v z^fd?=vU8-_G%~pYgwpL#gKk3s8+G2n4Bp7sx)?e`62bg?HFW}#T>RC65VIMy`PBj} zFwB5H5<3U(pJ43ygM%a2Ss;biZk3M;&_RLW%0(f*w{~?RtJMcViaUEieVjEx&Scu? zh7}$6E+9qZlhV2ld$dE^IwVg8O`zaPunQk$1B!YXf>bHV8HW74XEOIm_4n#neiQKq zK#PU*qEUpMac2T-FR^#t6pMHrY#p1rdc`6!A@llYd^Pn-g&gX_sc{K(^WhLWBH^U7 zNwkO^y>6(gmGOK?MI7AZe3vA;JGVuV*KS3M``}*_FM^gI#vbq>Ew@@p_qIuyd?E_O&%p3At>mU$1_F3Cq_eN z8^1-TQYa!a0t9Jcm5lg&#BAsaHzUVbXcz7R@Vz&`#LOSc;rjAMyIv z=zK3}n*y(gHmIaMm0VYuqrO7kkSM0H=`pS%0qGn3{NL=jA1N@&UBpHk4~mUM@!-tx zBY+8ybkD;AYDAOafD&Wfpr?F4zemSwgyvZP!qB3nL6b+$6CaHPcSmWj`ErD|Vzt%t zF=)gZe%K+I+-)f>w3$*bwWW?qiIqx5_{3}jU&f4y?Sc6;(8%nt!v=~3w3P|eiAt9= zA?e0aa2C)5;7y;7hT)o)T15R|H+m0$bBh(1`SzU3%%7y>mcXxKFcVOTgE` zh>K=j_6rKcUjkpoj4j}Vil*im>~uj#f+z)*ibv@vz>m2>@q~tVLO>3*teBBb$bqiabdai1T>>cAiMEsB3 z@JEL~ZSxpMSP|TG9-tOQvL7dam>l)Y$U6JfzwE3hks68=z4R<}9hQM);B7sBva0VJ zJ7}@de%u)@ydolpi7m*|>r(><;qqvB5fK=AbT9tAwI)Ly54N~hJOnN8m;U_0HZ)&i z^G?svl|AX)wx)?yFKz?w-)|kJY<9utmRvyt5v#28z(09<9!`}YB-$}?;M!I~Ps>7w zs&p4I=#=;rDsb(j+Q_ZXe(a6@h+aj->6xvH^rEODpmq1e zN)=JZPfR7(Awtu)F_jj)mzr+`6{XDyLx&Sgd_T$QW>_5-L4zQfc!0f;#n4PL;A)IK zEVFk4ru|uljvfi%D)`<3pcOVzlD-wCbV8~ffSG9^=o^}B8)wWeUW#m6@eyDbzi=%` z0|!VE!Y>>PKS%7Fb^buPHJ!i%>@13cDFx+~n^zz-a@WAPxwz%>D5@Knp?xm2klrdu z3`iCLAV#>VSvU9-n=e!zFt5j(-~%dE&*%8&f`B4Mj8c&0?2(TKq@cVFJMRVGc?S3I zTGt=O;Hc>ND}|;btA@MfpM87iptJoj*<@KvzZg`-P^ZgX;Be5E(k?{r%3Q3uLJnHX z0U;6kPPQ^XB8sa)>6Fa`nF3rvRY=Xct|{`L)+((5_a;xX7nRuqEyi|yL=Gw8R}k5h zTS(26Ese-GhItUiidK=vqgV1#GKLX0|5RcN`nC}Wx@MU#6`Z691FBjHP=zcSijGc2 z6UsX%*5o?~HM_^iMdG-w?Cb$SHH~cePnaXbItaCCTo6K0S?zlkNwFie5A|W1DWRDV zLGJo96Mxns&}LPtqa zn35OqH7_=QY7*#}-(KWvY0#f&4wTzL=#ThV&C;=YC)R>HoxPs|M#{-;43EKZq1w039W82tKZmwu(mK_L< z;AA8LS!|=!<~vkzJSc+e2?5S=;rJlMw;Sh!K0?3&gD4~0Pz2-fsDbVYMy2(Ee^FL2 zLX~kXf#r4#@sI~l(C2gw+Tah2HuX}zl#e(ZC{js_zA+=VFCMRCS2UvzW}OL0rc#s| zCZB|l)n2apHu8v*11q5Clh)yPDM2#KH3Qx8U%x=i8l+TGW8i=uhR`O zmWC6RNrLSm;W8#rA)W`21*?|`w#;%kluqj6j9F+5-1E#8l)+!N+)>s&+FN1uyLXIc z3nVMXn$_a-x%%~*N)K)g2kcznu zM-DS|Av{UJjVw6<5~Aq1b+o9Pb?JmMQ!=HI6sS~Z)q5UWHQpHwxvv`e1i&7F z?wd?|g;OVQu>jT>OC(-!fy%H9pA$u2{?Zvj5fn%#m?)%#kB5$1FeC=d+vt^5WGgrk zp*#e46CdRb=rs$J$o85a8=t?x%0;y}p*t+hnW zcE^F0xD1)8!Y^4t*_4}$ihC6ipA zjH^sKPYXFY^gWInz`<`5{~FMS^))*QX%~I^;l-_q0NJ)k5@Gsd5i{}T?wCZ{f%b?` zQve@aoi0^h+tR|66AwItc{!+K1u70mqKN<+9R)y@FAo=!Nu86k;<2X%`Cc61+2Ywpi0vC{nLTe}zfdMLiQZz?CW5s`4LgL9$w4p6eg!il& zJwYX!iMXlh$s$vqVjS+V&l*?qn#3Ghz>u0O7b^HR7n5JMFz8E*P!g1MB!$JRBuA)P zk~LUy$gS_(Z;Z$p=O=6$9t$lQ373mp^M5)-4M@r?;Bnpg+D07UhfrLtI?ZQrn1w5b zu&mRmB2b0gJP^qcU0}pO0VKN&5F#Q0%{lgi*rjz0EFUItTv~FEQ{1dMAHOd)s4CX@o)TcJV2q;iB>k)?@nf&i_2%Dr^@yz&hw2P13Uk9`MAi;Et^ zf=F9`Wz~V}3I+#%1$>K`99mA#Bm!v_-Vu4wKGw^+yCrHSB?1UrRiWvT47#*VDDqDaCau6|%j6Ox zg4P4U?Cc>SuP}E!xd3ZdQyAA*<$0kjoKZvUOIuPE`_s)YRaHFXLU!6i$^@3DhSlmE zB!q>W02xG28I_O030ZX>aM&m$W{vT}u|3{7Kt z3E5GQkr;^H{7hmjI8nwPq`j0Ug)$O(ex5!tI3gwovJa|>7!rrk>j1TAW6cG1!2ONH z3oo&gj6zAv9nb73A=0C;#->Si2NgD+cdDdFPr^<^67$%ejV^F* zGgryb9ga9)*tIx1Si+956{auxQ5GKS$TvE@q*X@VUr&tK9Cg6~_R>zY&@1Du#tUuM z!v%B;1Z)TU{F2dlLSNd0?oriMQasyhUEy6FmG|b;9^=YNQZ?~kFdv!x$w6|Wvh==H zMb5MJZo^bnfNZ4}$e}Dg5J=m+p{+psAi_DCZY`l12pNQBU@0Q2H5-~9_zCvPLJh_) znNR{PjjrbYXzD8q4q2=HL*Ji=ZkBwJE~k5kneV=#A3YbJ6jdcC;v|2|l9biwN3S!+ zQw4k(u9DD%N+)Niip`Ip*r<<1jIijJA*S8el&M53gP%dCDQNX_-7}Jpr?_(3R;20? zDjE7UvwbhElfuOzvhmOOwF()|C$pbXR2ScoY+C9l$ryTjt~UYE{>ET3=|#<;pUO(Y z0zOqN2ExLfZqi9XG9jjdGoCo;V@tA`?d%|#(hwrFl#1TrM#SwM-BagV;p~z(u89I0 z^q!r{ydORY1-eR>L`LA?E_>(X%*0o6r=&jwYVQ3@*IfJ+p`e4Iz%8B4m7@DTAaEJ> z!okWTY$DgNq%9MSBd#D4&YzkIL)1fHnNIJH}U2FK{*W% zQ8AZ;r)_1aRNJpAU9=+$Wu$R^lz<<>pxZZBoou2JIo;@o8BmnEj2s7-9To@oVik>M zYJ;l9U0Za$4+Yxy*!w#zJZ~ z!$#}ucehBeon4(~pX~Vq^H2+d*<`U_sK7Rd!UPdG-7r9OnH2YTu)$Y^CQC($MiWNR zd!>5c^{FcB$JcisVBf}8e!nsbEMSJ=?4hC-4`As>M6gkfd2eKc`wM{RYcw#Fl$4MG z-LiPxTx2SA_%abgfQ{9gMjAC{u~p?rt`c?gUK|9>B4R3v+an^ zO%&=Xc{Dy^jx{4D_DqN5OE?7Qu<3K52`Rx+i)7`j2*kiG1+Uh$)Z^({mNndvPH}${ zGPZ2OZ+D`firapIrfe9abD$*ZYa%+Q><>(evBeaZM8cSz4XE}h_>NNnoB+ins2GVG zFHRfXL4>mstX(S3h&V>m6m~RM*8t|=&Ag8agFotrkJH`~Y|O9uxl5eGhM1!Msr`cu zNk%|dhTSe1?HqMFKrv06+aTR;tqEsbm4TNZ=zclneHnI%@y!0`4V5-21iyRVGl_ypspc2>nW(41D{ zUl`F?7(W}*!5Ba+Z}S6)`3#cIZ6&|0ORmPjYY`Km{^1&F{mN1T>ZrY z2?g(%&C>&PeFsb~hC>Cs!_15G?sy5@%5Q6EQy|&DvkFjVZ9DQnG>Mtk(uMBG=;~7c zHl3Fi;SL%A1(s?lw(us1*Re9fs5Fdbrk)}XI?b-(5T@}5N)|~;Rz#FL_T`QxlzGv% z2J^)(d5o`H%!|H7rE)??M#J8fbM$~D>^L)LjqPSc%2Nnw6m_mEzo_&`sPy(%w{+-f=q2U>kNU)ii~|9YKDmJP9QG2 zbLWO^hjmMhhPTIf?D32Z7y`AJR)j%j3ML71^rsM!ZQ^n~y+Sr~JUkL`ivDRN#E`m6 z`^_p$(c#}t8+byeLCUo=hA`$gn-bvQ`YG^~d`C1=7r(eSZqG1Y&dj{%9$wgKg85_j zM9$1AGPF`~5k(p$HY8GzP~mlvQ)A08I@E44=0lWTdawPXtqccngJ*z zoM;6(m?Q`I(@a8QWkMLg36ioy5`%UMpfqtul0y!piX4YnK_?*BAY)mq)8sSAKtx1y zj)L(-J+pR3EJXg>gDDZbykUv(g3IY*s60-wv2w_U(8^5NSvn@uFsI8XZ3QqSt|6-yZC&M&+0ZdF{ z8G&KSx$vhI@rq)KjD*NCDEcq))Hjc0S%`a*uDKU zRYxh?0pZ=UUuU0!0Lq=sq`+clQ}g6~(u!uu1*kOgmoBF6M*x!Ptt_iSUzP2S)b(f2 zFnfCnu-J)^mYLZGnJ$h*yFR2QR4o8hAOWwcoEJ$YQp&%;-Z6yIhX}0ZhbV zD#v^yb{vIeIBuTxQYvI3xrPF{6CIs`=B>MrWL6E*=+_EaLfv0bz9lZbRaez?h54DQ z5nN^C-Y}WypA;j=o>}NpzO5iKX#tu>5?`KmsBUU@_oZw9-rsmNJ^%p$m%tfhSl2gdQm`)(qc@8DlZ=KoB64pbI0!>5Aqa`45Vi zYzoaJ#s;0wuA$1cB#blCk`gPlxB*J;&r8LL?k_K3&xotMo29xa|KA|%%3rLejcgEw zEk`ZdlMpn%pr30^xxxGsD~CgolCo~tpx{vz?(-by(HMyx9s z<}G9>cKprDxEkpKx5iETC7OlsEzk(#Xr#n`3ennZ*6GlVT2t1bGuXmXbvPn28wZwd z-6!(O@@NLkv&N%1uS}jg@i`E?TooAewy2lVP0qD~m&212pk1iRhD*Z4_>oI!#tGN`H#sxf$r=+U49+c*#%Kj8h3PO7H&UU&QpRY^(6mN??< zo0)iIg-xu6w|-i;vJs(A-DmDLj?Z9X1!nIa1SMA|qIHteU`Mx8*XSY3;3e_o*_8W? zcTL5F2yBWU@0g$h`#cHw^dT;y7~O&hP7N$qE2&opaCkIo5Jh)3xgs5xzh@$rX%fV1 zpMa=DH_2_Xi9j8cFofT`iM?IyJv)6GzB_l66E{q(4rQUjjx*9CuqoIYWk2emHv-+l zQz^AtlqFlf^J}vuK>%|~R>0aFq!z^xOJsJ-u7C1@EVdbpPC#w~1`Xygpos-m$AY-B zdCA)6Et*QJ@M=3_`>W!x3+A-J+jWEJus(D;2cP(fhr`7REp;xLZI$u@=^u{OU5EbL4PV0s@#}X{FoQV;>pRxfo8o zvyyWNT-%)1tojCfEtEkg#ej`X#tq`J(*{!fCHzK#Yjs)X;LZ`fLniipi8}Z%1lfu8td;b02`3Zvbu*lr&Vg!dvy*F_AnQngfp_h}~Ih8QmkQ2P6q~r#5 zg^s3en{zs*LOcVup*9k)YP|nxP|ceX{2ateEhuK7pav1z<<+cm9BLsZ6llI;JaeVsjQJX+R`lye8%rqiilD$q_$U z0=HH-x08vmJ?j#*Ru&ki0kniP1*?3glu8>8)%R-OjxT$u(ZA9Xh_R7)gk>%#6bLKP z7LLg)%q#CwiQopr81I|$vRfbdhbHSih{|)5MMgfAnb;2qgM;Px8{6T*moC;R87z`Y z_@+c6KHh);9}8Pb(2#?G#8pDh)qt6=rbRj19!T2SR(S)oCmqOMuw|c}IX#l#w*lQH+q6y#c%8rf343x^8^&7c7R*?r6OP~_(cza8M-Zl`Q{sSR z7=oBVSv40(gombT3w}G0^(7!y>trJf0sCxvV#q}}Vk<(F3loVDc^;ZP2yhq<78CF3 zFn;4t&l7KLKz7;j3QAK=Z*jm9(bcp29vFd+q>T9UipEeO{ndYXvz0VR8ykA{0sv|5 ze^iAdsf!K$1}hDlg1M+vXFr?dNFiy66VTSYik3fz9wun9#-B%;U&Mgm#P@1=X~?&3 zFff<$}KEPxyR0#q46WuT+;)9QD;5J-e4di%kI8d|iSIW|+MsLL?VQ0ny}W43n$ zb{(`Lax0=4L#(_s*v8I3%HE@V=w+i2aULN*!UKRSat$4=kgTfZb!>3lL?;OS{ep9M z234m}DDGEmI5v4lp2$I-xM=sAW8zrDeS$|@d?I1tl&_k&4&*E(pTot%JPYAPVr_MQ zzVc0d+#JOCFHEZ&oHZcp$_@l+@$osfnnv&>r>Cb~yvQJA-yaUvuvjEU3*UkP#Wb9F zTH`?nW5S}1bT~HxcLWZ{`?kOF^{aG|*`QZ3O7oY+dgguuHq@X3B~@5P4QpOd9&mw& zm+|AnyX@ba7d>9m+0Vk0;foZi6lYiNSqK2;R)OT2-r|aQY$o#ksf^LQbBr8Au5+bK z#36LXGB78WK%}XilU5mQ+IV8VoCG=~qvQ^YPP5wg16jRL#P4VO43FNHGgItTz_e5j zAoC#)Ki@Yu4ey-B1_oQO=wj|}-ku7bRT{1k^&K{$@N>Ii5?O%LC6DX{o%h}0!}C+0 zDjDrMLm+V+41t6eNy6%S{R zif2+nv7LSZzm87egrI`o)8c|rwO3PXF6^kxrbHW5jSD9y1&@VFPJtz{)rIV+fZ3v> zOA!8?*BbEoBv&eS2Bg)oOE;oB5;-=iZA1xMYrL?{bY4cy8Dof=L9pPMK5}c5=Gc~q z>SdqOM$5{0zgco`xx^$QrU2hFub!3USo)AkVO&j=#S$k-&;_O2eWqxTCP4hDmn!ax zrCVpr6?Ds3-MLJJ?yE{Y9Gd?*kxk2?n`Hp9Afh5XP?-)Q`zT8p5+>q zhaiL$s_tp0AHpmv{|U$dZXhR;BSixn@CBgp$+g*jL%TjWPu-QXP#O=7wc6p-4?>HL zXZs1GqaV}&

    s!SOc7+5FcpeKCY8xc4`o}xcEr`@y^k=4I~Pzq%F|^L#>(H`6jPP z>6mktB%u^ch>c0}T;LaQAq;s#xO91MrwV8$f8RcJpb!BSNpKi!J5Y)<6@zYequgh# z8mIG66UEw5RS~{1_UcNT;ucLXU-1+J*ikU&(hpXdPT~}(p0^cHzK(prM;%@j+AdI7 z=6`<6nPK=i&KF5{Xrt1-^lZ|~Ft?JNmy3@Ngw8wysHq8ZjFpjYT-f?8g7pAtt54fVdi1fKpT?$KrWg>^5ReU<}AsISR{e&`A!1;zkm} zb<;n}C?y{7W*EG%1V=R*(~EI6n~seC@%8)vfHiH z=Skk>0BC|1t>s)e3wCG>s7M$8o@WY$Y11?8Z{Td**h8B+n|2pRtaA%`gp zAZ_4G$qUiZ3~_HR~kU{DcA^uADTx(5<&wzfUlFxJ}*KG*(7gVP8;4yDc5` zk(QbBg=<4+rnJI{2b_cprRH#qUafPf2cmJ01n#!A{>2*O;MKP33JCTIMoUD8a>I(= zEuLmZm6U98+=9VW0`$U|eR}(U;!dum(l?G4!p^Hk9vMUWr~ZGbvF~kE6R;@i=`hJe|lgPfw4d?JRmKedh@%4Y#&&?&R~7 zvShjlA9gT%>6%O`H~-+&B2l7E z)-k*J1&sP0TnMtp3{gd^vBz}OkxUZ})|eN>P*TY`eQfT=@VXNa2i$Wm&n%bEo>k*a zuepyUCT~B|fP`~rX?_bvalAKreN2mh3kW%vG3xor+66$aJ>BCvgx;O2zs_fTsIhTd z4-PCm(3-|CWlODS6Ak=7nq(qc>5p9mi;KK`(lFX0fmp&KA2wLF8 zCEW|7cE9n{e6N7AwX%04CrkDO<7{)uWpz%_d(vdjusKzVK!E2bmJjGSjiDAz%nYWk zC0#s+`q6B(FfAa@==OSxl5p-iY8_&ihp+K~7A)d+^AdUu`$*_@NJ*_KfGd%eGCxq% zlQKCy)5L1>X$-T-_o~F_#cTwoEKsStb-zmiK*IhSHOk44^WgqQ0zR*W$D0JAV5R^q z#+V**nFpx|606`VO?Uw#HTVrlYFnuFGU$bDIJ-sI&k2 zjFWso*&*dZPnbrVVxJQvFe69-7cIH`njjxdV-75^wjdw@k~`_H-OAhS-etWo$GKv` zUnxY>wJ7YNfh9Ykkf6RBMy~I5X@^b^6avtH6V_>Ae& z;1`RcskBD`HF9j(n8K zGaaq<8mQWzbJh?We1tz!46QJx9Gs&>ik^Z$xK0z9eNf@h(J3`i%E_tH+?L4Z7;7u`{@w-4-Z#|D^t z`3;Wp02>Al!Y}$j6Bbc@>;V!enR|K3du<jKI!iK=BGe9ATKofx$AS>P=E1 ztbri`!VwmQB|2@r6qCY(*WHx(m;rozY_aJUvW2SY4ffzg`kCAA=Qq|B%p->1Cjtk) z1|w~BR%T%rTMw=>DQlNu#3NW5))EF~5j)1l=d<(RK5A%{LE~aV2SMFc#D6a#scC88 z8hS&u`y#HfzI%yL)aL_`kY}U&!Wa_ah)1E81d2SE4DTEogofhoKon%&IxvU{#E9M; z;j$_mcY_8FNB)e~D5+GacHUzlpbG=sElaXz{=ETMa%Cp-G+2ML^=A@4h5Wbd3g{!D zsnK%o6~hsOEJ=i|7QY|}!b%$WP$mx4!jdZ@V3ZufL5`TBP%(ssh?W5g7Mh%W8sIOV zQ#G}Nv3LAJK9(I4eS5tYllScoNb^)78$v21o!5PFCNB(XWZHe=(7}R-R{z;^>BW~G z0f#j)pifgZ?wF7LiiO9lj7G?22G1i(px_3A!>%21i3#HkNIC>w7YiJ9RRic*YyPr0 za)4Y3<7^S{HMIsRRqDp&lu&B2Eo-3aZ*xHKgTV+>5dB#+KxP<5Y-5O3!IEjT5TX=I znR23|XNK+PRB zBK1*_CyNBYaqSrrho7)9tN zQC-_w(_1jt<`{&ALJO8+mGGBPsf1!@_EiTkciMTX+E;ZH92gQyB?M{@9V)d#Ov5nC zpo{LMDsEbn(3QT_SpYoU1dyT4t><^%h--MA=6m5OzgU2M|?#O!Jy}7!G2_4`soOKX@5!WuB=A6yEpKN7B!Iw4+`E> zlU8}{_=CC3o?n?NxyAE$774BGPURG*qstBzdnWRBPNd;DC_}k32OY2iL>rDO4C#Xz z^DJe@X_di@)vwZn8e<&P6%YmcGZ3|@<5f5WvltNU@X~J;OgAQ2jZ(iT=r%yi$^_$% zzYJRYD3g?r$T^0n;t;!*mq)#==+@X2^Nczduxida8mI_3vzQIcFBG+RFu3_ zF#@^x0k=Ry;HY8+YCf+g?SY<-l66Zw7fgo)a|@V*0flnwF1GhQ78nX39HikY)Ok~L z)j{J%*bPCW;IHvg?#Dh4rl>is&>_+0XbwlDKTeFz)n>RcPG^A|j%Xw)x9q+)NDOtX z0a_Du0ZTXufad%?2vq3=1Gvq1443{n&H%Gl$be<36f6Q~u%Fb!A1Dt0&56@!B;S_X zxqIMdT9w<-p~D(3$#(Hd&8I}~@elO%LGGy%RS=xGxlSNmbrkv^ctX{j$00KS+?Xm)155#m;|n7>o952u zYNaN~jb~)0Ar+l$FYOo=W3K#*BdCf*a1%%O@9j^K&@ti^ENXIA`EM~~?KPyVdK~l< zY@wM;rgBMk(KcDbn%v+2V(do^b<%TV_Y9njN2v(vYGbmpK6IA_^VcL8wEr)7cg_)?k3ON)Uj5$?RtI z6Z%mBX6f8Vg;hBGE=CO~gcW#lM1OV{pRnJA6*DIa#(wlhOy59bVl&BqUWig{n9o>4 zU|PW#M)gi;+X2Y$gUuuj0?##d19%L`?9qSK2jNLwCJ!W;9GYHW_Kc1kz{czE5As8go)Hx8AlINJ+=g1=2q!tRMy^IbtH z6c8nehl&Q2DJiN{d&7c;%0Z0rMUtYveUF^DRXzofjEBV~omb~p6W2;V&_3`LXQaod zuXq=&gRB6M!sXgXxq&1wZ7+{PX75_Z%z!bC|L3l1k$U33t^ObxAD89~KtL>p*9|I!H%iwEWz_U5vt>u>Neml;<_2U8m zuAUvXR&QYGo~?L(kVYpk)niZtRY^#80qE2me(wR5G{j(8cIyG+aLY*Mo-i_CRh0AlP9jYfRq@lvBZ zBHuKlP)$h$*;4E3EbVq1Y(3} z1RDfT1o8w=1U&@4gsBBi1!n~l1&D+|1dIf~3y%re2JZ(z1^}gq5zIg!KvL0QmxCG) z;NTP@=riEJg5(QGJ3x#<0RkTc{0X2Ea3ElM!S@6X4qzj2Mu3(9)+mUgAYDOz4ZIcL zGO$xYU<#NautWf;fr5dX0b~O32WSj{0j&#C^b&x|0yqXJ4&Vzg3_vqLjeyhykQbmf zfv5%88(<6oWPrQ?-~dzh-+ccM_eadX3j9^@x5uA3d`IwC)1OlPdHQ$EUxIzF^;gK> zOZ>(9U(p{R{Tty&r(PQQvEg5!{Pgf^>gT6EhiIVWOh87QDZmaFpeY5W}{n+i=>})PZjHn#cbBoN(CS(_c z7Ox_NfQbi_;5H^mB)%NMzF`BnD%g4hl02c_`lQ|roug7f6g2D%0B#l>i-yBZX(T%Z zwKzzkpwVVe>CojCv4(yrBalVJaf4q2NFvKC}EE z8mk%P(E}&wkVRainrlRG+06k~Ac7mU@2(V)5N6z{rU9%Gb(xGi`puPCPY!?iY+wI} zFBRYh3o!#hMj|hz${c|Pv9%r)fY)-7@@6L^|14l%hyg>(_(s|!rWO@{Frn<9nwT`P zY=Yma_EK=Ld!Q1FD6QKs*u1+ANGctFn0f0YREUJ=*C-9V9+*S(|873oho2AOeXphw zt$~GJ`b~lk(Fj%%C1D}upp3i|-(bJWY-)Ix5U1ePfJYR8|F_Q&Jp7%=ADVt`tX{Lp z;%n!KP@QOk4GBqk3Fv>PbZ-Fc*?9m775B0=18YU(>{h#lAgtX@N zk~J$og{ZwZRi4Z$ZLTz0o?2>sg17J<0Jro=ODu&n0O z7|16&1mXxBI&b@fq*R&6-)C|G79*Uj4zllfL)os&{Dh`fS%ZkGPJC=!a`K34q!fb( z)q;@}spjUN$0-6E^hYTIK{^0X7hSr5n@4ryJ}Dl~BIHtAoB@(U4b2c3B&1GpU{I;h zWC=N5%1LJHs^pH#u;~(CgzqZi#|h4}xE~}uHvXg1bV9=-N_hU3tlR30FBs@m@>Ll` zfuKbmizY>nVdw->87CB6T{K*9)fNtvUt)9VQ?!{7Zn}w4k>NlfX}QP1CCI)2(=Yfq zL*a~y5!s-@$vAt_k%4^jPDulLXsIQDFqKwPiMFTPD-yQaZ27Ggd>0eIFpffW#FW5} z<)0n&%*%wodL=SRLoDx+AJ26Y#Y zOHHbooE$BK@Ml68N*4p^UIv!9M2hZ`LEuc@91P5*u17=H>CMWlkB#JKDa*)&SOv&d z`x`^*(?MgIx}%Zgch~wihzi#&0^OT%K@~&t#ieB<8=UNXdHP5;I>4lGt8QK|DX{oE zDw1YLUt->-ksPW?J^I3sKr{KKY@l zKCu5HrZEKbA(9c$@qf@MMhMHWK>^hLJk|d1)x5XD-(IeHDEYs7;G#PgWk@J$S`a z+_B6fcXEzo(HNI1U2zRH&m0fD@{bLRZ{Vw>mI(EE z6Ze(cAfZ%Ua6$mW2sjDEyhN2PfOCQTNKk4JX9G2WpGp1}{{D<{w#89zuvgStN_?!V zfPlEaEm*k7G<&TqgGTE_;6h*+HGYT_)Q5B?r{98HkGSN_CIx?#96;Z$8Ly zxe%EPg%^3)tfik|>CmwLwGm}nc5W8}VTCsL2}I7_4wC|y!+B4`B_mg{oG~7aKkK$Q z8CHgL8yg^^zoE#t3%qe{LAFc`=#E)M(c z1<0@-)LGDP%1`Z(3F+uj@#_YW!D;XmtSN;Qp{dJH96(kYxXrw!1yh;E6vrs8ZCHJa zp})bJ>iXvWT|nVMsnQz7l7RwK@5l=~Hy?06Nm1|a30Uj5GE+67P{!NZL+j+3z__Sd zwyGN(ME;KfWS%WFm<3C2ixWX`4akTkh;u&C&)Zau#~9o`9cd(GFq(&AlhVWm!VHe% z^GT5=7oZBtZK5hHoa3;Bi<5-4JgA1J9x;-t8!xkZxfGSfT(K!0bwY{Bg@~B{n~#IU z56s|eJ5~Vy9@+u#hE0ejoSYdC&0t{+?J#6LQJUt`0};;#TN??st4L0pqX(!a3$@0{ zYqtlR5E69sevQKP6BKAw71%qwLEojF49S+7VcBP;>i2xAurdeM(SXyABBO?Oy9xF2lBgA3d!i@dTEdMcF9jXE% z7ie9NdMzWMK^Eapm>HB)>U4LExC@fji`ZpwVRf|xWZANGLRO<1R@gAH3;VKmX>V^O zs*t(@iDd*NP4`AKm<$}y+&dYEhr8nB@Z<|MZ(Z{=A9!s^yK>zV=Zl5NOu;Kyh<@)Q zabA$<6c?y{tB!8w_%Z-95Ol{BD$sUznhl;sG&Q7bUagogU05@Z6qGYucL24}_x1QX z4}uW*l&LqFe@lMMX&fO*p4%qzy>~j~&Far~6K>r*F%5Zy01NQFuHIhKpCw;sAT5q! z%JeOJu(hs2(zpvk*ewDSB+FDj*qY%Pt3qkqX;827&V+h4{*B+EScESjl~p1Rm?2c? zLVje{Sk%q|CiV^8eKbkS7LgiQ94r;p19NiTuC=5Az;9Yz6_BLD2ELw-!2tg~5Sp1K z3bPi9uOYG#ZTVS)W~WmPgix4LQe*6m$oir>5kyEL_u*j_95AFBd^-g{K+$1M#Dy^q z5I8WTpn{Nq3N%faIadEaU<^LL&+oGIx5M%8VFTKmw&B$GfVN#u*mMhF#4Seiw7Bs_ zJV92?BRYoLq}hXNrNU~#viRFSHr#8X8K8>|q`ePYnQ#N3TbQskgw&^{yPi{?lsryY zL1+%8>#WlEgq)dJgR2wLyzZ?fs$5cn3HEAzs+(nnj*kQ#QtZ+j(wBE<4d_dovWD~} z&Dg_w66WEtDbCVqvfc&|)d}4)N=vwxEnr^_PPEdcoD1Qp(#{3&)aZItmXC23SitR= zi)o_D_!8t%C0q$^Xmg4bJqF?gr+`a`ooOIS7zfB6$`}N=In#0EkauwIPQWF>&a+PB z>;haI$u|Ih2QqFsk_~PcNtgj;m)V7uRQ;6AzzSvw{15(_fIEdU;bfVE9C>AsR|d>O zcvB>t0h}pQVN{S+aH>bZ7s8beDv|I7aHUB20(erUl9?E$;XI3jCkUFunrig%lGbv- zi-yw!1SbAJ%PAa;B$0!L()tDj|D{)iRwwcztNBC*6Z@4gkw~^#+eN_$cP0P;00000 F002TuuHFCu diff --git a/docs/fonts/fontawesome-webfont.svg b/docs/fonts/fontawesome-webfont.svg deleted file mode 100755 index 6fd19abcb9e..00000000000 --- a/docs/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,640 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/fonts/fontawesome-webfont.ttf b/docs/fonts/fontawesome-webfont.ttf deleted file mode 100755 index d7994e13086b1ac1a216bd754c93e1bccd65f237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138204 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 diff --git a/docs/fonts/fontawesome-webfont.woff b/docs/fonts/fontawesome-webfont.woff deleted file mode 100755 index 6fd4ede0f30f170eecb4156beb7235bf01fff00b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81284 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äY>7uxS6S37IVP_>DW-kg%dn+sFHLnFhvXTU%&ox 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 ZUtABnb?tu62nVk>KX+wfW(Hek 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 o-IM%8o*ehr=#Iq=Q0BvwUBdJ3D +2. Choose Import Icons and load `icomoon-selection.json` +3. Choose Generate Font → Download +4. Copy the font files and adapt the CSS to the paths we use in Jekyll From 4f4a628df81fc3490c4f4134c689eeed983d7c2c Mon Sep 17 00:00:00 2001 From: jona Date: Tue, 29 Nov 2016 13:37:10 +0100 Subject: [PATCH 1662/4996] fix tests --- ...8-9-23-categories.markdown => 2008-09-23-categories.markdown} | 0 ...8-9-23-categories.markdown => 2008-09-23-categories.markdown} | 0 test/test_collections.rb | 1 + 3 files changed, 1 insertion(+) rename test/source/category/_posts/{2008-9-23-categories.markdown => 2008-09-23-categories.markdown} (100%) rename test/source/z_category/_posts/{2008-9-23-categories.markdown => 2008-09-23-categories.markdown} (100%) diff --git a/test/source/category/_posts/2008-9-23-categories.markdown b/test/source/category/_posts/2008-09-23-categories.markdown similarity index 100% rename from test/source/category/_posts/2008-9-23-categories.markdown rename to test/source/category/_posts/2008-09-23-categories.markdown diff --git a/test/source/z_category/_posts/2008-9-23-categories.markdown b/test/source/z_category/_posts/2008-09-23-categories.markdown similarity index 100% rename from test/source/z_category/_posts/2008-9-23-categories.markdown rename to test/source/z_category/_posts/2008-09-23-categories.markdown diff --git a/test/test_collections.rb b/test/test_collections.rb index 45e2a51192b..0dca8443994 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -132,6 +132,7 @@ class TestCollections < JekyllUnitTest _methods/um_hi.md _methods/escape-+\ #%20[].md _methods/yaml_with_dots.md + _methods/3940394-21-9393050-fifif1323-test.md ), doc.relative_path end end From d7cdab16e2f67fe50515a3bb2021fa840444fa79 Mon Sep 17 00:00:00 2001 From: --global Date: Tue, 29 Nov 2016 14:07:07 +0100 Subject: [PATCH 1663/4996] fix cucumber tests --- features/collections.feature | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/features/collections.feature b/features/collections.feature index 60bba8a17fa..1310bdb1b65 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -77,8 +77,8 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status Then the _site directory should exist - And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows - And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows + And I should see "Collections: _methods/3940394-21-9393050-fifif1323-test.md _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows + And I should see "Collections: _methods/3940394-21-9393050-fifif1323-test.md _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows Scenario: Collections specified as an hash Given I have an "index.html" page that contains "Collections: {% for method in site.methods %}{{ method.relative_path }} {% endfor %}" @@ -91,8 +91,8 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status Then the _site directory should exist - And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows - And I should see "Collections: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows + And I should see "Collections: _methods/3940394-21-9393050-fifif1323-test.md _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows + And I should see "Collections: _methods/3940394-21-9393050-fifif1323-test.md _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows Scenario: All the documents Given I have an "index.html" page that contains "All documents: {% for doc in site.documents %}{{ doc.relative_path }} {% endfor %}" @@ -105,11 +105,11 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status Then the _site directory should exist - And I should see "All documents: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows - And I should see "All documents: _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows + And I should see "All documents: _methods/3940394-21-9393050-fifif1323-test.md _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows + And I should see "All documents: _methods/3940394-21-9393050-fifif1323-test.md _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows Scenario: Documents have an output attribute, which is the converted HTML - Given I have an "index.html" page that contains "Second document's output: {{ site.documents[1].output }}" + Given I have an "index.html" page that contains "Second document's output: {{ site.documents[2].output }}" And I have fixture collections And I have a "_config.yml" file with content: """ @@ -145,7 +145,7 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status And the _site directory should exist - And I should see "2. of 8:

    Page without title.

    " in "_site/index.html" unless Windows + And I should see "2. of 9:

    Page without title.

    " in "_site/index.html" unless Windows And I should see "2. of 7:

    Page without title.

    " in "_site/index.html" if on Windows Scenario: Sort by relative_path @@ -159,8 +159,8 @@ Feature: Collections When I run jekyll build Then I should get a zero exit status Then the _site directory should exist - And I should see "Collections: Collection#entries, Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, Site#generate," in "_site/index.html" unless Windows - And I should see "Collections: Collection#entries, Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, YAML with Dots" in "_site/index.html" if on Windows + And I should see "Collections: this is a test!, Collection#entries, Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, Site#generate, YAML with Dots" in "_site/index.html" unless Windows + And I should see "Collections: this is a test!, Collection#entries, Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, YAML with Dots" in "_site/index.html" if on Windows Scenario: Rendered collection with date/dateless filename Given I have an "index.html" page that contains "Collections: {% for method in site.thanksgiving %}{{ method.title }} {% endfor %}" From 6cbcaa99ad56c85633626500e69f7fadc6b2cba4 Mon Sep 17 00:00:00 2001 From: --global Date: Tue, 29 Nov 2016 14:17:56 +0100 Subject: [PATCH 1664/4996] fix collection cucumber for windows --- features/collections.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/collections.feature b/features/collections.feature index 1310bdb1b65..de5e2a22ed7 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -146,7 +146,7 @@ Feature: Collections Then I should get a zero exit status And the _site directory should exist And I should see "2. of 9:

    Page without title.

    " in "_site/index.html" unless Windows - And I should see "2. of 7:

    Page without title.

    " in "_site/index.html" if on Windows + And I should see "2. of 8:

    Page without title.

    " in "_site/index.html" if on Windows Scenario: Sort by relative_path Given I have an "index.html" page that contains "Collections: {% assign methods = site.methods | sort: 'relative_path' %}{{ methods | map:"title" | join: ", " }}" From d9cf97e9c6f443765954b48d4a863038cedd4b91 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Tue, 29 Nov 2016 10:10:37 +0200 Subject: [PATCH 1665/4996] Switch to `https` when possible. Also, remove two 404 links. --- benchmark/string-concat | 2 +- docs/_docs/github-pages.md | 2 +- docs/_docs/installation.md | 2 +- docs/_docs/plugins.md | 14 +++++++------- docs/_docs/resources.md | 10 +++++----- docs/_docs/sites.md | 4 ++-- docs/_docs/upgrading/2-to-3.md | 2 +- docs/_docs/usage.md | 2 +- docs/_docs/windows.md | 4 ++-- docs/_includes/analytics.html | 4 ++-- .../2013-05-06-jekyll-1-0-0-released.markdown | 2 +- .../2013-07-24-jekyll-1-1-1-released.markdown | 2 +- ...4-jekyll-stickers-1-dollar-stickermule.markdown | 2 +- ...014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown | 2 +- ...2014-12-17-alfredxing-welcome-to-jekyll-core.md | 2 +- ...016-08-24-jekyll-admin-initial-release.markdown | 2 +- docs/_posts/2016-10-06-jekyll-3-3-is-here.md | 2 +- docs/readme.md | 4 ++-- features/site_configuration.feature | 12 ++++++------ lib/jekyll/external.rb | 2 +- lib/jekyll/site.rb | 2 +- .../0000-00-00-welcome-to-jekyll.markdown.erb | 2 +- lib/site_template/about.md | 2 +- lib/theme_template/README.md.erb | 2 +- rake/site.rake | 4 ++-- .../source/_posts/2013-01-02-post-excerpt.markdown | 2 +- .../2013-07-22-post-excerpt-with-layout.markdown | 2 +- .../2015-01-08-post-excerpt-separator.markdown | 2 +- test/source/_slides/example-slide-4.html | 4 ++-- test/source/_slides/example-slide-6.html | 4 ++-- test/test_excerpt.rb | 8 ++++---- 31 files changed, 56 insertions(+), 56 deletions(-) diff --git a/benchmark/string-concat b/benchmark/string-concat index c5397088764..2020bb51567 100755 --- a/benchmark/string-concat +++ b/benchmark/string-concat @@ -1,7 +1,7 @@ #!/usr/bin/env ruby require 'benchmark/ips' -url = "http://jekyllrb.com" +url = "https://jekyllrb.com" Benchmark.ips do |x| x.report('+=') { url += '/' } diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index b046f0f9173..233d72e3ec7 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -91,7 +91,7 @@ gem 'github-pages' And be sure to run `bundle update` often. If you like to install `pages-gem` on Windows you can find instructions by Jens Willmer on -[how to install github-pages gem on Windows (x64)]("http://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46#github-pages-and-plugins"). +[how to install github-pages gem on Windows (x64)]("https://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46#github-pages-and-plugins").
    diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index ee27f15f6f0..54dfd9fc2b8 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -34,7 +34,7 @@ earlier, for CoffeeScript support). ## Install with RubyGems The best way to install Jekyll is via -[RubyGems](http://rubygems.org/pages/download). At the terminal prompt, +[RubyGems](https://rubygems.org/pages/download). At the terminal prompt, simply run the following command to install Jekyll: ```sh diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index b68d7bba780..cc1995ad48a 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -783,7 +783,7 @@ LESS.js files during generation. #### Filters -- [Truncate HTML](https://github.com/MattHall/truncatehtml) by [Matt Hall](http://codebeef.com): A Jekyll filter that truncates HTML while preserving markup structure. +- [Truncate HTML](https://github.com/MattHall/truncatehtml) by [Matt Hall](https://codebeef.com/): A Jekyll filter that truncates HTML while preserving markup structure. - [Domain Name Filter by Lawrence Woodman](https://github.com/LawrenceWoodman/domain_name-liquid_filter): Filters the input text so that just the domain name is left. - [Summarize Filter by Mathieu Arnold](https://gist.github.com/731597): Remove markup after a `
    ` tag. - [i18n_filter](https://github.com/gacha/gacha.id.lv/blob/master/_plugins/i18n_filter.rb): Liquid filter to use I18n localization. @@ -834,7 +834,7 @@ LESS.js files during generation. - [Jekyll-devonly_tag](https://gist.github.com/2403522): A block tag for including markup only during development. - [JekyllGalleryTag](https://github.com/redwallhp/JekyllGalleryTag) by [redwallhp](https://github.com/redwallhp): Generates thumbnails from a directory of images and displays them in a grid. - [Youku and Tudou Embed](https://gist.github.com/Yexiaoxing/5891929): Liquid plugin for embedding Youku and Tudou videos. -- [Jekyll-swfobject](https://github.com/sectore/jekyll-swfobject): Liquid plugin for embedding Adobe Flash files (.swf) using [SWFObject](http://code.google.com/p/swfobject/). +- [Jekyll-swfobject](https://github.com/sectore/jekyll-swfobject): Liquid plugin for embedding Adobe Flash files (.swf) using [SWFObject](https://github.com/swfobject/swfobject). - [Jekyll Picture Tag](https://github.com/robwierzbowski/jekyll-picture-tag): Easy responsive images for Jekyll. Based on the proposed [``](https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element) element, polyfilled with Scott Jehl’s [Picturefill](https://github.com/scottjehl/picturefill). - [Jekyll Image Tag](https://github.com/robwierzbowski/jekyll-image-tag): Better images for Jekyll. Save image presets, generate resized images, and add classes, alt text, and other attributes. - [Jekyll Responsive Image](https://github.com/wildlyinaccurate/jekyll-responsive-image): Responsive images for Jekyll. Automatically resizes images, supports all responsive methods (``, `srcset`, Imager.js, etc), super-flexible configuration. @@ -844,14 +844,14 @@ LESS.js files during generation. - [Jekyll Image Encode](https://github.com/GSI/jekyll_image_encode) by [GSI](https://github.com/GSI): Tag that renders base64 codes of images fetched from the web. - [Jekyll Quick Man](https://github.com/GSI/jekyll_quick_man) by [GSI](https://github.com/GSI): Tag that renders pretty links to man page sources on the internet. - [jekyll-font-awesome](https://gist.github.com/23maverick23/8532525): Quickly and easily add Font Awesome icons to your posts. -- [Lychee Gallery Tag](https://gist.github.com/tobru/9171700) by [tobru](https://github.com/tobru): Include [Lychee](http://lychee.electerious.com/) albums into a post. For an introduction, see [Jekyll meets Lychee - A Liquid Tag plugin](https://tobrunet.ch/articles/jekyll-meets-lychee-a-liquid-tag-plugin/) +- [Lychee Gallery Tag](https://gist.github.com/tobru/9171700) by [tobru](https://github.com/tobru): Include [Lychee](https://lychee.electerious.com/) albums into a post. For an introduction, see [Jekyll meets Lychee - A Liquid Tag plugin](https://tobrunet.ch/articles/jekyll-meets-lychee-a-liquid-tag-plugin/) - [Image Set/Gallery Tag](https://github.com/callmeed/jekyll-image-set) by [callmeed](https://github.com/callmeed): Renders HTML for an image gallery from a folder in your Jekyll site. Just pass it a folder name and class/tag options. - [jekyll_figure](https://github.com/lmullen/jekyll_figure): Generate figures and captions with links to the figure in a variety of formats - [Jekyll GitHub Sample Tag](https://github.com/bwillis/jekyll-github-sample): A liquid tag to include a sample of a github repo file in your Jekyll site. - [Jekyll Project Version Tag](https://github.com/rob-murray/jekyll-version-plugin): A Liquid tag plugin that renders a version identifier for your Jekyll site sourced from the git repository containing your code. -- [Piwigo Gallery](https://github.com/AlessandroLorenzi/piwigo_gallery) by [Alessandro Lorenzi](http://www.alorenzi.eu/): Jekyll plugin to generate thumbnails from a Piwigo gallery and display them with a Liquid tag +- [Piwigo Gallery](https://github.com/AlessandroLorenzi/piwigo_gallery) by [Alessandro Lorenzi](http://blog.alorenzi.eu/): Jekyll plugin to generate thumbnails from a Piwigo gallery and display them with a Liquid tag - [mathml.rb](https://github.com/tmthrgd/jekyll-plugins) by Tom Thorogood: A plugin to convert TeX mathematics into MathML for display. -- [webmention_io.rb](https://github.com/aarongustafson/jekyll-webmention_io) by [Aaron Gustafson](http://aaron-gustafson.com/): A plugin to enable [webmention](http://indiewebcamp.com/webmention) integration using [Webmention.io](http://webmention.io). Includes an optional JavaScript for updating webmentions automatically between publishes and, if available, in realtime using WebSockets. +- [webmention_io.rb](https://github.com/aarongustafson/jekyll-webmention_io) by [Aaron Gustafson](http://aaron-gustafson.com/): A plugin to enable [webmention](https://indieweb.org/webmention) integration using [Webmention.io](https://webmention.io/). Includes an optional JavaScript for updating webmentions automatically between publishes and, if available, in realtime using WebSockets. - [Jekyll 500px Embed](https://github.com/lkorth/jekyll-500px-embed) by Luke Korth. A Liquid tag plugin that embeds [500px](https://500px.com/) photos. - [inline\_highlight](https://github.com/bdesham/inline_highlight): A tag for inline syntax highlighting. - [jekyll-mermaid](https://github.com/jasonbellamy/jekyll-mermaid): Simplify the creation of mermaid diagrams and flowcharts in your posts and pages. @@ -873,7 +873,7 @@ LESS.js files during generation. #### Collections - [Jekyll Plugins by Recursive Design](https://github.com/recurser/jekyll-plugins): Plugins to generate Project pages from GitHub readmes, a Category page, and a Sitemap generator. -- [Company website and blog plugins](https://github.com/flatterline/jekyll-plugins) by Flatterline, a [Ruby on Rails development company](http://flatterline.com/): Portfolio/project page generator, team/individual page generator, an author bio liquid tag for use on posts, and a few other smaller plugins. +- [Company website and blog plugins](https://github.com/flatterline/jekyll-plugins) by Flatterline, a Ruby on Rails development company: Portfolio/project page generator, team/individual page generator, an author bio liquid tag for use on posts, and a few other smaller plugins. - [Jekyll plugins by Aucor](https://github.com/aucor/jekyll-plugins): Plugins for trimming unwanted newlines/whitespace and sorting pages by weight attribute. #### Other @@ -892,7 +892,7 @@ LESS.js files during generation. - [Jekyll-tagging](https://github.com/pattex/jekyll-tagging): Jekyll plugin to automatically generate a tag cloud and tag pages. - [Jekyll-scholar](https://github.com/inukshuk/jekyll-scholar): Jekyll extensions for the blogging scholar. - [Jekyll-asset_bundler](https://github.com/moshen/jekyll-asset_bundler): Bundles and minifies JavaScript and CSS. -- [Jekyll-assets](http://ixti.net/jekyll-assets/) by [ixti](https://github.com/ixti): Rails-alike assets pipeline (write assets in CoffeeScript, Sass, LESS etc; specify dependencies for automatic bundling using simple declarative comments in assets; minify and compress; use JST templates; cache bust; and many-many more). +- [Jekyll-assets](http://jekyll.github.io/jekyll-assets/) by [ixti](https://github.com/ixti): Rails-alike assets pipeline (write assets in CoffeeScript, Sass, LESS etc; specify dependencies for automatic bundling using simple declarative comments in assets; minify and compress; use JST templates; cache bust; and many-many more). - [JAPR](https://github.com/kitsched/japr): Jekyll Asset Pipeline Reborn - Powerful asset pipeline for Jekyll that collects, converts and compresses JavaScript and CSS assets. - [File compressor](https://gist.github.com/2758691) by [mytharcher](https://github.com/mytharcher): Compress HTML and JavaScript files on site build. - [Jekyll-minibundle](https://github.com/tkareine/jekyll-minibundle): Asset bundling and cache busting using external minification tool of your choice. No gem dependencies. diff --git a/docs/_docs/resources.md b/docs/_docs/resources.md index e17035ad782..2042b1a67b4 100644 --- a/docs/_docs/resources.md +++ b/docs/_docs/resources.md @@ -9,19 +9,19 @@ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, ext ### Useful Guides - [Jekyll Tips](http://jekyll.tips) is a set of resources created by [CloudCannon](https://cloudcannon.com) to help folks get up and running with Jekyll. They cover all skill levels, and even include some great video tutorials. -- [Jekyll Cheatsheet](http://cheat.jekyll.tips) is a single-page resource for Jekyll filters, variables, and the like. +- [Jekyll Cheatsheet](http://jekyll.tips/jekyll-cheat-sheet/) is a single-page resource for Jekyll filters, variables, and the like. - [“Creating and Hosting a Personal Site on GitHub”](http://jmcglone.com/guides/github-pages/) -- [‘Build A Blog With Jekyll And GitHub Pages’ on Smashing Magazine](http://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) +- [‘Build A Blog With Jekyll And GitHub Pages’ on Smashing Magazine](https://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) - Publishing to GitHub Pages? [Check out our documentation page for just that purpose](/docs/github-pages/). -- [Blogging with Git, Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) +- [Blogging with Git, Emacs and Jekyll](https://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) - [Tips for working with GitHub Pages Integration](https://gist.github.com/jedschneider/2890453) ### Integrations - Use a saas service as a backend for forms (contact forms, hiring forms, etc.) - - [Formspree (also open source)](http://formspree.io/) + - [Formspree (also open source)](https://formspree.io/) - [FormKeep](https://formkeep.com/guides/contact-form-jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=contact-form-jekyll) - - [Simple Form](http://getsimpleform.com/) + - [Simple Form](https://getsimpleform.com/) - [Formingo](https://www.formingo.co/guides/jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=Jekyll%20Documentation) - [Jekyll Bootstrap](http://jekyllbootstrap.com), 0 to Blog in 3 minutes. Provides detailed explanations, examples, and helper-code to make getting started with Jekyll easier. - [Integrating Twitter with Jekyll](http://www.justkez.com/integrating-twitter-with-jekyll/) diff --git a/docs/_docs/sites.md b/docs/_docs/sites.md index 61fbba139db..28e464bad7d 100644 --- a/docs/_docs/sites.md +++ b/docs/_docs/sites.md @@ -10,9 +10,9 @@ learning purposes. - [Tom Preston-Werner](http://tom.preston-werner.com/) ([source](https://github.com/mojombo/mojombo.github.io)) -- [GitHub Official Teaching Materials](http://training.github.com) +- [GitHub Official Teaching Materials](https://services.github.com/training/) ([source](https://github.com/github/training-kit)) -- [Rasmus Andersson](http://rsms.me/) +- [Rasmus Andersson](https://rsms.me/) ([source](https://github.com/rsms/rsms.github.com)) If you would like to explore more examples, you can find a list of sites diff --git a/docs/_docs/upgrading/2-to-3.md b/docs/_docs/upgrading/2-to-3.md index dfc93dff6bc..0d145b9c262 100644 --- a/docs/_docs/upgrading/2-to-3.md +++ b/docs/_docs/upgrading/2-to-3.md @@ -100,7 +100,7 @@ error when trying to **serve** or **build**: ```text Since v3.0, permalinks for pages in subfolders must be relative to the site source directory, not the parent directory. Check -http://jekyllrb.com/docs/upgrading/ for more info. +https://jekyllrb.com/docs/upgrading/ for more info. ``` This can be fixed by removing the following line from your `_config.yml` file: diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index 3d2413d444b..e6f1a0dba46 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -60,7 +60,7 @@ $ jekyll serve $ jekyll serve --detach # => Same as `jekyll serve` but will detach from the current terminal. # If you need to kill the server, you can `kill -9 1234` where "1234" is the PID. -# If you cannot find the PID, then do, `ps aux | grep jekyll` and kill the instance. [Read more](http://unixhelp.ed.ac.uk/shell/jobz5.html). +# If you cannot find the PID, then do, `ps aux | grep jekyll` and kill the instance. ```
    diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 4ae1fd5e055..05f3bbff14e 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -97,7 +97,7 @@ This gem is also needed in the github-pages and to get it running on Windows x64 ```ruby -source 'http://rubygems.org' +source 'https://rubygems.org' gem 'github-pages', group: :jekyll_plugins ``` @@ -110,7 +110,7 @@ There will be a warning on startup that you should include `gem 'wdm', '>= 0.1.0 In the future the installation process of the github-pages should be as simple as the setup of the blog. But as long as the new version of the Nokogiri ([v1.6.8][nokogiriReleases]) is not stable and referenced, it is work to get it up and running on Windows. -[jwillmerPost]: http://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46 "Installation instructions by Jens Willmer" +[jwillmerPost]: https://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46 "Installation instructions by Jens Willmer" [Chocolatey]: https://chocolatey.org/install "Package manager for Windows" [Bundler]: http://bundler.io/ "Ruby Dependencie Manager" [nokogiriReleases]: https://github.com/sparklemotion/nokogiri/releases "Nokogiri Releases" diff --git a/docs/_includes/analytics.html b/docs/_includes/analytics.html index 5bbfc88858e..05761c29b1f 100644 --- a/docs/_includes/analytics.html +++ b/docs/_includes/analytics.html @@ -1,5 +1,5 @@ {% if site.gauges_id %} - + ``` -For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/opinion/2014/02/16/Mathjax-with-jekyll/). +For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/visually-enforced/opinion/2014/02/16/Mathjax-with-jekyll/). ## Alternative Markdown Processors diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 710f702e6e4..b9b0cce6bc4 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -12,15 +12,13 @@ content, they’re also a great way to host your Jekyll-powered website for free Never built a website with GitHub Pages before? [See this marvelous guide by Jonathan McGlone to get you up and running](http://jmcglone.com/guides/github-pages/). -This guide will teach you what you need to know about Git, GitHub, and Jekyll to -create your very own website on GitHub Pages. +This guide will teach you what you need to know about Git, GitHub, and Jekyll to create your very own website on GitHub Pages. ### Project Page URL Structure Sometimes it's nice to preview your Jekyll site before you push your `gh-pages` branch to GitHub. However, the subdirectory-like URL structure GitHub uses for -Project Pages complicates the proper resolution of URLs. In order to assure your -site builds properly, use `site.github.url` in your URL's. +Project Pages complicates the proper resolution of URLs. In order to assure your site builds properly, use `site.github.url` in your URL's. ```html {% raw %} @@ -91,7 +89,7 @@ gem 'github-pages' And be sure to run `bundle update` often. If you like to install `pages-gem` on Windows you can find instructions by Jens Willmer on -[how to install github-pages gem on Windows (x64)]("https://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46#github-pages-and-plugins"). +[how to install github-pages gem on Windows (x64)](https://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46#github-pages-and-plugins).
    diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index b8fd5ec643a..dc6ae44ff7a 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -328,7 +328,7 @@ As with posts, if you use a permalink style that omits the `.html` file extensio By default, collections follow a similar structure in the `_site` folder as pages, except that the path is prefaced by the collection name. For example: `collectionname/mypage.html`. For permalink settings that omit the file extension, the path would be `collection_name/mypage/index.html`. -Collections have their own way of setting permalinks. Additionally, collections have unique template variables available available (such as `path` and `output_ext`). See the [Configuring permalinks for collections]( ../collections#permalinks ) in Collections for more information. +Collections have their own way of setting permalinks. Additionally, collections have unique template variables available available (such as `path` and `output_ext`). See the [Configuring permalinks for collections](../collections/#permalinks) in Collections for more information. ## Flattening pages in \_site on build diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index d15a9eb1730..7a81e70e316 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -4,7 +4,7 @@ title: Quick-start guide permalink: /docs/quickstart/ --- -If you already have [Ruby](https://www.ruby-lang.org/en/downloads/) and [RubyGems](https://rubygems.org/pages/download) installed (see Jekyll's [requirements](/docs/installation/#requirements/)), you can create a new Jekyll site by doing the following: +If you already have [Ruby](https://www.ruby-lang.org/en/downloads/) and [RubyGems](https://rubygems.org/pages/download) installed (see Jekyll's [requirements](../installation/#requirements)), you can create a new Jekyll site by doing the following: ```sh # Install Jekyll and Bundler gems through RubyGems @@ -35,7 +35,7 @@ If you already have [Ruby](https://www.ruby-lang.org/en/downloads/) and [RubyGem `jekyll new ` installs a new Jekyll site at the path specified (relative to current directory). In this case, Jekyll will be installed in a directory called `myblog`. Here are some additional details: -* To install the Jekyll site into the directory you're currently in, run `jekyll new .` If the existing directory isn't empty, you can pass the `--force` option with `jekyll new . --force`. +* To install the Jekyll site into the directory you're currently in, run `jekyll new .` If the existing directory isn't empty, you can pass the `--force` option with `jekyll new . --force`. * `jekyll new` automatically initiates `bundle install` to install the dependencies required. (If you don't want Bundler to install the gems, use `jekyll new myblog --skip-bundle`.) * By default, the Jekyll site installed by `jekyll new` uses a gem-based theme called [Minima](https://github.com/jekyll/minima). With [gem-based themes](../themes), some of the directories and files are stored in the theme-gem, hidden from your immediate view. * To learn about other parameters you can include with `jekyll new`, type `jekyll new --help`. diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 8d7bb8bc865..7dedde22f1a 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -17,6 +17,7 @@ A quick way to install Jekyll is to follow the [installation instructions by Dav 3. Reopen a command prompt and install Jekyll: `gem install jekyll` Updates in the infrastructure of Ruby may cause SSL errors when attempting to use `gem install` with versions of the RubyGems package older than 2.6. (The RubyGems package installed via the Chocolatey tool is version 2.3) If you have installed an older version, you can update the RubyGems package using the directions [here.][ssl-certificate-update] + [ssl-certificate-update]: http://guides.rubygems.org/ssl-certificate-update/#installing-using-update-packages For a more conventional way of installing Jekyll you can follow this [complete guide to install Jekyll 3 on Windows by Sverrir Sigmundarson][windows-installjekyll3]. @@ -39,10 +40,10 @@ $ chcp 65001 ## Timezone Management -Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00. +Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00. Though Windows users could alternatively define their blog's timezone by setting the key to use POSIX format of defining timezones, it wasn't as user-friendly when it came to having the clock altered to changing DST-rules. -Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). +Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). While 'new' blogs created with Jekyll v3.4 and greater, will have the following added to their 'Gemfile' by default, existing sites *will* have to update their 'Gemfile' (and installed) to enable development on Windows: ```ruby From 6cd388b2ab03658789bb093ef84ebdf67dfadfd8 Mon Sep 17 00:00:00 2001 From: Longwelwind Date: Sun, 8 Jan 2017 23:12:45 +0100 Subject: [PATCH 1801/4996] Replace a dead link with a web-archived one --- docs/_docs/extras.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/extras.md b/docs/_docs/extras.md index 83e79963213..9064d967d3d 100644 --- a/docs/_docs/extras.md +++ b/docs/_docs/extras.md @@ -15,7 +15,7 @@ Kramdown comes with optional support for LaTeX to PNG rendering via [MathJax](ht ``` -For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/opinion/2014/02/16/Mathjax-with-jekyll/). +For more information about getting started, check out [this excellent blog post](https://web.archive.org/web/20160522225559/http://gastonsanchez.com/opinion/2014/02/16/Mathjax-with-jekyll). ## Alternative Markdown Processors From 5ef6edb97770f9fc73c1a161d129a37daca499f1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 8 Jan 2017 14:51:30 -0800 Subject: [PATCH 1802/4996] Update history to reflect merge of #5738 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b75a9f15d0b..baf346a1c6f 100644 --- a/History.markdown +++ b/History.markdown @@ -55,6 +55,7 @@ * Document --unpublished build option (#5720) * Improve pages docs (#5692) * Added new includes.md topic to docs (#5696) + * Replace a dead link with a web-archived one (#5738) ## 3.3.1 / 2016-11-14 From 0ebc832e1b21b712f108ad0892c869be2893ef85 Mon Sep 17 00:00:00 2001 From: Kurt Anderson Date: Mon, 9 Jan 2017 08:01:58 -0500 Subject: [PATCH 1803/4996] Remove duplicate paragraph. --- docs/_docs/github-pages.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 710f702e6e4..0a00f2fa6d1 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -132,12 +132,6 @@ stored in a specially named `gh-pages` branch or in a `docs` folder on the will become available under a subpath of your user pages subdomain, such as `username.github.io/project` (unless a custom domain is specified). -The Jekyll project repository itself is a perfect example: the -[master branch]({{ site.repository }}) contains the actual software project -for Jekyll, however the Jekyll website (that you’re looking at right now) is -contained in the [docs folder]({{ site.repository }}/tree/master/docs) of the -same repository. - The Jekyll project repository itself is a perfect example of this branch structure—the [master branch]({{ site.repository }}) contains the actual software project for Jekyll, and the Jekyll website that you’re From 74fe613072d377c747ab37a4cc47f08f91a922b3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 9 Jan 2017 05:16:12 -0800 Subject: [PATCH 1804/4996] Update history to reflect merge of #5740 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index baf346a1c6f..c0764538714 100644 --- a/History.markdown +++ b/History.markdown @@ -56,6 +56,7 @@ * Improve pages docs (#5692) * Added new includes.md topic to docs (#5696) * Replace a dead link with a web-archived one (#5738) + * Remove duplicate paragraph. (#5740) ## 3.3.1 / 2016-11-14 From 8a5672fdffd87e586c2f97b5f77b7ca7aa7c53c2 Mon Sep 17 00:00:00 2001 From: Kenton Hansen Date: Mon, 10 Oct 2016 15:55:40 -0500 Subject: [PATCH 1805/4996] Addition of a sample "typical post" So, I thought this section in the docs would be a good place to put the anatomy of a post .md file. --- site/_docs/posts.md | 255 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 site/_docs/posts.md diff --git a/site/_docs/posts.md b/site/_docs/posts.md new file mode 100644 index 00000000000..bc8628c9414 --- /dev/null +++ b/site/_docs/posts.md @@ -0,0 +1,255 @@ +--- +layout: docs +title: Writing posts +permalink: /docs/posts/ +--- + +One of Jekyll’s best aspects is that it is “blog aware”. What does this mean, +exactly? Well, simply put, it means that blogging is baked into Jekyll’s +functionality. If you write articles and publish them online, you can publish +and maintain a blog simply by managing a folder of text-files on your computer. +Compared to the hassle of configuring and maintaining databases and web-based +CMS systems, this will be a welcome change! + +## The Posts Folder + +As explained on the [directory structure](../structure/) page, the `_posts` +folder is where your blog posts will live. These files are generally +[Markdown](https://daringfireball.net/projects/markdown/) or HTML, but can +be other formats with the proper converter installed. +All posts must have [YAML Front Matter](../frontmatter/), and they will be +converted from their source format into an HTML page that is part of your +static site. + +### Creating Post Files + +To create a new post, all you need to do is create a file in the `_posts` +directory. How you name files in this folder is important. Jekyll requires blog +post files to be named according to the following format: + +```sh +YEAR-MONTH-DAY-title.MARKUP +``` + +Where `YEAR` is a four-digit number, `MONTH` and `DAY` are both two-digit +numbers, and `MARKUP` is the file extension representing the format used in the +file. For example, the following are examples of valid post filenames: + +```sh +2011-12-31-new-years-eve-is-awesome.md +2012-09-12-how-to-write-a-blog.md +``` + +
    +
    ProTip™: Link to other posts
    +

    + Use the post_url + tag to link to other posts without having to worry about the URL's + breaking when the site permalink style changes. +

    +
    + +### Content Formats + +All blog post files must begin with [YAML Front Matter](../frontmatter/). After +that, it's simply a matter of deciding which format you prefer. Jekyll supports +[Markdown](https://daringfireball.net/projects/markdown/) out of the box, +and has [myriad extensions for other formats as well](/docs/plugins/#converters-1), +including the popular [Textile](http://redcloth.org/textile) format. These +formats each have their own way of marking up different types of content +within a post, so you should familiarize yourself with these formats and +decide which one best suits your needs. + +
    +
    Be aware of character sets
    +

    + Content processors can modify certain characters to make them look nicer. + For example, the smart extension in Redcarpet converts standard, + ASCII quotation characters to curly, Unicode ones. In order for the browser + to display those characters properly, define the charset meta value by + including <meta charset="utf-8"> in the + <head> of your layout. +

    +
    + +## Including images and resources + +Chances are, at some point, you'll want to include images, downloads, or other +digital assets along with your text content. While the syntax for linking to +these resources differs between Markdown and Textile, the problem of working +out where to store these files in your site is something everyone will face. + +Because of Jekyll’s flexibility, there are many solutions to how to do this. +One common solution is to create a folder in the root of the project directory +called something like `assets` or `downloads`, into which any images, downloads +or other resources are placed. Then, from within any post, they can be linked +to using the site’s root as the path for the asset to include. Again, this will +depend on the way your site’s (sub)domain and path are configured, but here are +some examples (in Markdown) of how you could do this using the `site.url` +variable in a post. + +Including an image asset in a post: + +```text +... which is shown in the screenshot below: +![My helpful screenshot]({% raw %}{{ site.url }}{% endraw %}/assets/screenshot.jpg) +``` + +Linking to a PDF for readers to download: + +```text +... you can [get the PDF]({% raw %}{{ site.url }}{% endraw %}/assets/mydoc.pdf) directly. +``` + +
    +
    ProTip™: Link using just the site root URL
    +

    + You can skip the {% raw %}{{ site.url }}{% endraw %} variable + if you know your site will only ever be displayed at the + root URL of your domain. In this case you can reference assets directly with + just /path/file.jpg. +

    +
    + +## A typical post + +Jekyll can handle many different iterations of the idea you might associate with a "post," however a standard blog style post, including an Title, Layout, Publishing Date, and Categories might look like this: + +``` +--- +layout: post +title: "Welcome to Jekyll!" +date: 2015-11-17 16:16:01 -0600 +categories: jekyll update +--- +You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. + +To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. + +``` +Everything in between the first and second `---` are part of the YAML Front Matter, and everything after the second `---` will be rendered with Markdown and show up as "Content." + +## Displaying an index of posts + +It’s all well and good to have posts in a folder, but a blog is no use unless +you have a list of posts somewhere. Creating an index of posts on another page +(or in a [template](../templates/)) is easy, thanks to the [Liquid template +language](https://docs.shopify.com/themes/liquid/basics) and its tags. Here’s a +basic example of how to create a list of links to your blog posts: + +```html + +``` + +Of course, you have full control over how (and where) you display your posts, +and how you structure your site. You should read more about [how templates +work](../templates/) with Jekyll if you want to know more. + +Note that the `post` variable only exists inside the `for` loop above. If +you wish to access the currently-rendering page/posts's variables (the +variables of the post/page that has the `for` loop in it), use the `page` +variable instead. + +## Post excerpts + +Each post automatically takes the first block of text, from the beginning of +the content to the first occurrence of `excerpt_separator`, and sets it as the `post.excerpt`. +Take the above example of an index of posts. Perhaps you want to include +a little hint about the post's content by adding the first paragraph of each of +your posts: + +```html + +``` + +Because Jekyll grabs the first paragraph you will not need to wrap the excerpt +in `p` tags, which is already done for you. These tags can be removed with the +following if you'd prefer: + +```html +{% raw %}{{ post.excerpt | remove: '

    ' | remove: '

    ' }}{% endraw %} +``` + +If you don't like the automatically-generated post excerpt, it can be +explicitly overridden by adding an `excerpt` value to your post's YAML +Front Matter. Alternatively, you can choose to define a custom +`excerpt_separator` in the post's YAML front matter: + +```text +--- +excerpt_separator: +--- + +Excerpt + +Out-of-excerpt +``` + +You can also set the `excerpt_separator` globally in your `_config.yml` +configuration file. + +Completely disable excerpts by setting your `excerpt_separator` to `""`. + +Also, as with any output generated by Liquid tags, you can pass the +`| strip_html` filter to remove any html tags in the output. This is +particularly helpful if you wish to output a post excerpt as a +`meta="description"` tag within the post `head`, or anywhere else having +html tags along with the content is not desirable. + +## Highlighting code snippets + +Jekyll also has built-in support for syntax highlighting of code snippets using +either Pygments or Rouge, and including a code snippet in any post is easy. +Just use the dedicated Liquid tag as follows: + +```text +{% raw %}{% highlight ruby %}{% endraw %} +def show + @widget = Widget(params[:id]) + respond_to do |format| + format.html # show.html.erb + format.json { render json: @widget } + end +end +{% raw %}{% endhighlight %}{% endraw %} +``` + +And the output will look like this: + +```ruby +def show + @widget = Widget(params[:id]) + respond_to do |format| + format.html # show.html.erb + format.json { render json: @widget } + end +end +``` + +
    +
    ProTip™: Show line numbers
    +

    + You can make code snippets include line-numbers by adding the word + linenos to the end of the opening highlight tag like this: + {% raw %}{% highlight ruby linenos %}{% endraw %}. +

    +
    + +These basics should be enough to get you started writing your first posts. When +you’re ready to dig into what else is possible, you might be interested in +doing things like [customizing post permalinks](../permalinks/) or +using [custom variables](../variables/) in your posts and elsewhere on your +site. From b1291605b36d978f0fab9fcc7de48879a67ace86 Mon Sep 17 00:00:00 2001 From: Kenton Hansen Date: Mon, 10 Oct 2016 16:46:42 -0500 Subject: [PATCH 1806/4996] Changes to 'bundle exec jekyll serve' Updated to be consistent with the rest of documentation. --- site/_docs/posts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/_docs/posts.md b/site/_docs/posts.md index bc8628c9414..d4d8f15d1b5 100644 --- a/site/_docs/posts.md +++ b/site/_docs/posts.md @@ -122,7 +122,7 @@ title: "Welcome to Jekyll!" date: 2015-11-17 16:16:01 -0600 categories: jekyll update --- -You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. +You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `bundle exec jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. From e60769731afc143ca3e2b7fc082be5ec17e16ad9 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 9 Jan 2017 15:25:59 +0100 Subject: [PATCH 1807/4996] Report modifications to docs --- docs/_docs/posts.md | 18 ++++ site/_docs/posts.md | 255 -------------------------------------------- 2 files changed, 18 insertions(+), 255 deletions(-) delete mode 100644 site/_docs/posts.md diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index 40aa8365c58..d4d8f15d1b5 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -111,6 +111,24 @@ Linking to a PDF for readers to download:

    +## A typical post + +Jekyll can handle many different iterations of the idea you might associate with a "post," however a standard blog style post, including an Title, Layout, Publishing Date, and Categories might look like this: + +``` +--- +layout: post +title: "Welcome to Jekyll!" +date: 2015-11-17 16:16:01 -0600 +categories: jekyll update +--- +You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `bundle exec jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. + +To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. + +``` +Everything in between the first and second `---` are part of the YAML Front Matter, and everything after the second `---` will be rendered with Markdown and show up as "Content." + ## Displaying an index of posts It’s all well and good to have posts in a folder, but a blog is no use unless diff --git a/site/_docs/posts.md b/site/_docs/posts.md deleted file mode 100644 index d4d8f15d1b5..00000000000 --- a/site/_docs/posts.md +++ /dev/null @@ -1,255 +0,0 @@ ---- -layout: docs -title: Writing posts -permalink: /docs/posts/ ---- - -One of Jekyll’s best aspects is that it is “blog aware”. What does this mean, -exactly? Well, simply put, it means that blogging is baked into Jekyll’s -functionality. If you write articles and publish them online, you can publish -and maintain a blog simply by managing a folder of text-files on your computer. -Compared to the hassle of configuring and maintaining databases and web-based -CMS systems, this will be a welcome change! - -## The Posts Folder - -As explained on the [directory structure](../structure/) page, the `_posts` -folder is where your blog posts will live. These files are generally -[Markdown](https://daringfireball.net/projects/markdown/) or HTML, but can -be other formats with the proper converter installed. -All posts must have [YAML Front Matter](../frontmatter/), and they will be -converted from their source format into an HTML page that is part of your -static site. - -### Creating Post Files - -To create a new post, all you need to do is create a file in the `_posts` -directory. How you name files in this folder is important. Jekyll requires blog -post files to be named according to the following format: - -```sh -YEAR-MONTH-DAY-title.MARKUP -``` - -Where `YEAR` is a four-digit number, `MONTH` and `DAY` are both two-digit -numbers, and `MARKUP` is the file extension representing the format used in the -file. For example, the following are examples of valid post filenames: - -```sh -2011-12-31-new-years-eve-is-awesome.md -2012-09-12-how-to-write-a-blog.md -``` - -
    -
    ProTip™: Link to other posts
    -

    - Use the post_url - tag to link to other posts without having to worry about the URL's - breaking when the site permalink style changes. -

    -
    - -### Content Formats - -All blog post files must begin with [YAML Front Matter](../frontmatter/). After -that, it's simply a matter of deciding which format you prefer. Jekyll supports -[Markdown](https://daringfireball.net/projects/markdown/) out of the box, -and has [myriad extensions for other formats as well](/docs/plugins/#converters-1), -including the popular [Textile](http://redcloth.org/textile) format. These -formats each have their own way of marking up different types of content -within a post, so you should familiarize yourself with these formats and -decide which one best suits your needs. - -
    -
    Be aware of character sets
    -

    - Content processors can modify certain characters to make them look nicer. - For example, the smart extension in Redcarpet converts standard, - ASCII quotation characters to curly, Unicode ones. In order for the browser - to display those characters properly, define the charset meta value by - including <meta charset="utf-8"> in the - <head> of your layout. -

    -
    - -## Including images and resources - -Chances are, at some point, you'll want to include images, downloads, or other -digital assets along with your text content. While the syntax for linking to -these resources differs between Markdown and Textile, the problem of working -out where to store these files in your site is something everyone will face. - -Because of Jekyll’s flexibility, there are many solutions to how to do this. -One common solution is to create a folder in the root of the project directory -called something like `assets` or `downloads`, into which any images, downloads -or other resources are placed. Then, from within any post, they can be linked -to using the site’s root as the path for the asset to include. Again, this will -depend on the way your site’s (sub)domain and path are configured, but here are -some examples (in Markdown) of how you could do this using the `site.url` -variable in a post. - -Including an image asset in a post: - -```text -... which is shown in the screenshot below: -![My helpful screenshot]({% raw %}{{ site.url }}{% endraw %}/assets/screenshot.jpg) -``` - -Linking to a PDF for readers to download: - -```text -... you can [get the PDF]({% raw %}{{ site.url }}{% endraw %}/assets/mydoc.pdf) directly. -``` - -
    -
    ProTip™: Link using just the site root URL
    -

    - You can skip the {% raw %}{{ site.url }}{% endraw %} variable - if you know your site will only ever be displayed at the - root URL of your domain. In this case you can reference assets directly with - just /path/file.jpg. -

    -
    - -## A typical post - -Jekyll can handle many different iterations of the idea you might associate with a "post," however a standard blog style post, including an Title, Layout, Publishing Date, and Categories might look like this: - -``` ---- -layout: post -title: "Welcome to Jekyll!" -date: 2015-11-17 16:16:01 -0600 -categories: jekyll update ---- -You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `bundle exec jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. - -To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. - -``` -Everything in between the first and second `---` are part of the YAML Front Matter, and everything after the second `---` will be rendered with Markdown and show up as "Content." - -## Displaying an index of posts - -It’s all well and good to have posts in a folder, but a blog is no use unless -you have a list of posts somewhere. Creating an index of posts on another page -(or in a [template](../templates/)) is easy, thanks to the [Liquid template -language](https://docs.shopify.com/themes/liquid/basics) and its tags. Here’s a -basic example of how to create a list of links to your blog posts: - -```html - -``` - -Of course, you have full control over how (and where) you display your posts, -and how you structure your site. You should read more about [how templates -work](../templates/) with Jekyll if you want to know more. - -Note that the `post` variable only exists inside the `for` loop above. If -you wish to access the currently-rendering page/posts's variables (the -variables of the post/page that has the `for` loop in it), use the `page` -variable instead. - -## Post excerpts - -Each post automatically takes the first block of text, from the beginning of -the content to the first occurrence of `excerpt_separator`, and sets it as the `post.excerpt`. -Take the above example of an index of posts. Perhaps you want to include -a little hint about the post's content by adding the first paragraph of each of -your posts: - -```html - -``` - -Because Jekyll grabs the first paragraph you will not need to wrap the excerpt -in `p` tags, which is already done for you. These tags can be removed with the -following if you'd prefer: - -```html -{% raw %}{{ post.excerpt | remove: '

    ' | remove: '

    ' }}{% endraw %} -``` - -If you don't like the automatically-generated post excerpt, it can be -explicitly overridden by adding an `excerpt` value to your post's YAML -Front Matter. Alternatively, you can choose to define a custom -`excerpt_separator` in the post's YAML front matter: - -```text ---- -excerpt_separator: ---- - -Excerpt - -Out-of-excerpt -``` - -You can also set the `excerpt_separator` globally in your `_config.yml` -configuration file. - -Completely disable excerpts by setting your `excerpt_separator` to `""`. - -Also, as with any output generated by Liquid tags, you can pass the -`| strip_html` filter to remove any html tags in the output. This is -particularly helpful if you wish to output a post excerpt as a -`meta="description"` tag within the post `head`, or anywhere else having -html tags along with the content is not desirable. - -## Highlighting code snippets - -Jekyll also has built-in support for syntax highlighting of code snippets using -either Pygments or Rouge, and including a code snippet in any post is easy. -Just use the dedicated Liquid tag as follows: - -```text -{% raw %}{% highlight ruby %}{% endraw %} -def show - @widget = Widget(params[:id]) - respond_to do |format| - format.html # show.html.erb - format.json { render json: @widget } - end -end -{% raw %}{% endhighlight %}{% endraw %} -``` - -And the output will look like this: - -```ruby -def show - @widget = Widget(params[:id]) - respond_to do |format| - format.html # show.html.erb - format.json { render json: @widget } - end -end -``` - -
    -
    ProTip™: Show line numbers
    -

    - You can make code snippets include line-numbers by adding the word - linenos to the end of the opening highlight tag like this: - {% raw %}{% highlight ruby linenos %}{% endraw %}. -

    -
    - -These basics should be enough to get you started writing your first posts. When -you’re ready to dig into what else is possible, you might be interested in -doing things like [customizing post permalinks](../permalinks/) or -using [custom variables](../variables/) in your posts and elsewhere on your -site. From 86fc58491c494c6acfb25d5e6a8d9f4a4c6c754f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 9 Jan 2017 06:36:52 -0800 Subject: [PATCH 1808/4996] Update history to reflect merge of #5473 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c0764538714..b578b9bfb51 100644 --- a/History.markdown +++ b/History.markdown @@ -57,6 +57,7 @@ * Added new includes.md topic to docs (#5696) * Replace a dead link with a web-archived one (#5738) * Remove duplicate paragraph. (#5740) + * Addition of a sample "typical post" (#5473) ## 3.3.1 / 2016-11-14 From 5ac3e0a866d7a2abfa4a081183160874bc082f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zlatan=20Vasovi=C4=87?= Date: Sat, 7 Jan 2017 11:12:50 +0100 Subject: [PATCH 1809/4996] Fix #5730: add gcc and make to the list of requirements --- docs/_docs/installation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 54dfd9fc2b8..1fb1ca36f55 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -21,6 +21,7 @@ requirements you’ll need to make sure your system has before you start. - [NodeJS](https://nodejs.org/), or another JavaScript runtime (Jekyll 2 and earlier, for CoffeeScript support). - [Python 2.7](https://www.python.org/downloads/) (for Jekyll 2 and earlier) +- [GCC](https://gcc.gnu.org/install/) and [Make](https://www.gnu.org/software/make/) (in case your system doesn't have them installed, which you can check by running `gcc -v` and `make -v` in your system's command line interface)
    Running Jekyll on Windows
    From 74e6ef83c9aa274a4ebf2efea372c7479feae68c Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 9 Jan 2017 21:10:24 +0100 Subject: [PATCH 1810/4996] Use defaults in config All docs stored in _docs inherit from docs layout All news items stored in _posts inherit from news-item layout --- Rakefile | 1 - docs/_config.yml | 15 +++++++++++++++ docs/_docs/assets.md | 1 - docs/_docs/collections.md | 1 - docs/_docs/conduct.md | 1 - docs/_docs/configuration.md | 1 - docs/_docs/continuous-integration.md | 1 - docs/_docs/contributing.md | 1 - docs/_docs/datafiles.md | 1 - docs/_docs/deployment-methods.md | 1 - docs/_docs/drafts.md | 1 - docs/_docs/extras.md | 1 - docs/_docs/frontmatter.md | 1 - docs/_docs/github-pages.md | 1 - docs/_docs/history.md | 1 - docs/_docs/includes.md | 1 - docs/_docs/index.md | 1 - docs/_docs/installation.md | 1 - docs/_docs/maintaining/affinity-team-captain.md | 1 - docs/_docs/maintaining/avoiding-burnout.md | 1 - docs/_docs/maintaining/becoming-a-maintainer.md | 1 - docs/_docs/maintaining/index.md | 1 - docs/_docs/maintaining/merging-a-pull-request.md | 1 - .../_docs/maintaining/reviewing-a-pull-request.md | 1 - docs/_docs/maintaining/special-labels.md | 1 - docs/_docs/maintaining/triaging-an-issue.md | 1 - docs/_docs/migrations.md | 1 - docs/_docs/pages.md | 1 - docs/_docs/pagination.md | 1 - docs/_docs/permalinks.md | 1 - docs/_docs/plugins.md | 1 - docs/_docs/posts.md | 1 - docs/_docs/quickstart.md | 1 - docs/_docs/resources.md | 1 - docs/_docs/sites.md | 1 - docs/_docs/static_files.md | 1 - docs/_docs/structure.md | 1 - docs/_docs/templates.md | 1 - docs/_docs/themes.md | 1 - docs/_docs/troubleshooting.md | 1 - docs/_docs/upgrading/0-to-2.md | 1 - docs/_docs/upgrading/2-to-3.md | 1 - docs/_docs/usage.md | 1 - docs/_docs/variables.md | 1 - docs/_docs/windows.md | 1 - .../2013-05-06-jekyll-1-0-0-released.markdown | 1 - .../2013-05-08-jekyll-1-0-1-released.markdown | 1 - .../2013-05-12-jekyll-1-0-2-released.markdown | 1 - .../2013-06-07-jekyll-1-0-3-released.markdown | 1 - .../2013-07-14-jekyll-1-1-0-released.markdown | 1 - .../2013-07-24-jekyll-1-1-1-released.markdown | 1 - .../2013-07-25-jekyll-1-0-4-released.markdown | 1 - .../2013-07-25-jekyll-1-1-2-released.markdown | 1 - .../2013-09-06-jekyll-1-2-0-released.markdown | 1 - .../2013-09-14-jekyll-1-2-1-released.markdown | 1 - .../2013-10-28-jekyll-1-3-0-rc1-released.markdown | 1 - .../2013-11-04-jekyll-1-3-0-released.markdown | 1 - .../2013-11-26-jekyll-1-3-1-released.markdown | 1 - .../2013-12-07-jekyll-1-4-0-released.markdown | 1 - .../2013-12-09-jekyll-1-4-1-released.markdown | 1 - .../2013-12-16-jekyll-1-4-2-released.markdown | 1 - .../2014-01-13-jekyll-1-4-3-released.markdown | 1 - .../2014-03-24-jekyll-1-5-0-released.markdown | 1 - .../2014-03-27-jekyll-1-5-1-released.markdown | 1 - .../_posts/2014-05-06-jekyll-turns-2-0-0.markdown | 1 - .../2014-05-08-jekyll-2-0-3-released.markdown | 1 - ...-jekyll-stickers-1-dollar-stickermule.markdown | 1 - ...14-06-28-jekyll-turns-21-i-mean-2-1-0.markdown | 1 - .../2014-07-01-jekyll-2-1-1-released.markdown | 1 - .../2014-07-29-jekyll-2-2-0-released.markdown | 1 - .../2014-08-10-jekyll-2-3-0-released.markdown | 1 - .../2014-09-09-jekyll-2-4-0-released.markdown | 1 - ...lls-midlife-crisis-jekyll-turns-2-5-0.markdown | 1 - .../2014-11-08-jekyll-2-5-1-released.markdown | 1 - .../2014-11-12-jekyll-2-5-2-released.markdown | 1 - ...014-12-17-alfredxing-welcome-to-jekyll-core.md | 1 - .../2014-12-22-jekyll-2-5-3-released.markdown | 1 - .../2015-01-20-jekyll-meet-and-greet.markdown | 1 - ...015-01-24-jekyll-3-0-0-beta1-released.markdown | 1 - .../2015-02-26-introducing-jekyll-talk.markdown | 3 +-- .../2015-10-26-jekyll-3-0-released.markdown | 1 - .../2015-11-17-jekyll-3-0-1-released.markdown | 1 - .../2016-01-20-jekyll-3-0-2-released.markdown | 1 - .../2016-01-24-jekyll-3-1-0-released.markdown | 1 - .../2016-01-28-jekyll-3-1-1-released.markdown | 1 - .../2016-02-08-jekyll-3-0-3-released.markdown | 1 - .../2016-02-19-jekyll-3-1-2-released.markdown | 1 - ...10-making-it-easier-to-contribute-to-jekyll.md | 1 - .../2016-04-19-jekyll-3-0-4-released.markdown | 1 - .../2016-04-19-jekyll-3-1-3-released.markdown | 2 -- .../2016-04-26-jekyll-3-0-5-released.markdown | 1 - .../2016-05-18-jekyll-3-1-4-released.markdown | 1 - .../2016-05-18-jekyll-3-1-5-released.markdown | 1 - .../2016-05-19-jekyll-3-1-6-released.markdown | 1 - ...kyll-s-google-summer-of-code-projects.markdown | 1 - .../2016-07-26-jekyll-3-2-0-released.markdown | 1 - .../2016-08-02-jekyll-3-2-1-released.markdown | 1 - ...16-08-24-jekyll-admin-initial-release.markdown | 1 - docs/_posts/2016-10-06-jekyll-3-3-is-here.md | 1 - .../2016-11-14-jekyll-3-3-1-released.markdown | 1 - rake/site.rake | 1 - 101 files changed, 16 insertions(+), 102 deletions(-) diff --git a/Rakefile b/Rakefile index 58aecfaf767..4f11a64e667 100644 --- a/Rakefile +++ b/Rakefile @@ -101,7 +101,6 @@ def siteify_file(file, overrides_front_matter = {}) slug = File.basename(file, ".markdown").downcase front_matter = { "title" => title, - "layout" => "docs", "permalink" => "/docs/#{slug}/", "note" => "This file is autogenerated. Edit /#{file} instead." }.merge(overrides_front_matter) diff --git a/docs/_config.yml b/docs/_config.yml index 32ae74bb0d4..f3dcb08d04a 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -10,6 +10,21 @@ help_url: https://github.com/jekyll/jekyll-help timezone: America/Los_Angeles +defaults: + - + scope: + path: "_docs" + type: "docs" + values: + layout: "docs" + - + scope: + path: "_posts" + type: "posts" + values: + layout: "news_item" + + collections: docs: permalink: /:collection/:path/ diff --git a/docs/_docs/assets.md b/docs/_docs/assets.md index 4908a4008de..7418f984f34 100644 --- a/docs/_docs/assets.md +++ b/docs/_docs/assets.md @@ -1,5 +1,4 @@ --- -layout: docs title: Assets permalink: /docs/assets/ --- diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 22a86e60ff4..8a1c3a1ad52 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -1,5 +1,4 @@ --- -layout: docs title: Collections permalink: /docs/collections/ --- diff --git a/docs/_docs/conduct.md b/docs/_docs/conduct.md index d68c5ec58ac..7ba30a5acaf 100644 --- a/docs/_docs/conduct.md +++ b/docs/_docs/conduct.md @@ -1,6 +1,5 @@ --- title: Code of Conduct -layout: docs permalink: "/docs/conduct/" note: This file is autogenerated. Edit /CONDUCT.markdown instead. redirect_from: "/conduct/index.html" diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 9df1c85f181..e4c35b8ad0a 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -1,5 +1,4 @@ --- -layout: docs title: Configuration permalink: /docs/configuration/ --- diff --git a/docs/_docs/continuous-integration.md b/docs/_docs/continuous-integration.md index 54b3466cb7c..c2e8a31fab1 100644 --- a/docs/_docs/continuous-integration.md +++ b/docs/_docs/continuous-integration.md @@ -1,5 +1,4 @@ --- -layout: docs title: Continuous Integration permalink: /docs/continuous-integration/ --- diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index 9ccac2935d9..724c6641801 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -1,6 +1,5 @@ --- title: Contributing -layout: docs permalink: "/docs/contributing/" note: This file is autogenerated. Edit /.github/CONTRIBUTING.markdown instead. --- diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index 21799169e92..221ee4d31a2 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -1,5 +1,4 @@ --- -layout: docs title: Data Files permalink: /docs/datafiles/ --- diff --git a/docs/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md index cefb4d32d79..33edec592fd 100644 --- a/docs/_docs/deployment-methods.md +++ b/docs/_docs/deployment-methods.md @@ -1,5 +1,4 @@ --- -layout: docs title: Deployment methods permalink: /docs/deployment-methods/ --- diff --git a/docs/_docs/drafts.md b/docs/_docs/drafts.md index d5513f75fc1..c4b4f9f0514 100644 --- a/docs/_docs/drafts.md +++ b/docs/_docs/drafts.md @@ -1,5 +1,4 @@ --- -layout: docs title: Working with drafts permalink: /docs/drafts/ --- diff --git a/docs/_docs/extras.md b/docs/_docs/extras.md index 9064d967d3d..67236e715e2 100644 --- a/docs/_docs/extras.md +++ b/docs/_docs/extras.md @@ -1,5 +1,4 @@ --- -layout: docs title: Extras permalink: /docs/extras/ --- diff --git a/docs/_docs/frontmatter.md b/docs/_docs/frontmatter.md index 6dd8e5fe2ba..cb55c444e53 100644 --- a/docs/_docs/frontmatter.md +++ b/docs/_docs/frontmatter.md @@ -1,5 +1,4 @@ --- -layout: docs title: Front Matter permalink: /docs/frontmatter/ --- diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 0a00f2fa6d1..cc7387045dd 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -1,5 +1,4 @@ --- -layout: docs title: GitHub Pages permalink: /docs/github-pages/ --- diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 5d07eb4009b..03767126d9b 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -1,6 +1,5 @@ --- title: History -layout: docs permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- diff --git a/docs/_docs/includes.md b/docs/_docs/includes.md index 94c568946ed..ae6409cd5ee 100644 --- a/docs/_docs/includes.md +++ b/docs/_docs/includes.md @@ -1,5 +1,4 @@ --- -layout: docs title: Includes permalink: /docs/includes/ --- diff --git a/docs/_docs/index.md b/docs/_docs/index.md index 5e08d7605b9..ff5e8ccedcf 100644 --- a/docs/_docs/index.md +++ b/docs/_docs/index.md @@ -1,5 +1,4 @@ --- -layout: docs title: Welcome permalink: /docs/home/ redirect_from: /docs/index.html diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 54dfd9fc2b8..d264997d436 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -1,5 +1,4 @@ --- -layout: docs title: Installation permalink: /docs/installation/ --- diff --git a/docs/_docs/maintaining/affinity-team-captain.md b/docs/_docs/maintaining/affinity-team-captain.md index 02247d2d17c..bafa4e9db4d 100644 --- a/docs/_docs/maintaining/affinity-team-captain.md +++ b/docs/_docs/maintaining/affinity-team-captain.md @@ -1,6 +1,5 @@ --- title: Affinity Team Captains -layout: docs --- **This guide is for affinity team captains.** These special people are **team maintainers** of one of our [affinity teams][] and help triage and evaluate the issues and contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/avoiding-burnout.md b/docs/_docs/maintaining/avoiding-burnout.md index 1d1d93b17e5..e6acf4028e6 100644 --- a/docs/_docs/maintaining/avoiding-burnout.md +++ b/docs/_docs/maintaining/avoiding-burnout.md @@ -1,6 +1,5 @@ --- title: "Avoiding Burnout" -layout: docs --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/becoming-a-maintainer.md b/docs/_docs/maintaining/becoming-a-maintainer.md index e4a1840ca7a..00abef54bd8 100644 --- a/docs/_docs/maintaining/becoming-a-maintainer.md +++ b/docs/_docs/maintaining/becoming-a-maintainer.md @@ -1,6 +1,5 @@ --- title: "Becoming a Maintainer" -layout: docs --- **This guide is for contributors.** These special people have contributed to one or more of Jekyll's repositories, but do not yet have write access to any. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/index.md b/docs/_docs/maintaining/index.md index 5c4da4db308..383bc6eeb64 100644 --- a/docs/_docs/maintaining/index.md +++ b/docs/_docs/maintaining/index.md @@ -1,5 +1,4 @@ --- -layout: docs title: Maintaining Jekyll permalink: /docs/maintaining/ --- diff --git a/docs/_docs/maintaining/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md index 80ad6f7c5e3..9aee4153c78 100644 --- a/docs/_docs/maintaining/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -1,6 +1,5 @@ --- title: "Merging a Pull Request" -layout: docs --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/reviewing-a-pull-request.md b/docs/_docs/maintaining/reviewing-a-pull-request.md index 12f7a35f38d..a0a6e353de5 100644 --- a/docs/_docs/maintaining/reviewing-a-pull-request.md +++ b/docs/_docs/maintaining/reviewing-a-pull-request.md @@ -1,6 +1,5 @@ --- title: "Reviewing a Pull Request" -layout: docs --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/special-labels.md b/docs/_docs/maintaining/special-labels.md index eea366e96be..a8696174191 100644 --- a/docs/_docs/maintaining/special-labels.md +++ b/docs/_docs/maintaining/special-labels.md @@ -1,6 +1,5 @@ --- title: "Special Labels" -layout: docs --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/maintaining/triaging-an-issue.md b/docs/_docs/maintaining/triaging-an-issue.md index 4802b61b486..bc87d96e19f 100644 --- a/docs/_docs/maintaining/triaging-an-issue.md +++ b/docs/_docs/maintaining/triaging-an-issue.md @@ -1,6 +1,5 @@ --- title: "Triaging an Issue" -layout: docs --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. diff --git a/docs/_docs/migrations.md b/docs/_docs/migrations.md index 961762f72eb..fd8676a40ea 100644 --- a/docs/_docs/migrations.md +++ b/docs/_docs/migrations.md @@ -1,5 +1,4 @@ --- -layout: docs title: Blog migrations permalink: /docs/migrations/ --- diff --git a/docs/_docs/pages.md b/docs/_docs/pages.md index 258fd6a269e..398d1987d1b 100644 --- a/docs/_docs/pages.md +++ b/docs/_docs/pages.md @@ -1,5 +1,4 @@ --- -layout: docs title: Creating pages permalink: /docs/pages/ --- diff --git a/docs/_docs/pagination.md b/docs/_docs/pagination.md index b32b934ca91..b05b6bb21b9 100644 --- a/docs/_docs/pagination.md +++ b/docs/_docs/pagination.md @@ -1,5 +1,4 @@ --- -layout: docs title: Pagination permalink: /docs/pagination/ --- diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index b8fd5ec643a..bcb39e54c16 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -1,5 +1,4 @@ --- -layout: docs title: Permalinks permalink: /docs/permalinks/ --- diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 4a5e61cfd78..ce174f128be 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -1,5 +1,4 @@ --- -layout: docs title: Plugins permalink: /docs/plugins/ --- diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index d4d8f15d1b5..f43b72e8af3 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -1,5 +1,4 @@ --- -layout: docs title: Writing posts permalink: /docs/posts/ --- diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index d15a9eb1730..984275f7a37 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -1,5 +1,4 @@ --- -layout: docs title: Quick-start guide permalink: /docs/quickstart/ --- diff --git a/docs/_docs/resources.md b/docs/_docs/resources.md index 2042b1a67b4..0f90fae8f25 100644 --- a/docs/_docs/resources.md +++ b/docs/_docs/resources.md @@ -1,5 +1,4 @@ --- -layout: docs title: Resources permalink: /docs/resources/ --- diff --git a/docs/_docs/sites.md b/docs/_docs/sites.md index 28e464bad7d..65401551cdc 100644 --- a/docs/_docs/sites.md +++ b/docs/_docs/sites.md @@ -1,5 +1,4 @@ --- -layout: docs title: Sites using Jekyll permalink: /docs/sites/ --- diff --git a/docs/_docs/static_files.md b/docs/_docs/static_files.md index 55a72747d4e..523c29dfc41 100644 --- a/docs/_docs/static_files.md +++ b/docs/_docs/static_files.md @@ -1,5 +1,4 @@ --- -layout: docs title: Static Files permalink: /docs/static-files/ --- diff --git a/docs/_docs/structure.md b/docs/_docs/structure.md index bdfaab59a7a..6735d6e02ac 100644 --- a/docs/_docs/structure.md +++ b/docs/_docs/structure.md @@ -1,5 +1,4 @@ --- -layout: docs title: Directory structure permalink: /docs/structure/ --- diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 79b5fdae770..26bd804a6d5 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -1,5 +1,4 @@ --- -layout: docs title: Templates permalink: /docs/templates/ --- diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index c7d6d574474..e01a4d1535c 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -1,5 +1,4 @@ --- -layout: docs title: Themes permalink: /docs/themes/ --- diff --git a/docs/_docs/troubleshooting.md b/docs/_docs/troubleshooting.md index 191953ec668..aae024bd285 100644 --- a/docs/_docs/troubleshooting.md +++ b/docs/_docs/troubleshooting.md @@ -1,5 +1,4 @@ --- -layout: docs title: Troubleshooting permalink: /docs/troubleshooting/ --- diff --git a/docs/_docs/upgrading/0-to-2.md b/docs/_docs/upgrading/0-to-2.md index 9de634557c9..5f9d2320b80 100644 --- a/docs/_docs/upgrading/0-to-2.md +++ b/docs/_docs/upgrading/0-to-2.md @@ -1,5 +1,4 @@ --- -layout: docs title: Upgrading from 0.x to 2.x permalink: /docs/upgrading/0-to-2/ --- diff --git a/docs/_docs/upgrading/2-to-3.md b/docs/_docs/upgrading/2-to-3.md index 0d145b9c262..a378d2f7e78 100644 --- a/docs/_docs/upgrading/2-to-3.md +++ b/docs/_docs/upgrading/2-to-3.md @@ -1,5 +1,4 @@ --- -layout: docs title: Upgrading from 2.x to 3.x permalink: /docs/upgrading/2-to-3/ --- diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index e6f1a0dba46..c88603734de 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -1,5 +1,4 @@ --- -layout: docs title: Basic Usage permalink: /docs/usage/ --- diff --git a/docs/_docs/variables.md b/docs/_docs/variables.md index 1d4e2091add..f32bddd6d9d 100644 --- a/docs/_docs/variables.md +++ b/docs/_docs/variables.md @@ -1,5 +1,4 @@ --- -layout: docs title: Variables permalink: /docs/variables/ --- diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 8d7bb8bc865..62fb69b4425 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -1,5 +1,4 @@ --- -layout: docs title: Jekyll on Windows permalink: /docs/windows/ --- diff --git a/docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown b/docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown index 538cb56528a..ae5d3f9cf32 100644 --- a/docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown +++ b/docs/_posts/2013-05-06-jekyll-1-0-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.0 Released" date: "2013-05-06 02:12:52 +0200" author: parkr diff --git a/docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown b/docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown index 90edcc26a43..5b7a2c353cc 100644 --- a/docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown +++ b/docs/_posts/2013-05-08-jekyll-1-0-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.1 Released" date: "2013-05-08 23:46:11 +0200" author: parkr diff --git a/docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown b/docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown index 2a2b97e6afc..e54663622a5 100644 --- a/docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown +++ b/docs/_posts/2013-05-12-jekyll-1-0-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.2 Released" date: "2013-05-12 14:45:00 +0200" author: parkr diff --git a/docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown b/docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown index 566ae6688cf..88f8ad41283 100644 --- a/docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown +++ b/docs/_posts/2013-06-07-jekyll-1-0-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.3 Released" date: "2013-06-07 21:02:13 +0200" author: parkr diff --git a/docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown b/docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown index 12b3d92130a..8d00b98bc8a 100644 --- a/docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown +++ b/docs/_posts/2013-07-14-jekyll-1-1-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.1.0 Released" date: "2013-07-14 19:38:02 +0200" author: parkr diff --git a/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown b/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown index 6741a89eb25..90b81847682 100644 --- a/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown +++ b/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.1.1 Released" date: "2013-07-24 22:24:14 +0200" author: parkr diff --git a/docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown b/docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown index 635d0e6cd09..2e234c0ed5f 100644 --- a/docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown +++ b/docs/_posts/2013-07-25-jekyll-1-0-4-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.0.4 Released" date: "2013-07-25 09:08:38 +0200" author: mattr- diff --git a/docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown b/docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown index ed16ca717c4..f308ca12544 100644 --- a/docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown +++ b/docs/_posts/2013-07-25-jekyll-1-1-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.1.2 Released" date: "2013-07-25 09:08:38 +0200" author: parkr diff --git a/docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown b/docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown index ae5448c21a3..76090527c93 100644 --- a/docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown +++ b/docs/_posts/2013-09-06-jekyll-1-2-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll 1.2.0 Released" date: "2013-09-06 22:02:41 -0400" author: parkr diff --git a/docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown b/docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown index 832dbd06a54..5f759e20525 100644 --- a/docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown +++ b/docs/_posts/2013-09-14-jekyll-1-2-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.2.1 Released' date: 2013-09-14 20:46:50 -0400 author: parkr diff --git a/docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown b/docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown index 1e3e44cee55..65e98700bd6 100644 --- a/docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown +++ b/docs/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.3.0.rc1 Released' date: 2013-10-28 20:14:39 -0500 author: mattr- diff --git a/docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown b/docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown index 1e325117c28..f70408cd88a 100644 --- a/docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown +++ b/docs/_posts/2013-11-04-jekyll-1-3-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.3.0 Released' date: 2013-11-04 21:46:02 -0600 author: mattr- diff --git a/docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown b/docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown index 4b4c37d5fda..baf8dea098f 100644 --- a/docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown +++ b/docs/_posts/2013-11-26-jekyll-1-3-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.3.1 Released' date: 2013-11-26 19:52:20 -0600 author: mattr- diff --git a/docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown b/docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown index d7a0c14f914..1b9d4b7a0e9 100644 --- a/docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown +++ b/docs/_posts/2013-12-07-jekyll-1-4-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.4.0 Released' date: 2013-12-07 13:55:28 -0600 author: mattr- diff --git a/docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown b/docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown index 63407158207..9d754857d98 100644 --- a/docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown +++ b/docs/_posts/2013-12-09-jekyll-1-4-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.4.1 Released' date: 2013-12-09 20:44:13 -0600 author: mattr- diff --git a/docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown b/docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown index afc92147d11..e4329adc3f2 100644 --- a/docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown +++ b/docs/_posts/2013-12-16-jekyll-1-4-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.4.2 Released' date: 2013-12-16 19:48:13 -0500 author: parkr diff --git a/docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown b/docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown index a97bcec496b..8338ffb6c13 100644 --- a/docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown +++ b/docs/_posts/2014-01-13-jekyll-1-4-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.4.3 Released' date: 2014-01-13 17:43:32 -0800 author: benbalter diff --git a/docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown b/docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown index 5b103dc219c..717424ab7f3 100644 --- a/docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown +++ b/docs/_posts/2014-03-24-jekyll-1-5-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.5.0 Released' date: 2014-03-24 20:37:59 -0400 author: parkr diff --git a/docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown b/docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown index e8a4096a45a..2105ad4dfe2 100644 --- a/docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown +++ b/docs/_posts/2014-03-27-jekyll-1-5-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 1.5.1 Released' date: 2014-03-27 22:43:48 -0400 author: parkr diff --git a/docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown b/docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown index 82555514bf7..af2a6774d7a 100644 --- a/docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown +++ b/docs/_posts/2014-05-06-jekyll-turns-2-0-0.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll turns 2.0.0' author: parkr version: 2.0.0 diff --git a/docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown b/docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown index ac5e9d7538a..e98e32c8f36 100644 --- a/docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown +++ b/docs/_posts/2014-05-08-jekyll-2-0-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.0.3 Released' date: 2014-05-08 22:43:17 -0400 author: parkr diff --git a/docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown b/docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown index 5ba126d2fe3..8ef37c54542 100644 --- a/docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown +++ b/docs/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Pick Up your $1 Jekyll Sticker' date: 2014-06-04 15:46:53 -0400 author: parkr diff --git a/docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown b/docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown index 82d01a181d0..c3fd4bb6a28 100644 --- a/docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown +++ b/docs/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll Turns 21! Err... I mean 2.1.0.' date: 2014-06-28 17:26:59 -0400 author: parkr diff --git a/docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown b/docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown index 81423539690..c73a055dfce 100644 --- a/docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown +++ b/docs/_posts/2014-07-01-jekyll-2-1-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.1.1 Released' date: 2014-07-01 20:16:43 -0400 author: parkr diff --git a/docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown b/docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown index ca7aee48870..6b726f17f15 100644 --- a/docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown +++ b/docs/_posts/2014-07-29-jekyll-2-2-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.2.0 Released' date: 2014-07-29 18:59:13 -0400 author: parkr diff --git a/docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown b/docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown index 63fe2b45012..07afc3c06e6 100644 --- a/docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown +++ b/docs/_posts/2014-08-10-jekyll-2-3-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.3.0 Released' date: 2014-08-10 20:38:34 -0400 author: parkr diff --git a/docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown b/docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown index e8dda676295..11cb738ec74 100644 --- a/docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown +++ b/docs/_posts/2014-09-09-jekyll-2-4-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'A Wild Jekyll 2.4.0 Appeared!' date: 2014-09-09 21:10:33 -0700 author: parkr diff --git a/docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown b/docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown index cc5de7c012b..012b6155bd4 100644 --- a/docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown +++ b/docs/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll's Mid-Life Crisis (Or, Jekyll turns 2.5.0)" date: 2014-11-05 10:48:22 -0800 author: parkr diff --git a/docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown b/docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown index 3237e48d4d2..2f6e3b51467 100644 --- a/docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown +++ b/docs/_posts/2014-11-08-jekyll-2-5-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.5.1 Released' date: 2014-11-09 09:47:52 -0800 author: parkr diff --git a/docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown b/docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown index 3eab8998aa2..cff18248e62 100644 --- a/docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown +++ b/docs/_posts/2014-11-12-jekyll-2-5-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 2.5.2 Released' date: 2014-11-12 18:49:08 -0800 author: parkr diff --git a/docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md b/docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md index 1951f0a48e7..51f55028b94 100644 --- a/docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md +++ b/docs/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Alfred Xing has joined the Jekyll core team' date: 2014-12-17 11:16:21 -0800 author: parkr diff --git a/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown b/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown index 7743fd8ed59..491007cdd1d 100644 --- a/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown +++ b/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll Release for the Holidays! v2.5.3 Out' date: 2014-12-22 09:03:30 -0500 author: parkr diff --git a/docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown b/docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown index ed273f9d337..eee8d5e7931 100644 --- a/docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown +++ b/docs/_posts/2015-01-20-jekyll-meet-and-greet.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll Meet & Greet at GitHub HQ" date: "2015-01-20 19:23:12 -0800" author: parkr diff --git a/docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown b/docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown index 9ba83b045a0..c63f184b3e3 100644 --- a/docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown +++ b/docs/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.0.beta1 Released' date: 2015-01-24 00:42:31 -0800 author: parkr diff --git a/docs/_posts/2015-02-26-introducing-jekyll-talk.markdown b/docs/_posts/2015-02-26-introducing-jekyll-talk.markdown index 90863c12eca..468ae4c81d7 100644 --- a/docs/_posts/2015-02-26-introducing-jekyll-talk.markdown +++ b/docs/_posts/2015-02-26-introducing-jekyll-talk.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Join the Discussion at Jekyll Talk' date: 2015-02-26 21:06:51 -0800 author: alfredxing @@ -12,4 +11,4 @@ The forum was set up by [@envygeeks](https://github.com/envygeeks) to build a co There's already been a lot of interesting topics, including a [site showcase](https://talk.jekyllrb.com/t/showcase-sites-made-using-jekyll/18) and [a poll for Jekyll 3.0 priorities](https://talk.jekyllrb.com/t/poll-installation-priorities-for-3-0/106/9). -Come join the fun! \ No newline at end of file +Come join the fun! diff --git a/docs/_posts/2015-10-26-jekyll-3-0-released.markdown b/docs/_posts/2015-10-26-jekyll-3-0-released.markdown index e7cf9db4e8f..37d075c4d56 100644 --- a/docs/_posts/2015-10-26-jekyll-3-0-released.markdown +++ b/docs/_posts/2015-10-26-jekyll-3-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0 Released' date: 2015-10-26 15:37:30 -0700 author: parkr diff --git a/docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown b/docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown index 71412c6ba54..3eb3cb718ce 100644 --- a/docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown +++ b/docs/_posts/2015-11-17-jekyll-3-0-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.1 Released' date: 2015-11-17 22:04:39 -0800 author: parkr diff --git a/docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown b/docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown index 88f8888f757..c12cde34a11 100644 --- a/docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown +++ b/docs/_posts/2016-01-20-jekyll-3-0-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.2 Released' date: 2016-01-20 14:08:18 -0800 author: parkr diff --git a/docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown b/docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown index 42768b9fe3e..7e91aa1d6af 100644 --- a/docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown +++ b/docs/_posts/2016-01-24-jekyll-3-1-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.0 Released' date: 2016-01-24 13:16:12 -0800 author: parkr diff --git a/docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown b/docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown index b5932b0aefe..cddfbf2602d 100644 --- a/docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown +++ b/docs/_posts/2016-01-28-jekyll-3-1-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.1 Released' date: 2016-01-28 17:21:50 -0800 author: parkr diff --git a/docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown b/docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown index 0c260cc696b..442dfeb9c5c 100644 --- a/docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown +++ b/docs/_posts/2016-02-08-jekyll-3-0-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.3 Released' date: 2016-02-08 10:39:08 -0800 author: parkr diff --git a/docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown b/docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown index 775445107d0..807621f6a9c 100644 --- a/docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown +++ b/docs/_posts/2016-02-19-jekyll-3-1-2-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.2 Released!' date: 2016-02-19 15:24:00 -0800 author: parkr diff --git a/docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md b/docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md index d735b6829b7..9d80604997e 100644 --- a/docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md +++ b/docs/_posts/2016-03-10-making-it-easier-to-contribute-to-jekyll.md @@ -1,7 +1,6 @@ --- title: Making it easier to contribute to Jekyll description: We've made it easier to contribute to Jekyll by updating our contributing documentation and introducing Jekyll Affinity Teams, teams dedicated to specific aspects of the project. -layout: news_item author: benbalter categories: [community] --- diff --git a/docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown b/docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown index d2cc4ec611a..9aa9b822f82 100644 --- a/docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown +++ b/docs/_posts/2016-04-19-jekyll-3-0-4-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.4 Released' date: 2016-04-19 10:26:12 -0700 author: parkr diff --git a/docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown b/docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown index cd478e22da8..6b0892aca49 100644 --- a/docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown +++ b/docs/_posts/2016-04-19-jekyll-3-1-3-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.3 Released' date: 2016-04-19 10:26:16 -0700 author: parkr @@ -15,4 +14,3 @@ v3.1.3 is a patch release which fixes the follow two issues: Both of these issues have been resolved. For more information, check out [the full history](/docs/history/#v3-1-3). Happy Jekylling! - diff --git a/docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown b/docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown index 9696713aa4b..5ac2154598d 100644 --- a/docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown +++ b/docs/_posts/2016-04-26-jekyll-3-0-5-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.0.5 Released' date: 2016-04-26 17:40:44 -0700 author: parkr diff --git a/docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown b/docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown index 161d4746346..738fc12e514 100644 --- a/docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown +++ b/docs/_posts/2016-05-18-jekyll-3-1-4-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.4 "Stability Sam" Released' date: 2016-05-18 16:50:37 -0700 author: parkr diff --git a/docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown b/docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown index c341b37b1a6..0ca981a623d 100644 --- a/docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown +++ b/docs/_posts/2016-05-18-jekyll-3-1-5-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.5 Released' date: 2016-05-18 21:35:27 -0700 author: parkr diff --git a/docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown b/docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown index 45e7312f1fe..e31951ebd41 100644 --- a/docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown +++ b/docs/_posts/2016-05-19-jekyll-3-1-6-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.1.6 Released' date: 2016-05-19 12:48:14 -0700 author: parkr diff --git a/docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown b/docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown index 0f4ce2de4d7..c3d01cddcbe 100644 --- a/docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown +++ b/docs/_posts/2016-06-03-update-on-jekyll-s-google-summer-of-code-projects.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll's Google Summer of Code Project: The CMS You Always Wanted" date: "2016-06-03 13:21:02 -0700" author: parkr diff --git a/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown b/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown index 2e62cc329e6..4cf4b6f754a 100644 --- a/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown +++ b/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll turns 3.2' date: 2016-07-26 15:06:49 -0700 author: parkr diff --git a/docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown b/docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown index f4d17e04ca5..f2bdaec87b9 100644 --- a/docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown +++ b/docs/_posts/2016-08-02-jekyll-3-2-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.2.1 Released with Fix for Windows' date: 2016-08-02 13:20:11 -0700 author: parkr diff --git a/docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown b/docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown index 1f6fa154211..e256a5c72c7 100644 --- a/docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown +++ b/docs/_posts/2016-08-24-jekyll-admin-initial-release.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: "Jekyll Admin Initial Release" date: "2016-08-25 09:50:00 +0300" author: mertkahyaoglu diff --git a/docs/_posts/2016-10-06-jekyll-3-3-is-here.md b/docs/_posts/2016-10-06-jekyll-3-3-is-here.md index 0b51e31eb44..8c756ef7291 100644 --- a/docs/_posts/2016-10-06-jekyll-3-3-is-here.md +++ b/docs/_posts/2016-10-06-jekyll-3-3-is-here.md @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.3 is here with better theme support, new URL filters, and tons more' date: 2016-10-06 11:10:38 -0700 author: parkr diff --git a/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown b/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown index a5a88376c94..0a357ea23da 100644 --- a/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown +++ b/docs/_posts/2016-11-14-jekyll-3-3-1-released.markdown @@ -1,5 +1,4 @@ --- -layout: news_item title: 'Jekyll 3.3.1 Released' date: 2016-11-14 14:29:59 -0800 author: parkr diff --git a/rake/site.rake b/rake/site.rake index 51978aed2e3..2fb4172a351 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -92,7 +92,6 @@ namespace :site do File.open(filename, "wb") do |post| post.puts("---") - post.puts("layout: news_item") post.puts("title: 'Jekyll #{release} Released'") post.puts("date: #{Time.new.strftime('%Y-%m-%d %H:%M:%S %z')}") post.puts("author: ") From 0c9c236c4863c996043d7eed068a324d4e421bf9 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 9 Jan 2017 21:31:57 +0100 Subject: [PATCH 1811/4996] rubocup -a --- Rakefile | 68 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/Rakefile b/Rakefile index 58aecfaf767..5353717e035 100644 --- a/Rakefile +++ b/Rakefile @@ -1,13 +1,13 @@ -require 'rubygems' -require 'rake' -require 'rdoc' -require 'date' -require 'yaml' +require "rubygems" +require "rake" +require "rdoc" +require "date" +require "yaml" -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib])) -require 'jekyll/version' +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib")) +require "jekyll/version" -Dir.glob('rake/**.rake').each { |f| import f } +Dir.glob("rake/**.rake").each { |f| import f } ############################################################################# # @@ -36,21 +36,21 @@ def gemspec_file end def gem_file - "#{name}-#{Gem::Version.new(version).to_s}.gem" + "#{name}-#{Gem::Version.new(version)}.gem" end def normalize_bullets(markdown) - markdown.gsub(/\n\s{2}\*{1}/, "\n-") + markdown.gsub(%r!\n\s{2}\*{1}!, "\n-") end def linkify_prs(markdown) - markdown.gsub(/#(\d+)/) do |word| + markdown.gsub(%r!#(\d+)!) do |word| "[#{word}]({{ site.repository }}/issues/#{word.delete("#")})" end end def linkify_users(markdown) - markdown.gsub(/(@\w+)/) do |username| + markdown.gsub(%r!(@\w+)!) do |username| "[#{username}](https://github.com/#{username.delete("@")})" end end @@ -60,13 +60,13 @@ def linkify(markdown) end def liquid_escape(markdown) - markdown.gsub(/(`{[{%].+[}%]}`)/, "{% raw %}\\1{% endraw %}") + markdown.gsub(%r!(`{[{%].+[}%]}`)!, "{% raw %}\\1{% endraw %}") end def custom_release_header_anchors(markdown) - header_regexp = /^(\d{1,2})\.(\d{1,2})\.(\d{1,2}) \/ \d{4}-\d{2}-\d{2}/ - section_regexp = /^### \w+ \w+$/ - markdown.split(/^##\s/).map do |release_notes| + header_regexp = %r!^(\d{1,2})\.(\d{1,2})\.(\d{1,2}) \/ \d{4}-\d{2}-\d{2}! + section_regexp = %r!^### \w+ \w+$! + markdown.split(%r!^##\s!).map do |release_notes| _, major, minor, patch = *release_notes.match(header_regexp) release_notes .gsub(header_regexp, "\\0\n{: #v\\1-\\2-\\3}") @@ -75,11 +75,11 @@ def custom_release_header_anchors(markdown) end def sluffigy(header) - header.gsub(/#/, '').strip.downcase.gsub(/\s+/, '-') + header.delete("#").strip.downcase.gsub(%r!\s+!, "-") end def remove_head_from_history(markdown) - index = markdown =~ /^##\s+\d+\.\d+\.\d+/ + index = markdown =~ %r!^##\s+\d+\.\d+\.\d+! markdown[index..-1] end @@ -88,13 +88,17 @@ def converted_history(markdown) custom_release_header_anchors( liquid_escape( linkify( - normalize_bullets(markdown))))) + normalize_bullets(markdown) + ) + ) + ) + ) end def siteify_file(file, overrides_front_matter = {}) - abort "You seem to have misplaced your #{file} file. I can haz?" unless File.exists?(file) + abort "You seem to have misplaced your #{file} file. I can haz?" unless File.exist?(file) title = begin - File.read(file).match(/\A# (.*)$/)[1] + File.read(file).match(%r!\A# (.*)$!)[1] rescue File.basename(file, ".*").downcase.capitalize end @@ -115,7 +119,7 @@ def content_for(file) when "History.markdown" converted_history(contents) else - contents.gsub(/\A# .*\n\n?/, "") + contents.gsub(%r!\A# .*\n\n?!, "") end end @@ -128,23 +132,23 @@ end multitask :default => [:test, :features] task :spec => :test -require 'rake/testtask' +require "rake/testtask" Rake::TestTask.new(:test) do |test| - test.libs << 'lib' << 'test' - test.pattern = 'test/**/test_*.rb' + test.libs << "lib" << "test" + test.pattern = "test/**/test_*.rb" test.verbose = true end -require 'rdoc/task' +require "rdoc/task" Rake::RDocTask.new do |rdoc| - rdoc.rdoc_dir = 'rdoc' + rdoc.rdoc_dir = "rdoc" rdoc.title = "#{name} #{version}" - rdoc.rdoc_files.include('README*') - rdoc.rdoc_files.include('lib/**/*.rb') + rdoc.rdoc_files.include("README*") + rdoc.rdoc_files.include("lib/**/*.rb") end begin - require 'cucumber/rake/task' + require "cucumber/rake/task" Cucumber::Rake::Task.new(:features) do |t| t.profile = "travis" end @@ -152,9 +156,9 @@ begin t.profile = "html_report" end rescue LoadError - desc 'Cucumber rake task not available' + desc "Cucumber rake task not available" task :features do - abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin' + abort "Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin" end end From 8bf9c37cf5f03fe6975f462531959d4bc5978a5b Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 9 Jan 2017 21:32:11 +0100 Subject: [PATCH 1812/4996] rubocop -a --- jekyll.gemspec | 52 +++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 734df2e4934..ca12fa0dbd0 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -1,42 +1,42 @@ # coding: utf-8 -lib = File.expand_path('../lib', __FILE__) +lib = File.expand_path("../lib", __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'jekyll/version' +require "jekyll/version" Gem::Specification.new do |s| s.specification_version = 2 if s.respond_to? :specification_version= - s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version= - s.rubygems_version = '2.2.2' - s.required_ruby_version = '>= 2.0.0' + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.rubygems_version = "2.2.2" + s.required_ruby_version = ">= 2.0.0" - s.name = 'jekyll' + s.name = "jekyll" s.version = Jekyll::VERSION - s.license = 'MIT' + s.license = "MIT" - s.summary = 'A simple, blog aware, static site generator.' - s.description = 'Jekyll is a simple, blog aware, static site generator.' + s.summary = "A simple, blog aware, static site generator." + s.description = "Jekyll is a simple, blog aware, static site generator." - s.authors = ['Tom Preston-Werner'] - s.email = 'tom@mojombo.com' - s.homepage = 'https://github.com/jekyll/jekyll' + s.authors = ["Tom Preston-Werner"] + s.email = "tom@mojombo.com" + s.homepage = "https://github.com/jekyll/jekyll" all_files = `git ls-files -z`.split("\x0") - s.files = all_files.grep(%r{^(exe|lib)/|^.rubocop.yml$}) - s.executables = all_files.grep(%r{^exe/}) { |f| File.basename(f) } + s.files = all_files.grep(%r!^(exe|lib)/|^.rubocop.yml$!) + s.executables = all_files.grep(%r!^exe/!) { |f| File.basename(f) } s.bindir = "exe" - s.require_paths = ['lib'] + s.require_paths = ["lib"] - s.rdoc_options = ['--charset=UTF-8'] - s.extra_rdoc_files = %w[README.markdown LICENSE] + s.rdoc_options = ["--charset=UTF-8"] + s.extra_rdoc_files = %w(README.markdown LICENSE) - s.add_runtime_dependency('liquid', '~> 3.0') - s.add_runtime_dependency('kramdown', '~> 1.3') - s.add_runtime_dependency('mercenary', '~> 0.3.3') - s.add_runtime_dependency('safe_yaml', '~> 1.0') - s.add_runtime_dependency('colorator', '~> 1.0') - s.add_runtime_dependency('rouge', '~> 1.7') - s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0') - s.add_runtime_dependency('jekyll-watch', '~> 1.1') + s.add_runtime_dependency("liquid", "~> 3.0") + s.add_runtime_dependency("kramdown", "~> 1.3") + s.add_runtime_dependency("mercenary", "~> 0.3.3") + s.add_runtime_dependency("safe_yaml", "~> 1.0") + s.add_runtime_dependency("colorator", "~> 1.0") + s.add_runtime_dependency("rouge", "~> 1.7") + s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") + s.add_runtime_dependency("jekyll-watch", "~> 1.1") s.add_runtime_dependency("pathutil", "~> 0.9") - s.add_runtime_dependency('addressable', '~> 2.4') + s.add_runtime_dependency("addressable", "~> 2.4") end From 10b96b26bc82bfbedfe4be4a3914b50b4532fb6e Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 9 Jan 2017 21:39:19 +0100 Subject: [PATCH 1813/4996] Sort dependencies --- jekyll.gemspec | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 734df2e4934..b36bed9f1bf 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -29,14 +29,14 @@ Gem::Specification.new do |s| s.rdoc_options = ['--charset=UTF-8'] s.extra_rdoc_files = %w[README.markdown LICENSE] - s.add_runtime_dependency('liquid', '~> 3.0') - s.add_runtime_dependency('kramdown', '~> 1.3') - s.add_runtime_dependency('mercenary', '~> 0.3.3') - s.add_runtime_dependency('safe_yaml', '~> 1.0') - s.add_runtime_dependency('colorator', '~> 1.0') - s.add_runtime_dependency('rouge', '~> 1.7') - s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0') - s.add_runtime_dependency('jekyll-watch', '~> 1.1') + s.add_runtime_dependency("addressable", "~> 2.4") + s.add_runtime_dependency("colorator", "~> 1.0") + s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") + s.add_runtime_dependency("jekyll-watch", "~> 1.1") + s.add_runtime_dependency("kramdown", "~> 1.3") + s.add_runtime_dependency("liquid", "~> 3.0") + s.add_runtime_dependency("mercenary", "~> 0.3.3") s.add_runtime_dependency("pathutil", "~> 0.9") - s.add_runtime_dependency('addressable', '~> 2.4') + s.add_runtime_dependency("rouge", "~> 1.7") + s.add_runtime_dependency("safe_yaml", "~> 1.0") end From 335d9b3881fc5f8ef6ebf5ce3a392d9c80420e4b Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 9 Jan 2017 21:39:42 +0100 Subject: [PATCH 1814/4996] sort gems --- docs/_config.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index 32ae74bb0d4..cc7476e252b 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -28,14 +28,14 @@ twitter: logo: /img/logo-2x.png gems: + - jekyll-avatar - jekyll-feed + - jekyll-mentions - jekyll-redirect-from - - jemoji - - jekyll-sitemap - jekyll-seo-tag - - jekyll-avatar - - jekyll-mentions + - jekyll-sitemap + - jemoji exclude: - - README.md - .gitignore + - README.md From fb83ebadf61326bb628d6baa72b8db7711db6e6d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 9 Jan 2017 14:10:03 -0800 Subject: [PATCH 1815/4996] Update history to reflect merge of #5745 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b578b9bfb51..d58914065bf 100644 --- a/History.markdown +++ b/History.markdown @@ -41,6 +41,7 @@ * Bump to rake 12.0 (#5670) * Rubocop Gemfile (#5671) * update Classifier-Reborn to 2.1.0 (#5711) + * Rubocop: fix Rakefile and gemspec (#5745) ### Documentation From 47550935cb63d9432bb773fdd9e96ed926058e8d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 9 Jan 2017 14:14:03 -0800 Subject: [PATCH 1816/4996] Update history to reflect merge of #5725 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d58914065bf..8ff70c6bc06 100644 --- a/History.markdown +++ b/History.markdown @@ -42,6 +42,7 @@ * Rubocop Gemfile (#5671) * update Classifier-Reborn to 2.1.0 (#5711) * Rubocop: fix Rakefile and gemspec (#5745) + * Use `assert_nil` (#5725) ### Documentation From 4ef69b948c4d903047e4992cc68e5dfbc15b5717 Mon Sep 17 00:00:00 2001 From: yoostk Date: Tue, 10 Jan 2017 15:03:46 +0900 Subject: [PATCH 1817/4996] Fix a minor grammatical mistake on themes' document --- docs/_docs/themes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index c7d6d574474..81a77d20835 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -67,7 +67,7 @@ Add your template files in the corresponding folders, complete the `.gemspec` an Theme layouts and includes work just like they work in any Jekyll site. Place layouts in your theme's `/_layouts` folder, and place includes in your themes `/_includes` folder. -For example, if your theme has a `/_layouts/page.html` file, and a page has `layout: page` in its YAML front matter, Jekyll will first look to the site's `_layouts` folder for a the `page` layout, and if none exists, will use your theme's `page` layout. +For example, if your theme has a `/_layouts/page.html` file, and a page has `layout: page` in its YAML front matter, Jekyll will first look to the site's `_layouts` folder for the `page` layout, and if none exists, will use your theme's `page` layout. ### Assets From c48daa9d5b5768acdc0e30908844fc7ae604e1ef Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 10 Jan 2017 10:34:16 +0100 Subject: [PATCH 1818/4996] normalize whitespace --- jekyll.gemspec | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 4ddac2faf3d..71b5f31eb59 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -29,15 +29,14 @@ Gem::Specification.new do |s| s.rdoc_options = ["--charset=UTF-8"] s.extra_rdoc_files = %w(README.markdown LICENSE) - s.add_runtime_dependency("addressable", "~> 2.4") - s.add_runtime_dependency("colorator", "~> 1.0") + s.add_runtime_dependency("addressable", "~> 2.4") + s.add_runtime_dependency("colorator", "~> 1.0") s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") - s.add_runtime_dependency("jekyll-watch", "~> 1.1") - s.add_runtime_dependency("kramdown", "~> 1.3") - s.add_runtime_dependency("liquid", "~> 3.0") - s.add_runtime_dependency("mercenary", "~> 0.3.3") - s.add_runtime_dependency("pathutil", "~> 0.9") - s.add_runtime_dependency("rouge", "~> 1.7") - s.add_runtime_dependency("safe_yaml", "~> 1.0") - + s.add_runtime_dependency("jekyll-watch", "~> 1.1") + s.add_runtime_dependency("kramdown", "~> 1.3") + s.add_runtime_dependency("liquid", "~> 3.0") + s.add_runtime_dependency("mercenary", "~> 0.3.3") + s.add_runtime_dependency("pathutil", "~> 0.9") + s.add_runtime_dependency("rouge", "~> 1.7") + s.add_runtime_dependency("safe_yaml", "~> 1.0") end From f785d6f8d14ffb65588f4536a2ddc86bf8b3b6dc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 10 Jan 2017 01:45:46 -0800 Subject: [PATCH 1819/4996] Update history to reflect merge of #5748 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8ff70c6bc06..de38e96d74e 100644 --- a/History.markdown +++ b/History.markdown @@ -60,6 +60,7 @@ * Replace a dead link with a web-archived one (#5738) * Remove duplicate paragraph. (#5740) * Addition of a sample "typical post" (#5473) + * Fix a minor grammatical mistake on themes' document (#5748) ## 3.3.1 / 2016-11-14 From 0210022c757e6d931db508e160217c2088a39e64 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 10 Jan 2017 01:46:18 -0800 Subject: [PATCH 1820/4996] Update history to reflect merge of #5746 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index de38e96d74e..61315abecc8 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * Use the current year for the LICENSE of theme (#5712) * Update License (#5713) * Use Addressable instead of URI to decode (#5726) + * Sort gems (#5746) ### Bug Fixes From faa67bcd62e3d55e07301c86f95d77267fe2082a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 10 Jan 2017 12:12:55 -0500 Subject: [PATCH 1821/4996] include: fix 'no implicit conversion of nil to String' This is when either 'dir' or 'file' is nil. --- lib/jekyll/tags/include.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 674617507f2..cf05219718d 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -112,8 +112,8 @@ def tag_includes_dirs(context) def locate_include_file(context, file, safe) includes_dirs = tag_includes_dirs(context) includes_dirs.each do |dir| - path = File.join(dir, file) - return path if valid_include_file?(path, dir, safe) + path = File.join(dir.to_s, file.to_s) + return path if valid_include_file?(path, dir.to_s, safe) end raise IOError, "Could not locate the included file '#{file}' in any of "\ "#{includes_dirs}. Ensure it exists in one of those directories and, "\ @@ -163,7 +163,7 @@ def load_cached_partial(path, context) end def valid_include_file?(path, dir, safe) - !(outside_site_source?(path, dir, safe) || !File.exist?(path)) + !(outside_site_source?(path, dir, safe) || !File.file?(path)) end def outside_site_source?(path, dir, safe) From 22368896fb6776766e82b746fb96bb55fcbbdd0d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 10 Jan 2017 12:17:42 -0500 Subject: [PATCH 1822/4996] Rearrange some pieces of History.markdown. --- History.markdown | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/History.markdown b/History.markdown index 61315abecc8..887a21653b4 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,20 @@ ## HEAD +### Minor Enhancements + + * Add connector param to `array_to_sentence_string` filter (#5597) + * Adds `group_by_exp` filter (#5513) + * Use the current year for the LICENSE of theme (#5712) + * Update License (#5713) + * Use Addressable instead of URI to decode (#5726) + +### Bug Fixes + + * Escaped regular expressions when using `post_url`. (#5605) + * fix date parsing in file names to be stricter (#5609) + * Add a module to re-define `ENV["TZ"]` in Windows (#5612) + * Use each instead of map to actually return nothing (#5668) + ### Site Enhancements * Remove instructions to install Jekyll 2 on Windows (#5582) @@ -16,22 +31,7 @@ * Add Jekyll-Post to list of plugins (#5705) * Add jekyll-numbered-headings (#5688) * Docs: move permalinks from documents into config (#5544) - -### Minor Enhancements - - * Add connector param to array_to_sentence_string filter (#5597) - * Adds group_by_exp filter (#5513) - * Use the current year for the LICENSE of theme (#5712) - * Update License (#5713) - * Use Addressable instead of URI to decode (#5726) - * Sort gems (#5746) - -### Bug Fixes - - * Escaped regular expressions when using post_url. (#5605) - * fix date parsing in file names to be stricter (#5609) - * Add a module to re-define `ENV["TZ"]` in Windows (#5612) - * Use each instead of map to actually return nothing (#5668) + * Sort gems in `docs/_config.yml` (#5746) ### Development Fixes @@ -44,6 +44,7 @@ * update Classifier-Reborn to 2.1.0 (#5711) * Rubocop: fix Rakefile and gemspec (#5745) * Use `assert_nil` (#5725) + * Sort gems in `jekyll.gemspec` (#5746) ### Documentation From 4f84b522b518d51864917fd1a70bbbc455039ac0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 10 Jan 2017 12:05:59 -0800 Subject: [PATCH 1823/4996] Update history to reflect merge of #5621 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 887a21653b4..d7950127478 100644 --- a/History.markdown +++ b/History.markdown @@ -64,6 +64,10 @@ * Addition of a sample "typical post" (#5473) * Fix a minor grammatical mistake on themes' document (#5748) +### -dev + + * Correct comments in data_reader.rb (#5621) + ## 3.3.1 / 2016-11-14 ### Minor Enhancements From c198b08ee87f7441eaf0ddc8a23014553860e3c8 Mon Sep 17 00:00:00 2001 From: Max Chadwick Date: Tue, 10 Jan 2017 22:50:30 -0500 Subject: [PATCH 1824/4996] Add jekyll-pre-commit to plugins list --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 4a5e61cfd78..05fe14343e5 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -919,6 +919,7 @@ LESS.js files during generation. - [jekyll-migrate-permalink](https://github.com/mpchadwick/jekyll-migrate-permalink): Adds a `migrate-permalink` sub-command to help deal with side effects of changing your permalink. - [Jekyll-Post](https://github.com/robcrocombe/jekyll-post): A CLI tool to easily draft, edit, and publish Jekyll posts. - [jekyll-numbered-headings](https://github.com/muratayusuke/jekyll-numbered-headings): Adds ordered number to headings. +- [jekyll-pre-commit](https://github.com/mpchadwick/jekyll-pre-commit): A framework for running checks against your posts using a git pre-commit hook before you publish them. #### Editors From 07d161c2ce8707d7320fbaf09af898e075f4a240 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 11 Jan 2017 01:42:10 -0800 Subject: [PATCH 1825/4996] Update history to reflect merge of #5752 [ci skip] --- History.markdown | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/History.markdown b/History.markdown index d7950127478..2d769ba8efb 100644 --- a/History.markdown +++ b/History.markdown @@ -62,11 +62,9 @@ * Replace a dead link with a web-archived one (#5738) * Remove duplicate paragraph. (#5740) * Addition of a sample "typical post" (#5473) - * Fix a minor grammatical mistake on themes' document (#5748) - -### -dev - + * Fix a minor grammatical mistake on themes' document ### -dev (#5748) * Correct comments in data_reader.rb (#5621) + * Add jekyll-pre-commit to plugins list (#5752) ## 3.3.1 / 2016-11-14 From d77ed5e608254123c6d0d0850338e6193ef38d84 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 11 Jan 2017 10:49:21 +0100 Subject: [PATCH 1826/4996] Add missing merge labels for jekyllbot --- docs/_docs/maintaining/merging-a-pull-request.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_docs/maintaining/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md index 80ad6f7c5e3..c7efe0b5e20 100644 --- a/docs/_docs/maintaining/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -38,8 +38,9 @@ The categories match the H3's in the history/changelog file, and they are: 1. Major Enhancements (`+major`) – major updates or breaking changes to the code which necessitate a major version bump (v3 ~> v4) 2. Minor Enhancements (`+minor`) – minor updates (feature, enhancement) which necessitate a minor version bump (v3.1 ~> v3.2) 3. Bug Fixes (`+bug`) – corrections to code which do not change or add functionality, which necessitate a patch version bump (v3.1.0 ~> v3.1.1) -4. Site Enhancements (`+site`) – changes to the source of https://jekyllrb.com, found in `site/` +4. Site Enhancements (`+site` or `+doc`) – changes to the source or the documentation found in `docs/` and published on https://jekyllrb.com, 5. Development Fixes (`+dev`) – changes which do not affect user-facing functionality or documentation, such as test fixes or bumping internal dependencies +6. Forward Ports (`+port`) — forward-port changes, e.g. from v3.1.4. Once @jekyllbot has merged the pull request, you should see three things: From 02858fdf089bce0e4bb7901ef8e5b13d61e91c01 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 11 Jan 2017 12:05:56 -0500 Subject: [PATCH 1827/4996] include: improve boolean logic in #valid_include_file? --- lib/jekyll/tags/include.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index cf05219718d..ca74087da28 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -163,7 +163,7 @@ def load_cached_partial(path, context) end def valid_include_file?(path, dir, safe) - !(outside_site_source?(path, dir, safe) || !File.file?(path)) + !outside_site_source?(path, dir, safe) && File.file?(path) end def outside_site_source?(path, dir, safe) From 8ae2673ebae7c9d2a7c75e3e3e95729cde04cdfc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 11 Jan 2017 09:13:39 -0800 Subject: [PATCH 1828/4996] Update history to reflect merge of #5744 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2d769ba8efb..bb10365f06a 100644 --- a/History.markdown +++ b/History.markdown @@ -32,6 +32,7 @@ * Add jekyll-numbered-headings (#5688) * Docs: move permalinks from documents into config (#5544) * Sort gems in `docs/_config.yml` (#5746) + * [site] Use defaults for docs and news-items (#5744) ### Development Fixes From 538cff15e9a9d68d7bf6c5727b8592d3cccaf332 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 11 Jan 2017 20:57:34 +0100 Subject: [PATCH 1829/4996] report @parkr feedback --- docs/_docs/maintaining/merging-a-pull-request.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/_docs/maintaining/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md index c7efe0b5e20..ed34adf1863 100644 --- a/docs/_docs/maintaining/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -38,9 +38,10 @@ The categories match the H3's in the history/changelog file, and they are: 1. Major Enhancements (`+major`) – major updates or breaking changes to the code which necessitate a major version bump (v3 ~> v4) 2. Minor Enhancements (`+minor`) – minor updates (feature, enhancement) which necessitate a minor version bump (v3.1 ~> v3.2) 3. Bug Fixes (`+bug`) – corrections to code which do not change or add functionality, which necessitate a patch version bump (v3.1.0 ~> v3.1.1) -4. Site Enhancements (`+site` or `+doc`) – changes to the source or the documentation found in `docs/` and published on https://jekyllrb.com, -5. Development Fixes (`+dev`) – changes which do not affect user-facing functionality or documentation, such as test fixes or bumping internal dependencies -6. Forward Ports (`+port`) — forward-port changes, e.g. from v3.1.4. +4. Documentation (`+doc`) - changes to the documentation found in `docs/_docs/` +5. Site Enhancements (`+site`) – changes to the source of [https://jekyllrb.com](https://jekyllrb.com) found in `docs/` +6. Development Fixes (`+dev`) – changes which do not affect user-facing functionality or documentation, such as test fixes or bumping internal dependencies +7. Forward Ports (`+port`) — bug fixes applied to a previous version of Jekyll pulled onto `master`, e.g. cherry-picked commits from `3-1-stable` to `master` Once @jekyllbot has merged the pull request, you should see three things: From 335c8fcf62bfb48c3555e0cd2a8a6d89fdfd1d7e Mon Sep 17 00:00:00 2001 From: BlueberryFoxtrot Date: Thu, 12 Jan 2017 17:28:32 +0100 Subject: [PATCH 1830/4996] Update installation.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Addition of *Running Jekyll on Ubuntu* section, to address Ubuntu stumbling block as per https://github.com/jekyll/jekyll/issues/5719. 2. Restructuring, and I hope I understood correctly when NodeJS/Python are/aren't required. 3. Gentler wording – it's probably not a good idea to tell punters who hit this page because they ran into trouble that installing Jekyll *is* easy and straight-forward; it *ought to be* straight-forward. (There's always the potential for pain and confusion if not all dependencies are in place.) --- docs/_docs/installation.md | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index d264997d436..bbc35fabd92 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -10,16 +10,31 @@ encountered and how we might make the process easier. ### Requirements -Installing Jekyll is easy and straight-forward, but there are a few -requirements you’ll need to make sure your system has before you start. +Installing Jekyll ought to be straight-forward if all requirements are met. +Before you start, make sure your system has the following: -- [Ruby](https://www.ruby-lang.org/en/downloads/) (including development +- Linux, Unix, or macOS +- [Ruby](https://www.ruby-lang.org/en/downloads/) (including all development headers, v1.9.3 or above for Jekyll 2 and v2 or above for Jekyll 3) - [RubyGems](https://rubygems.org/pages/download) -- Linux, Unix, or macOS -- [NodeJS](https://nodejs.org/), or another JavaScript runtime (Jekyll 2 and -earlier, for CoffeeScript support). -- [Python 2.7](https://www.python.org/downloads/) (for Jekyll 2 and earlier) + +#### Only required for Jekyll 2 and earlier +- [NodeJS](https://nodejs.org/), or another JavaScript runtime (for CoffeeScript support). +- [Python 2.7](https://www.python.org/downloads/) + +
    +
    Running Jekyll on Ubuntu
    +

    + Users of Jekyll on Ubuntu have reported encountering + Could not locate Gemfile or .bundle/ directory error messages at the + bundle exec jekyll serve step in the Quick-start guide. + The likely cause is that all installation requirements have not been fully met. + Recent stock Ubuntu distributions require the installation of both the ruby and ruby-all-dev + packages, e.g. via sudo apt-get install ruby ruby-all-dev (RubyGems should be included in ruby). + The ruby-all-dev .deb package in particular contains development header files whose absence causes + the above error message. +

    +
    Running Jekyll on Windows
    From 2fc4fdfe79223d7869417efb8c26ededaedda06c Mon Sep 17 00:00:00 2001 From: BlueberryFoxtrot Date: Thu, 12 Jan 2017 17:39:21 +0100 Subject: [PATCH 1831/4996] Update quickstart.md --- docs/_docs/quickstart.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index 984275f7a37..e84f87beb5e 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -3,7 +3,7 @@ title: Quick-start guide permalink: /docs/quickstart/ --- -If you already have [Ruby](https://www.ruby-lang.org/en/downloads/) and [RubyGems](https://rubygems.org/pages/download) installed (see Jekyll's [requirements](/docs/installation/#requirements/)), you can create a new Jekyll site by doing the following: +If you already have a full [Ruby](https://www.ruby-lang.org/en/downloads/) development environment with all headers and [RubyGems](https://rubygems.org/pages/download) installed (see Jekyll's [requirements](/docs/installation/#requirements/)), you can create a new Jekyll site by doing the following: ```sh # Install Jekyll and Bundler gems through RubyGems @@ -21,6 +21,8 @@ If you already have [Ruby](https://www.ruby-lang.org/en/downloads/) and [RubyGem # Now browse to http://localhost:4000 ``` +If you encounter any unexpected errors during the above, please refer to the already-mentioned [requirements](/docs/installation/#requirements/) page, as you might be missing development headers or other prerequisites. + ## About Bundler `gem install jekyll bundler` installs the [jekyll](https://rubygems.org/gems/jekyll/) and [bundler](https://rubygems.org/gems/bundler) gems through [RubyGems](https://rubygems.org/). You need only to install the gems one time — not every time you create a new Jekyll project. Here are some additional details: From 1d885911bce091a8d8f89df410896809ec6e8bd4 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 12 Jan 2017 17:52:29 -0600 Subject: [PATCH 1832/4996] Rubocop: Require consistent comma in multiline literals --- .rubocop.yml | 2 + features/support/formatter.rb | 2 +- features/support/helpers.rb | 4 +- lib/jekyll/commands/doctor.rb | 2 +- lib/jekyll/commands/serve.rb | 12 +-- lib/jekyll/commands/serve/servlet.rb | 2 +- lib/jekyll/configuration.rb | 10 +- .../converters/markdown/kramdown_parser.rb | 2 +- .../converters/markdown/redcarpet_parser.rb | 2 +- lib/jekyll/document.rb | 6 +- lib/jekyll/drops/jekyll_drop.rb | 2 +- lib/jekyll/entry_filter.rb | 2 +- lib/jekyll/filters/grouping_filters.rb | 2 +- lib/jekyll/hooks.rb | 14 +-- lib/jekyll/log_adapter.rb | 2 +- lib/jekyll/page.rb | 4 +- lib/jekyll/plugin.rb | 2 +- lib/jekyll/readers/data_reader.rb | 2 +- lib/jekyll/readers/post_reader.rb | 2 +- lib/jekyll/regenerator.rb | 2 +- lib/jekyll/static_file.rb | 6 +- lib/jekyll/tags/highlight.rb | 4 +- lib/jekyll/theme_builder.rb | 2 +- lib/jekyll/utils/ansi.rb | 2 +- test/helper.rb | 12 +-- test/test_collections.rb | 18 ++-- test/test_commands_serve.rb | 12 +-- test/test_configuration.rb | 50 +++++----- test/test_doctor_command.rb | 4 +- test/test_document.rb | 94 +++++++++---------- test/test_drop.rb | 2 +- test/test_entry_filter.rb | 2 +- test/test_excerpt.rb | 4 +- test/test_filters.rb | 78 +++++++-------- test/test_front_matter_defaults.rb | 58 ++++++------ test/test_kramdown.rb | 24 ++--- test/test_layout_reader.rb | 2 +- test/test_liquid_renderer.rb | 2 +- test/test_page.rb | 6 +- test/test_plugin_manager.rb | 8 +- test/test_rdiscount.rb | 4 +- test/test_redcarpet.rb | 4 +- test/test_regenerator.rb | 12 +-- test/test_related_posts.rb | 2 +- test/test_sass.rb | 2 +- test/test_site.rb | 8 +- test/test_static_file.rb | 6 +- test/test_tags.rb | 54 +++++------ 48 files changed, 281 insertions(+), 279 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 0324c4121b8..67f212aea57 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -127,5 +127,7 @@ Style/StringLiterals: EnforcedStyle: double_quotes Style/StringLiteralsInInterpolation: EnforcedStyle: double_quotes +Style/TrailingCommaInLiteral: + EnforcedStyleForMultiline: consistent_comma Style/UnneededCapitalW: Enabled: false diff --git a/features/support/formatter.rb b/features/support/formatter.rb index 2223701012c..79d1466480f 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -16,7 +16,7 @@ class Formatter :pending => "\u203D".yellow, :undefined => "\u2718".red, :passed => "\u2714".green, - :skipped => "\u203D".blue + :skipped => "\u203D".blue, }.freeze # diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 1340808a313..b8044a7c53e 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -142,7 +142,7 @@ def location(folder, direction) end [before || ".", - after || "."] + after || ".",] end # @@ -160,7 +160,7 @@ def seconds_agnostic_datetime(datetime = Time.now) [ Regexp.escape(date), "#{time}:\\d{2}", - Regexp.escape(zone) + Regexp.escape(zone), ] \ .join("\\ ") end diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index c7f387df7bb..59004c96049 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -35,7 +35,7 @@ def healthy?(site) fsnotify_buggy?(site), !deprecated_relative_permalinks(site), !conflicting_urls(site), - !urls_only_differ_by_case(site) + !urls_only_differ_by_case(site), ].all? end diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index e0da4807915..1691359569d 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -10,9 +10,9 @@ class << self "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], "port" => ["-P", "--port [PORT]", "Port to listen on"], "show_dir_listing" => ["--show-dir-listing", - "Show a directory listing instead of loading your index file."], + "Show a directory listing instead of loading your index file.",], "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", - "Skips the initial site build which occurs before the server is started."] + "Skips the initial site build which occurs before the server is started.",], }.freeze # @@ -88,7 +88,7 @@ def webrick_opts(opts) index.rhtml index.cgi index.xml - ) + ), } opts[:DirectoryIndex] = [] if opts[:JekyllOptions]["show_dir_listing"] @@ -116,8 +116,8 @@ def file_handler_opts WEBrick::Config::FileHandler.merge({ :FancyIndexing => true, :NondisclosureName => [ - ".ht*", "~*" - ] + ".ht*", "~*", + ], }) end @@ -139,7 +139,7 @@ def format_url(ssl_enabled, address, port, baseurl = nil) :prefix => ssl_enabled ? "https" : "http", :address => address, :port => port, - :baseurl => baseurl ? "#{baseurl}/" : "" + :baseurl => baseurl ? "#{baseurl}/" : "", }) end diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index d0dd22af8d7..3ae5cf32367 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -6,7 +6,7 @@ class Serve class Servlet < WEBrick::HTTPServlet::FileHandler DEFAULTS = { "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ - "no-store, no-cache, must-revalidate" + "no-store, no-cache, must-revalidate", }.freeze def initialize(server, root, callbacks) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 8dc1807d14a..27e245e4bcb 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -58,15 +58,15 @@ class Configuration < Hash "defaults" => [], "liquid" => { - "error_mode" => "warn" + "error_mode" => "warn", }, "rdiscount" => { - "extensions" => [] + "extensions" => [], }, "redcarpet" => { - "extensions" => [] + "extensions" => [], }, "kramdown" => { @@ -76,8 +76,8 @@ class Configuration < Hash "smart_quotes" => "lsquo,rsquo,ldquo,rdquo", "input" => "GFM", "hard_wrap" => false, - "footnote_nr" => 1 - } + "footnote_nr" => 1, + }, }.map { |k, v| [k, v.freeze] }].freeze class << self diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index dd71c6c1d5f..a7252f1a689 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -11,7 +11,7 @@ class KramdownParser "line_numbers" => "inline", "line_number_start" => 1, "tab_width" => 4, - "wrap" => "div" + "wrap" => "div", }.freeze def initialize(config) diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index b5ec99f55ce..aa170feb3b7 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -21,7 +21,7 @@ def block_code(code, lang) code, { :lexer => lang, - :options => { :encoding => "utf-8" } + :options => { :encoding => "utf-8" }, } ), lang diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index ad5884efb68..fecd58285c3 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -196,7 +196,7 @@ def url @url = URL.new({ :template => url_template, :placeholders => url_placeholders, - :permalink => permalink + :permalink => permalink, }).to_s end @@ -469,14 +469,14 @@ def populate_categories "category", "categories" ) - ).map(&:to_s).flatten.uniq + ).map(&:to_s).flatten.uniq, }) end private def populate_tags merge_data!({ - "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten + "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten, }) end diff --git a/lib/jekyll/drops/jekyll_drop.rb b/lib/jekyll/drops/jekyll_drop.rb index 50163d7461b..e3d2eb38d52 100644 --- a/lib/jekyll/drops/jekyll_drop.rb +++ b/lib/jekyll/drops/jekyll_drop.rb @@ -20,7 +20,7 @@ def environment def to_h @to_h ||= { "version" => version, - "environment" => environment + "environment" => environment, } end diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index 5f3431d8ed3..e4187d42d8e 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -2,7 +2,7 @@ module Jekyll class EntryFilter attr_reader :site SPECIAL_LEADING_CHARACTERS = [ - ".", "_", "#", "~" + ".", "_", "#", "~", ].freeze def initialize(site, base_directory = nil) diff --git a/lib/jekyll/filters/grouping_filters.rb b/lib/jekyll/filters/grouping_filters.rb index a16901d92b1..e7a904a4746 100644 --- a/lib/jekyll/filters/grouping_filters.rb +++ b/lib/jekyll/filters/grouping_filters.rb @@ -54,7 +54,7 @@ def grouped_array(groups) array << { "name" => item.first, "items" => item.last, - "size" => item.last.size + "size" => item.last.size, } end end diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index 9083b27a605..5f21b5f6fea 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -6,7 +6,7 @@ module Hooks PRIORITY_MAP = { :low => 10, :normal => 20, - :high => 30 + :high => 30, }.freeze # initial empty hooks @@ -17,26 +17,26 @@ module Hooks :post_read => [], :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [], }, :pages => { :post_init => [], :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [], }, :posts => { :post_init => [], :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [], }, :documents => { :post_init => [], :pre_render => [], :post_render => [], - :post_write => [] - } + :post_write => [], + }, } # map of all hooks and their priorities @@ -64,7 +64,7 @@ def self.register_one(owner, event, priority, &block) :post_init => [], :pre_render => [], :post_render => [], - :post_write => [] + :post_write => [], } unless @registry[owner][event] diff --git a/lib/jekyll/log_adapter.rb b/lib/jekyll/log_adapter.rb index 70173b91b9a..965f3295702 100644 --- a/lib/jekyll/log_adapter.rb +++ b/lib/jekyll/log_adapter.rb @@ -6,7 +6,7 @@ class LogAdapter :debug => ::Logger::DEBUG, :info => ::Logger::INFO, :warn => ::Logger::WARN, - :error => ::Logger::ERROR + :error => ::Logger::ERROR, }.freeze # Public: Create a new instance of a log writer diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 7619966de76..324a867d475 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -98,7 +98,7 @@ def url @url ||= URL.new({ :template => template, :placeholders => url_placeholders, - :permalink => permalink + :permalink => permalink, }).to_s end @@ -108,7 +108,7 @@ def url_placeholders { :path => @dir, :basename => basename, - :output_ext => output_ext + :output_ext => output_ext, } end diff --git a/lib/jekyll/plugin.rb b/lib/jekyll/plugin.rb index bcc1bf7e990..4680be32434 100644 --- a/lib/jekyll/plugin.rb +++ b/lib/jekyll/plugin.rb @@ -5,7 +5,7 @@ class Plugin :highest => 100, :lowest => -100, :normal => 0, - :high => 10 + :high => 10, }.freeze # diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index 6744ae05ce1..1083d62b26b 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -54,7 +54,7 @@ def read_data_file(path) when ".csv" CSV.read(path, { :headers => true, - :encoding => site.config["encoding"] + :encoding => site.config["encoding"], }).map(&:to_hash) else SafeYAML.load_file(path) diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index 123709e7374..70688875da5 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -57,7 +57,7 @@ def read_content(dir, magic_dir, matcher) path = @site.in_source_dir(File.join(dir, magic_dir, entry)) Document.new(path, { :site => @site, - :collection => @site.posts + :collection => @site.posts, }) end.reject(&:nil?) end diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 4d89da2e0e8..09ff309a28d 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -40,7 +40,7 @@ def add(path) metadata[path] = { "mtime" => File.mtime(path), - "deps" => [] + "deps" => [], } cache[path] = true end diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 927a9b47105..53b945d4168 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -101,7 +101,7 @@ def to_liquid "name" => name, "extname" => extname, "modified_time" => modified_time, - "path" => File.join("", relative_path) + "path" => File.join("", relative_path), } end @@ -112,7 +112,7 @@ def placeholders @collection.relative_directory.size..relative_path.size], :output_ext => "", :name => "", - :title => "" + :title => "", } end @@ -125,7 +125,7 @@ def url else ::Jekyll::URL.new({ :template => @collection.url_template, - :placeholders => placeholders + :placeholders => placeholders, }) end.to_s.gsub(%r!/$!, "") end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 43b0c62f7ef..86b9171b1fb 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -54,7 +54,7 @@ def sanitized_opts(opts, is_safe) [:hl_lines, opts.fetch(:hl_lines, nil)], [:linenos, opts.fetch(:linenos, nil)], [:encoding, opts.fetch(:encoding, "utf-8")], - [:cssclass, opts.fetch(:cssclass, nil)] + [:cssclass, opts.fetch(:cssclass, nil)], ].reject { |f| f.last.nil? }] else opts @@ -125,7 +125,7 @@ def render_codehighlighter(code) def add_code_tag(code) code_attributes = [ "class=\"language-#{@lang.to_s.tr("+", "-")}\"", - "data-lang=\"#{@lang}\"" + "data-lang=\"#{@lang}\"", ].join(" ") "
    "\
             "#{code.chomp}
    " diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index 68a5eeabf3f..f1c97e37974 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -28,7 +28,7 @@ def root def template_file(filename) [ root.join("theme_template", "#{filename}.erb"), - root.join("theme_template", filename.to_s) + root.join("theme_template", filename.to_s), ].find(&:exist?) end diff --git a/lib/jekyll/utils/ansi.rb b/lib/jekyll/utils/ansi.rb index 4be163c54ad..8bdd2322168 100644 --- a/lib/jekyll/utils/ansi.rb +++ b/lib/jekyll/utils/ansi.rb @@ -17,7 +17,7 @@ module Ansi :yellow => 33, :white => 37, :blue => 34, - :cyan => 36 + :cyan => 36, }.freeze # Strip ANSI from the current string. It also strips cursor stuff, diff --git a/test/helper.rb b/test/helper.rb index 0c6935a03fb..e33ddae7a49 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -46,7 +46,7 @@ def jruby? Minitest::Reporters.use! [ Minitest::Reporters::DefaultReporter.new( :color => true - ) + ), ] module Minitest::Assertions @@ -107,9 +107,9 @@ def fixture_document(relative_path) site = fixture_site({ "collections" => { "methods" => { - "output" => true - } - } + "output" => true, + }, + }, }) site.read matching_doc = site.collections["methods"].docs.find do |doc| @@ -133,10 +133,10 @@ def build_configs(overrides, base_hash = default_configuration) def site_configuration(overrides = {}) full_overrides = build_configs(overrides, build_configs({ "destination" => dest_dir, - "incremental" => false + "incremental" => false, })) Configuration.from(full_overrides.merge({ - "source" => source_dir + "source" => source_dir, })) end diff --git a/test/test_collections.rb b/test/test_collections.rb index 0dca8443994..0607208b8f3 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -91,9 +91,9 @@ class TestCollections < JekyllUnitTest @site = fixture_site({ "collections" => { "methods" => { - "permalink" => "/awesome/:path/" - } - } + "permalink" => "/awesome/:path/", + }, + }, }) @site.process @collection = @site.collections["methods"] @@ -107,7 +107,7 @@ class TestCollections < JekyllUnitTest context "with a collection" do setup do @site = fixture_site({ - "collections" => ["methods"] + "collections" => ["methods"], }) @site.process @collection = @site.collections["methods"] @@ -158,9 +158,9 @@ class TestCollections < JekyllUnitTest "collections" => { "methods" => { "foo" => "bar", - "baz" => "whoo" - } - } + "baz" => "whoo", + }, + }, }) @site.process @collection = @site.collections["methods"] @@ -175,7 +175,7 @@ class TestCollections < JekyllUnitTest setup do @site = fixture_site({ "collections" => ["methods"], - "safe" => true + "safe" => true, }) @site.process @collection = @site.collections["methods"] @@ -198,7 +198,7 @@ class TestCollections < JekyllUnitTest setup do @site = fixture_site({ "collections" => ["with.dots"], - "safe" => true + "safe" => true, }) @site.process @collection = @site.collections["with.dots"] diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 143dc2a549f..fa0f7f67bf3 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -86,12 +86,12 @@ def custom_opts(what) "config" => %w(_config.yml _development.yml), "serving" => true, "watch" => false, # for not having guard output when running the tests - "url" => "http://localhost:4000" + "url" => "http://localhost:4000", } expect(Jekyll::Commands::Serve).to receive(:process).with(custom_options) @merc.execute(:serve, { "config" => %w(_config.yml _development.yml), - "watch" => false }) + "watch" => false, }) end context "in development environment" do @@ -113,7 +113,7 @@ def custom_opts(what) "port" => "9999", "url" => "https://jekyllrb.com/", "ssl_cert" => "foo", - "ssl_key" => "bar" + "ssl_key" => "bar", }) assert_equal 1, Jekyll.sites.count @@ -146,13 +146,13 @@ def custom_opts(what) should "raise if enabling without key or cert" do assert_raises RuntimeError do custom_opts({ - "ssl_key" => "foo" + "ssl_key" => "foo", }) end assert_raises RuntimeError do custom_opts({ - "ssl_key" => "foo" + "ssl_key" => "foo", }) end end @@ -166,7 +166,7 @@ def custom_opts(what) "ssl_cert" => "foo", "source" => "bar", "enable_ssl" => true, - "ssl_key" => "bar" + "ssl_key" => "bar", }) assert result[:SSLEnable] diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 696fc3e9f63..febc0cbee1b 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -4,7 +4,7 @@ class TestConfiguration < JekyllUnitTest test_config = { "source" => new(nil).source_dir, - "destination" => dest_dir + "destination" => dest_dir, } context ".from" do @@ -34,8 +34,8 @@ class TestConfiguration < JekyllUnitTest { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - } + "permalink" => "/:categories/:year/:month/:day/:title:output_ext", + }, } ) end @@ -85,8 +85,8 @@ class TestConfiguration < JekyllUnitTest { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title/" - } + "permalink" => "/:categories/:year/:month/:day/:title/", + }, } ) @@ -109,14 +109,14 @@ class TestConfiguration < JekyllUnitTest :permalink => "date", "baseurl" => "/", :include => [".htaccess"], - :source => "./" + :source => "./", }] @string_keys = Configuration[{ "markdown" => "kramdown", "permalink" => "date", "baseurl" => "/", "include" => [".htaccess"], - "source" => "./" + "source" => "./", }] end should "stringify symbol keys" do @@ -132,7 +132,7 @@ class TestConfiguration < JekyllUnitTest @no_override = {} @one_config_file = { "config" => "config.yml" } @multiple_files = { - "config" => %w(config/site.yml config/deploy.toml configuration.yml) + "config" => %w(config/site.yml config/deploy.toml configuration.yml), } end @@ -205,7 +205,7 @@ class TestConfiguration < JekyllUnitTest "pygments" => true, "plugins" => true, "layouts" => true, - "data_source" => true + "data_source" => true, }] end should "unset 'auto' and 'watch'" do @@ -255,7 +255,7 @@ class TestConfiguration < JekyllUnitTest setup do @config = proc do |val| Configuration[{ - "paginate" => val + "paginate" => val, }] end end @@ -327,7 +327,7 @@ class TestConfiguration < JekyllUnitTest :default => source_dir("_config.yml"), :other => source_dir("_config.live.yml"), :toml => source_dir("_config.dev.toml"), - :empty => "" + :empty => "", } end @@ -372,7 +372,7 @@ class TestConfiguration < JekyllUnitTest Jekyll.logger.log_level = :warn assert_equal \ site_configuration({ "baseurl" => "/you-beautiful-blog-you", - "title" => "My magnificent site, wut" }), + "title" => "My magnificent site, wut", }), Jekyll.configuration(test_config.merge({ "config" => [@paths[:toml]] })) Jekyll.logger.log_level = :info end @@ -435,9 +435,9 @@ class TestConfiguration < JekyllUnitTest "docs" => {}, "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - } - } + "permalink" => "/:categories/:year/:month/:day/:title:output_ext", + }, + }, }) end @@ -449,9 +449,9 @@ class TestConfiguration < JekyllUnitTest "collections" => { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - } - } + "permalink" => "/:categories/:year/:month/:day/:title:output_ext", + }, + }, }) end @@ -461,9 +461,9 @@ class TestConfiguration < JekyllUnitTest "collections" => { "posts" => { "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title:output_ext" - } - } + "permalink" => "/:categories/:year/:month/:day/:title:output_ext", + }, + }, }) end @@ -471,16 +471,16 @@ class TestConfiguration < JekyllUnitTest posts_permalink = "/:year/:title/" conf = Configuration[default_configuration].tap do |c| c["collections"] = { - "posts" => { "permalink" => posts_permalink } + "posts" => { "permalink" => posts_permalink }, } end assert_equal conf.add_default_collections, conf.merge({ "collections" => { "posts" => { "output" => true, - "permalink" => posts_permalink - } - } + "permalink" => posts_permalink, + }, + }, }) end end diff --git a/test/test_doctor_command.rb b/test/test_doctor_command.rb index 652175b9cf4..8861440255c 100644 --- a/test/test_doctor_command.rb +++ b/test/test_doctor_command.rb @@ -10,7 +10,7 @@ class TestDoctorCommand < JekyllUnitTest should "return success on a valid site/page" do @site = Site.new(Jekyll.configuration({ "source" => File.join(source_dir, "/_urls_differ_by_case_valid"), - "destination" => dest_dir + "destination" => dest_dir, })) @site.process output = capture_stderr do @@ -23,7 +23,7 @@ class TestDoctorCommand < JekyllUnitTest should "return warning for pages only differing by case" do @site = Site.new(Jekyll.configuration({ "source" => File.join(source_dir, "/_urls_differ_by_case_invalid"), - "destination" => dest_dir + "destination" => dest_dir, })) @site.process output = capture_stderr do diff --git a/test/test_document.rb b/test/test_document.rb index 7c9df18c7dd..f274dd5327c 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -8,7 +8,7 @@ def assert_equal_value(key, one, other) context "a document in a collection" do setup do @site = fixture_site({ - "collections" => ["methods"] + "collections" => ["methods"], }) @site.process @document = @site.collections["methods"].docs.detect do |d| @@ -118,10 +118,10 @@ def assert_equal_value(key, one, other) "scope" => { "path"=>"", "type"=>"slides" }, "values" => { "nested" => { - "key" => "myval" - } - } - }] + "key" => "myval", + }, + }, + },], }) @site.process @document = @site.collections["slides"].docs.select { |d| d.is_a?(Document) }.first @@ -143,10 +143,10 @@ def assert_equal_value(key, one, other) "values" => { "nested" => { "test1" => "default1", - "test2" => "default1" - } - } - }] + "test2" => "default1", + }, + }, + },], }) @site.process @document = @site.collections["slides"].docs[1] @@ -170,10 +170,10 @@ def assert_equal_value(key, one, other) "scope" => { "path"=>"_slides", "type"=>"slides" }, "values" => { "nested" => { - "key" => "value123" - } - } - }] + "key" => "value123", + }, + }, + },], }) @site.process @document = @site.collections["slides"].docs.first @@ -194,10 +194,10 @@ def assert_equal_value(key, one, other) "scope" => { "path"=>"somepath", "type"=>"slides" }, "values" => { "nested" => { - "key" => "myval" - } - } - }] + "key" => "myval", + }, + }, + },], }) @site.process @document = @site.collections["slides"].docs.first @@ -213,7 +213,7 @@ def assert_equal_value(key, one, other) context "a document in a collection with a custom permalink" do setup do @site = fixture_site({ - "collections" => ["slides"] + "collections" => ["slides"], }) @site.process @document = @site.collections["slides"].docs[2] @@ -235,10 +235,10 @@ def assert_equal_value(key, one, other) "collections" => { "slides" => { "output" => true, - "permalink" => "/slides/test/:name" - } + "permalink" => "/slides/test/:name", + }, }, - "permalink" => "pretty" + "permalink" => "pretty", }) @site.process @document = @site.collections["slides"].docs[0] @@ -263,9 +263,9 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.permalink_style = :pretty @site.process @@ -287,9 +287,9 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.permalink_style = :pretty @site.process @@ -307,9 +307,9 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @document = @site.collections["slides"].docs[6] @@ -339,9 +339,9 @@ def assert_equal_value(key, one, other) "collections" => { "slides" => { "output" => true, - "permalink" => "/slides/:title" - } - } + "permalink" => "/slides/:title", + }, + }, }) @site.process @document = @site.collections["slides"].docs[3] @@ -381,8 +381,8 @@ def assert_equal_value(key, one, other) context "document with a permalink with dots & a trailing slash" do setup do @site = fixture_site({ "collections" => { - "with.dots" => { "output" => true } - } }) + "with.dots" => { "output" => true }, + }, }) @site.process @document = @site.collections["with.dots"].docs.last @dest_file = dest_dir("with.dots", "permalink.with.slash.tho", "index.html") @@ -406,9 +406,9 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @files = @site.collections["slides"].docs @@ -436,9 +436,9 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => { "slides" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @document = @site.collections["slides"].files.find do |doc| @@ -469,9 +469,9 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => { "methods" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @document = @site.collections["methods"].docs.find do |doc| @@ -498,9 +498,9 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => { "methods" => { - "output" => true - } - } + "output" => true, + }, + }, }) @site.process @document = @site.collections["methods"].docs.find do |doc| diff --git a/test/test_drop.rb b/test/test_drop.rb index 199e94ab075..80b0d0ff693 100644 --- a/test/test_drop.rb +++ b/test/test_drop.rb @@ -4,7 +4,7 @@ class TestDrop < JekyllUnitTest context "a document drop" do setup do @site = fixture_site({ - "collections" => ["methods"] + "collections" => ["methods"], }) @site.process @document = @site.collections["methods"].docs.detect do |d| diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb index f65badc67ea..7f32653c957 100644 --- a/test/test_entry_filter.rb +++ b/test/test_entry_filter.rb @@ -17,7 +17,7 @@ class TestEntryFilter < JekyllUnitTest should "allow regexp filtering" do files = %w(README.md) @site.exclude = [ - %r!README! + %r!README!, ] assert_empty @site.reader.filter_entries( diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index 0b7e540fc6f..e0960f69663 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -4,13 +4,13 @@ class TestExcerpt < JekyllUnitTest def setup_post(file) Document.new(@site.in_source_dir(File.join("_posts", file)), { :site => @site, - :collection => @site.posts + :collection => @site.posts, }).tap(&:read) end def do_render(document) @site.layouts = { - "default" => Layout.new(@site, source_dir("_layouts"), "simple.html") + "default" => Layout.new(@site, source_dir("_layouts"), "simple.html"), } document.output = Jekyll::Renderer.new(@site, document, @site.site_payload).run end diff --git a/test/test_filters.rb b/test/test_filters.rb index e5dedfae9ad..71639ad7824 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -29,7 +29,7 @@ def select; end @filter = make_filter_mock({ "timezone" => "UTC", "url" => "http://example.com", - "baseurl" => "/base" + "baseurl" => "/base", }) @sample_time = Time.utc(2013, 3, 27, 11, 22, 33) @sample_date = Date.parse("2013-03-27") @@ -39,7 +39,7 @@ def select; end @array_of_objects = [ { "color" => "red", "size" => "large" }, { "color" => "red", "size" => "medium" }, - { "color" => "blue", "size" => "medium" } + { "color" => "blue", "size" => "medium" }, ] end @@ -332,7 +332,7 @@ def select; end page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => "base" + "baseurl" => "base", }) assert_equal "http://example.com/base/#{page_url}", filter.absolute_url(page_url) end @@ -341,7 +341,7 @@ def select; end page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => "", - "baseurl" => "base" + "baseurl" => "base", }) assert_equal "/base/#{page_url}", filter.absolute_url(page_url) end @@ -350,7 +350,7 @@ def select; end page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => nil, - "baseurl" => "base" + "baseurl" => "base", }) assert_equal "/base/#{page_url}", filter.absolute_url(page_url) end @@ -359,7 +359,7 @@ def select; end page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => nil + "baseurl" => nil, }) assert_equal "http://example.com/#{page_url}", filter.absolute_url(page_url) end @@ -368,7 +368,7 @@ def select; end page_url = "" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => "/base" + "baseurl" => "/base", }) assert_equal "http://example.com/base", filter.absolute_url(page_url) end @@ -377,7 +377,7 @@ def select; end page_url = "" filter = make_filter_mock({ "url" => "http://ümlaut.example.org/", - "baseurl" => nil + "baseurl" => nil, }) assert_equal "http://xn--mlaut-jva.example.org/", filter.absolute_url(page_url) end @@ -409,7 +409,7 @@ def select; end page_url = "about/my_favorite_page/" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => nil + "baseurl" => nil, }) assert_equal "/#{page_url}", filter.relative_url(page_url) end @@ -418,7 +418,7 @@ def select; end page_url = "" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => "/base" + "baseurl" => "/base", }) assert_equal "/base", filter.relative_url(page_url) end @@ -451,7 +451,7 @@ def select; end "excerpt" => "

    This should be published.

    \n", "draft" => false, "categories" => [ - "publish_test" + "publish_test", ], "layout" => "default", "title" => "Publish", @@ -459,7 +459,7 @@ def select; end "date" => "2008-02-02 00:00:00 +0000", "slug" => "published", "ext" => ".markdown", - "tags" => [] + "tags" => [], } actual = JSON.parse(@filter.jsonify(@filter.site.docs_to_write.first.to_liquid)) @@ -475,7 +475,7 @@ def select; end actual = @filter.jsonify(@filter.site.to_liquid) assert_equal JSON.parse(actual)["jekyll"], { "environment" => "development", - "version" => Jekyll::VERSION + "version" => Jekyll::VERSION, } end @@ -491,7 +491,7 @@ def to_liquid "name" => name, :v => 1, :thing => M.new({ :kay => "jewelers" }), - :stuff => true + :stuff => true, } end end @@ -503,21 +503,21 @@ def to_liquid "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true + "stuff" => true, }, { "name" => "Smathers", "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true - } + "stuff" => true, + }, ] result = @filter.jsonify([T.new("Jeremiah"), T.new("Smathers")]) assert_equal expected, JSON.parse(result) @@ -533,32 +533,32 @@ def to_liquid "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true + "stuff" => true, }, { "name" => 1, "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true + "stuff" => true, }, { "name" => 2, "v" => 1, "thing" => [ { - "kay" => "jewelers" - } + "kay" => "jewelers", + }, ], - "stuff" => true - } - ] + "stuff" => true, + }, + ], } result = @filter.jsonify(my_hash) assert_equal expected, JSON.parse(result) @@ -633,7 +633,7 @@ def to_liquid hash = { "a" => { "tags"=>%w(x y) }, "b" => { "tags"=>["x"] }, - "c" => { "tags"=>%w(y z) } + "c" => { "tags"=>%w(y z) }, } assert_equal 2, @filter.where(hash, "tags", "x").length end @@ -642,7 +642,7 @@ def to_liquid hash = { "a" => { "tags"=>%w(x y) }, "b" => { "tags"=>"x" }, - "c" => { "tags"=>%w(y z) } + "c" => { "tags"=>%w(y z) }, } assert_equal 2, @filter.where(hash, "tags", "x").length end @@ -651,7 +651,7 @@ def to_liquid hash = { "a" => { "category"=>"bear" }, "b" => { "category"=>"wolf" }, - "c" => { "category"=>%w(bear lion) } + "c" => { "category"=>%w(bear lion) }, } assert_equal 0, @filter.where(hash, "category", "ear").length end @@ -660,7 +660,7 @@ def to_liquid hash = { "The Words" => { "rating" => 1.2, "featured" => false }, "Limitless" => { "rating" => 9.2, "featured" => true }, - "Hustle" => { "rating" => 4.7, "featured" => true } + "Hustle" => { "rating" => 4.7, "featured" => true }, } results = @filter.where(hash, "featured", "true") @@ -704,7 +704,7 @@ def to_liquid hash = { "The Words" => { "rating" => 1.2, "featured" => false }, "Limitless" => { "rating" => 9.2, "featured" => true }, - "Hustle" => { "rating" => 4.7, "featured" => true } + "Hustle" => { "rating" => 4.7, "featured" => true }, } results = @filter.where_exp(hash, "item", "item.featured == true") @@ -725,7 +725,7 @@ def to_liquid { "id" => "a", "groups" => [1, 2] }, { "id" => "b", "groups" => [2, 3] }, { "id" => "c" }, - { "id" => "d", "groups" => [1, 3] } + { "id" => "d", "groups" => [1, 3] }, ] should "filter with the contains operator over arrays" do results = @filter.where_exp(objects, "obj", "obj.groups contains 1") @@ -807,7 +807,7 @@ def to_liquid items = [ { "version"=>"1.0", "result"=>"slow" }, { "version"=>"1.1.5", "result"=>"medium" }, - { "version"=>"2.7.3", "result"=>"fast" } + { "version"=>"2.7.3", "result"=>"fast" }, ] result = @filter.group_by_exp(items, "item", "item.version | split: '.' | first") diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index 30c713aca60..0d066c11f15 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -7,12 +7,12 @@ class TestFrontMatterDefaults < JekyllUnitTest "defaults" => [{ "scope" => { "path" => "contacts", - "type" => "page" + "type" => "page", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @affected = @site.pages.find { |page| page.relative_path == "contacts/bar.html" } @@ -30,12 +30,12 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "scope" => { - "path" => "index.html" + "path" => "index.html", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @@ -54,12 +54,12 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "scope" => { - "path" => "win" + "path" => "win", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @@ -78,12 +78,12 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "scope" => { - "type" => "page" + "type" => "page", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @@ -103,12 +103,12 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "scope" => { - "type" => "pages" + "type" => "pages", }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @affected = @site.pages @@ -129,9 +129,9 @@ class TestFrontMatterDefaults < JekyllUnitTest "scope" => { }, "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @affected = @site.pages @@ -149,9 +149,9 @@ class TestFrontMatterDefaults < JekyllUnitTest @site = fixture_site({ "defaults" => [{ "values" => { - "key" => "val" - } - }] + "key" => "val", + }, + },], }) @site.process @affected = @site.pages @@ -171,9 +171,9 @@ class TestFrontMatterDefaults < JekyllUnitTest "destination" => dest_dir, "defaults" => [{ "values" => { - "date" => "2015-01-01 00:00:01" - } - }] + "date" => "2015-01-01 00:00:01", + }, + },], })) end diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index 0a6332f8bdd..d8f886a4c1a 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -16,9 +16,9 @@ class TestKramdown < JekyllUnitTest "syntax_highlighter" => "rouge", "syntax_highlighter_opts" => { - "bold_every" => 8, "css" => :class - } - } + "bold_every" => 8, "css" => :class, + }, + }, } @config = Jekyll.configuration(@config) @@ -43,8 +43,8 @@ class TestKramdown < JekyllUnitTest override = { "highlighter" => nil, "kramdown" => { - "smart_quotes" => "lsaquo,rsaquo,laquo,raquo" - } + "smart_quotes" => "lsaquo,rsaquo,laquo,raquo", + }, } markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) @@ -70,8 +70,8 @@ class TestKramdown < JekyllUnitTest "highlighter" => nil, "markdown" => "kramdown", "kramdown" => { - "syntax_highlighter" => :coderay - } + "syntax_highlighter" => :coderay, + }, } markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) @@ -89,8 +89,8 @@ class TestKramdown < JekyllUnitTest override = { "markdown" => "kramdown", "kramdown" => { - "enable_coderay" => true - } + "enable_coderay" => true, + }, } @config.delete("highlighter") @@ -115,9 +115,9 @@ class TestKramdown < JekyllUnitTest "kramdown" => { "syntax_highlighter" => "coderay", "coderay" => { - "hello" => "world" - } - } + "hello" => "world", + }, + }, })) expect(Kramdown::Document).to receive(:new) do |arg1, hash| diff --git a/test/test_layout_reader.rb b/test/test_layout_reader.rb index 133cd6f219c..1d32fa57892 100644 --- a/test/test_layout_reader.rb +++ b/test/test_layout_reader.rb @@ -4,7 +4,7 @@ class TestLayoutReader < JekyllUnitTest context "reading layouts" do setup do config = Jekyll::Configuration::DEFAULTS.merge({ "source" => source_dir, - "destination" => dest_dir }) + "destination" => dest_dir, }) @site = fixture_site(config) end diff --git a/test/test_liquid_renderer.rb b/test/test_liquid_renderer.rb index 7d429c52a24..6ba29299d67 100644 --- a/test/test_liquid_renderer.rb +++ b/test/test_liquid_renderer.rb @@ -16,7 +16,7 @@ class TestLiquidRenderer < JekyllUnitTest expected = [ %r!^Filename\s+|\s+Count\s+|\s+Bytes\s+|\s+Time$!, %r!^-+\++-+\++-+\++-+$!, - %r!^_posts/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$! + %r!^_posts/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$!, ] # rubocop:enable Metrics/LineLength diff --git a/test/test_page.rb b/test/test_page.rb index 259de1858b4..431c57a63ca 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -12,7 +12,7 @@ def setup_page(*args) def do_render(page) layouts = { - "default" => Layout.new(@site, source_dir("_layouts"), "simple.html") + "default" => Layout.new(@site, source_dir("_layouts"), "simple.html"), } page.render(layouts, @site.site_payload) end @@ -23,7 +23,7 @@ def do_render(page) @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "skip_config_files" => true + "skip_config_files" => true, })) end @@ -90,7 +90,7 @@ def do_render(page) :permalink => "/properties/", :published => nil, :title => "Properties Page", - :url => "/properties/" + :url => "/properties/", } attrs.each do |attr, val| diff --git a/test/test_plugin_manager.rb b/test/test_plugin_manager.rb index c625c3a84a2..702df593bb8 100644 --- a/test/test_plugin_manager.rb +++ b/test/test_plugin_manager.rb @@ -68,7 +68,7 @@ def with_no_gemfile should "require plugin files" do site = double({ :safe => false, :config => { "plugins_dir" => "_plugins" }, - :in_source_dir => "/tmp/" }) + :in_source_dir => "/tmp/", }) plugin_manager = PluginManager.new(site) expect(Jekyll::External).to receive(:require_with_graceful_fail) @@ -98,9 +98,9 @@ def with_no_gemfile should "call site's in_source_dir" do site = double({ :config => { - "plugins_dir" => Jekyll::Configuration::DEFAULTS["plugins_dir"] + "plugins_dir" => Jekyll::Configuration::DEFAULTS["plugins_dir"], }, - :in_source_dir => "/tmp/" + :in_source_dir => "/tmp/", }) plugin_manager = PluginManager.new(site) @@ -132,7 +132,7 @@ def with_no_gemfile should "print no deprecation warning if jekyll-paginate is present" do site = double({ - :config => { "paginate" => true, "gems" => ["jekyll-paginate"] } + :config => { "paginate" => true, "gems" => ["jekyll-paginate"] }, }) plugin_manager = PluginManager.new(site) diff --git a/test/test_rdiscount.rb b/test/test_rdiscount.rb index 9390aaed080..32289a64368 100644 --- a/test/test_rdiscount.rb +++ b/test/test_rdiscount.rb @@ -13,8 +13,8 @@ class TestRdiscount < JekyllUnitTest "markdown" => "rdiscount", "rdiscount" => { "toc_token" => "{:toc}", - "extensions" => %w(smart generate_toc) - } + "extensions" => %w(smart generate_toc), + }, } @markdown = Converters::Markdown.new config diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb index 140fabbea9b..4e979f4d2ee 100644 --- a/test/test_redcarpet.rb +++ b/test/test_redcarpet.rb @@ -12,8 +12,8 @@ class TestRedcarpet < JekyllUnitTest @config = { "markdown" => "redcarpet", "redcarpet" => { - "extensions" => %w(smart strikethrough filter_html) - } + "extensions" => %w(smart strikethrough filter_html), + }, } @markdown = Converters::Markdown.new @config diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index 03920c83022..9e1559d4bec 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -8,10 +8,10 @@ class TestRegenerator < JekyllUnitTest @site = fixture_site({ "collections" => { "methods" => { - "output" => true - } + "output" => true, + }, }, - "incremental" => true + "incremental" => true, }) @site.read @@ -92,7 +92,7 @@ class TestRegenerator < JekyllUnitTest setup do FileUtils.rm_rf(source_dir(".jekyll-metadata")) @site = fixture_site({ - "incremental" => true + "incremental" => true, }) @site.read @@ -129,7 +129,7 @@ class TestRegenerator < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "incremental" => true + "incremental" => true, })) @site.process @@ -311,7 +311,7 @@ class TestRegenerator < JekyllUnitTest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, - "incremental" => false + "incremental" => false, })) @site.process diff --git a/test/test_related_posts.rb b/test/test_related_posts.rb index ef7265ef01d..2d6165505e3 100644 --- a/test/test_related_posts.rb +++ b/test/test_related_posts.rb @@ -28,7 +28,7 @@ class TestRelatedPosts < JekyllUnitTest allow_any_instance_of(Jekyll::RelatedPosts).to receive(:display) @site = fixture_site({ - "lsi" => true + "lsi" => true, }) @site.reset diff --git a/test/test_sass.rb b/test/test_sass.rb index f5241790497..3a9df0aeae3 100644 --- a/test/test_sass.rb +++ b/test/test_sass.rb @@ -5,7 +5,7 @@ class TestSass < JekyllUnitTest setup do @site = Jekyll::Site.new(Jekyll.configuration({ "source" => source_dir, - "destination" => dest_dir + "destination" => dest_dir, })) @site.process @test_css_file = dest_dir("css/main.css") diff --git a/test/test_site.rb b/test/test_site.rb index 81da363d2d6..bbf42d25656 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -20,7 +20,7 @@ class TestSite < JekyllUnitTest should "have an array for plugins if passed as an array" do site = Site.new(site_configuration({ - "plugins_dir" => ["/tmp/plugins", "/tmp/otherplugins"] + "plugins_dir" => ["/tmp/plugins", "/tmp/otherplugins"], })) array = if Utils::Platforms.windows? ["C:/tmp/plugins", "C:/tmp/otherplugins"] @@ -485,7 +485,7 @@ def convert(*_args) context "manipulating the Jekyll environment" do setup do @site = Site.new(site_configuration({ - "incremental" => false + "incremental" => false, })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } @@ -499,7 +499,7 @@ def convert(*_args) setup do ENV["JEKYLL_ENV"] = "production" @site = Site.new(site_configuration({ - "incremental" => false + "incremental" => false, })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } @@ -565,7 +565,7 @@ def convert(*_args) context "incremental build" do setup do @site = Site.new(site_configuration({ - "incremental" => true + "incremental" => true, })) @site.read end diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 2be800a662c..dd3515f6c0e 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -95,8 +95,8 @@ def setup_static_file_with_defaults(base, dir, name, defaults) should "use the _config.yml defaults to determine writability" do defaults = [{ "scope" => { "path" => "private" }, - "values" => { "published" => false } - }] + "values" => { "published" => false }, + },] static_file = setup_static_file_with_defaults( "root", "private/dir/subdir", @@ -146,7 +146,7 @@ def setup_static_file_with_defaults(base, dir, name, defaults) "name" => "static_file.txt", "extname" => ".txt", "modified_time" => @static_file.modified_time, - "path" => "/static_file.txt" + "path" => "/static_file.txt", } assert_equal expected, @static_file.to_liquid end diff --git a/test/test_tags.rb b/test/test_tags.rb index fd6dcb9783e..a636abf6131 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -17,7 +17,7 @@ def create_post(content, override = {}, converter_class = Jekyll::Converters::Ma info = { :filters => [Jekyll::Filters], :registers => { :site => site } } @converter = site.converters.find { |c| c.class == converter_class } payload = { "highlighter_prefix" => @converter.highlighter_prefix, - "highlighter_suffix" => @converter.highlighter_suffix } + "highlighter_suffix" => @converter.highlighter_suffix, } @result = Liquid::Template.parse(content).render!(payload, info) @result = @converter.convert(@result) @@ -487,7 +487,7 @@ def highlight_block_with_opts(options_string) end create_post(@content, { - "markdown" => "rdiscount" + "markdown" => "rdiscount", }) end @@ -517,7 +517,7 @@ def highlight_block_with_opts(options_string) end create_post(@content, { - "markdown" => "redcarpet" + "markdown" => "redcarpet", }) end @@ -541,7 +541,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -567,7 +567,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -596,7 +596,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -628,7 +628,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -664,7 +664,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end end @@ -683,7 +683,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end end @@ -703,7 +703,7 @@ def highlight_block_with_opts(options_string) create_post(content, { "source" => source_dir, "destination" => dest_dir, - "read_all" => true + "read_all" => true, }) end @@ -737,7 +737,7 @@ def highlight_block_with_opts(options_string) "source" => source_dir, "destination" => dest_dir, "collections" => { "methods" => { "output" => true } }, - "read_collections" => true + "read_collections" => true, }) end @@ -764,7 +764,7 @@ def highlight_block_with_opts(options_string) "source" => source_dir, "destination" => dest_dir, "collections" => { "methods" => { "output" => true } }, - "read_collections" => true + "read_collections" => true, }) end @@ -796,7 +796,7 @@ def highlight_block_with_opts(options_string) "source" => source_dir, "destination" => dest_dir, "collections" => { "methods" => { "output" => true } }, - "read_collections" => true + "read_collections" => true, }) end end @@ -820,7 +820,7 @@ def highlight_block_with_opts(options_string) "source" => source_dir, "destination" => dest_dir, "read_posts" => true, - "safe" => true + "safe" => true, }) end @result ||= "" @@ -842,7 +842,7 @@ def highlight_block_with_opts(options_string) "source" => source_dir, "destination" => dest_dir, "read_posts" => true, - "safe" => true + "safe" => true, }) end assert_match( @@ -868,7 +868,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -896,7 +896,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -913,7 +913,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end end @@ -932,7 +932,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -959,7 +959,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -982,7 +982,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -1004,7 +1004,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end @@ -1030,7 +1030,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end assert_match( @@ -1125,7 +1125,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end assert_match "Could not locate the included file 'missing.html' in any of " \ @@ -1150,7 +1150,7 @@ def highlight_block_with_opts(options_string) "permalink" => "pretty", "source" => source_dir, "destination" => dest_dir, - "read_posts" => true + "read_posts" => true, }) end assert_equal( @@ -1180,7 +1180,7 @@ def highlight_block_with_opts(options_string) "source" => source_dir, "destination" => dest_dir, "read_posts" => true, - "safe" => true + "safe" => true, }) end @result ||= "" @@ -1202,7 +1202,7 @@ def highlight_block_with_opts(options_string) "source" => source_dir, "destination" => dest_dir, "read_posts" => true, - "safe" => true + "safe" => true, }) end assert_match( From 27ed81547b12d28a60c51961b82a5723981feb7d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 12 Jan 2017 16:41:16 -0800 Subject: [PATCH 1833/4996] Update history to reflect merge of #5761 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bb10365f06a..60c9cf21f99 100644 --- a/History.markdown +++ b/History.markdown @@ -46,6 +46,7 @@ * Rubocop: fix Rakefile and gemspec (#5745) * Use `assert_nil` (#5725) * Sort gems in `jekyll.gemspec` (#5746) + * Rubocop: Require consistent comma in multiline literals (#5761) ### Documentation From 7efeb3d4af68543a9fc88fbdadfff2354c173419 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Thu, 12 Jan 2017 23:03:56 -0800 Subject: [PATCH 1834/4996] made updates as requested from latest review --- docs/_docs/datafiles.md | 2 + docs/_docs/navigation.md | 174 ++++++++++++++++++++------------------- docs/_sass/_style.scss | 3 - 3 files changed, 91 insertions(+), 88 deletions(-) diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index 40723d2fab7..59a3ef3ed59 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -70,6 +70,8 @@ You can now render the list of members in a template: {% endraw %} ``` +{: .note .info } +If your Jekyll site has a lot of pages, such as with documentation websites, we've got you covered with some detailed examples on [how to build robust navigation for your site](..navigation). ## Example: Organizations diff --git a/docs/_docs/navigation.md b/docs/_docs/navigation.md index bbb009c74e6..548013a2d15 100644 --- a/docs/_docs/navigation.md +++ b/docs/_docs/navigation.md @@ -49,21 +49,24 @@ docs: {% raw %}

    {{ site.data.samplelist.docs_list_title }}

    {% endraw %} ``` **Result** -
    + +{: .note .info } +For the results in these samples with fictitious page references, `#` is manually substituted for the actual link value to avoid 404 errors.) + When you use a `for` loop, you choose how you want to refer to the items you're looping through. The variable you choose (in this case, `item`) becomes how you access the properties of each item in the list. Dot notation is used to get a property of the item (for example, `item.url`). The YAML content has two main types of formats that are relevant here: @@ -94,10 +97,10 @@ Suppose you wanted to sort the list by the `title`. To do this, convert the refe **Result** -
    -
  • Configuration
  • -
  • Deployment
  • -
  • Introduction
  • + The items now appear in alphabetical order. The `sort` property in the Liquid filter applies to the `title`, which is an actual property in the list. If `title` weren't a property, we would need to sort by another property. @@ -158,26 +161,26 @@ toc: ``` **Result** -
    + @@ -240,64 +243,64 @@ toc2: {% raw %}
    {% if site.data.samplelist.toc2[0] %} {% for item in site.data.samplelist.toc2 %} -

    {{ item.title }}

    - {% if item.subfolderitems[0] %} -
      - {% for entry in item.subfolderitems %} -
    • {{ entry.page }}
    • - {% if entry.subsubfolderitems[0] %} - - {% endif %} - {% endfor %} -
    - {% endif %} - {% endfor %} +

    {{ item.title }}

    + {% if item.subfolderitems[0] %} +
      + {% for entry in item.subfolderitems %} +
    • {{ entry.page }}
    • + {% if entry.subsubfolderitems[0] %} + + {% endif %} + {% endfor %} +
    + {% endif %} + {% endfor %} {% endif %}
    {% endraw %} ``` **Result** -
    + - In this example, `if site.data.samplelist.toc2[0]` is used to ensure that the YAML level actually contains items. If there isn't anything at the `[0]` position, we can skip looking in this level. +In this example, `if site.data.samplelist.toc2[0]` is used to ensure that the YAML level actually contains items. If there isn't anything at the `[0]` position, we can skip looking in this level.
    ProTip: Line up for loops and if statements
    @@ -324,17 +327,17 @@ sidebar: toc ```liquid {% raw %}{% endraw %} ``` **Result** -
    + @@ -358,7 +361,8 @@ In addition to inserting items from the YAML data file into your list, you also ```liquid {% raw %}{% for item in site.data.samplelist.docs %}
  • - {{ item.title }}
  • + {{ item.title }} + {% endfor %}{% endraw %} ``` @@ -371,10 +375,10 @@ In addition to inserting items from the YAML data file into your list, you also } -
    -
  • Introduction
  • -
  • Configuration
  • -
  • Deployment
  • + In this case, assume `Deployment` is the current page. @@ -408,19 +412,19 @@ docs2: ```liquid {% raw %}
      {% for item in site.data.samplelist.docs2 %} - {% if item.version == 1 %} -
    • {{ item.title }}
    • - {% endif %} + {% if item.version == 1 %} +
    • {{ item.title }}
    • + {% endif %} {% endfor %}
    {% endraw %} ``` **Result** -
    + @@ -488,20 +492,20 @@ If you wanted to simply get all docs in the collection for a specific category, {% raw %}

    Getting Started

      {% for doc in site.docs %} - {% if doc.category == "getting-started" %} -
    • {{ doc.title }}
    • - {% endif %} + {% if doc.category == "getting-started" %} +
    • {{ doc.title }}
    • + {% endif %} {% endfor %}
    {% endraw %} ``` The result would be as follows: -
    +

    Getting Started

    @@ -521,31 +525,31 @@ Here's the code for getting lists of pages grouped under their corresponding cat {% for cat in mydocs %}

    {{ cat.name | capitalize }}

      - {% assign items = cat.items | sort: 'weight' %} - {% for item in items %} -
    • {{ item.title }}
    • - {% endfor %} + {% assign items = cat.items | sort: 'order' %} + {% for item in items %} +
    • {{ item.title }}
    • + {% endfor %}
    {% endfor %}{% endraw %} ``` **Result** -
    +

    Getting-started

    Configuration

    Deployment

    diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 202644087dd..3a038966558 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -1035,7 +1035,4 @@ code.output { .result { border: 1px solid yellow; padding: 10px; - margin-top: 10px; - margin-bottom: 10px; - font-size:14px; } From 6d9633e36460d6292414eb8f8173b570ac711f38 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Thu, 12 Jan 2017 23:28:56 -0800 Subject: [PATCH 1835/4996] making edits from reviews --- docs/_docs/datafiles.md | 3 ++- docs/_docs/navigation.md | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index 59a3ef3ed59..3f4644763cd 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -70,8 +70,9 @@ You can now render the list of members in a template: {% endraw %} ``` + {: .note .info } -If your Jekyll site has a lot of pages, such as with documentation websites, we've got you covered with some detailed examples on [how to build robust navigation for your site](..navigation). +If your Jekyll site has a lot of pages, such as with documentation websites, see the detailed examples in [how to build robust navigation for your site](../navigation). ## Example: Organizations diff --git a/docs/_docs/navigation.md b/docs/_docs/navigation.md index 548013a2d15..bd4228e379a 100644 --- a/docs/_docs/navigation.md +++ b/docs/_docs/navigation.md @@ -10,7 +10,7 @@ There are two primary ways of retrieving pages on a Jekyll site: * **Retrieve pages listed in a YAML data source**. Store the page data in a YAML (or JSON or CSV) file in the `_data` folder, loop through the YAML properties, and insert the values into your theme. * **Retrieve pages by looping through the page front matter**. Look through the front matter of your pages to identify certain properties, return those pages, and insert the pages' front matter values into your theme. -The examples that follow start with a basic navigation scenario and add more sophisticated elements to demonstrate different ways of returning the pages. In almost every scenario, you'll see 3 elements: +The examples that follow start with a basic navigation scenario and add more sophisticated elements to demonstrate different ways of returning the pages. In every scenario, you'll see 3 elements: * YAML * Liquid @@ -65,7 +65,7 @@ docs:
    {: .note .info } -For the results in these samples with fictitious page references, `#` is manually substituted for the actual link value to avoid 404 errors.) +For the results in these fictitious samples, `#` is manually substituted for the actual link value to avoid 404 errors.) When you use a `for` loop, you choose how you want to refer to the items you're looping through. The variable you choose (in this case, `item`) becomes how you access the properties of each item in the list. Dot notation is used to get a property of the item (for example, `item.url`). @@ -434,7 +434,7 @@ The `Deployment` page is excluded because its `version` is `2`. If you don't want to store your navigation items in a YAML file in your `_data` folder, you can use `for` loops to look through the YAML front matter of each page or collection and get the content based on properties in the front matter. -In this scenario, suppose we have a collection called `_docs`. Collections are often better than pages because they allow you to be more specific in what you're looping through. (Try to avoid scenarios where you loop through large numbers of items, since it will increase your build time. Collections help you narrow the scope. For more information about collections, see [Collections]({% link _docs/collections.md %}).) +In this scenario, suppose we have a collection called `_docs`. Collections are often better than pages because they allow you to narrow the list of what you're looping through. (Try to avoid scenarios where you loop through large numbers of items, since it will increase your build time. [Collections]({% link _docs/collections.md %}) help you narrow the scope.) In our scenario, there are 6 docs in the `docs` collection: Sample 1, Sample 2, Topic 1, Topic 2, Widget 1, and Widget 2. @@ -513,7 +513,7 @@ This might be useful if you're setting up a knowledge base and have dozens of to But let's say you want to sort the items by category and group them under the category name, without hard-coding the category names. To achieve this, you could use two filters: -* `group by` +* `group_by` * `sort` Here's the code for getting lists of pages grouped under their corresponding category headers: @@ -571,6 +571,6 @@ After getting the category name, we assign the variable `items` for the docs and The `for item in items` loop looks through each `item` and gets the `title` and `url` to form the list item link. -For more details on the `group by` filter, see [group by in Jekyll's Templates documentation](https://jekyllrb.com/docs/templates/) as well as [this Siteleaf tutorial](https://www.siteleaf.com/blog/advanced-liquid-group-by/). For more details on the `sort` filter, see [sort in Liquid's documentation](https://help.shopify.com/themes/liquid/filters/array-filters#sort). +For more details on the `group_by` filter, see [Jekyll's Templates documentation](https://jekyllrb.com/docs/templates/) as well as [this Siteleaf tutorial](https://www.siteleaf.com/blog/advanced-liquid-group-by/). For more details on the `sort` filter, see [sort](https://help.shopify.com/themes/liquid/filters/array-filters#sort) in Liquid's documentation. Whether you use properties in your doc's front matter to retrieve your pages or a YAML data file, in both cases you can programmatically build a more robust navigation for your site. From a66fd1fa042752d421e248244ebeed27f7ea0459 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 13 Jan 2017 04:59:14 -0500 Subject: [PATCH 1836/4996] Update history to reflect merge of #5758 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 60c9cf21f99..5980801bb88 100644 --- a/History.markdown +++ b/History.markdown @@ -67,6 +67,7 @@ * Fix a minor grammatical mistake on themes' document ### -dev (#5748) * Correct comments in data_reader.rb (#5621) * Add jekyll-pre-commit to plugins list (#5752) + * Update quickstart.md (#5758) ## 3.3.1 / 2016-11-14 From b9ae94387f4b51ddb41dd543515fbfebef59f71f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 14 Jan 2017 00:01:33 -0500 Subject: [PATCH 1837/4996] Update history to reflect merge of #5750 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5980801bb88..2c6b5c7ad33 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ * fix date parsing in file names to be stricter (#5609) * Add a module to re-define `ENV["TZ"]` in Windows (#5612) * Use each instead of map to actually return nothing (#5668) + * include: fix 'no implicit conversion of nil to String' (#5750) ### Site Enhancements From 59cbdf5935541e0088f086ef07770f2d3f595d3c Mon Sep 17 00:00:00 2001 From: Purplecarrot Date: Sat, 14 Jan 2017 10:36:55 +0000 Subject: [PATCH 1838/4996] Correct minor typo --- docs/_docs/github-pages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index cc7387045dd..886dea88640 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -138,7 +138,7 @@ looking at right now is contained in the [docs folder]({{ site.repository }}/tree/master/docs) of the same repository. Please refer to GitHub official documentation on -[user, organization and projets pages](https://help.github.com/articles/user-organization-and-project-pages/) +[user, organization and project pages](https://help.github.com/articles/user-organization-and-project-pages/) to see more detailed examples.
    From 7d5f961dbacac7af9d58cb4d900eadb84d26494d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 14 Jan 2017 07:41:25 -0500 Subject: [PATCH 1839/4996] Update history to reflect merge of #5764 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2c6b5c7ad33..216c887b0f5 100644 --- a/History.markdown +++ b/History.markdown @@ -69,6 +69,7 @@ * Correct comments in data_reader.rb (#5621) * Add jekyll-pre-commit to plugins list (#5752) * Update quickstart.md (#5758) + * Correct minor typo (#5764) ## 3.3.1 / 2016-11-14 From 44324828b4b4b807f8a99fab365d6b29234f045f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 14 Jan 2017 20:00:36 +0100 Subject: [PATCH 1840/4996] bump Rubocop to latest version --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index eda95e5eb53..ea65fdcc3f0 100644 --- a/Gemfile +++ b/Gemfile @@ -25,7 +25,7 @@ group :test do gem "nokogiri" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.44.1" + gem "rubocop", "~> 0.46" gem "test-theme", :path => File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) gem "jruby-openssl" if RUBY_ENGINE == "jruby" From 5d52074d2d05c2178bb6791b60c5eafb6a7ea320 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 14 Jan 2017 20:01:41 +0100 Subject: [PATCH 1841/4996] appease Rubocop --- test/source/_plugins/dummy.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/source/_plugins/dummy.rb b/test/source/_plugins/dummy.rb index bfd46e1ce03..fd11d0e1044 100644 --- a/test/source/_plugins/dummy.rb +++ b/test/source/_plugins/dummy.rb @@ -2,7 +2,6 @@ module Jekyll class Dummy < Generator priority :high - def generate(site) - end + def generate(site) end end end From 39b7af373264efeff89af59c23708366bce1b672 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 14 Jan 2017 20:05:11 +0100 Subject: [PATCH 1842/4996] exclude rake tasks and gemspec from metrics exclude from BlockLength and LineLength metrics --- .rubocop.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.rubocop.yml b/.rubocop.yml index 67f212aea57..87d24743abb 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -22,6 +22,8 @@ Metrics/BlockLength: Exclude: - test/**/*.rb - lib/jekyll/configuration.rb + - rake/*.rake + - jekyll.gemspec Metrics/ClassLength: Exclude: - !ruby/regexp /features\/.*.rb$/ @@ -32,6 +34,8 @@ Metrics/CyclomaticComplexity: Metrics/LineLength: Exclude: - !ruby/regexp /features\/.*.rb/ + - Rakefile + - rake/*.rake Max: 90 Severity: warning Metrics/MethodLength: From 6f8bf2e9501b2e2752effd07bd9cd781194a38a8 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 14 Jan 2017 20:11:30 +0100 Subject: [PATCH 1843/4996] appease rubocop --- rake/docs.rake | 2 +- rake/release.rake | 2 +- rake/site.rake | 26 +++++++++++++------------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/rake/docs.rake b/rake/docs.rake index aec162b59e9..fcae4f20162 100644 --- a/rake/docs.rake +++ b/rake/docs.rake @@ -7,7 +7,7 @@ namespace :docs do desc "Release #{docs_name} v#{version}" task :release => :build do - unless `git branch` =~ /^\* master$/ + unless `git branch` =~ %r!^\* master$! puts "You must be on the master branch to release!" exit! end diff --git a/rake/release.rake b/rake/release.rake index a78690d8726..832b5bb33de 100644 --- a/rake/release.rake +++ b/rake/release.rake @@ -6,7 +6,7 @@ desc "Release #{name} v#{version}" task :release => :build do - unless `git branch` =~ /^\* master$/ + unless `git branch` =~ %r!^\* master$! puts "You must be on the master branch to release!" exit! end diff --git a/rake/site.rake b/rake/site.rake index 2fb4172a351..63b04fc8243 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -13,7 +13,7 @@ namespace :site do require "jekyll" browser_launched = false - Jekyll::Hooks.register :site, :post_write do |site| + Jekyll::Hooks.register :site, :post_write do |_site| next if browser_launched browser_launched = true Jekyll.logger.info "Opening in browser..." @@ -26,7 +26,7 @@ namespace :site do "source" => File.expand_path(docs_folder), "destination" => File.expand_path("#{docs_folder}/_site"), "watch" => true, - "serving" => true + "serving" => true, } Jekyll::Commands::Build.process(options) Jekyll::Commands::Serve.process(options) @@ -38,7 +38,7 @@ namespace :site do Jekyll::Commands::Build.process({ "profile" => true, "source" => File.expand_path(docs_folder), - "destination" => File.expand_path("#{docs_folder}/_site") + "destination" => File.expand_path("#{docs_folder}/_site"), }) end task :build => :generate @@ -48,7 +48,7 @@ namespace :site do Dir.chdir("#{docs_folder}/_sass") do sh 'curl "https://necolas.github.io/normalize.css/latest/normalize.css" -o "normalize.scss"' sh 'sass "normalize.scss":"_normalize.scss" --style compressed' - rm ['normalize.scss', Dir.glob('*.map')].flatten + rm ["normalize.scss", Dir.glob("*.map")].flatten end end @@ -60,40 +60,40 @@ namespace :site do desc "Create a nicely formatted history page for the jekyll site based on the repo history." task :history do - siteify_file('History.markdown', { "title" => "History" }) + siteify_file("History.markdown", { "title" => "History" }) end desc "Copy the Code of Conduct" task :conduct do front_matter = { "redirect_from" => "/conduct/index.html", - "editable" => false + "editable" => false, } - siteify_file('CONDUCT.markdown', front_matter) + siteify_file("CONDUCT.markdown", front_matter) end desc "Copy the contributing file" task :contributing do - siteify_file('.github/CONTRIBUTING.markdown', "title" => "Contributing") + siteify_file(".github/CONTRIBUTING.markdown", "title" => "Contributing") end desc "Write the site latest_version.txt file" task :version_file do - File.open("#{docs_folder}/latest_version.txt", 'wb') { |f| f.puts(version) } unless version =~ /(beta|rc|alpha)/i + File.open("#{docs_folder}/latest_version.txt", "wb") { |f| f.puts(version) } unless version =~ %r!(beta|rc|alpha)!i end namespace :releases do desc "Create new release post" - task :new, :version do |t, args| + task :new, :version do |_t, args| raise "Specify a version: rake site:releases:new['1.2.3']" unless args.version - today = Time.new.strftime('%Y-%m-%d') + today = Time.new.strftime("%Y-%m-%d") release = args.version.to_s - filename = "#{docs_folder}/_posts/#{today}-jekyll-#{release.split('.').join('-')}-released.markdown" + filename = "#{docs_folder}/_posts/#{today}-jekyll-#{release.split(".").join("-")}-released.markdown" File.open(filename, "wb") do |post| post.puts("---") post.puts("title: 'Jekyll #{release} Released'") - post.puts("date: #{Time.new.strftime('%Y-%m-%d %H:%M:%S %z')}") + post.puts("date: #{Time.new.strftime("%Y-%m-%d %H:%M:%S %z")}") post.puts("author: ") post.puts("version: #{release}") post.puts("categories: [release]") From becdcb5164cbba419abbd0d2f3650ef798d2c393 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 15 Jan 2017 03:47:06 -0500 Subject: [PATCH 1844/4996] Update history to reflect merge of #5765 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 216c887b0f5..eafd41c4516 100644 --- a/History.markdown +++ b/History.markdown @@ -48,6 +48,7 @@ * Use `assert_nil` (#5725) * Sort gems in `jekyll.gemspec` (#5746) * Rubocop: Require consistent comma in multiline literals (#5761) + * Bump rubocop (#5765) ### Documentation From ecd04badf05094cf65062635248cacebce139a38 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Sun, 15 Jan 2017 20:35:10 +0100 Subject: [PATCH 1845/4996] throw IncludeTagError if error occurs in included file fixes #5756 --- features/rendering.feature | 9 +++++++++ lib/jekyll/tags/include.rb | 8 ++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/features/rendering.feature b/features/rendering.feature index 5031ef06d8d..fbe9ce57415 100644 --- a/features/rendering.feature +++ b/features/rendering.feature @@ -12,6 +12,15 @@ Feature: Rendering Then I should get a non-zero exit-status And I should see "Liquid Exception" in the build output + Scenario: When receiving bad Liquid in included file + Given I have a _includes directory + And I have a "_includes/invalid.html" file that contains "{% INVALID %}" + And I have a "index.html" page with layout "simple" that contains "{% include invalid.html %}" + And I have a simple layout that contains "{{ content }}" + When I run jekyll build + Then I should get a non-zero exit-status + And I should see "Liquid Exception.*Unknown tag 'INVALID' in.*_includes/invalid\.html" in the build output + Scenario: Render Liquid and place in layout Given I have a "index.html" page with layout "simple" that contains "Hi there, Jekyll {{ jekyll.environment }}!" And I have a simple layout that contains "{{ content }}Ahoy, indeed!" diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index ca74087da28..08843047a2e 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -155,10 +155,14 @@ def load_cached_partial(path, context) if cached_partial.key?(path) cached_partial[path] else - cached_partial[path] = context.registers[:site] + unparsed_file = context.registers[:site] .liquid_renderer .file(path) - .parse(read_file(path, context)) + begin + cached_partial[path] = unparsed_file.parse(read_file(path, context)) + rescue Liquid::SyntaxError => ex + raise IncludeTagError.new(ex.message, path) + end end end From a30d81ceb899ea33308503743603dace74d2ac98 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 16 Jan 2017 10:26:08 +0100 Subject: [PATCH 1846/4996] bump Rubocop to v47 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index ea65fdcc3f0..f04f7969d34 100644 --- a/Gemfile +++ b/Gemfile @@ -25,7 +25,7 @@ group :test do gem "nokogiri" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.46" + gem "rubocop", "~> 0.47" gem "test-theme", :path => File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) gem "jruby-openssl" if RUBY_ENGINE == "jruby" From d790477d6dda77c0bea900f2739a076a2b894912 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 16 Jan 2017 10:43:07 +0100 Subject: [PATCH 1847/4996] Add security rules --- .rubocop.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.rubocop.yml b/.rubocop.yml index 87d24743abb..4193f4b4afd 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -48,6 +48,14 @@ Metrics/ParameterLists: Max: 4 Metrics/PerceivedComplexity: Max: 8 +Security/MarshalLoad: + Exclude: + - !ruby/regexp /test\/.*.rb$/ + - lib/jekyll/regenerator.rb +Security/YAMLLoad: + Exclude: + - !ruby/regexp /features\/.*.rb/ + - !ruby/regexp /test\/.*.rb$/ Style/Alias: Enabled: false Style/AlignArray: From 55993c6c5d5cf2b2ad3d5e5b12b365d4ca9d715c Mon Sep 17 00:00:00 2001 From: Dmitrii Evdokimov Date: Mon, 16 Jan 2017 17:53:04 +0300 Subject: [PATCH 1848/4996] Fix a markdown link to look properly on the web --- docs/_docs/windows.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 62fb69b4425..ce7e78c142a 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -15,7 +15,8 @@ A quick way to install Jekyll is to follow the [installation instructions by Dav 2. Install Ruby via Chocolatey: `choco install ruby -y` 3. Reopen a command prompt and install Jekyll: `gem install jekyll` -Updates in the infrastructure of Ruby may cause SSL errors when attempting to use `gem install` with versions of the RubyGems package older than 2.6. (The RubyGems package installed via the Chocolatey tool is version 2.3) If you have installed an older version, you can update the RubyGems package using the directions [here.][ssl-certificate-update] +Updates in the infrastructure of Ruby may cause SSL errors when attempting to use `gem install` with versions of the RubyGems package older than 2.6. (The RubyGems package installed via the Chocolatey tool is version 2.3) If you have installed an older version, you can update the RubyGems package using the directions [here][ssl-certificate-update]. + [ssl-certificate-update]: http://guides.rubygems.org/ssl-certificate-update/#installing-using-update-packages For a more conventional way of installing Jekyll you can follow this [complete guide to install Jekyll 3 on Windows by Sverrir Sigmundarson][windows-installjekyll3]. From 036dd3ccc96365ea97797dc61387aac167c54742 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 16 Jan 2017 11:05:25 -0500 Subject: [PATCH 1849/4996] Update history to reflect merge of #5769 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index eafd41c4516..0d537420664 100644 --- a/History.markdown +++ b/History.markdown @@ -71,6 +71,7 @@ * Add jekyll-pre-commit to plugins list (#5752) * Update quickstart.md (#5758) * Correct minor typo (#5764) + * Fix a markdown link to look properly on the web (#5769) ## 3.3.1 / 2016-11-14 From 9d70bbba44cc2c62ac96a579050f163b52dc1672 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 16 Jan 2017 16:00:07 -0500 Subject: [PATCH 1850/4996] Update history to reflect merge of #5768 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0d537420664..c6694c36ea4 100644 --- a/History.markdown +++ b/History.markdown @@ -49,6 +49,7 @@ * Sort gems in `jekyll.gemspec` (#5746) * Rubocop: Require consistent comma in multiline literals (#5761) * Bump rubocop (#5765) + * New rubocop security checks (#5768) ### Documentation From 567a7952dd0a506b04e2e50a1ac29715bc48aa6d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 16 Jan 2017 16:25:09 -0500 Subject: [PATCH 1851/4996] test/helper: fix flaky plugin path test by initializing Configuration::DEFAULTS at start of tests If we do a Dir.chdir before Configuration::DEFAULTS is initialized, then its source and destination values will not be what we expect. We expect that Dir.pwd should stay as the root of the repo but there are some errant calls to Dir.chdir without a block that are still not yet cleaned up. --- test/helper.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/helper.rb b/test/helper.rb index 0c6935a03fb..fcbb71668b2 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -30,6 +30,11 @@ def jruby? require "rspec/mocks" require_relative "../lib/jekyll.rb" +# The default "source" and "destination" values depend on Dir.pwd, +# which changes when we use Dir.chdir without a block. Initialize +# it here so it has Dir.pwd = root of this repo. +Jekyll::Configuration::DEFAULTS + Jekyll.logger = Logger.new(StringIO.new) unless jruby? From aa7e47a30d4db30e644c54fc939ecd526db3c161 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 16 Jan 2017 16:43:25 -0500 Subject: [PATCH 1852/4996] Remove calls to Dir.chdir without a block. This removes the necessity to initialize Jekyll::Configuration::DEFAULTS manually. --- test/helper.rb | 11 +++++------ test/test_static_file.rb | 15 ++++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index fcbb71668b2..28c37ecff92 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -30,11 +30,6 @@ def jruby? require "rspec/mocks" require_relative "../lib/jekyll.rb" -# The default "source" and "destination" values depend on Dir.pwd, -# which changes when we use Dir.chdir without a block. Initialize -# it here so it has Dir.pwd = root of this repo. -Jekyll::Configuration::DEFAULTS - Jekyll.logger = Logger.new(StringIO.new) unless jruby? @@ -67,6 +62,10 @@ def refute_exist(filename, msg = nil) end module DirectoryHelpers + def root_dir(*subdirs) + File.join(File.dirname(File.dirname(__FILE__)), *subdirs) + end + def dest_dir(*subdirs) test_dir("dest", *subdirs) end @@ -76,7 +75,7 @@ def source_dir(*subdirs) end def test_dir(*subdirs) - File.join(File.dirname(__FILE__), *subdirs) + root_dir("test", *subdirs) end end diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 2be800a662c..c45dcd78063 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -16,33 +16,34 @@ def remove_dummy_file(filename) end def setup_static_file(base, dir, name) - StaticFile.new(@site, base, dir, name) + Dir.chdir(@site.source) { StaticFile.new(@site, base, dir, name) } end def setup_static_file_with_collection(base, dir, name, metadata) site = fixture_site("collections" => { "foo" => metadata }) - StaticFile.new(site, base, dir, name, site.collections["foo"]) + Dir.chdir(site.source) do + StaticFile.new(site, base, dir, name, site.collections["foo"]) + end end def setup_static_file_with_defaults(base, dir, name, defaults) site = fixture_site("defaults" => defaults) - StaticFile.new(site, base, dir, name) + Dir.chdir(site.source) do + StaticFile.new(site, base, dir, name) + end end context "A StaticFile" do setup do clear_dest - @old_pwd = Dir.pwd - Dir.chdir source_dir @site = fixture_site @filename = "static_file.txt" make_dummy_file(@filename) - @static_file = setup_static_file(nil, nil, @filename) + @static_file = setup_static_file(@site.source, "", @filename) end teardown do remove_dummy_file(@filename) if File.exist?(source_dir(@filename)) - Dir.chdir @old_pwd end should "have a source file path" do From 448b6ba08ee419f4dd55b9a0ee0d036089077b48 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 16 Jan 2017 17:03:42 -0500 Subject: [PATCH 1853/4996] Update history to reflect merge of #5779 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c6694c36ea4..dfea615e224 100644 --- a/History.markdown +++ b/History.markdown @@ -50,6 +50,7 @@ * Rubocop: Require consistent comma in multiline literals (#5761) * Bump rubocop (#5765) * New rubocop security checks (#5768) + * test/helper: fix flaky plugin path test by removing calls to Dir.chdir without a block (#5779) ### Documentation From e509cf2139d1a7ee11090b09721344608ecf48f6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 16 Jan 2017 18:38:35 -0500 Subject: [PATCH 1854/4996] Update history to reflect merge of #5767 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index dfea615e224..49783093da8 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * Use the current year for the LICENSE of theme (#5712) * Update License (#5713) * Use Addressable instead of URI to decode (#5726) + * throw IncludeTagError if error occurs in included file (#5767) ### Bug Fixes From 9a5307c3f9c568dec3703a3f30e6c68f0a751597 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 16 Jan 2017 19:17:45 -0500 Subject: [PATCH 1855/4996] Don't include the theme's includes_path if it is nil. --- lib/jekyll/site.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 5797df77e74..3bbeaef34b7 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -435,7 +435,7 @@ def configure_theme private def configure_include_paths @includes_load_paths = Array(in_source_dir(config["includes_dir"].to_s)) - @includes_load_paths << theme.includes_path if self.theme + @includes_load_paths << theme.includes_path if self.theme && theme.includes_path end private From cd8836cf6efe15d4da4c668e8df1a9bfdac71861 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 17 Jan 2017 02:34:15 +0100 Subject: [PATCH 1856/4996] bump htmlproofer --- Gemfile | 2 +- script/proof | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index f04f7969d34..4ead30a9a5b 100644 --- a/Gemfile +++ b/Gemfile @@ -88,7 +88,7 @@ end group :site do if ENV["PROOF"] - gem "html-proofer", "~> 2.0" + gem "html-proofer", "~> 3.4" end gem "jekyll-avatar" diff --git a/script/proof b/script/proof index 1dd63a28925..664e778d22a 100755 --- a/script/proof +++ b/script/proof @@ -32,4 +32,4 @@ bundle exec jekyll build -s $SOURCE -d $DESTINATION --trace # 3. msg "Proofing..." -time bundle exec htmlproof ./$DESTINATION --url-ignore $INGORE_HREFS $@ +time bundle exec htmlproofer ./$DESTINATION --url-ignore $INGORE_HREFS $@ From c39414a17b43399243190a31df7dfe24eeb3d945 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 17 Jan 2017 02:59:57 +0100 Subject: [PATCH 1857/4996] use latest jemoji gem --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index f04f7969d34..97364a112e2 100644 --- a/Gemfile +++ b/Gemfile @@ -95,5 +95,5 @@ group :site do gem "jekyll-mentions" gem "jekyll-seo-tag" gem "jekyll-sitemap" - gem "jemoji", "0.5.1" + gem "jemoji" end From 67ab1596064eef6a2eb9c1dcc4367915c3efe1b7 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 16 Jan 2017 21:38:56 -0500 Subject: [PATCH 1858/4996] Update history to reflect merge of #5691 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 49783093da8..f8433c8389e 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Docs: move permalinks from documents into config (#5544) * Sort gems in `docs/_config.yml` (#5746) * [site] Use defaults for docs and news-items (#5744) + * Improve collections docs (#5691) ### Development Fixes From 5460e711765c99a638a125b1cbaca698ea813297 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 16 Jan 2017 21:48:20 -0500 Subject: [PATCH 1859/4996] Update history to reflect merge of #5731 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f8433c8389e..d03a2f6e7d3 100644 --- a/History.markdown +++ b/History.markdown @@ -36,6 +36,7 @@ * Sort gems in `docs/_config.yml` (#5746) * [site] Use defaults for docs and news-items (#5744) * Improve collections docs (#5691) + * Fix #5730: add gcc and make to the list of requirements (#5731) ### Development Fixes From 4ea770e99565f611359f4699e50fd7b9dcb2face Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 Jan 2017 03:22:44 -0500 Subject: [PATCH 1860/4996] Update history to reflect merge of #5782 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d03a2f6e7d3..f6f737875d2 100644 --- a/History.markdown +++ b/History.markdown @@ -54,6 +54,7 @@ * Bump rubocop (#5765) * New rubocop security checks (#5768) * test/helper: fix flaky plugin path test by removing calls to Dir.chdir without a block (#5779) + * Use latest jemoji gem (#5782) ### Documentation From 9c729033959bf7ef74372a22eb19e67900881aa9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 Jan 2017 03:24:08 -0500 Subject: [PATCH 1861/4996] Update history to reflect merge of #5781 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f6f737875d2..25aa3c5a4a1 100644 --- a/History.markdown +++ b/History.markdown @@ -55,6 +55,7 @@ * New rubocop security checks (#5768) * test/helper: fix flaky plugin path test by removing calls to Dir.chdir without a block (#5779) * Use latest jemoji gem (#5782) + * Bump htmlproofer (#5781) ### Documentation From b9dedb34774382099b89eff7aa8bb85ed5e39ed5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 Jan 2017 03:34:05 -0500 Subject: [PATCH 1862/4996] Update history to reflect merge of #5312 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 25aa3c5a4a1..faee4627e40 100644 --- a/History.markdown +++ b/History.markdown @@ -79,6 +79,7 @@ * Update quickstart.md (#5758) * Correct minor typo (#5764) * Fix a markdown link to look properly on the web (#5769) + * [docs] Info about the help command usage (#5312) ## 3.3.1 / 2016-11-14 From bfb6cf1ca95b57afcacc2e77126774179b14ba92 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Tue, 17 Jan 2017 14:35:33 +0530 Subject: [PATCH 1863/4996] bump rubies --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6ff7022c7b5..30eb1fc5d47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,10 +5,10 @@ language: ruby sudo: false rvm: - - &ruby1 2.3.1 - - &ruby2 2.2.5 + - &ruby1 2.3.3 + - &ruby2 2.2.6 - &ruby3 2.1.9 - - &jruby jruby-9.1.2.0 + - &jruby jruby-9.1.7.0 matrix: include: From 39c4054cd1aa5346ff0e6f547bcdb15485998e3a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 Jan 2017 04:34:19 -0500 Subject: [PATCH 1864/4996] Update history to reflect merge of #5784 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index faee4627e40..f2c2abda883 100644 --- a/History.markdown +++ b/History.markdown @@ -56,6 +56,7 @@ * test/helper: fix flaky plugin path test by removing calls to Dir.chdir without a block (#5779) * Use latest jemoji gem (#5782) * Bump htmlproofer (#5781) + * Bump rubies we test against (#5784) ### Documentation From e1f4d92d023cdbb960eff4a9943bd7930ee50690 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 17 Jan 2017 18:22:28 +0100 Subject: [PATCH 1865/4996] add missing class --- docs/_docs/quickstart.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index b21d084d31d..3d126787b73 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -37,15 +37,14 @@ If you encounter any unexpected errors during the above, please refer to the alr `jekyll new ` installs a new Jekyll site at the path specified (relative to current directory). In this case, Jekyll will be installed in a directory called `myblog`. Here are some additional details: -* To install the Jekyll site into the directory you're currently in, run `jekyll new .` If the existing directory isn't empty, you can pass the `--force` option with `jekyll new . --force`. +* To install the Jekyll site into the directory you're currently in, run `jekyll new .` If the existing directory isn't empty, you can pass the `--force` option with `jekyll new . --force`. * `jekyll new` automatically initiates `bundle install` to install the dependencies required. (If you don't want Bundler to install the gems, use `jekyll new myblog --skip-bundle`.) * By default, the Jekyll site installed by `jekyll new` uses a gem-based theme called [Minima](https://github.com/jekyll/minima). With [gem-based themes](../themes), some of the directories and files are stored in the theme-gem, hidden from your immediate view. * To learn about other parameters you can include with `jekyll new`, type `jekyll new --help`. When in doubt, use the help command to remind you of all available options and usage, it also works with the new, build and serve subcommands, e.g. jekyll help new or jekyll help build. -{: .info } +{: .note .info } ## Next steps Building a Jekyll site with the default theme is just the first step. The real magic happens when you start creating blog posts, using the front matter to control templates and layouts, and taking advantage of all the awesome configuration options Jekyll makes available. - From 2052280ccd026b0c8711e026ed513a4783566308 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 Jan 2017 14:56:00 -0500 Subject: [PATCH 1866/4996] Update history to reflect merge of #5791 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f2c2abda883..5971b779bc0 100644 --- a/History.markdown +++ b/History.markdown @@ -37,6 +37,7 @@ * [site] Use defaults for docs and news-items (#5744) * Improve collections docs (#5691) * Fix #5730: add gcc and make to the list of requirements (#5731) + * Add missing class (#5791) ### Development Fixes From ad8fb9b927908f52565efbf59e3a4198bfd8c82c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Jan 2017 16:19:26 -0500 Subject: [PATCH 1867/4996] Add theme_dir() helper func --- test/helper.rb | 4 ++++ test/test_theme.rb | 9 ++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index bb9e5a29f8d..ca60f79ff19 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -74,6 +74,10 @@ def source_dir(*subdirs) test_dir("source", *subdirs) end + def theme_dir(*subdirs) + test_dir("fixtures", "test-theme", *subdirs) + end + def test_dir(*subdirs) root_dir("test", *subdirs) end diff --git a/test/test_theme.rb b/test/test_theme.rb index ab1eff4395f..3d557dc8ca0 100644 --- a/test/test_theme.rb +++ b/test/test_theme.rb @@ -3,7 +3,6 @@ class TestTheme < JekyllUnitTest def setup @theme = Theme.new("test-theme") - @expected_root = File.expand_path "./fixtures/test-theme", File.dirname(__FILE__) end context "initializing" do @@ -13,7 +12,7 @@ def setup end should "know the theme root" do - assert_equal @expected_root, @theme.root + assert_equal theme_dir, @theme.root end should "know the theme version" do @@ -36,13 +35,13 @@ def setup context "path generation" do [:assets, :_layouts, :_includes, :_sass].each do |folder| should "know the #{folder} path" do - expected = File.expand_path(folder.to_s, @expected_root) + expected = theme_dir(folder.to_s) assert_equal expected, @theme.public_send("#{folder.to_s.tr("_", "")}_path") end end should "generate folder paths" do - expected = File.expand_path("./_sass", @expected_root) + expected = theme_dir("_sass") assert_equal expected, @theme.send(:path_for, :_sass) end @@ -58,7 +57,7 @@ def setup # no support for symlinks on Windows skip_if_windows "Jekyll does not currently support symlinks on Windows." - expected = File.expand_path("./_layouts", @expected_root) + expected = theme_dir("_layouts") assert_equal expected, @theme.send(:path_for, :_symlink) end end From e0d63c8aa90acd4608cfc34b2dbf2e34c6c7483f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Jan 2017 16:19:47 -0500 Subject: [PATCH 1868/4996] Add test to ensure that if the includes dir isn't in the theme that it won't break the site --- test/test_site.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/test_site.rb b/test/test_site.rb index bbf42d25656..cee08dfd342 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -49,6 +49,17 @@ class TestSite < JekyllUnitTest site = Site.new(site_configuration({ "baseurl" => "/blog" })) assert_equal "/blog", site.baseurl end + + should "only include theme includes_path if the path exists" do + site = fixture_site({ "theme" => "test-theme" }) + assert_equal [source_dir("_includes"), theme_dir("_includes")], site.includes_load_paths + + allow(File).to receive(:directory?).with(theme_dir("_sass")).and_return(true) + allow(File).to receive(:directory?).with(theme_dir("_layouts")).and_return(true) + allow(File).to receive(:directory?).with(theme_dir("_includes")).and_return(false) + site = fixture_site({ "theme" => "test-theme" }) + assert_equal [source_dir("_includes")], site.includes_load_paths + end end context "creating sites" do setup do From 023476049befdd61dd9ffabbc3e871034bc3cd9c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Jan 2017 16:21:28 -0500 Subject: [PATCH 1869/4996] Remove superfluous self. --- lib/jekyll/site.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 3bbeaef34b7..87ea719b6a8 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -435,7 +435,7 @@ def configure_theme private def configure_include_paths @includes_load_paths = Array(in_source_dir(config["includes_dir"].to_s)) - @includes_load_paths << theme.includes_path if self.theme && theme.includes_path + @includes_load_paths << theme.includes_path if theme && theme.includes_path end private From 130159dda4c1c567edc7ce2104a82f0e090b7048 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Jan 2017 17:05:14 -0500 Subject: [PATCH 1870/4996] Fix rubocop error. --- test/test_site.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_site.rb b/test/test_site.rb index cee08dfd342..65032ebdfd3 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -52,7 +52,8 @@ class TestSite < JekyllUnitTest should "only include theme includes_path if the path exists" do site = fixture_site({ "theme" => "test-theme" }) - assert_equal [source_dir("_includes"), theme_dir("_includes")], site.includes_load_paths + assert_equal [source_dir("_includes"), theme_dir("_includes")], + site.includes_load_paths allow(File).to receive(:directory?).with(theme_dir("_sass")).and_return(true) allow(File).to receive(:directory?).with(theme_dir("_layouts")).and_return(true) From 2c19264d08786028a94355e0c57d09e19a6324ad Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 17 Jan 2017 18:51:49 -0500 Subject: [PATCH 1871/4996] Add a philosophy doc. --- docs/philosophy.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 docs/philosophy.md diff --git a/docs/philosophy.md b/docs/philosophy.md new file mode 100644 index 00000000000..ad9cbb4f170 --- /dev/null +++ b/docs/philosophy.md @@ -0,0 +1,41 @@ +--- +title: Philosophy +--- + +Jekyll offers a unique philosophy when approaching the problem of static +site generation. This core philosophy drives development and product +decisions. When a contributor, maintainer, or user asks herself what Jekyll +is about, the following principles should come to mind: + +### 1. No Magic + +Jekyll is not magic. A user should be able to understand the underlying +processes that make up the Jekyll build without much reading. It should +behave "as you'd expect." + +### 2. It "Just Works" + +The out-of-the-box experience should be that it "just works." Run `gem +install jekyll` and it should build any Jekyll site that it's given. +Features like auto-regeneration and settings like the markdown renderer +should represent sane defaults that work perfectly for the vast majority of +cases. The burden of configuration should not be placed on the user. + +### 3. Content is King + +Why is Jekyll so loved by content creators? It focuses on content first and +foremost, making the process of publishing content on the Web easy. Users +should find the management of their content enjoyable and simple. + +### 4. Stability + +If a user's site builds today, it should build tomorrow. +Backwards-compatibility should be strongly preferred over breaking changes. +Upon breaking changes, provide a clear path for users to upgrade. + +### 5. Small & Extensible + +The core of Jekyll should be simple and small, and extensibility should be +a first-class feature to provide added functionality from community +contributors. The core should be kept to features used by at least 90% of +users–everything else should be provided as a plugin. From a9c7e14d6079e8cfee9adfd7e54e11954e9c0ba1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 Jan 2017 18:59:39 -0500 Subject: [PATCH 1872/4996] Update history to reflect merge of #5780 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5971b779bc0..dcf5a6195ab 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Add a module to re-define `ENV["TZ"]` in Windows (#5612) * Use each instead of map to actually return nothing (#5668) * include: fix 'no implicit conversion of nil to String' (#5750) + * Don't include the theme's includes_path if it is nil. (#5780) ### Site Enhancements From 0b4a097a40bafd278116a7833f87ae1b6cbdc81a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 Jan 2017 20:20:36 -0500 Subject: [PATCH 1873/4996] Update history to reflect merge of #5753 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index dcf5a6195ab..55a65c5ee2e 100644 --- a/History.markdown +++ b/History.markdown @@ -83,6 +83,7 @@ * Correct minor typo (#5764) * Fix a markdown link to look properly on the web (#5769) * [docs] Info about the help command usage (#5312) + * Add missing merge labels for jekyllbot (#5753) ## 3.3.1 / 2016-11-14 From 402eb0dfa548ffbbd11a9b9a1fffa90a0ee40b04 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 17 Jan 2017 20:21:49 -0500 Subject: [PATCH 1874/4996] Update history to reflect merge of #5542 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 55a65c5ee2e..26abb8799af 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * Use each instead of map to actually return nothing (#5668) * include: fix 'no implicit conversion of nil to String' (#5750) * Don't include the theme's includes_path if it is nil. (#5780) + * test double slash when input = '/' (#5542) ### Site Enhancements From 0599c2242570d82230f60b70ffa49d8f363f0e1c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 18 Jan 2017 14:15:13 -0500 Subject: [PATCH 1875/4996] Update history to reflect merge of #5640 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 26abb8799af..36e70cb6d85 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * Update License (#5713) * Use Addressable instead of URI to decode (#5726) * throw IncludeTagError if error occurs in included file (#5767) + * Write Jekyll::Utils::Exec.run for running shell commands. (#5640) ### Bug Fixes From b6bc85ec7cf70dfdde262eb15b0723b191ad21d0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 Jan 2017 14:16:08 -0500 Subject: [PATCH 1876/4996] Correct 2 Style/TrailingCommaInLiteral rubocop offenses in test_filters.rb --- test/test_filters.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index 8b31a171368..d18b57e3ef3 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -377,7 +377,7 @@ def select; end page_url = "/" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => "/base" + "baseurl" => "/base", }) assert_equal "http://example.com/base/", filter.absolute_url(page_url) end @@ -386,7 +386,7 @@ def select; end page_url = "/" filter = make_filter_mock({ "url" => "http://example.com", - "baseurl" => nil + "baseurl" => nil, }) assert_equal "http://example.com/", filter.absolute_url(page_url) end From b2d93913d09740494d5bfedea9a9f459acdf9353 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 18 Jan 2017 15:36:13 -0500 Subject: [PATCH 1877/4996] Update history to reflect merge of #5694 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 36e70cb6d85..e9df1fb4ed4 100644 --- a/History.markdown +++ b/History.markdown @@ -41,6 +41,7 @@ * Improve collections docs (#5691) * Fix #5730: add gcc and make to the list of requirements (#5731) * Add missing class (#5791) + * Improve template docs (#5694) ### Development Fixes From b7f44e6ecace7521614942d631345b504ad146bf Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 18 Jan 2017 16:54:21 -0500 Subject: [PATCH 1878/4996] Queue up a 3.4 deploy with unfinished release post. --- History.markdown | 2 +- docs/_docs/history.md | 95 +++++++++++++++++++ .../2017-01-18-jekyll-3-4-0-released.markdown | 16 ++++ docs/latest_version.txt | 2 +- lib/jekyll/version.rb | 2 +- 5 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown diff --git a/History.markdown b/History.markdown index 36e70cb6d85..8ad3e2ae814 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,4 @@ -## HEAD +## 3.4.0 / 2016-01-20 ### Minor Enhancements diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 03767126d9b..a31266bcdec 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,6 +4,101 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.4.0 / 2016-01-20 +{: #v3-4-0} + +### Minor Enhancements +{: #minor-enhancements-v3-4-0} + +- Add connector param to `array_to_sentence_string` filter ([#5597]({{ site.repository }}/issues/5597)) +- Adds `group_by_exp` filter ([#5513]({{ site.repository }}/issues/5513)) +- Use the current year for the LICENSE of theme ([#5712]({{ site.repository }}/issues/5712)) +- Update License ([#5713]({{ site.repository }}/issues/5713)) +- Use Addressable instead of URI to decode ([#5726]({{ site.repository }}/issues/5726)) +- throw IncludeTagError if error occurs in included file ([#5767]({{ site.repository }}/issues/5767)) +- Write Jekyll::Utils::Exec.run for running shell commands. ([#5640]({{ site.repository }}/issues/5640)) + +### Bug Fixes +{: #bug-fixes-v3-4-0} + +- Escaped regular expressions when using `post_url`. ([#5605]({{ site.repository }}/issues/5605)) +- fix date parsing in file names to be stricter ([#5609]({{ site.repository }}/issues/5609)) +- Add a module to re-define `ENV["TZ"]` in Windows ([#5612]({{ site.repository }}/issues/5612)) +- Use each instead of map to actually return nothing ([#5668]({{ site.repository }}/issues/5668)) +- include: fix 'no implicit conversion of nil to String' ([#5750]({{ site.repository }}/issues/5750)) +- Don't include the theme's includes_path if it is nil. ([#5780]({{ site.repository }}/issues/5780)) +- test double slash when input = '/' ([#5542]({{ site.repository }}/issues/5542)) + +### Site Enhancements +{: #site-enhancements-v3-4-0} + +- Remove instructions to install Jekyll 2 on Windows ([#5582]({{ site.repository }}/issues/5582)) +- Fix example URL inconsistency ([#5592]({{ site.repository }}/issues/5592)) +- Replace backticks within HTML blocks with HTML tags ([#5435]({{ site.repository }}/issues/5435)) +- Add jekyll-migrate-permalink ([#5600]({{ site.repository }}/issues/5600)) +- Fix bad config YAML in collections example ([#5587]({{ site.repository }}/issues/5587)) +- Bring documentation on 'Directory Structure' up-to-date ([#5573]({{ site.repository }}/issues/5573)) +- Use only the used Font Awesome icons. ([#5530]({{ site.repository }}/issues/5530)) +- Switch to `https` when possible. ([#5611]({{ site.repository }}/issues/5611)) +- Update `_font-awesome.scss` to move .woff file before .ttf ([#5614]({{ site.repository }}/issues/5614)) +- Update documentation on updating FontAwesome Iconset ([#5655]({{ site.repository }}/issues/5655)) +- Improve quickstart docs ([#5689]({{ site.repository }}/issues/5689)) +- Add Jekyll-Post to list of plugins ([#5705]({{ site.repository }}/issues/5705)) +- Add jekyll-numbered-headings ([#5688]({{ site.repository }}/issues/5688)) +- Docs: move permalinks from documents into config ([#5544]({{ site.repository }}/issues/5544)) +- Sort gems in `docs/_config.yml` ([#5746]({{ site.repository }}/issues/5746)) +- [site] Use defaults for docs and news-items ([#5744]({{ site.repository }}/issues/5744)) +- Improve collections docs ([#5691]({{ site.repository }}/issues/5691)) +- Fix [#5730]({{ site.repository }}/issues/5730): add gcc and make to the list of requirements ([#5731]({{ site.repository }}/issues/5731)) +- Add missing class ([#5791]({{ site.repository }}/issues/5791)) + +### Development Fixes +{: #development-fixes-v3-4-0} + +- clean unit-test names in `test/test_tags.rb` ([#5608]({{ site.repository }}/issues/5608)) +- Add cucumber feature to test for bonafide theme gems ([#5384]({{ site.repository }}/issues/5384)) +- Use `assert_nil` instead of `assert_equal nil` ([#5652]({{ site.repository }}/issues/5652)) +- Rubocop -a on lib/jekyll ([#5666]({{ site.repository }}/issues/5666)) +- Bump to rake 12.0 ([#5670]({{ site.repository }}/issues/5670)) +- Rubocop Gemfile ([#5671]({{ site.repository }}/issues/5671)) +- update Classifier-Reborn to 2.1.0 ([#5711]({{ site.repository }}/issues/5711)) +- Rubocop: fix Rakefile and gemspec ([#5745]({{ site.repository }}/issues/5745)) +- Use `assert_nil` ([#5725]({{ site.repository }}/issues/5725)) +- Sort gems in `jekyll.gemspec` ([#5746]({{ site.repository }}/issues/5746)) +- Rubocop: Require consistent comma in multiline literals ([#5761]({{ site.repository }}/issues/5761)) +- Bump rubocop ([#5765]({{ site.repository }}/issues/5765)) +- New rubocop security checks ([#5768]({{ site.repository }}/issues/5768)) +- test/helper: fix flaky plugin path test by removing calls to Dir.chdir without a block ([#5779]({{ site.repository }}/issues/5779)) +- Use latest jemoji gem ([#5782]({{ site.repository }}/issues/5782)) +- Bump htmlproofer ([#5781]({{ site.repository }}/issues/5781)) +- Bump rubies we test against ([#5784]({{ site.repository }}/issues/5784)) + +### Documentation + +- Fixed typo ([#5632]({{ site.repository }}/issues/5632)) +- use backticks for Gemfile for consistency since in the next sentence … ([#5641]({{ site.repository }}/issues/5641)) +- Update Core team list in the README file ([#5643]({{ site.repository }}/issues/5643)) +- Improve Permalinks documentation. ([#5653]({{ site.repository }}/issues/5653)) +- Fix typo in Variables doc page ([#5657]({{ site.repository }}/issues/5657)) +- Fix a couple of typos in the docs ([#5658]({{ site.repository }}/issues/5658)) +- Update windows.md ([#5683]({{ site.repository }}/issues/5683)) +- Improve permalinks docs ([#5693]({{ site.repository }}/issues/5693)) +- Document --unpublished build option ([#5720]({{ site.repository }}/issues/5720)) +- Improve pages docs ([#5692]({{ site.repository }}/issues/5692)) +- Added new includes.md topic to docs ([#5696]({{ site.repository }}/issues/5696)) +- Replace a dead link with a web-archived one ([#5738]({{ site.repository }}/issues/5738)) +- Remove duplicate paragraph. ([#5740]({{ site.repository }}/issues/5740)) +- Addition of a sample "typical post" ([#5473]({{ site.repository }}/issues/5473)) +- Fix a minor grammatical mistake on themes' document ### -dev ([#5748]({{ site.repository }}/issues/5748)) +- Correct comments in data_reader.rb ([#5621]({{ site.repository }}/issues/5621)) +- Add jekyll-pre-commit to plugins list ([#5752]({{ site.repository }}/issues/5752)) +- Update quickstart.md ([#5758]({{ site.repository }}/issues/5758)) +- Correct minor typo ([#5764]({{ site.repository }}/issues/5764)) +- Fix a markdown link to look properly on the web ([#5769]({{ site.repository }}/issues/5769)) +- [docs] Info about the help command usage ([#5312]({{ site.repository }}/issues/5312)) +- Add missing merge labels for jekyllbot ([#5753]({{ site.repository }}/issues/5753)) + + ## 3.3.1 / 2016-11-14 {: #v3-3-1} diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown new file mode 100644 index 00000000000..ca9745d7f58 --- /dev/null +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -0,0 +1,16 @@ +--- +title: 'Jekyll turns 3.4.0' +date: 2017-01-18 14:19:13 -0500 +author: parkr +version: 3.4.0 +categories: [release] +--- + +Hey there! We have a quick updated of Jekyll for you to enjoy this January. +Packed full of bug fixes as usual, thanks to the tireless efforts of our +exceptional Jekyll community. Three changes to call out: + +1. If you're a big fan of [`where_by_exp`](/docs/filters/), you'll be an +even bigger fan of [`group_by_exp`](/docs/filters/). +2. Using a custom timezone in Jekyll on Windows? Yeah, sorry that hasn't ever worked + properly. We made the internals possible diff --git a/docs/latest_version.txt b/docs/latest_version.txt index bea438e9ade..18091983f59 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.3.1 +3.4.0 diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index a01e787a21d..4babc2082bc 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.3.1".freeze + VERSION = "3.4.0".freeze end From 60ba3fc0c982f771c75f59d2f4d2061d0bc1ef8f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 19 Jan 2017 08:55:04 -0500 Subject: [PATCH 1879/4996] Update history to reflect merge of #5736 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e9df1fb4ed4..b813f405c55 100644 --- a/History.markdown +++ b/History.markdown @@ -87,6 +87,7 @@ * Fix a markdown link to look properly on the web (#5769) * [docs] Info about the help command usage (#5312) * Add missing merge labels for jekyllbot (#5753) + * Fix broken links in documentation (#5736) ## 3.3.1 / 2016-11-14 From 63dfe080db91334dab01276e70b33e77430a2e41 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 19 Jan 2017 22:06:37 +0100 Subject: [PATCH 1880/4996] bump rdoc to v5.0 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 7a786c9b15f..0abcbe4a426 100644 --- a/Gemfile +++ b/Gemfile @@ -69,7 +69,7 @@ group :jekyll_optional_dependencies do gem "jekyll-redirect-from" gem "kramdown", "~> 1.9" gem "mime-types", "~> 3.0" - gem "rdoc", "~> 4.2" + gem "rdoc", "~> 5.0" gem "toml", "~> 0.1.0" platform :ruby, :mswin, :mingw, :x64_mingw do From 6ec2145c0ccf949e0d1ef0ca7d0aa4acbdb05c4c Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 19 Jan 2017 22:15:07 +0100 Subject: [PATCH 1881/4996] bump codeclimate-test-reporter to v1.0.5 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 7a786c9b15f..9b0a2c182a5 100644 --- a/Gemfile +++ b/Gemfile @@ -18,7 +18,7 @@ end # group :test do - gem "codeclimate-test-reporter", "~> 0.6.0" + gem "codeclimate-test-reporter", "~> 1.0.5" gem "cucumber", "~> 2.1" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" From 5ed22d0b3eb4dbabfdf458fa5ad288983f29e8d7 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 19 Jan 2017 22:39:39 +0100 Subject: [PATCH 1882/4996] Now we must execute SimpleCov --- test/helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/helper.rb b/test/helper.rb index 94bad2ccacf..74f2682e36b 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -10,8 +10,8 @@ def jruby? end if ENV["CI"] - require "codeclimate-test-reporter" - CodeClimate::TestReporter.start + require "simplecov" + SimpleCov.start else require File.expand_path("../simplecov_custom_profile", __FILE__) SimpleCov.start "gem" do From 4ed4c430445dd58f0991f322cded2e38feecf1b6 Mon Sep 17 00:00:00 2001 From: Tunghsiao Liu Date: Fri, 20 Jan 2017 15:14:23 +0800 Subject: [PATCH 1883/4996] Add `match_regex` and `replace_regex` filters --- docs/_docs/plugins.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 9034cb207a2..09bb2feb5a5 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -803,6 +803,8 @@ LESS.js files during generation. - [jekyll-typogrify](https://github.com/myles/jekyll-typogrify): A Jekyll plugin that brings the functions of [typogruby](http://avdgaag.github.io/typogruby/). - [Jekyll Email Protect](https://github.com/vwochnik/jekyll-email-protect): Email protection liquid filter for Jekyll - [Jekyll Uglify Filter](https://github.com/mattg/jekyll-uglify-filter): A Liquid filter that runs your JavaScript through UglifyJS. +- [match_regex](https://github.com/sparanoid/match_regex): A Liquid filter to perform regex match. +- [replace_regex](https://github.com/sparanoid/replace_regex): A Liquid filter to perform regex replace. #### Tags From 4804806266e9fade7c3de6bf0d3064bc013e29fd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 20 Jan 2017 03:42:02 -0500 Subject: [PATCH 1884/4996] Update history to reflect merge of #5799 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b813f405c55..883cb845f1a 100644 --- a/History.markdown +++ b/History.markdown @@ -88,6 +88,7 @@ * [docs] Info about the help command usage (#5312) * Add missing merge labels for jekyllbot (#5753) * Fix broken links in documentation (#5736) + * Docs: add `match_regex` and `replace_regex` filters (#5799) ## 3.3.1 / 2016-11-14 From 12201d4f1bf057abdbad544a7a49c64b539691f0 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 20 Jan 2017 09:49:34 +0100 Subject: [PATCH 1885/4996] update excluded paths --- .codeclimate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index cd70c7de6af..b3d26d655a1 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -23,7 +23,7 @@ exclude_paths: - features/**/* - script/**/* - - site/**/* + - docs/**/* - spec/**/* - test/**/* - vendor/**/* From 9fe73be1013639b6721b4bffb787d8e62cbf12bd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 20 Jan 2017 13:59:19 -0500 Subject: [PATCH 1886/4996] Update history to reflect merge of #5797 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 883cb845f1a..8b63ad60bc1 100644 --- a/History.markdown +++ b/History.markdown @@ -62,6 +62,7 @@ * Use latest jemoji gem (#5782) * Bump htmlproofer (#5781) * Bump rubies we test against (#5784) + * Bump rdoc to v5.0 (#5797) ### Documentation From eb54e270f91892e4df6d3252cfa896b5ff9afdf5 Mon Sep 17 00:00:00 2001 From: Ajay Karwal Date: Sat, 21 Jan 2017 00:17:14 +0000 Subject: [PATCH 1887/4996] Added note about --blank flag Added instructions about installing Jekyll with a blank slate using the --blank flag. --- docs/_docs/quickstart.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index 50df76cf080..a8a2ae98cb5 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -40,6 +40,7 @@ If you encounter any unexpected errors during the above, please refer to the alr * To install the Jekyll site into the directory you're currently in, run `jekyll new .` If the existing directory isn't empty, you can pass the `--force` option with `jekyll new . --force`. * `jekyll new` automatically initiates `bundle install` to install the dependencies required. (If you don't want Bundler to install the gems, use `jekyll new myblog --skip-bundle`.) * By default, the Jekyll site installed by `jekyll new` uses a gem-based theme called [Minima](https://github.com/jekyll/minima). With [gem-based themes](../themes), some of the directories and files are stored in the theme-gem, hidden from your immediate view. +* We recommend setting up Jekyll with a gem-based theme but if you want to start with a blank slate, use `jekyll new myblog --blank` * To learn about other parameters you can include with `jekyll new`, type `jekyll new --help`. When in doubt, use the help command to remind you of all available options and usage, it also works with the new, build and serve subcommands, e.g. jekyll help new or jekyll help build. From f7186c86c4b365fbd13a5b9602033eb34bf83f08 Mon Sep 17 00:00:00 2001 From: Josh Habdas Date: Sun, 22 Jan 2017 22:33:21 +0800 Subject: [PATCH 1888/4996] Got that diaper money? --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 09bb2feb5a5..d9e5fe33ad2 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -805,6 +805,7 @@ LESS.js files during generation. - [Jekyll Uglify Filter](https://github.com/mattg/jekyll-uglify-filter): A Liquid filter that runs your JavaScript through UglifyJS. - [match_regex](https://github.com/sparanoid/match_regex): A Liquid filter to perform regex match. - [replace_regex](https://github.com/sparanoid/replace_regex): A Liquid filter to perform regex replace. +- [Jekyll Money](https://rubygems.org/gems/jekyll-money): A Jekyll plugin for dealing with money. Because we all have to at some point. #### Tags From c1b542e066f656f81a3fc138b0b73871c4852d9b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 22 Jan 2017 12:00:29 -0500 Subject: [PATCH 1889/4996] Update history to reflect merge of #5810 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8b63ad60bc1..64cc144c21a 100644 --- a/History.markdown +++ b/History.markdown @@ -90,6 +90,7 @@ * Add missing merge labels for jekyllbot (#5753) * Fix broken links in documentation (#5736) * Docs: add `match_regex` and `replace_regex` filters (#5799) + * Got that diaper money? (#5810) ## 3.3.1 / 2016-11-14 From 03722f022e4a0858aabfe85d7b06b369c942786d Mon Sep 17 00:00:00 2001 From: Nicolas Hoizey Date: Sun, 22 Jan 2017 22:12:58 +0100 Subject: [PATCH 1890/4996] Add mention of classifier-reborn for LSI classifier-reborn is mandatory for LSI since Jekyll 3.0 --- docs/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index e4c35b8ad0a..2542b85f5bb 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -233,7 +233,7 @@ class="flag">flags (specified on the command-line) that control them.

    LSI

    -

    Produce an index for related posts.

    +

    Produce an index for related posts. The classifier-reborn plugin must be used.

    lsi: BOOL

    From e6392ea6dd56af288de3b6602868455414eba92a Mon Sep 17 00:00:00 2001 From: Nicolas Hoizey Date: Mon, 23 Jan 2017 10:06:24 +0100 Subject: [PATCH 1891/4996] Update configuration.md --- docs/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 2542b85f5bb..3f3bfd25c9f 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -233,7 +233,7 @@ class="flag">flags (specified on the command-line) that control them.

    LSI

    -

    Produce an index for related posts. The classifier-reborn plugin must be used.

    +

    Produce an index for related posts. Requires the classifier-reborn plugin.

    lsi: BOOL

    From 2a2602cf61af9b83c43b60470dc89d1817557a64 Mon Sep 17 00:00:00 2001 From: Josh Habdas Date: Mon, 23 Jan 2017 17:59:25 +0800 Subject: [PATCH 1892/4996] Add jekyll-ga plug-in --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 09bb2feb5a5..f0cdb3454f2 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -753,6 +753,7 @@ LESS.js files during generation. - [Jekyll::Paginate::Category](https://github.com/midnightSuyama/jekyll-paginate-category): Pagination Generator for Jekyll Category. - [AMP-Jekyll by Juuso Mikkonen](https://github.com/juusaw/amp-jekyll): Generate [Accelerated Mobile Pages](https://www.ampproject.org) of Jekyll posts. - [Jekyll Art Gallery plugin](https://github.com/alexivkin/Jekyll-Art-Gallery-Plugin): An advanced art/photo gallery generation plugin for creating galleries from a set of image folders. Supports image tagging, thumbnails, sorting, image rotation, post-processing (remove EXIF, add watermark), multiple collections and much more. +- [jekyll-ga](https://github.com/developmentseed/jekyll-ga): A Jekyll plugin that downloads Google Analytics data and adds it to posts. Useful for making a site that lists "most popular" content. [Read the introduction](https://developmentseed.org/blog/google-analytics-jekyll-plugin/) post on the developmentSEED blog. #### Converters From 2a56e9ce0d5eaf3581bf0bf4e134241731785974 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 23 Jan 2017 11:53:13 -0500 Subject: [PATCH 1893/4996] Update history to reflect merge of #5812 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 64cc144c21a..776fd40b225 100644 --- a/History.markdown +++ b/History.markdown @@ -91,6 +91,7 @@ * Fix broken links in documentation (#5736) * Docs: add `match_regex` and `replace_regex` filters (#5799) * Got that diaper money? (#5810) + * Sort content by popularity using Google Analytics (#5812) ## 3.3.1 / 2016-11-14 From 2662319641fe0b4a902d448407ef8bb860d4d53b Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 23 Jan 2017 19:58:20 +0100 Subject: [PATCH 1894/4996] typo --- docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown index ca9745d7f58..6950277eb80 100644 --- a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -6,7 +6,7 @@ version: 3.4.0 categories: [release] --- -Hey there! We have a quick updated of Jekyll for you to enjoy this January. +Hey there! We have a quick update of Jekyll for you to enjoy this January. Packed full of bug fixes as usual, thanks to the tireless efforts of our exceptional Jekyll community. Three changes to call out: From 3a3ceff1509b0391952252c6121db614387dd88e Mon Sep 17 00:00:00 2001 From: Ricardo N Feliciano Date: Thu, 19 Jan 2017 19:29:09 -0500 Subject: [PATCH 1895/4996] Rework CI doc to include multiple providers. --- docs/_docs/continuous-integration.md | 242 ++---------------- docs/_docs/continuous-integration/circleci.md | 92 +++++++ .../_docs/continuous-integration/travis-ci.md | 230 +++++++++++++++++ docs/img/circleci-badge.svg | 14 + docs/img/travis-ci-badge.png | Bin 0 -> 26749 bytes 5 files changed, 351 insertions(+), 227 deletions(-) create mode 100644 docs/_docs/continuous-integration/circleci.md create mode 100644 docs/_docs/continuous-integration/travis-ci.md create mode 100644 docs/img/circleci-badge.svg create mode 100644 docs/img/travis-ci-badge.png diff --git a/docs/_docs/continuous-integration.md b/docs/_docs/continuous-integration.md index c2e8a31fab1..7947764554d 100644 --- a/docs/_docs/continuous-integration.md +++ b/docs/_docs/continuous-integration.md @@ -1,232 +1,20 @@ --- title: Continuous Integration -permalink: /docs/continuous-integration/ --- -You can easily test your website build against one or more versions of Ruby. -The following guide will show you how to set up a free build environment on -[Travis][0], with [GitHub][1] integration for pull requests. Paid -alternatives exist for private repositories. - -[0]: https://travis-ci.org/ -[1]: https://github.com/ - -## 1. Enabling Travis and GitHub - -Enabling Travis builds for your GitHub repository is pretty simple: - -1. Go to your profile on travis-ci.org: https://travis-ci.org/profile/username -2. Find the repository for which you're interested in enabling builds. -3. Click the slider on the right so it says "ON" and is a dark grey. -4. Optionally configure the build by clicking on the gear icon. Further - configuration happens in your `.travis.yml` file. More details on that - below. - -## 2. The Test Script - -The simplest test script simply runs `jekyll build` and ensures that Jekyll -doesn't fail to build the site. It doesn't check the resulting site, but it -does ensure things are built properly. - -When testing Jekyll output, there is no better tool than [html-proofer][2]. -This tool checks your resulting site to ensure all links and images exist. -Utilize it either with the convenient `htmlproofer` 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 - -```sh -#!/usr/bin/env bash -set -e # halt script on error - -bundle exec jekyll build -bundle exec htmlproofer ./_site -``` - -Some options can be specified via command-line switches. Check out the -`html-proofer` README for more information about these switches, or run -`htmlproofer --help` locally. - -For example to avoid testing external sites, use this command: - -```sh -$ bundle exec htmlproofer ./_site --disable-external -``` - -### The HTML Proofer Library - -You can also invoke `html-proofer` in Ruby scripts (e.g. in a Rakefile): - -```ruby -#!/usr/bin/env ruby - -require 'html-proofer' -HTMLProofer.check_directory("./_site").run -``` - -Options are given as a second argument to `.new`, and are encoded in a -symbol-keyed Ruby Hash. For more information about the configuration options, -check out `html-proofer`'s README file. - -[2]: https://github.com/gjtorikian/html-proofer - -## 3. Configuring Your Travis Builds - -This file is used to configure your Travis builds. Because Jekyll is built -with Ruby and requires RubyGems to install, we use the Ruby language build -environment. Below is a sample `.travis.yml` file, followed by -an explanation of each line. - -**Note:** You will need a Gemfile as well, [Travis will automatically install](https://docs.travis-ci.com/user/languages/ruby/#Dependency-Management) the dependencies based on the referenced gems: - -```ruby -source "https://rubygems.org" - -gem "jekyll" -gem "html-proofer" -``` - -Your `.travis.yml` file should look like this: - -```yaml -language: ruby -rvm: -- 2.2.5 - -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, only for GitHub Pages -branches: - only: - - gh-pages # test the gh-pages branch - - /pages-(.*)/ # test every branch which starts with "pages-" - -env: - global: - - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer - -sudo: false # route your build to the container-based infrastructure for a faster build -``` - -Ok, now for an explanation of each line: - -```yaml -language: ruby -``` - -This line tells Travis to use a Ruby build container. It gives your script -access to Bundler, RubyGems, and a Ruby runtime. - -```yaml -rvm: -- 2.2.5 -``` - -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. - -```yaml -before_script: - - chmod +x ./script/cibuild -``` - -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. - -```yaml -script: ./script/cibuild -``` - -Travis allows you to run any arbitrary shell script to test your site. One -convention is to put all scripts for your project in the `script` -directory, and to call your test script `cibuild`. This line is completely -customizable. If your script won't change much, you can write your test -incantation here directly: - -```yaml -install: gem install jekyll html-proofer -script: jekyll build && htmlproofer ./_site -``` - -The `script` directive can be absolutely any valid shell command. - -```yaml -# branch whitelist, only for GitHub Pages -branches: - only: - - gh-pages # test the gh-pages branch - - /pages-(.*)/ # test every branch which starts with "pages-" -``` - -You want to ensure the Travis builds for your site are being run only on -the branch or branches which contain your site. One means of ensuring this -isolation is including a branch whitelist in your Travis configuration -file. By specifying the `gh-pages` branch, you will ensure the associated -test script (discussed above) is only executed on site branches. If you use -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. Travis will build from every -push to any branch of your repo if leave it out. - -```yaml -env: - global: - - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer -``` - -Using `html-proofer`? You'll want this environment variable. Nokogiri, used -to parse HTML files in your compiled site, comes bundled with libraries -which it must compile each time it is installed. Luckily, you can -dramatically decrease the install time of Nokogiri by setting the -environment variable `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true`. - -
    -
    Be sure to exclude vendor from your - _config.yml
    -

    Travis bundles all gems in the vendor directory on its build - servers, which Jekyll will mistakenly read and explode on.

    +Continuous Integration (CI) enables you to publish your Jekyll generated website with confidence by automating the quality assurance and deployment processes. You can quickly get started using CI with one of the providers below: + + - -```yaml -exclude: [vendor] -``` - -By default you should supply the `sudo: false` command to Travis. This command -explicitly tells Travis to run your build on Travis's [container-based - infrastructure](https://docs.travis-ci.com/user/workers/container-based-infrastructure/#Routing-your-build-to-container-based-infrastructure). Running on the container-based infrastructure can often times -speed up your build. If you have any trouble with your build, or if your build -does need `sudo` access, modify the line to `sudo: required`. - -```yaml -sudo: false -``` - -### 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/docs/_docs/continuous-integration.md -[4]: https://jekyllrb.com/help/ diff --git a/docs/_docs/continuous-integration/circleci.md b/docs/_docs/continuous-integration/circleci.md new file mode 100644 index 00000000000..ccd2d933a9c --- /dev/null +++ b/docs/_docs/continuous-integration/circleci.md @@ -0,0 +1,92 @@ +--- +title: "CircleCI" +--- + +Building, testing, and deploying your Jekyll-generated website can quickly be done with [CircleCI][0], a continuous integration & delivery tool. CircleCI supports [GitHub][1] and [Bitbucket][2], and you can get started for free using an open-source or private repository. + +[0]: https://circleci.com/ +[1]: https://github.com/ +[2]: https://bitbucket.org/ + +## Follow Your Project on CircleCI + +To start building your project on CircleCI, all you need to do is 'follow' your project from CircleCI's website: + +1. Visit the 'Add Projects' page: +1. From the GitHub or Bitbucket tab on the left, choose a user or organization. +1. Find your project in the list and click 'Build project' on the right. +1. The first build will start on its own. You can start telling CircleCI how to build your project by creating a [circle.yml][3] file in the root of your repository. + +[3]: https://circleci.com/docs/configuration/ + +## Dependencies + +The easiest way to manage dependencies for a Jekyll project (with or without CircleCI) is via a [Gemfile][4]. You'd want to have Jekyll, any Jekyll plugins, [HTML Proofer](#html-proofer), and any other gems that you are using in the `Gemfile`. Don't forget to version `Gemfile.lock` as well. Here's an example `Gemfile`: + +[4]: http://bundler.io/gemfile.html + +```yaml +source 'https://rubygems.org' + +ruby '2.4.0' + +gem 'jekyll' +gem 'html-proofer' +``` + +CircleCI detects when `Gemfile` is present is will automatically run `bundle install` for you in the `dependencies` phase. + +## Testing + +The most basic test that can be run is simply seeing if `jekyll build` actually works. This is a blocker, a dependency if you will, for other tests you might run on the generate site. So we'll run Jekyll, via Bundler, in the `dependencies` phase. + +``` +dependencies: + post: + - bundle exec jekyll build +``` + +### HTML Proofer + +With your site built, it's useful to run tests to check for valid HTML, broken links, etc. There's a few tools out there but [HTML Proofer][5] is popular amongst Jekyll users. We'll run it in the `test` phase with a few preferred flags. Check out the `html-proofer` [README][6] for all available flags, or run `htmlproofer --help` locally. + +[5]: https://github.com/gjtorikian/html-proofer +[6]: https://github.com/gjtorikian/html-proofer/blob/master/README.md#configuration + +```yaml +test: + post: + - bundle exec htmlproofer ./_site --check-html --disable-external +``` + +## Complete Example circle.yml File + +When you put it all together, here's an example of what that `circle.yml` file could look like: + +``` +machine: + environment: + NOKOGIRI_USE_SYSTEM_LIBRARIES: true # speeds up installation of html-proofer + +dependencies: + post: + - bundle exec jekyll build + +test: + post: + - bundle exec htmlproofer ./_site --allow-hash-href --check-favicon --check-html --disable-external + +deployment: + prod: + branch: master + commands: + - rsync -va --delete ./_site username@my-website:/var/html +``` + +## Questions? + +This entire guide is open-source. Go ahead and [edit it][7] if you have a fix or [ask for help][8] if you run into trouble and need some help. CircleCI also has an [online community][9] for help. + +[7]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/circleci.md +[8]: https://jekyllrb.com/help/ +[9]: https://discuss.circleci.com diff --git a/docs/_docs/continuous-integration/travis-ci.md b/docs/_docs/continuous-integration/travis-ci.md new file mode 100644 index 00000000000..caff2f64238 --- /dev/null +++ b/docs/_docs/continuous-integration/travis-ci.md @@ -0,0 +1,230 @@ +--- +title: "Travis CI" +--- + +You can easily test your website build against one or more versions of Ruby. +The following guide will show you how to set up a free build environment on +[Travis][0], with [GitHub][1] integration for pull requests. + +[0]: https://travis-ci.org/ +[1]: https://github.com/ + +## 1. Enabling Travis and GitHub + +Enabling Travis builds for your GitHub repository is pretty simple: + +1. Go to your profile on travis-ci.org: https://travis-ci.org/profile/username +2. Find the repository for which you're interested in enabling builds. +3. Click the slider on the right so it says "ON" and is a dark grey. +4. Optionally configure the build by clicking on the gear icon. Further + configuration happens in your `.travis.yml` file. More details on that + below. + +## 2. The Test Script + +The simplest test script simply runs `jekyll build` and ensures that Jekyll +doesn't fail to build the site. It doesn't check the resulting site, but it +does ensure things are built properly. + +When testing Jekyll output, there is no better tool than [html-proofer][2]. +This tool checks your resulting site to ensure all links and images exist. +Utilize it either with the convenient `htmlproofer` 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 + +```sh +#!/usr/bin/env bash +set -e # halt script on error + +bundle exec jekyll build +bundle exec htmlproofer ./_site +``` + +Some options can be specified via command-line switches. Check out the +`html-proofer` README for more information about these switches, or run +`htmlproofer --help` locally. + +For example to avoid testing external sites, use this command: + +```sh +$ bundle exec htmlproofer ./_site --disable-external +``` + +### The HTML Proofer Library + +You can also invoke `html-proofer` in Ruby scripts (e.g. in a Rakefile): + +```ruby +#!/usr/bin/env ruby + +require 'html-proofer' +HTMLProofer.check_directory("./_site").run +``` + +Options are given as a second argument to `.new`, and are encoded in a +symbol-keyed Ruby Hash. For more information about the configuration options, +check out `html-proofer`'s README file. + +[2]: https://github.com/gjtorikian/html-proofer + +## 3. Configuring Your Travis Builds + +This file is used to configure your Travis builds. Because Jekyll is built +with Ruby and requires RubyGems to install, we use the Ruby language build +environment. Below is a sample `.travis.yml` file, followed by +an explanation of each line. + +**Note:** You will need a Gemfile as well, [Travis will automatically install](https://docs.travis-ci.com/user/languages/ruby/#Dependency-Management) the dependencies based on the referenced gems: + +```ruby +source "https://rubygems.org" + +gem "jekyll" +gem "html-proofer" +``` + +Your `.travis.yml` file should look like this: + +```yaml +language: ruby +rvm: +- 2.2.5 + +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, only for GitHub Pages +branches: + only: + - gh-pages # test the gh-pages branch + - /pages-(.*)/ # test every branch which starts with "pages-" + +env: + global: + - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer + +sudo: false # route your build to the container-based infrastructure for a faster build +``` + +Ok, now for an explanation of each line: + +```yaml +language: ruby +``` + +This line tells Travis to use a Ruby build container. It gives your script +access to Bundler, RubyGems, and a Ruby runtime. + +```yaml +rvm: +- 2.2.5 +``` + +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. + +```yaml +before_script: + - chmod +x ./script/cibuild +``` + +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. + +```yaml +script: ./script/cibuild +``` + +Travis allows you to run any arbitrary shell script to test your site. One +convention is to put all scripts for your project in the `script` +directory, and to call your test script `cibuild`. This line is completely +customizable. If your script won't change much, you can write your test +incantation here directly: + +```yaml +install: gem install jekyll html-proofer +script: jekyll build && htmlproofer ./_site +``` + +The `script` directive can be absolutely any valid shell command. + +```yaml +# branch whitelist, only for GitHub Pages +branches: + only: + - gh-pages # test the gh-pages branch + - /pages-(.*)/ # test every branch which starts with "pages-" +``` + +You want to ensure the Travis builds for your site are being run only on +the branch or branches which contain your site. One means of ensuring this +isolation is including a branch whitelist in your Travis configuration +file. By specifying the `gh-pages` branch, you will ensure the associated +test script (discussed above) is only executed on site branches. If you use +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. Travis will build from every +push to any branch of your repo if leave it out. + +```yaml +env: + global: + - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer +``` + +Using `html-proofer`? You'll want this environment variable. Nokogiri, used +to parse HTML files in your compiled site, comes bundled with libraries +which it must compile each time it is installed. Luckily, you can +dramatically decrease the install time of Nokogiri by setting the +environment variable `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true`. + +
    +
    Be sure to exclude vendor from your + _config.yml
    +

    Travis bundles all gems in the vendor directory on its build + servers, which Jekyll will mistakenly read and explode on.

    +
    + +```yaml +exclude: [vendor] +``` + +By default you should supply the `sudo: false` command to Travis. This command +explicitly tells Travis to run your build on Travis's [container-based + infrastructure](https://docs.travis-ci.com/user/workers/container-based-infrastructure/#Routing-your-build-to-container-based-infrastructure). Running on the container-based infrastructure can often times +speed up your build. If you have any trouble with your build, or if your build +does need `sudo` access, modify the line to `sudo: required`. + +```yaml +sudo: false +``` + +### 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/docs/_docs/continuous-integration/travis-ci.md +[4]: https://jekyllrb.com/help/ diff --git a/docs/img/circleci-badge.svg b/docs/img/circleci-badge.svg new file mode 100644 index 00000000000..38658380a67 --- /dev/null +++ b/docs/img/circleci-badge.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/docs/img/travis-ci-badge.png b/docs/img/travis-ci-badge.png new file mode 100644 index 0000000000000000000000000000000000000000..94f255ec9ef016e18e94f7fedb6bb04105ae4aa7 GIT binary patch literal 26749 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

    ak<2AIA!{{F87&q>sx_$WcF+D1SEnsUiAvXH$1 z>WQVF!17Kx?b>k=ZTdgPktZdh7j-n!al_Z%9jXM6TZ~h)s=Iv}6o(5UIpruZNQZ>A`-f{vt&0!u}S_0XLy`mELyVB*}ZamShLYG?4?S$a6`l1Rcg z{OrKJv%aEQ{;1U(jHH@tK(Bs!PIdT_nh5pCm~F^CA#H=(D@r=C^Ow_5M3a(<;zL@> za{kq7!|8*CH^k5QxI60ytp*pEQsS_1GlTrrK$m^K)y|9RrEnkqj+-szV13pJMy$PI z_&7(XgDKV!?XTkqKA5JO$mf*EehRa<7QE+Av5GL;bXiokw5omnU-JyfiATX=b3{$6 z&-L2nn2FY!Kuyom6FK{_R!vH9Cneb`N8Pv)je2$v$!TGmS&}`pXl~;UCPA9UCUqtt zK4e3vnV44$D0F3p>OjOqO6B+-8UNg6t89ONZDhLLeM#C`_S4g6Pif50{!#eH!Rk6? zp$R(e*9p})l!xFpBg(r)DFh}{&Bp!dlU0Fk53}HN_?OCKB};R_?}dHArP_0$7j)*g-!Ie{wf!lM-J4OC#bYVdo*3zbyUV|6E4?kBr7p$j)n5Lf+RjeQDZLY6 zc^qV0Rb$?9$WxT%F6BMtdZ{GacO4!&)T(Lk)T!~`z?6}wsfkIIcZKalVVaJr^_lCN z>8ClNQV(ZOA82n>_vYO0tlC?mpdkv3}gg!n{W-D z2PNJzeg`+5&qWc61}?~el0zI!Cg82D({0e$BIR+Nx4h@7Wk*`-0%=9Q*S0NF`q#Bx z{JswuFWPBq)$&kXqs8{j-Cq1jqm=5MYA zTa0Z;G2W8ARrl$fKSimRkDjs6r=9%9y=JdS!LkvBXvhK$pedyf{f0l=Pi^2{X(>f#y@E(=1PGg!4A_tN^wC1(to{7HCsYs}nImdmAFcL3llMJz zw|X*c5U*8QX)C@=i6*RqJ}i{y^= z=g(w+{U?{qu!T=5rruW26)Uig^_xo?9h4cLeEM+TwAnB$HkRQ(+eTfiI(MT1zt3#( zirHB6(xAR;GvI@0t9{>~psA?%8BthM;E(ABZ!wzT|2{)WzDVpk2|6dwrwb@=0bfOx z`6VJSayqmy9$MS(!BD%Z{}f^!cHsf>=`_-GIX4LZSC@4nQZXhX?+t2$9a!w$$t&&r~EC7&t~ikwu&%H14S&d+U6qFSRU^ZCwWmrgv5lThaU zMDC5exyyUaJst^0t14zyn=<=`4L7nmj!QP1dvk7qo)h!)-&i;PBg|9YN$dS#Iewi~ zEtO^H9sAu?7mibL1gUy&5tArC4Ou?is$7bv8kDD-qfysOrQ>O^L;O8~pI^urSRCsV zkU=60H?vHC+{7)_EMEr`2z$-I8qOcqMoK+VF+^Xd2?^Xi_R)}=dz}C(5E>M{%ftQS zscyeR@4IITliU@-sSA6CcRAz^;nCl}C0D@nhzPG;ewFpo@*32H1e`RomWmR#V7)g} zxxQFD*ej9O{uo_%-!o-5YPvp`sdr{SP!NFPMe!~FtKzddRt>ILiqk27fERxHP^9NZ z)`HNqBad1B890+7Id3SMO6M>10;{1QSm{IMuGA;9GexD9h(HIuaqnHN9QkmpQ~1$N z2Ua;VEVy;zLAF%Cbe;aE-DWfVxtZUKpld0BLwXXcgs5AW2lT;Y{R=a1`A5}==8KuhMhvQg zzAEd#e;724i~Uc5P4(gsOaQ#GeD*~q5nlgRh}(Px#3+^>8^Wc`I>uZH)-}y*b#NAC zR8UC%;b+!@coN?vA*Y-R&M)c( zVAP@-+~O-_PF*L2j;Scq)x-TMXV`aKs`HQkdQ30@ukP$rUg+?u5qp#M%f*paod$f7 zxC^qF^3e@ZAy;}XI>BnX&k-?VKVuPgVO?OJUhtY)(c#|b{zOpUhidxznznSzV zU8?qdib<1t`+j|Gbk$?*J2z6iku6>GOV;@$A=<6B?O3bg6dFp{l+QsoGY-q=p(FC1 z(|GydKf5}*#5?4s`TDsWYEx|MFPGb1obMO#HjwXB);I+esn7g4z6=``eHNj8f^7{1Gh;W}r?zh@cw;*Oe? zKgsLtCzs(I;_pprgUu^p5x^Lj3yoWw4sU_KDJurOBGFfRGh*ac1a+THrwA z%-KfseZ}i-G4rMv7mfApU&~c{?*I}*Qr(N=wXw!R43kC6D1T3sSj?w+8i%h;mBIDS z7RRS$_f#2Rd8=$|+lN9DFU#*dY?5!rHz=B7l=LK4YTb`_OwjG&<$>p&z4FHtQXpf8_e$CoW0uM}(fSN^Bw z=CxZ-BYeO|wwKQmrLu64er>cB88``Tc&mA@^y*Y7OSZxBWG77VLYb!X+TM4>;Ien( zwqP7=GuNKWw9`#Xw#FuaVU_W{dd%{7t>eBYq({e4~*1EVl#u>ZjQ4GE-mMR!sEDE?y|R{kFpXX(yQYR>W$<(AFr1@$*lj|iJ>3ebgP;BdOw_uS9VnVXnH(P zW`bz@!Jh}zWV1xS`hXH$4_3qK)ZiLh&d>Ui@lS#hAa39~ZDNKXC-R-xZuVX2U(e;J zOi4~eh`&@XH|*Kk93~R1?kceHdAXCEvj?4aYSms1?E$Ws#a(Z@YY#YH*7p3M*6$FL zN|`un7+&XsEUo*4Ill-dh*^8`CF|7-$9&-xFz%KO1NxjEO{mv#M{qjFV0OdY4_0X& z%A?nX_GNq`_ZUvE-n3PEDTc(5?DXwkm6mKiT}#v`9OLe>qitifo~7zx4wo@p)g-%@ z_Q%U&u+j>Su9cOLIUOMeg3mt{NNtU^SrJ_38pO)Ds%f~`)%|p#l-SVGSo$X8-m=RR z72cBGP&^+%3U9730TOAjyZ7s0L(3pMOTciso9*kbJP_<5o!gKD&rMcGj%>J0^Kadr zROF|>fxp!sj?NedM2mWvtdAM4ztH7lIFB_ypr)P7;Wv6p{_#90v)Ze^-}TIPPG*Mqd7WzBzp2hE^TxPfel}q66{+v=+YS-}~UpM{8cf zrSDf^emQ2~;wXF5>W|Ba3fBTk;%-u5ppWL$;1_cx*dFfo$A}r@JnJ z#Q)^S2B0B|?CkdY?g!sn>s5c`A4gcdppzXP#x(k=IZrl%jZ z7?+Pem*OeQ{E7`jE*)MTAF-?v2dx~h4!FOiy7>Ufe>Jn~JQ=dS^*M;%Isyl z|8r!v6Gp_vYf52l_7i}jiwrDL&}Nk=-Q+-|24_5821>MSdY4bT>Xm;L*Vmerq#Q2kIGnH zBhcY0jjKxAewiCDNJxWg zQrv!`TkwZgTqcQLb?|SHPRkDI+Zf?ur1fzkhiBuo$#+m% z3Z?nMsnus1a98OW^fzloU!3VfuY^)mxyS8Vri;@IS7<^*3MO9f-2s%$RK5O}5$~`1 zPRs#WV5fHuwI{W5{CWGGn$LZOwFc9kT{yJJ@!62UW#I?0ng6sv7GJHWnZn%t8ffg^ z)}?y?d{6k=CVF-z8Z%%I@LJ1sD>7t#%vLSocRy*cewE4V2Mq`9JnQg6Z6n9g`gRA`ZM zVNICEI;p@g#w6VE>4mtq&Id$cF2DIKs>r`Ng#r~DdZ-VPuM0HMP4Gw>v0aV(fNizT zbg$uCAZ#7rsv9Q=oT;{7KEB|jC}yygkB$ozQ&$HnHBn*Z-I*8Ee-mrw0!V!Y%M@oGeTxkA(=-Xs ze|+Dqdd*4EjDdjJM4pn85_uSTnj*1S<=qxzzEd*Hv?DY3^cQml=St3d2H>OfJc2V` zL8Gw70_W9$?di4iRenF;P|T1vU*~$~P|{q-9E{dT$nTkb5-3At~VYkZ{qT69Gqw<=Y19`r_Uc_yOfmF`yox1`7iXo%Ya$<(tnyrhx zOlATv!^NxxD{2P=%$9pd_m=aY>4&>9 zj@$^(jxDiWZW;Ao#cBi3tkvfTCyOe*gY=(<7wA<52G2EH=HX~!>$3Fz#JUG<31&(; zKeN9-=WcU{qGrC32Xr{@$@);0_XM|6HK0ys z#yJAGhNb-;-HodKJRkm+wW92kfZy471zjm^(kF2D@SKSdRf{Wxye!pEo6k87)n4Lc zwG04EOE%sf-$aAmUT7E+Yy<_-ysP*~lElUAo`)N?LHhM-=GEL@%Xc`fZ%&-IeYpg? zJLf6qT|E98ap!5DnAP7dv|<=e5Sg74EloE3!Fun7{Zh~Y{+(kK5ckF}oUQUiWg&4L zW0l{jpZ6obv2o-syd|pt0g2Dr*ADBvtDMF*1u4V%6UkiLg3Nx!>Elj(>-oSEnmXYA zvDY!IEZ23e+Ux{*eOaG}47jXIdNn%>ryVQ%i*MJQ?s0&XRGxet9wJYMA2Zzzs*)yu ze++N2@LC?al@0Q3N%pM}WppA`983e-g7SoqXb7k*(lJ8O=4H2*HNN;+qRzQ`mj5xlZB zz$vQ#~u^UK~l__0rV(EH}53Y`@Fs;Wc__Qh^%^?T*U zsB8*-wP_L*$?CjPTPhj7`fmIcA8R=Nfn9#^#&Z7+1vvk}!4XuzA~abFXfEV7_nsAH zv-H|uFGv&+TSGE&#|D^%{r%_}9sL_)_~eE!V6f$(|C>wdi>u9BY}3Ri**Gm(T)%Fn zew~{X$qW15S?cDj*@EkVIxQ-{tM_Uk_LJIiT|nNO-$@N4f?)Jv!{J4!#LGpy7esLL zfrlco-wx!?U$>iK z-`5)#_w98K3K97A@uBD0xsV4Vh@GJ1BRt?~U9bpylt%1rjWJkoE~x$HNU-xqEz4vW zTKmRp3S_+Dd;JewvaI_>B&i#pS@SR{zgDSzu|OF2BCv-f_s=;qc4c zA~4%an@9Zt5#JM>zNt_&J*yJ2ahk=53=T>=PApLEgkh4q!Xm=xZ~=x1u0x%ThJD8h zO%VtoMAf!EUFI_YDzQQ)v);AYdJp?#c)^-}tPBtDY^E-_2^3QHR88|YerrKF_P?(# zf#0dqLM1qgN4@^GCmQe^E8tb=BT~12;7l&)Z&X>h@TunNMEc$M!(b)k_{1MnTG{fuQXeea57k-<@ZBc6Ng6-LA;<5YO}cXdYRGH3)HW z)eHOe?We;F-(p5OpF#hxq^k~Svg_iTlz@y-L0VF2>23i55u|H$C^2#j$temVARSTz zrBj+QN*a-rl#P^b>HZ$x@9*uNdr#iy-h0mP(A!Kdm$_4#mMl8uKW8~&aVqnZqJ-^E zNn8rYycsCuofCBy&wLSt+Eo9>;7+C3bu`16))~4{F(y(oI-|h5^zR4NGXW53nH_FhArHejb z{6RmIQ;&09*6Sj$hIwI;oEfcC9y)0O#I*chi0ew$Zbeq4WbYqVwfAsbblIOK%*M*X zHsZmq?(NY_O)~?aa&0hIz@Vxww+3SdxFu9)h1M4lt4XOA&@F(i9TFI2_TOc6lx-Fc zGgri!aXXTR|K?B%9ATjy0KwBRA42igoW?FUast^4gqKA-K{VV#sm~#wHm0qP`6*xz zymtt#SPP2N`*rdy@JEfL*xPBdVBXS2z&wam*6z0gDgmi<)7u+ZSYZh!-~g@v2K1h% z`iddfQ%v7Z4UHy@pEt}ykvK+YKNM@fSF>($h;AOq)A*94#(7#A21&10VmxkA?h1Oh z4dnmdh_m+~WBv~wd<>|QfmAJO^(Hgi+Y0|$>wYf`d(YLC*hu0Rqs|fL=hUaI%jQZJ z#CiS1#nCXInf5UzHda5|^e~UTz#r~d46~yiOl&{SKj2bVlOHPt7>E(c*h;9CBu8L^ zzot8lG5&1O2$c#G4U=0>bg}&AzUY5Y{K(~{PTImR$RW2Q-g@pYJ=6iB?p!HDmual% z(Mv@j!n!LKB75jyB9ZZv3L#_KsurnW&+_uw>9Bll=$4!T2 zs8kILgMp-mo%3h(*>WR}ZpVeYv}grf=ANeK?~Q>%Ls_kbl=x5UtYP_u$7hBJ^hQ^i z;QO}$<_DpnGTe@R1uDG%XbV%b%=@4CjivM2l^fKd9#>G`Hxl@!nlf2Rgs=Rl^Ilu& zj>j`~uyAJdw3LYPmU=6&iEA!?ITce1f&SHf^>0Qzy^wR2yQdKFS;?Pe1X+to0p~) zlSnp&s~SRVOQk%14Vjc`{i#C?o<=tG%zu48qcTv8Nmrxd8fOc8uDv16-nDn-^_?h4 zvlF$40O3qqfD$BsT1S<5*O0S>z=qT`DK4{4xs!o*sMj4s%i4MAqmhXD0)v*6zrUxd z-yF12poM#*cDcdA3es`|t2$qa0;=S^J)f}b(@X4QkfIwoDCHia*?pgDgxQjddS87% zzl%S;43UcOgJ(X@W~FC0Z&7rirf@MnE4j!$bzYum2fiQN>V@ry&+rgT*{#h;AtA)idCk5p@-YLT2 zT@98og(a!pdew~PX^IHA6u8s!I zx4l^fi&6w0@UZgj6D<+xmI%pnOsw0xl=rW)7GDk|*)B^v{c)AuA@aVi6dNm=wlt*+ zoqNX#F_mX2zz&75xF|a>^km*y>r|99Kr_vU;{p^12e}J}pp&%bA zLN+&nO#G2ll&v{#+5EtOcpgyeO0TRse}Ng#q)K$0C{a|W%xxQv{!Zh~nsvJ%{^N`{ zZ!g4IOy<3XHpcY3X88JmSfGjW{}=03$T{Ni_?c{Xdi$5a%2bW9&BK+WAVNbn{)E@6 zuYdyoD*J?zDgP-VL3p=L@r=Z%xZ5Y{K(XDa#FhN9~|E9c7JcCx9{7{3( zcn9FKKP7eO!2&NA^qIl@)xQ~DyARzPpSGk2che(QSyzUj5NIXrH?16-qoA4$vL$ZP zNWU+3jC8m*kv$*%B0CgEz7Tyd$8Y>AJ_{GKUh zjf9u_{Ow>cGQt@lxy^Dc4DOUrY(>V;ntxFfQMxgsdI~ z60?ac1*trL`z<}ezaxZ#w^M6G$j8Nho01=S z34&iirAt_Aw@ix+DTOc3`}t1m%rTDuS{Sfl!ginrK3-3zFaX%~ByytXrcK z{8`bVa)8GMCDi>JD3SI%obGlzv&NYo9@2}ef$#7BS$uJo>sHwo*r7VX6S_(c^G8Vb zCIONp3lE%1EXw|GH#DMOl$Rbp{o@u`y)gst?iZh0Tzl6L+$6O`8hlKI61h|6-a`TB z1NeX?2O|4Ic4QhSeG2X}t-{IXTY296-&}>UWKYP8^nQx*7t}S9%Z%GYzt0A4{4g~X z;^QY1_^1Y`)*VB#&FZ+*`pj4HA*_P+JJ4}{p94;yA` z1JA!i#=m$R$fj&zSRYb+FXDDz!2*-$u~CnGE9t~w6@TY_fvI?Zwj-yIUuDN!iZ~-4 z8=5{{BN6_z;IsIAXIG032_DoJ<+ZdByASbLI}iCkn4UNAKfuXpNaEVoH|B*#!|!vOk%zF*-b|OwDv>}*2IRi+~??eN(?vi0|*GLYC3MMxZydC&mVf;5W_E~MMuDS*MW zlK(Dbm+r~t6CC=y%4sHTrcH*BiYCwBzPcgsaH0eOgkXz>DR59G+nnPiceDJiuBg?( z3_ZbNUg<$9;bcnI3{(G`dY_($-8H|vM#KS8NP|{WWsOircnwe%-o!NH4eKVnAdVwZ zXNm7Cs+`61TK3wmp25oqsrnfLxFby?l-HbEyH8^_=z-&ha(@fM6Dt*LI?N^hxOvU{ zsTPc%*egMYFxf@$md)YabN!+&3(RQZi$kp_RHyORd$iGyQSnkqp8@z6^jvWTeO_Bl z(X3FoDz3!+1+KDqI*sdKk>evgGd>#3#*K)?hTb@fV;0dlk*jVmHX6tHk$_!(9qXgym z6~o!-I4Y9ELM!f-?81|ylRDbOrexgw2-O-ev>jS!5xZYs#Pz`x8P%m zd0~AURFi&Gh)cPz@AS^4-Lg(HX{J`lhh;3f$Kq_6&tzWEbY%5eo2|911lvDjUr4<* z-<;8ZV=hN$E;N2i;aVuCiZ@gDhK`h&EEaI@FL z`6+pmtUWvxEcJ=Ad9j{$h<^pHWX&cC+8M~VpIrV(fCBz_B*V;!xGY= zT86%jAmXLh4#!f|JQJ1caqyLA4|%}LEvKVlL6gPT{#ZE4zpL=TG2NQKi3$qTY%bKv zzO2Ooq2Ei4bb(?@3Nr*1zvN&czz7?5o!vdQhd?3KTU(&%h1CP|-{|m}!#m#!h!Wk+Q|jKDwFh8zKA@i_PZmuf-8qO2+OhnP|@1eVE3r zkLo`9z=8*@UpAi~IL>MDKcq{o907}=iL#?*h!L{fCNEkRX<%j)f4|*5FWL*-X1T^x z=*})OH_SH4I-_-rlF^;Dm^r=Yz%IfhP~w4If7J5t^sQLL80ggliM zq|0m&=TTL7x7Q>wYBmh?dyW5?tjEjv8#adf!_y7*g)7}PioM3Xj>n2k%u!NG{uP5@ z;q)R&#WW3Ip@_P!Uc>HB`=G?K7;)&F9|8D1;+$?xo$?&8&9y{4Mt*;Cz zvEAXCqrW!?7G%>0qwO7JW^4SKe#Oi-xcWavXch%2(Uy=miut-NU~ua1CECDW&Y2u{ zKWe>ez}=U}&E*MV*uA{&A&;k`Gyf(nIYDKAnq8E-`)~O^jY|tAHkNP2uSbd-=Zx!s zPzE)rr3wHXfe#MYLyOK^#QvHnm*j3=uG?oA$?7o4P5?*|+jq-BZ%7o3-k5c31QO4evGj?Wp25v2)AclVAcfwt1)eREJjIStFPL@G2Cy?u0*z6wP zG1l`_a2iRqTk~R+e1Yj{CTrQOPSCA4G#brjRMIQ0=6nC{?f3zfe*cp5mw^Fa;C@|O zUtO1;Nh-L_&Ij+0XtJv>7tSl;V->v;&9KL*wfmG;%9@WmXRK}+P~XXB?fgQPB-d@p zY+kOyqeKcjoc%>ZGVV4aWn3-5yjdh!mWaBnc%{bcByj_(!%P^JpF&5YF{@GC)?~BD ze)?W4-(G_iE7v>bar7T7mxIMV|1&9gr(PPQvW2J})|c5A<@W=J=2bcVkB zB}Y+6JYX5LNBo;qs|^aNKs(WhmqT6~yWFzJfUnBNjJz{Vo0|5goqgcVwGPL@ubmFZ z2Y{66)ZnlUos5sq&%vDYd(zw{TOO=L9RGr%tF4$hyI&jXxG9YUJWtcKcx+J;C-izM zp+0Z!=RS3=nE4boI<3+nK&S6_%O=oXg2X( zgUENu9T)z20?y^6*HaM@z!QhTGYB2Drfh$FEKORwWQH*3d<0d3uB1fBNZvoH6sH0E zVV8asMTZ8aD5W@kR#aJp@cSHLJN2iI0cs=B(lIniG&M^edoj7&Yr5p0Tn|_!SBKWM zGSm#+3hRGwH8>wGMRiQ=E!ctgef#9<_d?d0Yqy9!k?>9sbn|y9G5Gd+kxBkb)w)_`mAUk zT4(WFN6j#Jv*YNc2gUIqgJTPDU^DU`VBZc`e#fx)Z)$y~r%i)qH1SFI?e+#T-hxZQ zp(gAqc+PkphXK-5>SKzxZPl#7catIfSG-kYj2#Fq3diJKn>+5lnlB7QgXStO4^KzhjgE#zV_>em~x`K(e2|5BmaUc!Z?@z2rw zA>T&;1eQ^&()?H?`T(NNKe+A``v&fM+5V;l6wYbS`OHanpLWqXMP>$w$m~51Sq>^0M zp0wkE>yw#mo_X)@Kfg!e=-5v-?XSwS5vo@5*&u$_v-V~k7UK=jX!(G@@3ObC;MFqf z09qzu{{?F{51%&K@=sNL8Yr!l3x^ZP8b^UZohgTh{8jKZ4Sj*0PLe(>A7P=n5hXE z#~mIjuhlsf;oYs5&&=Fy0a>mD)+72Yw#H%@NCu)g=bg}i+*bGSnK6)2|GofiA-$Q_o|;bfyTC9mWlYxOmnbXcJ^ z(7xek!~3JTl$~35!aZ&^Bv?fjGd>a96`pRg*~6Hw`Sb#ouoYKR)*)e&3&(s@r^*d3 zrO(4V8NRuw$G^Dw+!dK4-$nfLbqfJtEasgKgcM8i@tqkFlTSFiTyeF5+2mPf>y;dd zP4<%H!MM=AK|^xTm~yKp>(iKFQSAyKBcR{7Z2iRk-oz`!V8G{=70 zJ(b&|EV1rfU6fVE!VU7aKQD#X6tLGCZ&r%}>=VcQPDVYUy~bHrJC*4qJ2Z%JKX4vK zq<@0`vKxSeOlN$C237~({}}ho!{=<7w4=X&HUCumnGM0FmI-iRl&YW4WF9Q+!_GJ# z^Cm#xWfiC>R{K0mj)ZiWs^S#>zSFB;KQsgg)<=vxdflk%Yn%EQ+C)ng`Q*zL*}K%K z<{80%KwkbcZ2^<{fVtGF;ufE!mBKZ!8qZVNs)y80>B?lljxoCFIKv~(6e1p+h^Ya9 zUgYE>o9eOpNXDYPLkoteK_<%J$D|Cuka@7dI1!NUZ}CLjWGzuv4*=UbGtTkClVco^ zX79IO^XWF#Wq>-p_GHAfMbgg^St-bmwj@6;D<$zVS;KqVATqJ?HA7saN-$wQF-=76 z8)>TD!BkwFmL90rG?gmsHnY9co^9fO6Pu^0U2c9zL$#0%_|2oS{)7|}H6~CXc2Tj+ z&s!Z9)XHprsaX>A*CuNJyrSn67Rcnlpju3_p6a-rs!uZ;6Y2-En(~R6bq6r7KW@s0 z{^7Rc*l$b=YBRB?fh~loM1>HwKfvY}delz_bSCXQ*tUELL#W5u0kH(KWx^-qT_h~l zzgG?=4~IPu(;)Ul<2cj}0lciKQftgI{j;Jp(fWD4&hGwjm`@#sUH!&idacOBV+7@G zUZpNBgp%*=-MGNmU`^i^zdF^_d0^u)aBfeie*a6*Hi#8XKf@wd#wi>pa&O)7Cr-p4 zmBr7ogV|0IluzyI(QyF&sdEM0+aS%vM~VB%Kg>Iy$u;r{BLbWEy*89CX8UYoXBy_;I2j za~#$tt@Rm|b6!IzzR!(ylu?#eZ0RjpCVY&1!+};O4t4#W=lwY0W?XyT{lNNp$zf9q zrXaa$yBc=1I@LyxCn%BqCNf}mKbdLFkj$W##<^y)?d8-)q~a1S7)Eo~8gvGKG;zIt zmn5{1`|+u!$(o81AhFX1D?}M-l71S@HH*FQHRXn~pO7=%ANzGj97-a63pInt ziIjo=D??L-ywl>@iINL*+4Xeea!U^W0mm2GpIG)@7R7-WQdX{Ms38ELnQT~zB*QJU z_gX7cPm<}ng-AqwB1bDhQ+u+0Y3UN7C8jiS?BGCEbBfV0*Hu#WN0mtSFfB>0NsdxR zI`62D#K2U_menscAZ>6M2%Rl$GamQ2MYJTIcrQ!8pm^H+MZX;T*gfZ_BA0#Sm(%50jDeyGjH#GG3FQr=Z7Dl?B&~d#keNehjp=MclX{lrM zC2e6t_uS^I@`5$huf--wZp*u)x#8y6)HnyI8xZ{!t(YNujb|a~hAsfpHd0Kza4Yv& z9TNb|KNz%V>cwM0Bqq;ySqUnwJM*G?N_Bdqv{r@;+2L zi$VFSva4SfcQzU~ToHrcfNbkPznlD``n5DCF47_Vy>TbiCv}=SM!_d4Z*i=|RwsCh z_Nj?fRSXZA@`|*?jJ|RLnn>|D$j$NjjwYUqoitMN{K_JY6O9ivHGCrl{Fu`Ui&

    #3$RpaHpFsInJ z%)l~`DYR|$8JI+u!{ddZPw(u~i%N!YIQ!smB~;rol(_-BM{+vIww93 zE^uUK?a$>G1guNls@n-sLXe~+9Irn$!QL6T-K#bL{$0EF1Hoh=awm+d@`X8ow*NM; zEL)X1WMhHjBY95gQr42wSNqJ9!7knq zOXgSKee>c2NX6Dnafr#M*o{@Y^tiH5;<;#KBt<{2}x@VsTCLaAyp@yxcB?QGO%`EJNVy$O7Z30jFz*J z_zVI0!yf}7YUBu?o#sluV_(mqJrBT|a)x6RCce9~*(N3t`YvFt-PPQa9mm8HCei5Z z$dDI-hhGL-E>H8NZ!YyW1GehqNO~~qI?ZTX6T9^P~)Q0MZ_D z;nJoB*#-aLUB?xdD&bXMmbyy+@-SE-+-tf1rVYP3L&!l&w9c@5$3A(?!4Gpq^k|Ee;WDK)1adYf}x#Y)RZ=b4ZZ~5_n1pBn(gFFZT30 zI;1U6|Lt|LFkyF@0|uw{OqL_w-OOJ3CtlsOZvJ1D$m`ddx3InC0nPiREf;royKa%I zyDF+H2JN;w>)}>ZIDPwVL5dFG>8YVrdxvs~+;pLVb}V1`%Vooqti-0^@RGW$G()SF21 zyVbD>ruM)mA16hSu5CXbF;K`wv_CyzoJUyH2I-mQ=W6Xmrb1_L z8rHnKkjTPMeE~}MUqWa%{gdqi*9Nv96E%*llULp{eR$K#L>JAF>Pt|qhpa1t!FE68 zoko&;kFBe-;g{^mK`Xv9j{_W1H@VpZ!c;`}idSE#UDhB{M*ha;xKe1&#-~+^Tzp&n_iulDmUNtT)3$_tje Date: Tue, 24 Jan 2017 01:42:53 +0100 Subject: [PATCH 1896/4996] Review CI pages --- docs/_docs/continuous-integration.md | 20 ------------------ docs/_docs/continuous-integration/circleci.md | 6 +++--- docs/_docs/continuous-integration/index.md | 9 ++++++++ .../_docs/continuous-integration/travis-ci.md | 14 ++++++------ docs/img/circleci-badge.svg | 14 ------------ docs/img/travis-ci-badge.png | Bin 26749 -> 0 bytes 6 files changed, 19 insertions(+), 44 deletions(-) delete mode 100644 docs/_docs/continuous-integration.md create mode 100644 docs/_docs/continuous-integration/index.md delete mode 100644 docs/img/circleci-badge.svg delete mode 100644 docs/img/travis-ci-badge.png diff --git a/docs/_docs/continuous-integration.md b/docs/_docs/continuous-integration.md deleted file mode 100644 index 7947764554d..00000000000 --- a/docs/_docs/continuous-integration.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Continuous Integration ---- - -Continuous Integration (CI) enables you to publish your Jekyll generated website with confidence by automating the quality assurance and deployment processes. You can quickly get started using CI with one of the providers below: - - diff --git a/docs/_docs/continuous-integration/circleci.md b/docs/_docs/continuous-integration/circleci.md index ccd2d933a9c..fede484a2d1 100644 --- a/docs/_docs/continuous-integration/circleci.md +++ b/docs/_docs/continuous-integration/circleci.md @@ -8,7 +8,7 @@ Building, testing, and deploying your Jekyll-generated website can quickly be do [1]: https://github.com/ [2]: https://bitbucket.org/ -## Follow Your Project on CircleCI +## 1. Follow Your Project on CircleCI To start building your project on CircleCI, all you need to do is 'follow' your project from CircleCI's website: @@ -19,7 +19,7 @@ To start building your project on CircleCI, all you need to do is 'follow' your [3]: https://circleci.com/docs/configuration/ -## Dependencies +## 2. Dependencies The easiest way to manage dependencies for a Jekyll project (with or without CircleCI) is via a [Gemfile][4]. You'd want to have Jekyll, any Jekyll plugins, [HTML Proofer](#html-proofer), and any other gems that you are using in the `Gemfile`. Don't forget to version `Gemfile.lock` as well. Here's an example `Gemfile`: @@ -36,7 +36,7 @@ gem 'html-proofer' CircleCI detects when `Gemfile` is present is will automatically run `bundle install` for you in the `dependencies` phase. -## Testing +## 3. Testing The most basic test that can be run is simply seeing if `jekyll build` actually works. This is a blocker, a dependency if you will, for other tests you might run on the generate site. So we'll run Jekyll, via Bundler, in the `dependencies` phase. diff --git a/docs/_docs/continuous-integration/index.md b/docs/_docs/continuous-integration/index.md new file mode 100644 index 00000000000..14c5c7490a4 --- /dev/null +++ b/docs/_docs/continuous-integration/index.md @@ -0,0 +1,9 @@ +--- +title: Continuous Integration +permalink: /docs/continuous-integration/ +--- + +Continuous Integration (CI) enables you to publish your Jekyll generated website with confidence by automating the quality assurance and deployment processes. You can quickly get started using CI with one of the providers below: + +* [Travis CI](travis-ci) +* [CircleCI](circleci) diff --git a/docs/_docs/continuous-integration/travis-ci.md b/docs/_docs/continuous-integration/travis-ci.md index caff2f64238..e76e1a60c32 100644 --- a/docs/_docs/continuous-integration/travis-ci.md +++ b/docs/_docs/continuous-integration/travis-ci.md @@ -4,10 +4,10 @@ title: "Travis CI" You can easily test your website build against one or more versions of Ruby. The following guide will show you how to set up a free build environment on -[Travis][0], with [GitHub][1] integration for pull requests. +[Travis][travis], with [GitHub][github] integration for pull requests. -[0]: https://travis-ci.org/ -[1]: https://github.com/ +[travis]: https://travis-ci.org/ +[github]: https://github.com/ ## 1. Enabling Travis and GitHub @@ -26,7 +26,7 @@ The simplest test script simply runs `jekyll build` and ensures that Jekyll doesn't fail to build the site. It doesn't check the resulting site, but it does ensure things are built properly. -When testing Jekyll output, there is no better tool than [html-proofer][2]. +When testing Jekyll output, there is no better tool than [html-proofer][html-proofer]. This tool checks your resulting site to ensure all links and images exist. Utilize it either with the convenient `htmlproofer` command-line executable, or write a Ruby script which utilizes the gem. @@ -68,7 +68,7 @@ Options are given as a second argument to `.new`, and are encoded in a symbol-keyed Ruby Hash. For more information about the configuration options, check out `html-proofer`'s README file. -[2]: https://github.com/gjtorikian/html-proofer +[html-proofer]: https://github.com/gjtorikian/html-proofer ## 3. Configuring Your Travis Builds @@ -91,7 +91,7 @@ Your `.travis.yml` file should look like this: ```yaml language: ruby rvm: -- 2.2.5 +- 2.3.3 before_script: - chmod +x ./script/cibuild # or do this locally and commit @@ -124,7 +124,7 @@ access to Bundler, RubyGems, and a Ruby runtime. ```yaml rvm: -- 2.2.5 +- 2.3.3 ``` RVM is a popular Ruby Version Manager (like rbenv, chruby, etc). This diff --git a/docs/img/circleci-badge.svg b/docs/img/circleci-badge.svg deleted file mode 100644 index 38658380a67..00000000000 --- a/docs/img/circleci-badge.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - diff --git a/docs/img/travis-ci-badge.png b/docs/img/travis-ci-badge.png deleted file mode 100644 index 94f255ec9ef016e18e94f7fedb6bb04105ae4aa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26749 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

    ak<2AIA!{{F87&q>sx_$WcF+D1SEnsUiAvXH$1 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

    #3$RpaHpFsInJ z%)l~`DYR|$8JI+u!{ddZPw(u~i%N!YIQ!smB~;rol(_-BM{+vIww93 zE^uUK?a$>G1guNls@n-sLXe~+9Irn$!QL6T-K#bL{$0EF1Hoh=awm+d@`X8ow*NM; zEL)X1WMhHjBY95gQr42wSNqJ9!7knq zOXgSKee>c2NX6Dnafr#M*o{@Y^tiH5;<;#KBt<{2}x@VsTCLaAyp@yxcB?QGO%`EJNVy$O7Z30jFz*J z_zVI0!yf}7YUBu?o#sluV_(mqJrBT|a)x6RCce9~*(N3t`YvFt-PPQa9mm8HCei5Z z$dDI-hhGL-E>H8NZ!YyW1GehqNO~~qI?ZTX6T9^P~)Q0MZ_D z;nJoB*#-aLUB?xdD&bXMmbyy+@-SE-+-tf1rVYP3L&!l&w9c@5$3A(?!4Gpq^k|Ee;WDK)1adYf}x#Y)RZ=b4ZZ~5_n1pBn(gFFZT30 zI;1U6|Lt|LFkyF@0|uw{OqL_w-OOJ3CtlsOZvJ1D$m`ddx3InC0nPiREf;royKa%I zyDF+H2JN;w>)}>ZIDPwVL5dFG>8YVrdxvs~+;pLVb}V1`%Vooqti-0^@RGW$G()SF21 zyVbD>ruM)mA16hSu5CXbF;K`wv_CyzoJUyH2I-mQ=W6Xmrb1_L z8rHnKkjTPMeE~}MUqWa%{gdqi*9Nv96E%*llULp{eR$K#L>JAF>Pt|qhpa1t!FE68 zoko&;kFBe-;g{^mK`Xv9j{_W1H@VpZ!c;`}idSE#UDhB{M*ha;xKe1&#-~+^Tzp&n_iulDmUNtT)3$_tje Date: Mon, 23 Jan 2017 20:08:44 -0500 Subject: [PATCH 1897/4996] Include more verbiage to the 3.4.0 release post. --- .../2017-01-18-jekyll-3-4-0-released.markdown | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown index 6950277eb80..f6a880fc428 100644 --- a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -13,4 +13,22 @@ exceptional Jekyll community. Three changes to call out: 1. If you're a big fan of [`where_by_exp`](/docs/filters/), you'll be an even bigger fan of [`group_by_exp`](/docs/filters/). 2. Using a custom timezone in Jekyll on Windows? Yeah, sorry that hasn't ever worked - properly. We made the internals possible + properly. We made it possible to accurately [set the timezone using IANA + timezone codes](https://jekyllrb.com/docs/windows/#timezone-management). +3. + +And [lots and lots more!](/docs/history/#v3-4-0) + +This update was made possible by the dedicated efforts of our excellent +contributors: CONTRIB LIST HERE. + +As always, if you encounter bugs, please do [search the issues]({{ site.repository }}/issues) +and [file an issue]({{ site.repository }}/issues/new) if you aren't able to +find a resolution. We also have [our Jekyll Talk +forum](https://talk.jekyllrb.com) for those of you with general questions +about how to accomplish certain tasks with Jekyll. + +We have some exciting updates in store for v3.5, and we're hard at work on +those already. + +Happy Jekylling! From 451fd8e15f84f813ab406ac06a505047c5a3232a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 24 Jan 2017 10:39:54 -0500 Subject: [PATCH 1898/4996] Update history to reflect merge of #5815 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 776fd40b225..c0d869ebcc4 100644 --- a/History.markdown +++ b/History.markdown @@ -92,6 +92,7 @@ * Docs: add `match_regex` and `replace_regex` filters (#5799) * Got that diaper money? (#5810) * Sort content by popularity using Google Analytics (#5812) + * Rework CI doc to include multiple providers. (#5815) ## 3.3.1 / 2016-11-14 From b0a7c4df0abdb85bb01d03febfc81e6457105724 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 24 Jan 2017 10:41:13 -0500 Subject: [PATCH 1899/4996] Update history to reflect merge of #5690 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c0d869ebcc4..fed14a91842 100644 --- a/History.markdown +++ b/History.markdown @@ -93,6 +93,7 @@ * Got that diaper money? (#5810) * Sort content by popularity using Google Analytics (#5812) * Rework CI doc to include multiple providers. (#5815) + * Improve theme docs (#5690) ## 3.3.1 / 2016-11-14 From 770ef586f53b5efa9b3594586c2ce04ec365301b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 24 Jan 2017 10:45:27 -0500 Subject: [PATCH 1900/4996] Update history to reflect merge of #5811 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fed14a91842..60156e55a30 100644 --- a/History.markdown +++ b/History.markdown @@ -94,6 +94,7 @@ * Sort content by popularity using Google Analytics (#5812) * Rework CI doc to include multiple providers. (#5815) * Improve theme docs (#5690) + * Add mention of classifier-reborn for LSI (#5811) ## 3.3.1 / 2016-11-14 From 6b08c14ccccc2cf292bd141661bcd3294af056e2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 24 Jan 2017 12:51:25 -0500 Subject: [PATCH 1901/4996] Update history to reflect merge of #5802 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 60156e55a30..3595e48c06a 100644 --- a/History.markdown +++ b/History.markdown @@ -95,6 +95,7 @@ * Rework CI doc to include multiple providers. (#5815) * Improve theme docs (#5690) * Add mention of classifier-reborn for LSI (#5811) + * Added note about --blank flag (#5802) ## 3.3.1 / 2016-11-14 From b1edaea7e8d38b9a8cd4d327ac5fab794a4898a0 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 24 Jan 2017 20:21:34 +0100 Subject: [PATCH 1902/4996] Add a note about troubleshooting on installation page --- docs/_docs/installation.md | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 0228a0f88c8..979279b80ee 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -25,16 +25,11 @@ Before you start, make sure your system has the following: - [Python 2.7](https://www.python.org/downloads/)
    -
    Running Jekyll on Ubuntu
    +
    Problems installing Jekyll?

    - Users of Jekyll on Ubuntu have reported encountering - Could not locate Gemfile or .bundle/ directory error messages at the - bundle exec jekyll serve step in the Quick-start guide. - The likely cause is that all installation requirements have not been fully met. - Recent stock Ubuntu distributions require the installation of both the ruby and ruby-all-dev - packages, e.g. via sudo apt-get install ruby ruby-all-dev (RubyGems should be included in ruby). - The ruby-all-dev .deb package in particular contains development header files whose absence causes - the above error message. + Check out the troubleshooting page or + report an issue so the + Jekyll community can improve the experience for everyone.

    @@ -58,10 +53,7 @@ $ gem install jekyll ``` All of Jekyll’s gem dependencies are automatically installed by the above -command, so you won’t have to worry about them at all. If you have problems -installing Jekyll, check out the [troubleshooting](../troubleshooting/) page or -[report an issue]({{ site.repository }}/issues/new) so the Jekyll -community can improve the experience for everyone. +command, so you won’t have to worry about them at all.
    Installing Xcode Command-Line Tools
    From 7397f305c238da1593732c0e38f1b3ef184f0f84 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 24 Jan 2017 20:23:01 +0100 Subject: [PATCH 1903/4996] Add Ubuntu section on troubleshooting --- docs/_docs/troubleshooting.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/_docs/troubleshooting.md b/docs/_docs/troubleshooting.md index aae024bd285..d5f29671fa2 100644 --- a/docs/_docs/troubleshooting.md +++ b/docs/_docs/troubleshooting.md @@ -36,6 +36,15 @@ If you installed the above - specifically on Fedora 23 - but the extensions woul sudo dnf install redhat-rpm-config ``` +On Ubuntu if you get stuck after `bundle exec jekyll serve` and see error +messages like `Could not locate Gemfile` or `.bundle/ directory`, it's likely +because all requirements have not been fully met. Recent stock Ubuntu +distributions require the installation of both the `ruby` and `ruby-all-dev` +packages: + +```sh +sudo apt-get install ruby ruby-all-dev +``` On [NearlyFreeSpeech](https://www.nearlyfreespeech.net/) you need to run the following commands before installing Jekyll: @@ -180,10 +189,10 @@ That is: defaults are overridden by options specified in `_config.yml`, and flags specified at the command-line will override all other settings specified elsewhere. -If you encounter an error in building the site, with the error message -"'0000-00-00-welcome-to-jekyll.markdown.erb' does not have a valid date in the -YAML front matter." try including the line `exclude: [vendor]` -in `_config.yml`. +If you encounter an error in building the site, with the error message +"'0000-00-00-welcome-to-jekyll.markdown.erb' does not have a valid date in the +YAML front matter." try including the line `exclude: [vendor]` +in `_config.yml`. ## Markup Problems From 9eef1d9f5ac6cad1e39aaded9b5cc6abb6b1307c Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 24 Jan 2017 20:52:34 +0100 Subject: [PATCH 1904/4996] add contributors --- docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown index f6a880fc428..cfb1c4fd1d2 100644 --- a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -15,12 +15,12 @@ even bigger fan of [`group_by_exp`](/docs/filters/). 2. Using a custom timezone in Jekyll on Windows? Yeah, sorry that hasn't ever worked properly. We made it possible to accurately [set the timezone using IANA timezone codes](https://jekyllrb.com/docs/windows/#timezone-management). -3. +3. New users should And [lots and lots more!](/docs/history/#v3-4-0) This update was made possible by the dedicated efforts of our excellent -contributors: CONTRIB LIST HERE. +contributors: Frank Taillandier, Tom Johnson, Ashwin Maroli, Parker Moore, Pat Hawks, alexmalik, Thiago Arrais, Nursen, Eldritch Cheese, XhmikosR, Roger Ogden, Ricardo N Feliciano, Nicolas Hoizey, Max Chadwick, Kenton Hansen, Josh Habdas, jona, Zlatan Vasović, yoostk, Tunghsiao Liu, Tim Banks, Skylar Challand, Rob Crocombe, Purplecarrot, muratayusuke, Longwelwind, Kurt Anderson, kimbaudi, Kevin Wojniak, Ivan Dmitrievsky, Hugo, Florian Thomas, Fabrice Laporte, Don Denton, Dmitrii Evdokimov, Dean Attali, Chayoung You, Chase, brainscript, BlueberryFoxtrot, Alexey Rogachev, Ajay Karwal. As always, if you encounter bugs, please do [search the issues]({{ site.repository }}/issues) and [file an issue]({{ site.repository }}/issues/new) if you aren't able to From 886de9f37d0e859a04ac9e9cc92e75ac255d3466 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 24 Jan 2017 20:53:27 +0100 Subject: [PATCH 1905/4996] Group all documentation related changes --- History.markdown | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/History.markdown b/History.markdown index 8ad3e2ae814..d364e673ecb 100644 --- a/History.markdown +++ b/History.markdown @@ -4,11 +4,11 @@ * Add connector param to `array_to_sentence_string` filter (#5597) * Adds `group_by_exp` filter (#5513) - * Use the current year for the LICENSE of theme (#5712) - * Update License (#5713) * Use Addressable instead of URI to decode (#5726) * throw IncludeTagError if error occurs in included file (#5767) * Write Jekyll::Utils::Exec.run for running shell commands. (#5640) + * Use the current year for the LICENSE of theme (#5712) + * Update License (#5713) ### Bug Fixes @@ -22,24 +22,12 @@ ### Site Enhancements - * Remove instructions to install Jekyll 2 on Windows (#5582) - * Fix example URL inconsistency (#5592) - * Replace backticks within HTML blocks with HTML tags (#5435) - * Add jekyll-migrate-permalink (#5600) - * Fix bad config YAML in collections example (#5587) - * Bring documentation on 'Directory Structure' up-to-date (#5573) * Use only the used Font Awesome icons. (#5530) * Switch to `https` when possible. (#5611) * Update `_font-awesome.scss` to move .woff file before .ttf (#5614) * Update documentation on updating FontAwesome Iconset (#5655) - * Improve quickstart docs (#5689) - * Add Jekyll-Post to list of plugins (#5705) - * Add jekyll-numbered-headings (#5688) - * Docs: move permalinks from documents into config (#5544) - * Sort gems in `docs/_config.yml` (#5746) * [site] Use defaults for docs and news-items (#5744) - * Improve collections docs (#5691) - * Fix #5730: add gcc and make to the list of requirements (#5731) + * Sort gems in `docs/_config.yml` (#5746) * Add missing class (#5791) ### Development Fixes @@ -64,6 +52,18 @@ ### Documentation + * Improve quickstart docs (#5689) + * Add Jekyll-Post to list of plugins (#5705) + * Add jekyll-numbered-headings (#5688) + * Docs: move permalinks from documents into config (#5544) + * Improve collections docs (#5691) + * Fix #5730: add gcc and make to the list of requirements (#5731) + * Remove instructions to install Jekyll 2 on Windows (#5582) + * Fix example URL inconsistency (#5592) + * Replace backticks within HTML blocks with HTML tags (#5435) + * Add jekyll-migrate-permalink (#5600) + * Fix bad config YAML in collections example (#5587) + * Bring documentation on 'Directory Structure' up-to-date (#5573) * Fixed typo (#5632) * use backticks for Gemfile for consistency since in the next sentence … (#5641) * Update Core team list in the README file (#5643) From 452b0cf29d5c1499f4db37c3a71ed9ff36cdffde Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 24 Jan 2017 20:59:07 +0100 Subject: [PATCH 1906/4996] mention documentation improvements --- docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown index cfb1c4fd1d2..db0796dffcd 100644 --- a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -15,7 +15,7 @@ even bigger fan of [`group_by_exp`](/docs/filters/). 2. Using a custom timezone in Jekyll on Windows? Yeah, sorry that hasn't ever worked properly. We made it possible to accurately [set the timezone using IANA timezone codes](https://jekyllrb.com/docs/windows/#timezone-management). -3. New users should +3. Documentation has been improved, notably on themes, includes and permalinks. And [lots and lots more!](/docs/history/#v3-4-0) From 92c0890fbd0b7261fe2b6a20e3b066871ed41bea Mon Sep 17 00:00:00 2001 From: penny Date: Tue, 24 Jan 2017 21:09:08 +0100 Subject: [PATCH 1907/4996] let's not use my deadname --- docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown index db0796dffcd..39835d5bd30 100644 --- a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -20,7 +20,7 @@ even bigger fan of [`group_by_exp`](/docs/filters/). And [lots and lots more!](/docs/history/#v3-4-0) This update was made possible by the dedicated efforts of our excellent -contributors: Frank Taillandier, Tom Johnson, Ashwin Maroli, Parker Moore, Pat Hawks, alexmalik, Thiago Arrais, Nursen, Eldritch Cheese, XhmikosR, Roger Ogden, Ricardo N Feliciano, Nicolas Hoizey, Max Chadwick, Kenton Hansen, Josh Habdas, jona, Zlatan Vasović, yoostk, Tunghsiao Liu, Tim Banks, Skylar Challand, Rob Crocombe, Purplecarrot, muratayusuke, Longwelwind, Kurt Anderson, kimbaudi, Kevin Wojniak, Ivan Dmitrievsky, Hugo, Florian Thomas, Fabrice Laporte, Don Denton, Dmitrii Evdokimov, Dean Attali, Chayoung You, Chase, brainscript, BlueberryFoxtrot, Alexey Rogachev, Ajay Karwal. +contributors: Frank Taillandier, Tom Johnson, Ashwin Maroli, Parker Moore, Pat Hawks, alexmalik, Thiago Arrais, Nursen, Eldritch Cheese, XhmikosR, Roger Ogden, Ricardo N Feliciano, Nicolas Hoizey, Max Chadwick, Kenton Hansen, Josh Habdas, penny, Zlatan Vasović, yoostk, Tunghsiao Liu, Tim Banks, Skylar Challand, Rob Crocombe, Purplecarrot, muratayusuke, Longwelwind, Kurt Anderson, kimbaudi, Kevin Wojniak, Ivan Dmitrievsky, Hugo, Florian Thomas, Fabrice Laporte, Don Denton, Dmitrii Evdokimov, Dean Attali, Chayoung You, Chase, brainscript, BlueberryFoxtrot, Alexey Rogachev, Ajay Karwal. As always, if you encounter bugs, please do [search the issues]({{ site.repository }}/issues) and [file an issue]({{ site.repository }}/issues/new) if you aren't able to From a05e64c9d360e8357dc9c23a76656d231f0665dd Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Tue, 24 Jan 2017 15:38:17 -0800 Subject: [PATCH 1908/4996] moved navigation under new collection called tutorial --- docs/{_docs => _tutorials}/navigation.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{_docs => _tutorials}/navigation.md (100%) diff --git a/docs/_docs/navigation.md b/docs/_tutorials/navigation.md similarity index 100% rename from docs/_docs/navigation.md rename to docs/_tutorials/navigation.md From 2e9a32edd2ced3626cb38fcf0ec998549e56b411 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Tue, 24 Jan 2017 22:58:04 -0800 Subject: [PATCH 1909/4996] Added tutorials as a new collection, similar to Docs. Also added tutorial sidebar, tutorial link in primary nav, and tutorial overview page. --- docs/.gitignore | 1 + docs/_config.yml | 2 + docs/_data/tutorials.yml | 8 ++++ docs/_includes/primary-nav-items.html | 5 ++- docs/_includes/section_nav_tutorials.html | 39 +++++++++++++++++++ docs/_includes/tutorials_contents.html | 10 +++++ docs/_includes/tutorials_contents_mobile.html | 10 +++++ docs/_includes/tutorials_option.html | 5 +++ docs/_includes/tutorials_ul.html | 7 ++++ docs/_layouts/tutorials.html | 27 +++++++++++++ docs/_tutorials/index.md | 35 +++++++++++++++++ docs/_tutorials/navigation.md | 5 ++- 12 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 docs/_data/tutorials.yml create mode 100644 docs/_includes/section_nav_tutorials.html create mode 100644 docs/_includes/tutorials_contents.html create mode 100644 docs/_includes/tutorials_contents_mobile.html create mode 100644 docs/_includes/tutorials_option.html create mode 100644 docs/_includes/tutorials_ul.html create mode 100644 docs/_layouts/tutorials.html create mode 100644 docs/_tutorials/index.md diff --git a/docs/.gitignore b/docs/.gitignore index 79bd74f7496..527980f3c80 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -2,3 +2,4 @@ _site/ *.swp pkg/ test/ +.idea/ \ No newline at end of file diff --git a/docs/_config.yml b/docs/_config.yml index 6f57710aa2e..589b042e27f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -16,6 +16,8 @@ collections: posts: permalink: /news/:year/:month/:day/:title/ output: true + tutorials: + output: true name: Jekyll • Simple, blog-aware, static sites description: Transform your plain text into static websites and blogs diff --git a/docs/_data/tutorials.yml b/docs/_data/tutorials.yml new file mode 100644 index 00000000000..73a0184a195 --- /dev/null +++ b/docs/_data/tutorials.yml @@ -0,0 +1,8 @@ +- title: Tutorials + tutorials: + - home + - navigation + +#- title: Another section +# tutorials: +# - sample \ No newline at end of file diff --git a/docs/_includes/primary-nav-items.html b/docs/_includes/primary-nav-items.html index f3778a8439c..a431d846d50 100644 --- a/docs/_includes/primary-nav-items.html +++ b/docs/_includes/primary-nav-items.html @@ -5,6 +5,9 @@
  • Docs
  • +
  • + Tutorials +
  • News
  • @@ -15,6 +18,6 @@ Help
  • - View on GitHub + GitHub
  • diff --git a/docs/_includes/section_nav_tutorials.html b/docs/_includes/section_nav_tutorials.html new file mode 100644 index 00000000000..30812bbafe4 --- /dev/null +++ b/docs/_includes/section_nav_tutorials.html @@ -0,0 +1,39 @@ +{% comment %} +Map grabs the tutorials sections, giving us an array of arrays. Join, flattens all +the items to a comma delimited string. Split turns it into an array again. +{% endcomment %} +{% assign tutorials = site.data.tutorials | map: 'tutorials' | join: ',' | split: ',' %} + +{% comment %} +Because this is built for every page, lets find where we are in the ordered +document list by comparing url strings. Then if there's something previous or +next, lets build a link to it. +{% endcomment %} + +{% for tutorial in tutorials %} + {% assign tutorial_url = tutorial | prepend:"/tutorials/" | append:"/" %} + {% if tutorial_url == page.url %} +
    +
    + {% if forloop.first %} + Back + {% else %} + {% assign previous = forloop.index0 | minus: 1 %} + {% assign previous_page = tutorials[previous] | prepend:"/tutorials/" | append:"/" %} + + {% endif %} +
    +
    + {% if forloop.last %} + Next + {% else %} + {% assign next = forloop.index0 | plus: 1 %} + {% assign next_page = tutorials[next] | prepend:"/tutorials/" | append:"/" %} + + {% endif %} +
    +
    +
    + {% break %} + {% endif %} +{% endfor %} \ No newline at end of file diff --git a/docs/_includes/tutorials_contents.html b/docs/_includes/tutorials_contents.html new file mode 100644 index 00000000000..5c9cdc8ee7f --- /dev/null +++ b/docs/_includes/tutorials_contents.html @@ -0,0 +1,10 @@ +
    + +
    diff --git a/docs/_includes/tutorials_contents_mobile.html b/docs/_includes/tutorials_contents_mobile.html new file mode 100644 index 00000000000..901fdf5c435 --- /dev/null +++ b/docs/_includes/tutorials_contents_mobile.html @@ -0,0 +1,10 @@ +
    + +
    diff --git a/docs/_includes/tutorials_option.html b/docs/_includes/tutorials_option.html new file mode 100644 index 00000000000..482c2143337 --- /dev/null +++ b/docs/_includes/tutorials_option.html @@ -0,0 +1,5 @@ +{% for item in include.items %} + {% assign item_url = item | prepend:"/tutorials/" | append:"/" %} + {% assign tutorial = site.tutorials | where: "url", item_url | first %} + +{% endfor %} diff --git a/docs/_includes/tutorials_ul.html b/docs/_includes/tutorials_ul.html new file mode 100644 index 00000000000..6604915c716 --- /dev/null +++ b/docs/_includes/tutorials_ul.html @@ -0,0 +1,7 @@ +
      +{% for item in include.items %} + {% assign item_url = item | prepend:"/tutorials/" | append:"/" %} + {% assign p = site.tutorials | where:"url", item_url | first %} +
    • {{ p.title }}
    • +{% endfor %} +
    diff --git a/docs/_layouts/tutorials.html b/docs/_layouts/tutorials.html new file mode 100644 index 00000000000..e3f7794bdd5 --- /dev/null +++ b/docs/_layouts/tutorials.html @@ -0,0 +1,27 @@ +--- +layout: default +--- + +
    +
    + + {% include tutorials_contents_mobile.html %} + +
    +
    + +

    {{ page.title }}

    + {{ content }} + {% include section_nav_tutorials.html %} +
    +
    + + {% include tutorials_contents.html %} + +
    + +
    +
    diff --git a/docs/_tutorials/index.md b/docs/_tutorials/index.md new file mode 100644 index 00000000000..b0988b09f62 --- /dev/null +++ b/docs/_tutorials/index.md @@ -0,0 +1,35 @@ +--- +layout: tutorials +title: Tutorials +permalink: /tutorials/home/ +redirect_from: /tutorials/index.html +--- + +In contrast to [Docs](../docs), Tutorials provide more detailed, narrative instruction that cover a variety of Jekyll topics and scenarios. Tutorials might contain the following: + +* Step-by-step processes through particular scenarios or challenges +* Full walk-throughs using sample data, showing inputs and results from the sample data +* Detailed explanation about the pros and cons for different Jekyll strategies +* End-to-end instruction in developing a complete feature on a Jekyll site +* Instruction that combines various techniques from across the docs + +In short, tutorials aren't the core reference information in docs. They walk users through processes from beginning to end. + +{: .info .note} +**Note:** The Tutorials section is new, so there aren't many tutorials yet. You can add a tutorial here to help popular this section. + +Some of these techniques might even guide you through a supporting tool, script, service, or other hack used with your Jekyll site. Feel free to include tutorials involving external services with Jekyll as well. However, note that Jekyll in no way endorses any third-party tools mentioned in tutorials. + +## How to contribute a tutorial + +We welcome your tutorial contributions. To add your tutorial: + +1. Fork the Jekyll project by clicking the **Fork** button in the upper-right corner of the [jekyll/jekyll project Github repo](https://github.com/jekyll/jekyll/). +2. Add your tutorial in the `_tutorials` collection. +3. Make sure your tutorial has the same front matter items as other tutorial items. +5. Add a reference to your tutorial filename in `_data/tutorials.yml`. This allows your tutorial to appear in the Tutorials sidebar. +6. Follow the regular git workflow to submit the pull request. + +When you submit your pull request, the Jekyll documentation team will review your contribution and either merge it or suggest edits. + + diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index bd4228e379a..60e86369af8 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -1,6 +1,7 @@ --- -layout: docs -permalink: /docs/navigation +layout: tutorials +permalink: /tutorials/navigation/ +title: Navigation --- If your Jekyll site has a lot of pages, you might want to create navigation for the pages. Instead of hard-coding navigation links, you can programmatically retrieve a list of pages to build the navigation for your site. From ecdc8a5bf2436b78eb0f753b38ad2d8aad1348b7 Mon Sep 17 00:00:00 2001 From: Alexey Rogachev Date: Wed, 25 Jan 2017 15:22:26 +0600 Subject: [PATCH 1910/4996] Fixed inaccuracy in "Built-in permalink styles" docs [skip ci] Must be either: > Rather than typing `permalink: /:categories/:year/:month/:day/:title/`, you can just type `permalink: pretty`. or: > Rather than typing `permalink: /:categories/:year/:month/:day/:title.html`, you can just type `permalink: date`. I guess the former was meant to write because the latter was already mentioned in "Where to configure permalinks" section. --- docs/_docs/permalinks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index 1bd880215b7..f0e16770b36 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -230,7 +230,7 @@ Although you can specify a custom permalink pattern using [template variables](#
    -Rather than typing `permalink: /:categories/:year/:month/:day/:title/`, you can just type `permalink: date`. +Rather than typing `permalink: /:categories/:year/:month/:day/:title/`, you can just type `permalink: pretty`.
    Specifying permalinks through the YAML Front Matter
    From e56d8092982982622653007d31a742542b32c85a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 25 Jan 2017 07:29:43 -0500 Subject: [PATCH 1911/4996] Update history to reflect merge of #5819 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3595e48c06a..6d840343665 100644 --- a/History.markdown +++ b/History.markdown @@ -96,6 +96,7 @@ * Improve theme docs (#5690) * Add mention of classifier-reborn for LSI (#5811) * Added note about --blank flag (#5802) + * Fixed inaccuracy in "Built-in permalink styles" docs (#5819) ## 3.3.1 / 2016-11-14 From ef8779dbfd3c45d88dcd0e683f5b89ee36da62b7 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 25 Jan 2017 14:06:27 +0100 Subject: [PATCH 1912/4996] run codeclimate after success --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 30eb1fc5d47..66c85eaabab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,3 +45,6 @@ addons: DA4vsRURfABU0fIhwYkQuZqEcA3d8TL36BZcGEshG6MQ2AmnYsmFiTcxqV5bmlElHEqQuT\ 5SUFXLafgZPBnL0qDwujQcHukID41sE=\ " +# regular test configuration +after_success: + - bundle exec codeclimate-test-reporter From 65a3891ca293818d68b4d3a2c0ea2abf9b71e19f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 25 Jan 2017 14:10:19 +0100 Subject: [PATCH 1913/4996] ought to -> should props @pnn --- docs/_docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 979279b80ee..bc5c251568c 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -10,7 +10,7 @@ encountered and how we might make the process easier. ### Requirements -Installing Jekyll ought to be straight-forward if all requirements are met. +Installing Jekyll should be straight-forward if all requirements are met. Before you start, make sure your system has the following: - GNU/Linux, Unix, or macOS From c7db12bad8a8a02f206df908a9a72ce296b0bf2c Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Wed, 25 Jan 2017 06:50:23 -0800 Subject: [PATCH 1914/4996] fixed link in datafiles.md to point to navigation.md location in new tutorials collection --- docs/_docs/datafiles.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index 3f4644763cd..fde34aa0ff9 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -72,7 +72,7 @@ You can now render the list of members in a template: ``` {: .note .info } -If your Jekyll site has a lot of pages, such as with documentation websites, see the detailed examples in [how to build robust navigation for your site](../navigation). +If your Jekyll site has a lot of pages, such as with documentation websites, see the detailed examples in [how to build robust navigation for your site]({% link _tutorials/navigation.md %}). ## Example: Organizations From a6adfa835832dec060cc068740e36612e01d39d6 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Wed, 25 Jan 2017 09:49:36 -0800 Subject: [PATCH 1915/4996] added cross-reference to the data files topic within the navigation topic --- docs/_tutorials/navigation.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index 60e86369af8..7d4bafa372f 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -6,6 +6,8 @@ title: Navigation If your Jekyll site has a lot of pages, you might want to create navigation for the pages. Instead of hard-coding navigation links, you can programmatically retrieve a list of pages to build the navigation for your site. +Although there's already information about [interacting with data files]({% link _docs/datafiles.md %}) in other Jekyll docs, this tutorial dives into building more robust navigation for your site. + There are two primary ways of retrieving pages on a Jekyll site: * **Retrieve pages listed in a YAML data source**. Store the page data in a YAML (or JSON or CSV) file in the `_data` folder, loop through the YAML properties, and insert the values into your theme. From 0a3916c07e2444eaab01540161bba1f67df66c3b Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Wed, 25 Jan 2017 10:06:57 -0800 Subject: [PATCH 1916/4996] Make links in sidebar for current page more prominent When viewing a page, it's kind of hard to see what page you're viewing. The little triangle graphic pointing to the page is too subtle. Making the link to the current page orange (the same as the hover color) would make it visually more apparent where you are in the navigation. Here's a screenshot showing the change: [https://www.screencast.com/t/e6NKerSAUL](https://www.screencast.com/t/e6NKerSAUL). The link to the current page is orange even when I'm not hovering over the link with my mouse. --- docs/_sass/_style.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index f1e3de5f327..e39e8f01cf4 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -459,6 +459,9 @@ aside { top: 0; left: -30px; } + &.current a { + color: #f90; + } } } From 4b19e93f0905e45876d0add85ec65e42d354c1ac Mon Sep 17 00:00:00 2001 From: Joel Meyer-Hamme Date: Thu, 26 Jan 2017 16:02:08 +0000 Subject: [PATCH 1917/4996] use logger.info Imo running `--lsi` should use `Jekyll.logger.info`, so it can be made `--quiet`. --- lib/jekyll/related_posts.rb | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/related_posts.rb b/lib/jekyll/related_posts.rb index cde1742c081..3526a73b76f 100644 --- a/lib/jekyll/related_posts.rb +++ b/lib/jekyll/related_posts.rb @@ -26,15 +26,15 @@ def build def build_index self.class.lsi ||= begin lsi = ClassifierReborn::LSI.new(:auto_rebuild => false) - display("Populating LSI...") + Jekyll.logger.info("Populating LSI...") site.posts.docs.each do |x| lsi.add_item(x) end - display("Rebuilding index...") + Jekyll.logger.info("Rebuilding index...") lsi.build_index - display("") + Jekyll.logger.info("") lsi end end @@ -46,11 +46,5 @@ def lsi_related_posts def most_recent_posts @most_recent_posts ||= (site.posts.docs.reverse - [post]).first(10) end - - def display(output) - $stdout.print("\n") - $stdout.print(Jekyll.logger.formatted_topic(output)) - $stdout.flush - end end end From 4a781f23f3c0e3c02bbf6bdfffd726f6d01da453 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 Jan 2017 15:52:26 -0500 Subject: [PATCH 1918/4996] Update history to reflect merge of #5822 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6d840343665..30372e1c9bd 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * include: fix 'no implicit conversion of nil to String' (#5750) * Don't include the theme's includes_path if it is nil. (#5780) * test double slash when input = '/' (#5542) + * use logger.info for related posts (#5822) ### Site Enhancements From f0dcc9415b2a1a1a61143a6935ba616968e39475 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 Jan 2017 15:53:46 -0500 Subject: [PATCH 1919/4996] Update history to reflect merge of #5798 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 30372e1c9bd..1348af78977 100644 --- a/History.markdown +++ b/History.markdown @@ -64,6 +64,7 @@ * Bump htmlproofer (#5781) * Bump rubies we test against (#5784) * Bump rdoc to v5.0 (#5797) + * Bump codeclimate-test-reporter to v1.0.5 (#5798) ### Documentation From 7c1aae3e303be7bc25aa2ac08961bdc282d3a719 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 26 Jan 2017 16:24:45 -0500 Subject: [PATCH 1920/4996] Update history on website to reflect new things merged --- docs/_docs/history.md | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index a31266bcdec..e400efd5610 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -12,11 +12,11 @@ note: This file is autogenerated. Edit /History.markdown instead. - Add connector param to `array_to_sentence_string` filter ([#5597]({{ site.repository }}/issues/5597)) - Adds `group_by_exp` filter ([#5513]({{ site.repository }}/issues/5513)) -- Use the current year for the LICENSE of theme ([#5712]({{ site.repository }}/issues/5712)) -- Update License ([#5713]({{ site.repository }}/issues/5713)) - Use Addressable instead of URI to decode ([#5726]({{ site.repository }}/issues/5726)) - throw IncludeTagError if error occurs in included file ([#5767]({{ site.repository }}/issues/5767)) - Write Jekyll::Utils::Exec.run for running shell commands. ([#5640]({{ site.repository }}/issues/5640)) +- Use the current year for the LICENSE of theme ([#5712]({{ site.repository }}/issues/5712)) +- Update License ([#5713]({{ site.repository }}/issues/5713)) ### Bug Fixes {: #bug-fixes-v3-4-0} @@ -28,29 +28,19 @@ note: This file is autogenerated. Edit /History.markdown instead. - include: fix 'no implicit conversion of nil to String' ([#5750]({{ site.repository }}/issues/5750)) - Don't include the theme's includes_path if it is nil. ([#5780]({{ site.repository }}/issues/5780)) - test double slash when input = '/' ([#5542]({{ site.repository }}/issues/5542)) +- use logger.info for related posts ([#5822]({{ site.repository }}/issues/5822)) ### Site Enhancements {: #site-enhancements-v3-4-0} -- Remove instructions to install Jekyll 2 on Windows ([#5582]({{ site.repository }}/issues/5582)) -- Fix example URL inconsistency ([#5592]({{ site.repository }}/issues/5592)) -- Replace backticks within HTML blocks with HTML tags ([#5435]({{ site.repository }}/issues/5435)) -- Add jekyll-migrate-permalink ([#5600]({{ site.repository }}/issues/5600)) -- Fix bad config YAML in collections example ([#5587]({{ site.repository }}/issues/5587)) -- Bring documentation on 'Directory Structure' up-to-date ([#5573]({{ site.repository }}/issues/5573)) - Use only the used Font Awesome icons. ([#5530]({{ site.repository }}/issues/5530)) - Switch to `https` when possible. ([#5611]({{ site.repository }}/issues/5611)) - Update `_font-awesome.scss` to move .woff file before .ttf ([#5614]({{ site.repository }}/issues/5614)) - Update documentation on updating FontAwesome Iconset ([#5655]({{ site.repository }}/issues/5655)) -- Improve quickstart docs ([#5689]({{ site.repository }}/issues/5689)) -- Add Jekyll-Post to list of plugins ([#5705]({{ site.repository }}/issues/5705)) -- Add jekyll-numbered-headings ([#5688]({{ site.repository }}/issues/5688)) -- Docs: move permalinks from documents into config ([#5544]({{ site.repository }}/issues/5544)) -- Sort gems in `docs/_config.yml` ([#5746]({{ site.repository }}/issues/5746)) - [site] Use defaults for docs and news-items ([#5744]({{ site.repository }}/issues/5744)) -- Improve collections docs ([#5691]({{ site.repository }}/issues/5691)) -- Fix [#5730]({{ site.repository }}/issues/5730): add gcc and make to the list of requirements ([#5731]({{ site.repository }}/issues/5731)) +- Sort gems in `docs/_config.yml` ([#5746]({{ site.repository }}/issues/5746)) - Add missing class ([#5791]({{ site.repository }}/issues/5791)) +- Improve template docs ([#5694]({{ site.repository }}/issues/5694)) ### Development Fixes {: #development-fixes-v3-4-0} @@ -72,9 +62,23 @@ note: This file is autogenerated. Edit /History.markdown instead. - Use latest jemoji gem ([#5782]({{ site.repository }}/issues/5782)) - Bump htmlproofer ([#5781]({{ site.repository }}/issues/5781)) - Bump rubies we test against ([#5784]({{ site.repository }}/issues/5784)) +- Bump rdoc to v5.0 ([#5797]({{ site.repository }}/issues/5797)) +- Bump codeclimate-test-reporter to v1.0.5 ([#5798]({{ site.repository }}/issues/5798)) ### Documentation +- Improve quickstart docs ([#5689]({{ site.repository }}/issues/5689)) +- Add Jekyll-Post to list of plugins ([#5705]({{ site.repository }}/issues/5705)) +- Add jekyll-numbered-headings ([#5688]({{ site.repository }}/issues/5688)) +- Docs: move permalinks from documents into config ([#5544]({{ site.repository }}/issues/5544)) +- Improve collections docs ([#5691]({{ site.repository }}/issues/5691)) +- Fix [#5730]({{ site.repository }}/issues/5730): add gcc and make to the list of requirements ([#5731]({{ site.repository }}/issues/5731)) +- Remove instructions to install Jekyll 2 on Windows ([#5582]({{ site.repository }}/issues/5582)) +- Fix example URL inconsistency ([#5592]({{ site.repository }}/issues/5592)) +- Replace backticks within HTML blocks with HTML tags ([#5435]({{ site.repository }}/issues/5435)) +- Add jekyll-migrate-permalink ([#5600]({{ site.repository }}/issues/5600)) +- Fix bad config YAML in collections example ([#5587]({{ site.repository }}/issues/5587)) +- Bring documentation on 'Directory Structure' up-to-date ([#5573]({{ site.repository }}/issues/5573)) - Fixed typo ([#5632]({{ site.repository }}/issues/5632)) - use backticks for Gemfile for consistency since in the next sentence … ([#5641]({{ site.repository }}/issues/5641)) - Update Core team list in the README file ([#5643]({{ site.repository }}/issues/5643)) @@ -97,6 +101,15 @@ note: This file is autogenerated. Edit /History.markdown instead. - Fix a markdown link to look properly on the web ([#5769]({{ site.repository }}/issues/5769)) - [docs] Info about the help command usage ([#5312]({{ site.repository }}/issues/5312)) - Add missing merge labels for jekyllbot ([#5753]({{ site.repository }}/issues/5753)) +- Fix broken links in documentation ([#5736]({{ site.repository }}/issues/5736)) +- Docs: add `match_regex` and `replace_regex` filters ([#5799]({{ site.repository }}/issues/5799)) +- Got that diaper money? ([#5810]({{ site.repository }}/issues/5810)) +- Sort content by popularity using Google Analytics ([#5812]({{ site.repository }}/issues/5812)) +- Rework CI doc to include multiple providers. ([#5815]({{ site.repository }}/issues/5815)) +- Improve theme docs ([#5690]({{ site.repository }}/issues/5690)) +- Add mention of classifier-reborn for LSI ([#5811]({{ site.repository }}/issues/5811)) +- Added note about --blank flag ([#5802]({{ site.repository }}/issues/5802)) +- Fixed inaccuracy in "Built-in permalink styles" docs ([#5819]({{ site.repository }}/issues/5819)) ## 3.3.1 / 2016-11-14 From 6d34cf18fbf1e66013577d33136a72cafaa68fe4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 26 Jan 2017 16:24:53 -0500 Subject: [PATCH 1921/4996] New list of contributors --- docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown index 39835d5bd30..58275063779 100644 --- a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -20,7 +20,15 @@ even bigger fan of [`group_by_exp`](/docs/filters/). And [lots and lots more!](/docs/history/#v3-4-0) This update was made possible by the dedicated efforts of our excellent -contributors: Frank Taillandier, Tom Johnson, Ashwin Maroli, Parker Moore, Pat Hawks, alexmalik, Thiago Arrais, Nursen, Eldritch Cheese, XhmikosR, Roger Ogden, Ricardo N Feliciano, Nicolas Hoizey, Max Chadwick, Kenton Hansen, Josh Habdas, penny, Zlatan Vasović, yoostk, Tunghsiao Liu, Tim Banks, Skylar Challand, Rob Crocombe, Purplecarrot, muratayusuke, Longwelwind, Kurt Anderson, kimbaudi, Kevin Wojniak, Ivan Dmitrievsky, Hugo, Florian Thomas, Fabrice Laporte, Don Denton, Dmitrii Evdokimov, Dean Attali, Chayoung You, Chase, brainscript, BlueberryFoxtrot, Alexey Rogachev, Ajay Karwal. +contributors: Ajay Karwal, Alexey Rogachev, Ashwin Maroli, +BlueberryFoxtrot, Chase, Chayoung You, Dean Attali, Dmitrii Evdokimov, Don +Denton, Eldritch Cheese, Fabrice Laporte, Florian Thomas, Frank +Taillandier, Hugo, Ivan Dmitrievsky, Joel Meyer-Hamme, Josh Habdas, Kenton +Hansen, Kevin Wojniak, Kurt Anderson, Longwelwind, Max Chadwick, Nicolas +Hoizey, Nursen, Parker Moore, Pat Hawks, Purplecarrot, Ricardo N Feliciano, +Rob Crocombe, Roger Ogden, Skylar Challand, Thiago Arrais, Tim Banks, Tom +Johnson, Tunghsiao Liu, XhmikosR, Zlatan Vasović, alexmalik, brainscript, +jona, kimbaudi, muratayusuke, penny, and yoostk. As always, if you encounter bugs, please do [search the issues]({{ site.repository }}/issues) and [file an issue]({{ site.repository }}/issues/new) if you aren't able to From eca4b94c3a387e3b2232030164701f31be5c4752 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 26 Jan 2017 16:26:39 -0500 Subject: [PATCH 1922/4996] Remove jona as contributor. --- docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown index 58275063779..cb2c6f872ca 100644 --- a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -28,7 +28,7 @@ Hansen, Kevin Wojniak, Kurt Anderson, Longwelwind, Max Chadwick, Nicolas Hoizey, Nursen, Parker Moore, Pat Hawks, Purplecarrot, Ricardo N Feliciano, Rob Crocombe, Roger Ogden, Skylar Challand, Thiago Arrais, Tim Banks, Tom Johnson, Tunghsiao Liu, XhmikosR, Zlatan Vasović, alexmalik, brainscript, -jona, kimbaudi, muratayusuke, penny, and yoostk. +kimbaudi, muratayusuke, penny, and yoostk. As always, if you encounter bugs, please do [search the issues]({{ site.repository }}/issues) and [file an issue]({{ site.repository }}/issues/new) if you aren't able to From 5183bde7b88fa95b6816a9ca87a75b6d27ac6176 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 27 Jan 2017 11:05:55 -0500 Subject: [PATCH 1923/4996] Update release date of 3.4.0 --- History.markdown | 2 +- docs/_docs/history.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/History.markdown b/History.markdown index 2470b67b7c2..ab9cd2e631a 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,4 @@ -## 3.4.0 / 2016-01-20 +## 3.4.0 / 2016-01-27 ### Minor Enhancements diff --git a/docs/_docs/history.md b/docs/_docs/history.md index e400efd5610..2ddaf67a6f2 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,7 +4,7 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- -## 3.4.0 / 2016-01-20 +## 3.4.0 / 2016-01-27 {: #v3-4-0} ### Minor Enhancements From 76feebd2d26cb4166d42ecffaab19ff38ad36494 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 27 Jan 2017 11:06:00 -0500 Subject: [PATCH 1924/4996] Release :gem: 3.4.0 From c01b7e4a4a70ee4df498398585bce4e6f59fb04a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 27 Jan 2017 11:10:55 -0500 Subject: [PATCH 1925/4996] Update history to reflect merge of #4362 [ci skip] --- History.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/History.markdown b/History.markdown index ab9cd2e631a..d286be245b6 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,9 @@ +## HEAD + +### Minor Enhancements + + * Upgrade to Liquid v4 (#4362) + ## 3.4.0 / 2016-01-27 ### Minor Enhancements From 966800fb1f4371729eb0ed8b016efa0a084e7318 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 27 Jan 2017 11:37:05 -0500 Subject: [PATCH 1926/4996] Update history to reflect merge of #5817 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index d286be245b6..2958d74e224 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,10 @@ * Upgrade to Liquid v4 (#4362) +### Documentation + + * Install troubleshooting on Ubuntu (#5817) + ## 3.4.0 / 2016-01-27 ### Minor Enhancements From f6dffecab7aad6497b33fb4a954f83a90d234ea9 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 27 Jan 2017 20:51:56 +0100 Subject: [PATCH 1927/4996] fix broken links in release post --- docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown index cb2c6f872ca..37edb7bc379 100644 --- a/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown +++ b/docs/_posts/2017-01-18-jekyll-3-4-0-released.markdown @@ -10,8 +10,8 @@ Hey there! We have a quick update of Jekyll for you to enjoy this January. Packed full of bug fixes as usual, thanks to the tireless efforts of our exceptional Jekyll community. Three changes to call out: -1. If you're a big fan of [`where_by_exp`](/docs/filters/), you'll be an -even bigger fan of [`group_by_exp`](/docs/filters/). +1. If you're a big fan of [`where_by_exp`](/docs/templates/#filters), you'll be an +even bigger fan of [`group_by_exp`](/docs/templates/#filters). 2. Using a custom timezone in Jekyll on Windows? Yeah, sorry that hasn't ever worked properly. We made it possible to accurately [set the timezone using IANA timezone codes](https://jekyllrb.com/docs/windows/#timezone-management). From 3da459ef33055802074000dd95a94dac8b262574 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 28 Jan 2017 22:15:34 +0530 Subject: [PATCH 1928/4996] update rubygems version on travis --- .travis.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3543e9aae57..f48eb77a0d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,9 +6,9 @@ sudo: false rvm: - &ruby1 2.4.0 - - &ruby1 2.3.3 - - &ruby2 2.2.6 - - &ruby3 2.1.9 + - &ruby2 2.3.3 + - &ruby3 2.2.6 + - &ruby4 2.1.9 - &jruby jruby-9.1.7.0 matrix: @@ -17,6 +17,10 @@ matrix: env: TEST_SUITE=fmt - rvm: *ruby1 env: TEST_SUITE=default-site + - rvm: *ruby2 + env: TEST_SUITE=fmt + - rvm: *ruby2 + env: TEST_SUITE=default-site exclude: - rvm: *jruby env: TEST_SUITE=cucumber @@ -49,3 +53,6 @@ addons: # regular test configuration after_success: - bundle exec codeclimate-test-reporter + +before_install: + - gem update --system From 8bacf01c1b49042d9aeb1a9b82824f46292545e5 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Sun, 29 Jan 2017 21:45:03 -0800 Subject: [PATCH 1929/4996] Add documentation about order of interpretation This tutorial defines Jekyll's "order of interpretation," as @swizca called it in [#5808](https://github.com/jekyll/jekyll/pull/5698). This tutorial makes it clear how Jekyll processes files as it renders the static HTML output. This order-of-interpretation info is important for troubleshooting and generally understanding Jekyll. It's important to know how Jekyll generates out the files, what rules it uses, what order it processes things, and so forth. (Note: Please process 5698 before this request, because 5698 includes the tutorial collection/navigation that this tutorial fits into. I also need to update this commit to add a link in the Tutorials nav to this topic, but I'm waiting for 5698 to be merged so that menu becomes available.) @jekyll/documentation @dirtyf --- docs/_tutorials/orderofinterpretation.md | 133 +++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 docs/_tutorials/orderofinterpretation.md diff --git a/docs/_tutorials/orderofinterpretation.md b/docs/_tutorials/orderofinterpretation.md new file mode 100644 index 00000000000..e4e003be8a5 --- /dev/null +++ b/docs/_tutorials/orderofinterpretation.md @@ -0,0 +1,133 @@ +--- +layout: tutorials +permalink: /tutorials/orderofinterpretation/ +title: Order of interpretation +--- + +Jekyll's main job is to convert your raw text files into a static website. It does this by rendering Liquid, Markdown, and other transforms as it generates the static HTML output. + +In this conversion process, it's important to understand Jekyll's order of interpretation. By "order of interpretation," we mean what gets rendered, in what order, and what rules get applied in converting content. + +If an element isn't converting, you can troubleshoot the problem by analyzing the order of interpretation. + +## Order of interpretations + +Jekyll converts your site in the following order: + +1. **Site variables**. Jekyll looks across your files and populates [site variables]({% link _docs/variables.md %}), such as `site`, `page`, `post`, and collection objects. (From these objects, Jekyll determines the values for permalinks, tags, categories, and other details.) + +2. **Liquid**. Jekyll processes any Liquid formatting in pages that contain [front matter]({% link _docs/frontmatter.md %}). All Liquid tags, such as `include`, `highlight`, or `assign` tags, are rendered. (Anything in Jekyll with `{% raw %}{{ }}{% endraw %}` curly braces or `{% raw %}{% %}{% endraw %}` is usually a Liquid filter or tag.) + +3. **Markdown**. Jekyll converts Markdown to HTML using the Markdown filter specified in your config file. Files must have a Markdown file extension and front matter in order for Jekyll to convert them. + +4. **Layout**. Jekyll pushes content into the layouts specified by the page's front matter (or as specified in the config file). The content from each page gets pushed into the `{% raw %}{{content}}{% endraw %}` tags within the layouts. + +5. **Files**. Jekyll writes the generated content into files in the [directory structure]({% link _docs/structure.md %}) in `_site`. Pages, posts, and collections get structured based on their [permalink]({% link _docs/permalinks.md %}) setting. Directories that begin with `_` (such as `_includes` and `_data`) are usually hidden in the output. + +## Scenarios where incorrect configurations yield problems + +For the most part, you don't have to think about the order of interpretation when building your Jekyll site. These details only become important to know when something isn't rendering. + +The following scenarios highlight potential problems you might encounter. These problems stem from misunderstanding the order of interpretation and can be easily fixed. + +### Variable on page not rendered because variable is assigned in layout + +In your layout file (`_layouts/default.html`), suppose you have a variable assigned: + +``` +{% raw %}{% assign myvar = "joe" %}{% endraw %} +``` + +On a page that uses the layout, you reference that variable: + +``` +{% raw %}{{myvar}}{% endraw %} +``` + +The variable won't render because the page's order of interpretation is to render Liquid first and later process the Layout. When the Liquid rendering happens, the variable assignment isn't available. + +To make the code work, you could put the variable assignment into the page's front matter. + +### Liquid tag in data reference not rendered + +In `_data/mydata.yml`, suppose you have this mapping: + +``` +{% raw %}somevalue: {{myvar}}{% endraw %} +``` + +On a page, you try to insert this value: + +``` +{% raw %}{{site.data.mydata.somevalue}}{% endraw %} +``` +Nothing renders because first the site variables populate, and then Liquid renders. When the site variables populate, the value for `{% raw %}{{site.data.mydata.somevalue}}{% endraw %}` is simply `{% raw %}{{myvar}}{% endraw %}`, which registers as a string and gets printed as a string. You can't use Liquid in data files. + +Similarly, suppose you have a `highlight` tag in your `_data/mydata.yml` file: + +``` +{% raw %}myvalue: > + {% highlight javascript %} + console.log('alert'); + {% endhighlight %}{% endraw %} +``` + +On a page, you try to insert the value: + +``` +{% raw %}{{site.data.mydata.myvalue}}{% endraw %} +``` + +This renders as a string for the same reasons described above. When the `site.data.mydata.myvalue` tag populates, the value gets stored as a string and printed to the page as a string. + +To make the code work, consider populating content from includes. + +### Markdown in include file not processed + +Suppose you have a Markdown file at `_includes/mycontent.md`. In the Markdown file, you have some Markdown formatting: + +```markdown +This is a list: +* first item +* second item +``` + +You include the file into an HTML file as follows: + +```liquid +{% raw %}{% include mycontent.md %}{% endraw %} +``` + +The Markdown is not processed because first the Liquid (`include` tag) gets processed, inserting `mycontent.md` into the HTML file. *Then* the Markdown would get processed. + +But because the content is included into an *HTML* page, the Markdown isn't rendered. The Markdown filter processes content only in Markdown files. + +To make the code work, use HMTL formatting in includes inserted into HTML files. + +However, note that `highlight` tags don't require Markdown to process. Suppose your include contains the following: + +```liquid +{% raw %}{% highlight javascript %} +console.log('alert'); +{% endhighlight %}{% endraw %} +``` + +The `highlight` tag *is* Liquid. (Liquid passes the content to Rouge or Pygments for syntax highlighting.) As a result, this code will actually convert to HTML with syntax highlighting. Jekyll does not need the Markdown filter to process `highlight` tags. + +### Liquid mixed with JavaScript isn't rendered + +Suppose you try to mix Liquid with JavaScript, like this: + +```liquid +{% raw %}if page.type == "home" { + $("intro").addClass("bright"); +elsif page.type == "normal" { + $("intro").addClass("muted"); + }{% endraw %} +``` + +The Liquid renders long before the page gets converted to HTML. So when JavaScript executes in the browser, the Liquid is no longer present. + +You can never mix Liquid with JavaScript because Liquid processes when the site builds. In contrast, JavaScript processes in the browser when a user interacts with your site. + +To make the code work, don't mix Liquid with JavaScript. If you need the code to execute in real-time in the browser, use JavaScript. From a7cba8a8a6686af2c8395bd627e2e8a2a2819a5e Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Mon, 30 Jan 2017 11:45:24 -0800 Subject: [PATCH 1930/4996] Made updates as suggested by reviewers --- docs/_tutorials/orderofinterpretation.md | 59 ++++++++++++++++-------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/docs/_tutorials/orderofinterpretation.md b/docs/_tutorials/orderofinterpretation.md index e4e003be8a5..bf3614a1870 100644 --- a/docs/_tutorials/orderofinterpretation.md +++ b/docs/_tutorials/orderofinterpretation.md @@ -20,11 +20,11 @@ Jekyll converts your site in the following order: 3. **Markdown**. Jekyll converts Markdown to HTML using the Markdown filter specified in your config file. Files must have a Markdown file extension and front matter in order for Jekyll to convert them. -4. **Layout**. Jekyll pushes content into the layouts specified by the page's front matter (or as specified in the config file). The content from each page gets pushed into the `{% raw %}{{content}}{% endraw %}` tags within the layouts. +4. **Layout**. Jekyll pushes content into the layouts specified by the page's front matter (or as specified in the config file). The content from each page gets pushed into the `{% raw %}{{ content }}{% endraw %}` tags within the layouts. 5. **Files**. Jekyll writes the generated content into files in the [directory structure]({% link _docs/structure.md %}) in `_site`. Pages, posts, and collections get structured based on their [permalink]({% link _docs/permalinks.md %}) setting. Directories that begin with `_` (such as `_includes` and `_data`) are usually hidden in the output. -## Scenarios where incorrect configurations yield problems +## Scenarios where incorrect configurations create problems For the most part, you don't have to think about the order of interpretation when building your Jekyll site. These details only become important to know when something isn't rendering. @@ -41,7 +41,7 @@ In your layout file (`_layouts/default.html`), suppose you have a variable assig On a page that uses the layout, you reference that variable: ``` -{% raw %}{{myvar}}{% endraw %} +{% raw %}{{ myvar }}{% endraw %} ``` The variable won't render because the page's order of interpretation is to render Liquid first and later process the Layout. When the Liquid rendering happens, the variable assignment isn't available. @@ -53,15 +53,16 @@ To make the code work, you could put the variable assignment into the page's fro In `_data/mydata.yml`, suppose you have this mapping: ``` -{% raw %}somevalue: {{myvar}}{% endraw %} +{% raw %}somevalue: {{ myvar }}{% endraw %} ``` On a page, you try to insert this value: ``` -{% raw %}{{site.data.mydata.somevalue}}{% endraw %} +{% raw %}{{ site.data.mydata.somevalue }}{% endraw %} ``` -Nothing renders because first the site variables populate, and then Liquid renders. When the site variables populate, the value for `{% raw %}{{site.data.mydata.somevalue}}{% endraw %}` is simply `{% raw %}{{myvar}}{% endraw %}`, which registers as a string and gets printed as a string. You can't use Liquid in data files. + +This renders as a string (`{% raw %}"{{ site.data.mydata.somevalue }}{% endraw %}"` rather than the variable's value. This is because first the site variables populate, and then Liquid renders. When the site variables populate, the value for `{% raw %}{{ site.data.mydata.somevalue }}{% endraw %}` is simply `{% raw %}{{ myvar }}{% endraw %}`, which registers as a string. You can't use Liquid in data files. Similarly, suppose you have a `highlight` tag in your `_data/mydata.yml` file: @@ -75,7 +76,7 @@ Similarly, suppose you have a `highlight` tag in your `_data/mydata.yml` file: On a page, you try to insert the value: ``` -{% raw %}{{site.data.mydata.myvalue}}{% endraw %} +{% raw %}{{ site.data.mydata.myvalue }}{% endraw %} ``` This renders as a string for the same reasons described above. When the `site.data.mydata.myvalue` tag populates, the value gets stored as a string and printed to the page as a string. @@ -102,9 +103,9 @@ The Markdown is not processed because first the Liquid (`include` tag) gets proc But because the content is included into an *HTML* page, the Markdown isn't rendered. The Markdown filter processes content only in Markdown files. -To make the code work, use HMTL formatting in includes inserted into HTML files. +To make the code work, use HMTL formatting in includes that are inserted into HTML files. -However, note that `highlight` tags don't require Markdown to process. Suppose your include contains the following: +Note that `highlight` tags don't require Markdown to process. Suppose your include contains the following: ```liquid {% raw %}{% highlight javascript %} @@ -116,18 +117,38 @@ The `highlight` tag *is* Liquid. (Liquid passes the content to Rouge or Pygments ### Liquid mixed with JavaScript isn't rendered -Suppose you try to mix Liquid with JavaScript, like this: +Suppose you try to mix Liquid's `assign` tag with JavaScript, like this: -```liquid -{% raw %}if page.type == "home" { - $("intro").addClass("bright"); -elsif page.type == "normal" { - $("intro").addClass("muted"); - }{% endraw %} +```javascript +{% raw %} + +

    + +{% endraw %} ``` -The Liquid renders long before the page gets converted to HTML. So when JavaScript executes in the browser, the Liquid is no longer present. +This won't work because the `assign` tag is only available during the Liquid rendering phase of the site. In this JavaScript example, the script executes when a user clicks a button ("Click me") on the page. At that time, the Liquid logic is no longer available, so the `assign` tag wouldn't return anything. + +However, you can use Jekyll's site variables or Liquid to *populate* a script that is executed at a later time. For example, suppose you have the following property in your front matter: `someContent: "This is some content"`. You could do this: + +```js +{% raw %} + +

    + +{% endraw %} +``` -You can never mix Liquid with JavaScript because Liquid processes when the site builds. In contrast, JavaScript processes in the browser when a user interacts with your site. +When Jekyll builds the site, this `someContent` property populates the script's values, converting `{% raw %}{{ page.someContent }}{% endraw %}` to `"This is some content"`. -To make the code work, don't mix Liquid with JavaScript. If you need the code to execute in real-time in the browser, use JavaScript. +The key to remember is that Liquid renders when Jekyll builds your site. Liquid is not available at run-time in the browser when a user executes an event. From 384be58b5e7e0b57433c47f6cd3de15eaf6ce612 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Tue, 31 Jan 2017 08:40:06 +0530 Subject: [PATCH 1931/4996] add missing comma --- test/test_site_drop.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_site_drop.rb b/test/test_site_drop.rb index 6175bbb8cc9..b836c70d3eb 100644 --- a/test/test_site_drop.rb +++ b/test/test_site_drop.rb @@ -4,7 +4,7 @@ class TestSiteDrop < JekyllUnitTest context "a site drop" do setup do @site = fixture_site({ - "collections" => ["thanksgiving"] + "collections" => ["thanksgiving"], }) @site.process @drop = @site.to_liquid.site From 875486e8ae8ab5d18ca1c744eb3c8b7618065460 Mon Sep 17 00:00:00 2001 From: Nate Date: Mon, 30 Jan 2017 22:13:05 -0800 Subject: [PATCH 1932/4996] Add Termux section on troubleshooting --- docs/_docs/troubleshooting.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/_docs/troubleshooting.md b/docs/_docs/troubleshooting.md index d5f29671fa2..8fb669425c1 100644 --- a/docs/_docs/troubleshooting.md +++ b/docs/_docs/troubleshooting.md @@ -65,6 +65,12 @@ sudo emerge -av dev-ruby/rubygems On Windows, you may need to install [RubyInstaller DevKit](https://wiki.github.com/oneclick/rubyinstaller/development-kit). +On Android (with Termux) you can install all requirements by running: + +```sh +apt update && apt install libffi-dev clang ruby-dev make +``` + On macOS, you may need to update RubyGems (using `sudo` only if necessary): ```sh From 78a4f207449e323e77f67036eab504bea7b9d9cb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 31 Jan 2017 03:50:10 -0500 Subject: [PATCH 1933/4996] Update history to reflect merge of #5835 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 2958d74e224..252b41b41b6 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,10 @@ * Install troubleshooting on Ubuntu (#5817) +### Development Fixes + + * [Rubocop] add missing comma (#5835) + ## 3.4.0 / 2016-01-27 ### Minor Enhancements From e0109633ded51bc5cbd31c114e751418f33855d8 Mon Sep 17 00:00:00 2001 From: Alfred Myers Date: Tue, 31 Jan 2017 13:05:26 -0200 Subject: [PATCH 1934/4996] Corrected date for version 3.4.0 Year should probably be 2017 instead of 2016 --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 252b41b41b6..194b4a70451 100644 --- a/History.markdown +++ b/History.markdown @@ -12,7 +12,7 @@ * [Rubocop] add missing comma (#5835) -## 3.4.0 / 2016-01-27 +## 3.4.0 / 2017-01-27 ### Minor Enhancements From 1457359ce500d734cd22349bc603077f9a76acff Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 31 Jan 2017 10:10:36 -0500 Subject: [PATCH 1935/4996] Update history to reflect merge of #5842 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 194b4a70451..71e56083a09 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,10 @@ * [Rubocop] add missing comma (#5835) +### Site Enhancements + + * Corrected date for version 3.4.0 (#5842) + ## 3.4.0 / 2017-01-27 ### Minor Enhancements From 0c59ac3d299ab498ff535c4de83253d9034c0ffa Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 31 Jan 2017 10:12:47 -0500 Subject: [PATCH 1936/4996] Update history to reflect merge of #5837 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 71e56083a09..3d0d01d6812 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ ### Documentation * Install troubleshooting on Ubuntu (#5817) + * Add Termux section on troubleshooting (#5837) ### Development Fixes From 4b325a65afde21830b026ee978c847ac4c2c3b5b Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Fri, 3 Feb 2017 20:46:05 -0800 Subject: [PATCH 1937/4996] updated based on review I moved the section about liquid and yaml to the end and shortened it. i also clarified that isn't an order-of-interpretation issue why liquid doesn't render in yaml. I also fixed the type with HMTL. --- docs/_tutorials/orderofinterpretation.md | 60 +++++++++--------------- 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/docs/_tutorials/orderofinterpretation.md b/docs/_tutorials/orderofinterpretation.md index bf3614a1870..8ffb9d7ea3d 100644 --- a/docs/_tutorials/orderofinterpretation.md +++ b/docs/_tutorials/orderofinterpretation.md @@ -48,41 +48,6 @@ The variable won't render because the page's order of interpretation is to rende To make the code work, you could put the variable assignment into the page's front matter. -### Liquid tag in data reference not rendered - -In `_data/mydata.yml`, suppose you have this mapping: - -``` -{% raw %}somevalue: {{ myvar }}{% endraw %} -``` - -On a page, you try to insert this value: - -``` -{% raw %}{{ site.data.mydata.somevalue }}{% endraw %} -``` - -This renders as a string (`{% raw %}"{{ site.data.mydata.somevalue }}{% endraw %}"` rather than the variable's value. This is because first the site variables populate, and then Liquid renders. When the site variables populate, the value for `{% raw %}{{ site.data.mydata.somevalue }}{% endraw %}` is simply `{% raw %}{{ myvar }}{% endraw %}`, which registers as a string. You can't use Liquid in data files. - -Similarly, suppose you have a `highlight` tag in your `_data/mydata.yml` file: - -``` -{% raw %}myvalue: > - {% highlight javascript %} - console.log('alert'); - {% endhighlight %}{% endraw %} -``` - -On a page, you try to insert the value: - -``` -{% raw %}{{ site.data.mydata.myvalue }}{% endraw %} -``` - -This renders as a string for the same reasons described above. When the `site.data.mydata.myvalue` tag populates, the value gets stored as a string and printed to the page as a string. - -To make the code work, consider populating content from includes. - ### Markdown in include file not processed Suppose you have a Markdown file at `_includes/mycontent.md`. In the Markdown file, you have some Markdown formatting: @@ -103,7 +68,7 @@ The Markdown is not processed because first the Liquid (`include` tag) gets proc But because the content is included into an *HTML* page, the Markdown isn't rendered. The Markdown filter processes content only in Markdown files. -To make the code work, use HMTL formatting in includes that are inserted into HTML files. +To make the code work, use HTML formatting in includes that are inserted into HTML files. Note that `highlight` tags don't require Markdown to process. Suppose your include contains the following: @@ -132,7 +97,7 @@ function someFunction() { {% endraw %} ``` -This won't work because the `assign` tag is only available during the Liquid rendering phase of the site. In this JavaScript example, the script executes when a user clicks a button ("Click me") on the page. At that time, the Liquid logic is no longer available, so the `assign` tag wouldn't return anything. +This won't work because the `assign` tag is only available during the Liquid rendering phase of the site. In this JavaScript example, the script executes when a user clicks a button ("Click me") on the HTML page. At that time, the Liquid logic is no longer available, so the `assign` tag wouldn't return anything. However, you can use Jekyll's site variables or Liquid to *populate* a script that is executed at a later time. For example, suppose you have the following property in your front matter: `someContent: "This is some content"`. You could do this: @@ -152,3 +117,24 @@ function someFunction() { When Jekyll builds the site, this `someContent` property populates the script's values, converting `{% raw %}{{ page.someContent }}{% endraw %}` to `"This is some content"`. The key to remember is that Liquid renders when Jekyll builds your site. Liquid is not available at run-time in the browser when a user executes an event. + +## Note about using Liquid in YAML + +There's one more detail to remember: Liquid does not render when embedded in YAML files or front matter. (This isn't related to order of interpretation, but it's worth mentioning because it's a common question about element rendering.) + +For example, suppose you have a `highlight` tag in your `_data/mydata.yml` file: + +``` +{% raw %}myvalue: > + {% highlight javascript %} + console.log('alert'); + {% endhighlight %}{% endraw %} +``` + +On a page, you try to insert the value: + +``` +{% raw %}{{ site.data.mydata.myvalue }}{% endraw %} +``` + +This would render as a string rather than a code sample with syntax highlighting. To make the code render, you might use an include instead. From 7e45610379cf5419ceba3c8f9532eca25ee405bd Mon Sep 17 00:00:00 2001 From: Colin Date: Sat, 4 Feb 2017 15:52:42 +0000 Subject: [PATCH 1938/4996] Add the correct year to the 3.4.0 release date --- docs/_docs/history.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 2ddaf67a6f2..7d96660a389 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,7 +4,7 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- -## 3.4.0 / 2016-01-27 +## 3.4.0 / 2017-01-27 {: #v3-4-0} ### Minor Enhancements From 20d2eb2709b9fda243a955d365fbb911cd0b51f6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 4 Feb 2017 12:30:28 -0500 Subject: [PATCH 1939/4996] Update history to reflect merge of #5858 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3d0d01d6812..abf9b5f2031 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ ### Site Enhancements * Corrected date for version 3.4.0 (#5842) + * Add the correct year to the 3.4.0 release date (#5858) ## 3.4.0 / 2017-01-27 From 4e40593a53e51c9f1e2ce567677bc1803bbd4829 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 5 Feb 2017 01:26:41 +0530 Subject: [PATCH 1940/4996] exclude Gemfile and its lockfile by default --- lib/jekyll/configuration.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 27e245e4bcb..b4bf7c5aba3 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -18,7 +18,8 @@ class Configuration < Hash "safe" => false, "include" => [".htaccess"], "exclude" => %w( - node_modules vendor/bundle/ vendor/cache/ vendor/gems/ vendor/ruby/ + Gemfile Gemfile.lock node_modules vendor/bundle/ vendor/cache/ vendor/gems/ + vendor/ruby/ ), "keep_files" => [".git", ".svn"], "encoding" => "utf-8", From 6316856773a8c41d16c887e2df82ec8735f3890b Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 5 Feb 2017 01:28:43 +0530 Subject: [PATCH 1941/4996] comment out 'exclude:' in config file --- lib/site_template/_config.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index f5df9830896..aa255a64979 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -29,6 +29,17 @@ markdown: kramdown theme: minima gems: - jekyll-feed -exclude: - - Gemfile - - Gemfile.lock + +# Exclude from processing. +# The items below are excluded by default, to customize the list, uncomment the +# lines below and simply add to the list. Items removed will **not** be excluded +# from processing. +# +# exclude: +# - Gemfile +# - Gemfile.lock +# - node_modules +# - vendor/bundle/ +# - vendor/cache/ +# - vendor/gems/ +# - vendor/ruby/ From 2813b9c03985e2c4bd7c1f74b246d5432cb41bf0 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 5 Feb 2017 01:49:38 +0530 Subject: [PATCH 1942/4996] test exclusion of Gemfile --- test/test_configuration.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_configuration.rb b/test/test_configuration.rb index febc0cbee1b..9602c5c309f 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -55,6 +55,8 @@ class TestConfiguration < JekyllUnitTest should "exclude ruby vendor directories" do exclude = Configuration.from({})["exclude"] + assert_includes exclude, "Gemfile" + assert_includes exclude, "Gemfile.lock" assert_includes exclude, "vendor/bundle/" assert_includes exclude, "vendor/cache/" assert_includes exclude, "vendor/gems/" From eb36ea095fb948ad21a820ba35fe145a43cbf352 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 5 Feb 2017 01:56:49 +0530 Subject: [PATCH 1943/4996] test overriding default excludes --- features/site_configuration.feature | 2 ++ 1 file changed, 2 insertions(+) diff --git a/features/site_configuration.feature b/features/site_configuration.feature index 2d00f9b77cf..3aace7946ef 100644 --- a/features/site_configuration.feature +++ b/features/site_configuration.feature @@ -44,9 +44,11 @@ Feature: Site configuration Given I have an "Rakefile" file that contains "I want to be excluded" And I have an "README" file that contains "I want to be excluded" And I have an "index.html" file that contains "I want to be included" + And I have a "Gemfile" file that contains "gem 'include-me'" And I have a configuration file with "exclude" set to "['Rakefile', 'README']" When I run jekyll build Then I should see "I want to be included" in "_site/index.html" + And the "_site/Gemfile" file should exist And the "_site/Rakefile" file should not exist And the "_site/README" file should not exist From 3745b2456409882ba81f1c2e7cd6c4f868175f3b Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 5 Feb 2017 07:55:26 +0530 Subject: [PATCH 1944/4996] update comment for `exclude` array --- lib/site_template/_config.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index aa255a64979..436d5999500 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -31,10 +31,8 @@ gems: - jekyll-feed # Exclude from processing. -# The items below are excluded by default, to customize the list, uncomment the -# lines below and simply add to the list. Items removed will **not** be excluded -# from processing. -# +# The following items will not be processed, by default. Create a custom list +# to override the default setting. # exclude: # - Gemfile # - Gemfile.lock From 755cc6c137dedefe7a070fdf03f427e102b5e866 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Sun, 5 Feb 2017 20:55:16 -0800 Subject: [PATCH 1945/4996] Fixes based on latest review Mostly I added more detail in the Liquid section. --- docs/_tutorials/orderofinterpretation.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/_tutorials/orderofinterpretation.md b/docs/_tutorials/orderofinterpretation.md index 8ffb9d7ea3d..1146c636200 100644 --- a/docs/_tutorials/orderofinterpretation.md +++ b/docs/_tutorials/orderofinterpretation.md @@ -16,7 +16,10 @@ Jekyll converts your site in the following order: 1. **Site variables**. Jekyll looks across your files and populates [site variables]({% link _docs/variables.md %}), such as `site`, `page`, `post`, and collection objects. (From these objects, Jekyll determines the values for permalinks, tags, categories, and other details.) -2. **Liquid**. Jekyll processes any Liquid formatting in pages that contain [front matter]({% link _docs/frontmatter.md %}). All Liquid tags, such as `include`, `highlight`, or `assign` tags, are rendered. (Anything in Jekyll with `{% raw %}{{ }}{% endraw %}` curly braces or `{% raw %}{% %}{% endraw %}` is usually a Liquid filter or tag.) +2. **Liquid**. Jekyll processes any [Liquid](https://github.com/Shopify/liquid) formatting in pages that contain [front matter]({% link _docs/frontmatter.md %}). You can identify Liquid as follows: + * **Liguid tags** start with `{% raw %}{%{% endraw %}` and end with a `{% raw %}%}{% endraw %}`. For example: `{% raw %}{% highlight %}{% endraw %}` or `{% raw %}{% seo %}{% endraw %}`. Tags can define blocks or be inline. Block-defining tags will also come with a corresponding end tag — for example, `{% raw %}{% endhighlight %}{% endraw %}`. + * **Liquid variables** start and end with double curly braces. For example: `{% raw %}{{ site.myvariable }}{% endraw %}` or `{% raw %}{{ content }}{% endraw %}`. + * **Liquid filters** start with a pipe character (`|`) and can only be used within **Liquid variables** after the variable string. For example: the `relative_url` filter in `{% raw %}{{ "css/main.css" | relative_url }}{% endraw %}`. 3. **Markdown**. Jekyll converts Markdown to HTML using the Markdown filter specified in your config file. Files must have a Markdown file extension and front matter in order for Jekyll to convert them. @@ -28,7 +31,7 @@ Jekyll converts your site in the following order: For the most part, you don't have to think about the order of interpretation when building your Jekyll site. These details only become important to know when something isn't rendering. -The following scenarios highlight potential problems you might encounter. These problems stem from misunderstanding the order of interpretation and can be easily fixed. +The following scenarios highlight potential problems you might encounter. These problems come from misunderstanding the order of interpretation and can be easily fixed. ### Variable on page not rendered because variable is assigned in layout @@ -137,4 +140,4 @@ On a page, you try to insert the value: {% raw %}{{ site.data.mydata.myvalue }}{% endraw %} ``` -This would render as a string rather than a code sample with syntax highlighting. To make the code render, you might use an include instead. +This would render only as a string rather than a code sample with syntax highlighting. To make the code render, consider using an include instead. From 229769e249bc9a6703fda4a9af061cd639d1ca75 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Wed, 8 Feb 2017 17:44:47 -0500 Subject: [PATCH 1946/4996] add StaticFileDrop --- lib/jekyll/drops/static_file_drop.rb | 11 +++++++++++ lib/jekyll/static_file.rb | 20 +++++++++++++------- test/test_static_file.rb | 3 ++- 3 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 lib/jekyll/drops/static_file_drop.rb diff --git a/lib/jekyll/drops/static_file_drop.rb b/lib/jekyll/drops/static_file_drop.rb new file mode 100644 index 00000000000..e0af2f09ed1 --- /dev/null +++ b/lib/jekyll/drops/static_file_drop.rb @@ -0,0 +1,11 @@ +module Jekyll + module Drops + class StaticFileDrop < Drop + extend Forwardable + def_delegators :@obj, :name, :extname, :modified_time, :basename + def_delegator :@obj, :relative_path, :path + def_delegator :@obj, :data, :fallback_data + def_delegator :@obj, :type, :collection + end + end +end diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 53b945d4168..beea9ddf99c 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -28,6 +28,10 @@ def initialize(site, base, dir, name, collection = nil) @collection = collection @relative_path = File.join(*[@dir, @name].compact) @extname = File.extname(@name) + + data.default_proc = proc do |_, key| + site.frontmatter_defaults.find(relative_path, type, key) + end end # rubocop: enable ParameterLists @@ -96,13 +100,15 @@ def write(dest) end def to_liquid - { - "basename" => File.basename(name, extname), - "name" => name, - "extname" => extname, - "modified_time" => modified_time, - "path" => File.join("", relative_path), - } + @to_liquid ||= Drops::StaticFileDrop.new(self) + end + + def data + @data ||= {} + end + + def basename + File.basename(name, extname) end def placeholders diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 114885db752..b2299ae273f 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -148,8 +148,9 @@ def setup_static_file_with_defaults(base, dir, name, defaults) "extname" => ".txt", "modified_time" => @static_file.modified_time, "path" => "/static_file.txt", + "collection" => nil } - assert_equal expected, @static_file.to_liquid + assert_equal expected, @static_file.to_liquid.to_h end end end From 1d44be54216fc1dddf698a630ea4e5f7c0577bca Mon Sep 17 00:00:00 2001 From: Marcelo Canina Date: Fri, 10 Feb 2017 12:34:16 -0300 Subject: [PATCH 1947/4996] fix ial css classes in theme doc --- docs/_docs/themes.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index 551d93400c9..4db8d404143 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -141,7 +141,8 @@ To install a gem-based theme: bundle exec jekyll serve ``` -You can have multiple themes listed in your site's `Gemfile`, but only one theme can be selected in your site's `_config.yml`. {: .note .info } +You can have multiple themes listed in your site's `Gemfile`, but only one theme can be selected in your site's `_config.yml`. +{: .note .info } If you're publishing your Jekyll site on [GitHub Pages](https://pages.github.com/), note that GitHub Pages supports only some gem-based themes. See [Supported Themes](https://pages.github.com/themes/) in GitHub's documentation to see which themes are supported. @@ -217,7 +218,8 @@ Themes are visual. Show users what your theme looks like by including a screensh To preview your theme as you're authoring it, it may be helpful to add dummy content in, for example, `/index.html` and `/page.html` files. This will allow you to use the `jekyll build` and `jekyll serve` commands to preview your theme, just as you'd preview a Jekyll site. -If you do preview your theme locally, be sure to add `/_site` to your theme's `.gitignore` file to prevent the compiled site from also being included when you distribute your theme. {: .info .note} +If you do preview your theme locally, be sure to add `/_site` to your theme's `.gitignore` file to prevent the compiled site from also being included when you distribute your theme. +{: .info .note} ### Publishing your theme From bdf594317b25899c4d9856e5d40e0c944363f48b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 10 Feb 2017 14:26:16 -0500 Subject: [PATCH 1948/4996] Update history to reflect merge of #5876 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index abf9b5f2031..33b3a5f8158 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * Install troubleshooting on Ubuntu (#5817) * Add Termux section on troubleshooting (#5837) + * fix ial css classes in theme doc (#5876) ### Development Fixes From 7b58bcfc9e0822649f4ea26843856ef46e801dad Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 10 Feb 2017 21:08:50 -0500 Subject: [PATCH 1949/4996] Update history to reflect merge of #5871 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 33b3a5f8158..7d2c32b3a72 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Minor Enhancements * Upgrade to Liquid v4 (#4362) + * Convert StaticFile liquid representation to a Drop & add front matter defaults support to StaticFiles (#5871) ### Documentation From bcebf58cbd1181ca73b05dac797c59a5d80d6e40 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 10 Feb 2017 21:10:11 -0500 Subject: [PATCH 1950/4996] Update history to reflect merge of #5860 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 7d2c32b3a72..8ef746b934d 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,10 @@ * Corrected date for version 3.4.0 (#5842) * Add the correct year to the 3.4.0 release date (#5858) +### Bug Fixes + + * Exclude Gemfile by default (#5860) + ## 3.4.0 / 2017-01-27 ### Minor Enhancements From ec234a4ef89629f40b3bb826f41948303a70a400 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 10 Feb 2017 21:05:32 -0500 Subject: [PATCH 1951/4996] Bump Ruby 2.1 testing up to Ruby 2.1.10 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 66c85eaabab..3a6ef68bb67 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ sudo: false rvm: - &ruby1 2.3.3 - &ruby2 2.2.6 - - &ruby3 2.1.9 + - &ruby3 2.1.10 - &jruby jruby-9.1.7.0 matrix: From 23808c2ae64638f79e1cb2b51936827e98f70880 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 10 Feb 2017 21:16:25 -0500 Subject: [PATCH 1952/4996] Fix missing trailing comma to alleviate fmt errors Offenses: test/test_static_file.rb:151:9: C: [Corrected] Style/TrailingCommaInLiteral: Put a comma after the last item of a multiline hash. "collection" => nil ^^^^^^^^^^^^^^^^^^^^^^ --- test/test_static_file.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_static_file.rb b/test/test_static_file.rb index b2299ae273f..1603420a8dd 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -148,7 +148,7 @@ def setup_static_file_with_defaults(base, dir, name, defaults) "extname" => ".txt", "modified_time" => @static_file.modified_time, "path" => "/static_file.txt", - "collection" => nil + "collection" => nil, } assert_equal expected, @static_file.to_liquid.to_h end From 98e19c3cf5122582a8d2b5ecaad805a7902f2e53 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 10 Feb 2017 21:16:58 -0500 Subject: [PATCH 1953/4996] Update history to reflect merge of #5834 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8ef746b934d..f6fb2e3a5d4 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * Corrected date for version 3.4.0 (#5842) * Add the correct year to the 3.4.0 release date (#5858) + * Add documentation about order of interpretation (#5834) ### Bug Fixes From 5bc67c1fb7964d9180777d84f9996027eec4001c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 10 Feb 2017 21:56:43 -0500 Subject: [PATCH 1954/4996] Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty --- lib/jekyll/convertible.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index e710b6f03c4..11d5fa865cf 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -69,7 +69,7 @@ def validate_data!(filename) end def validate_permalink!(filename) - if self.data["permalink"] && self.data["permalink"].empty? + if self.data["permalink"] && self.data["permalink"].to_s.empty? raise Errors::InvalidPermalinkError, "Invalid permalink in #{filename}" end end From 7414ab068a91c795c3a2cae9cff8a2c642c45faf Mon Sep 17 00:00:00 2001 From: BlueberryFoxtrot Date: Sat, 11 Feb 2017 05:35:50 +0100 Subject: [PATCH 1955/4996] Update installation.md It --> Jekyll. Avoids misreading that "it is possible to get [Windows] running on Windows." --- docs/_docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index bc5c251568c..5a8fc7a1286 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -36,7 +36,7 @@ Before you start, make sure your system has the following:
    Running Jekyll on Windows

    - While Windows is not officially supported, it is possible to get it running + While Windows is not officially supported, it is possible to get Jekyll running on Windows. Special instructions can be found on our Windows-specific docs page.

    From 9ec7969c09c4de2f40bff94bd84ab76b9c33f870 Mon Sep 17 00:00:00 2001 From: Ricardo N Feliciano Date: Sat, 11 Feb 2017 00:06:48 -0500 Subject: [PATCH 1956/4996] Add note to collections doc on hard-coded collections. --- docs/_docs/collections.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index c64abd23aa7..97ca6ecb9ab 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -321,6 +321,15 @@ you specified in your `_config.yml` (if present) and the following information:
    +
    +
    A Hard-Coded Collection
    +

    In addition to any collections you create yourself, the + posts collection is hard-coded into Jekyll. It exists whether + you have a _posts directory or not. This is something to note + when iterating through site.collections as you may need to + filter it out.

    +
    + ### Documents From 7484c23ba42068bcaf36b3a2a5f4d6a031368287 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 11 Feb 2017 00:21:20 -0500 Subject: [PATCH 1957/4996] Update history to reflect merge of #5880 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f6fb2e3a5d4..83a744304f7 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,7 @@ * Install troubleshooting on Ubuntu (#5817) * Add Termux section on troubleshooting (#5837) * fix ial css classes in theme doc (#5876) + * Update installation.md (#5880) ### Development Fixes From 6123175a7138d1ed6912054abcd4d7fd0c28bbb5 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 11 Feb 2017 13:58:23 +0530 Subject: [PATCH 1958/4996] test with pygments 1.1 on all ruby versions --- Gemfile | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index b13bb9084ed..616abfb8d09 100644 --- a/Gemfile +++ b/Gemfile @@ -3,12 +3,7 @@ gemspec :name => "jekyll" gem "rake", "~> 12.0" -if RUBY_VERSION >= '2.4' - gem "json", "~> 2.0" - gem "pygments.rb", "~> 1.1" -else - gem "pygments.rb", "~> 0.6.0" unless RUBY_ENGINE == "jruby" -end +gem "pygments.rb", "~> 1.1" # Dependency of jekyll-mentions. RubyGems in Ruby 2.1 doesn't shield us from this. gem "activesupport", "~> 4.2", :groups => [:test_legacy, :site] if RUBY_VERSION < "2.2.2" From 04ae82b84913b11408b326d4c815200039e72bf3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 12 Feb 2017 09:21:32 -0500 Subject: [PATCH 1959/4996] Update history to reflect merge of #5878 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 83a744304f7..e79677bcb3c 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ ### Bug Fixes * Exclude Gemfile by default (#5860) + * Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty (#5878) ## 3.4.0 / 2017-01-27 From b17c6c29144504aae7607a3163659e06f8e11d92 Mon Sep 17 00:00:00 2001 From: Ivan Storck Date: Sun, 12 Feb 2017 13:54:46 -0500 Subject: [PATCH 1960/4996] update Aerobatic docs --- docs/_docs/deployment-methods.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md index 79138caafd2..f2533cfd363 100644 --- a/docs/_docs/deployment-methods.md +++ b/docs/_docs/deployment-methods.md @@ -203,6 +203,6 @@ Setting up Kickster is very easy, just install the gem and you are good to go. M ## Aerobatic -[Aerobatic](https://www.aerobatic.com) is an add-on for Bitbucket that brings GitHub Pages style functionality to Bitbucket users. It includes continuous deployment, custom domains with a wildcard SSL cert, CDN, basic auth, and staging branches all in the box. +[Aerobatic](https://www.aerobatic.com) has custom domains, global CDN distribution, basic auth, CORS proxying, and a growling list of plugins all included. -Automating the build and deployment of a Jekyll site is just as simple as GitHub Pages - push your changes to your repo (excluding the `_site` directory) and within seconds a build will be triggered and your built site deployed to our highly- available, globally distributed hosting service. The build process will even install and execute custom Ruby plugins. See our [Jekyll docs](https://www.aerobatic.com/docs/static-generators#jekyll) for more details. +Automating the deployment of a Jekyll site is simple. See our [Jekyll docs](https://www.aerobatic.com/docs/static-site-generators/#jekyll) for more details. Your built site deployed to our highly-available, globally distributed hosting service. From b181eb2515b3e82e301eea343be4dccc800ba9ee Mon Sep 17 00:00:00 2001 From: Ivan Storck Date: Sun, 12 Feb 2017 17:56:08 -0500 Subject: [PATCH 1961/4996] fix typo --- docs/_docs/deployment-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md index f2533cfd363..ef8d16b1726 100644 --- a/docs/_docs/deployment-methods.md +++ b/docs/_docs/deployment-methods.md @@ -205,4 +205,4 @@ Setting up Kickster is very easy, just install the gem and you are good to go. M [Aerobatic](https://www.aerobatic.com) has custom domains, global CDN distribution, basic auth, CORS proxying, and a growling list of plugins all included. -Automating the deployment of a Jekyll site is simple. See our [Jekyll docs](https://www.aerobatic.com/docs/static-site-generators/#jekyll) for more details. Your built site deployed to our highly-available, globally distributed hosting service. +Automating the deployment of a Jekyll site is simple. See our [Jekyll docs](https://www.aerobatic.com/docs/static-site-generators/#jekyll) for more details. Your built `_site` folder is deployed to our highly-available, globally distributed hosting service. From 50292be8951f62750ae4bd68ce4e0658a898d172 Mon Sep 17 00:00:00 2001 From: Ivan Storck Date: Mon, 13 Feb 2017 11:40:30 -0500 Subject: [PATCH 1962/4996] fix typo --- docs/_docs/deployment-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md index ef8d16b1726..3e5fcfdcc90 100644 --- a/docs/_docs/deployment-methods.md +++ b/docs/_docs/deployment-methods.md @@ -203,6 +203,6 @@ Setting up Kickster is very easy, just install the gem and you are good to go. M ## Aerobatic -[Aerobatic](https://www.aerobatic.com) has custom domains, global CDN distribution, basic auth, CORS proxying, and a growling list of plugins all included. +[Aerobatic](https://www.aerobatic.com) has custom domains, global CDN distribution, basic auth, CORS proxying, and a growing list of plugins all included. Automating the deployment of a Jekyll site is simple. See our [Jekyll docs](https://www.aerobatic.com/docs/static-site-generators/#jekyll) for more details. Your built `_site` folder is deployed to our highly-available, globally distributed hosting service. From 2dde1800a285d6199eee38fd24bc0106b857bde8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 13 Feb 2017 14:23:50 -0500 Subject: [PATCH 1963/4996] Update history to reflect merge of #5883 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e79677bcb3c..83151769713 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Add Termux section on troubleshooting (#5837) * fix ial css classes in theme doc (#5876) * Update installation.md (#5880) + * Update Aerobatic docs (#5883) ### Development Fixes From c48b12ba9f293c6137a7b60bc3ab7bf240482989 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 14 Feb 2017 02:34:16 -0500 Subject: [PATCH 1964/4996] Update history to reflect merge of #5882 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 83151769713..f50b1c5007a 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ * fix ial css classes in theme doc (#5876) * Update installation.md (#5880) * Update Aerobatic docs (#5883) + * Add note to collections doc on hard-coded collections. (#5882) ### Development Fixes From 42a65a57e61cabacfb2505c22735527f2124a41e Mon Sep 17 00:00:00 2001 From: Phil Nash Date: Fri, 17 Feb 2017 02:16:37 +0000 Subject: [PATCH 1965/4996] Makes uri_escape template docs more specific. I didn't know the difference between cgi_escape and uri_escape until it bit me when I had a colon in a title I used uri_escape on. Addressable::URI.encode (from addressable 2.4.0 and later) thought it was a URI and raised an error. I should have been using cgi_escape, which is for strings that will be added to URIs and not uri_escape, which is for encoding strings that are already in a URI. This commit borrows from the addressable docs to make it more specific so that readers choose uri_escape when they already have a URI and cgi_escape when they are just escaping a plain string. --- docs/_docs/templates.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 0d4975d6dc3..19ad65193e6 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -194,15 +194,15 @@ common tasks easier.

    URI Escape

    - URI escape a string. + Percent encodes any special characters in a URI.

    - {% raw %}{{ "foo, bar \baz?" | uri_escape }}{% endraw %} + {% raw %}{{ "http://foo.com/?query=foo, bar \baz?" | uri_escape }}{% endraw %}

    - foo,%20bar%20%5Cbaz? + http://foo.com/?query=foo,%20bar%20%5Cbaz?

    From 6137dccfc02998ea2936e67e9524bfbdecb948fe Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 17 Feb 2017 04:19:18 -0500 Subject: [PATCH 1966/4996] Update history to reflect merge of #5887 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f50b1c5007a..722b5fd71b1 100644 --- a/History.markdown +++ b/History.markdown @@ -13,6 +13,7 @@ * Update installation.md (#5880) * Update Aerobatic docs (#5883) * Add note to collections doc on hard-coded collections. (#5882) + * Makes uri_escape template docs more specific. (#5887) ### Development Fixes From db229a85d79a5351e23b1f3639125b5f2edb1b2d Mon Sep 17 00:00:00 2001 From: Chun Fei Lung Date: Sat, 18 Feb 2017 17:14:15 +0100 Subject: [PATCH 1967/4996] Remove duplicate footnote_nr from default config The configuration page lists the footnote_nr kramdown configuration option twice. That seemed a bit much, so I removed one of the two lines. --- docs/_docs/configuration.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 3f3bfd25c9f..79de5a98ffc 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -653,7 +653,6 @@ redcarpet: kramdown: auto_ids: true - footnote_nr: 1 entity_output: as_char toc_levels: 1..6 smart_quotes: lsquo,rsquo,ldquo,rdquo From 2c75cb1ca7e540673ce21de30793f75eafc62b94 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 19 Feb 2017 11:29:53 -0500 Subject: [PATCH 1968/4996] Update history to reflect merge of #5891 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 722b5fd71b1..d876c6714f6 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ * Update Aerobatic docs (#5883) * Add note to collections doc on hard-coded collections. (#5882) * Makes uri_escape template docs more specific. (#5887) + * Remove duplicate footnote_nr from default config (#5891) ### Development Fixes From 4e913add3ecece41885c4c314d56a103934040ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pobo=C5=99il?= Date: Wed, 22 Feb 2017 22:58:48 +0100 Subject: [PATCH 1969/4996] Fixed tutorial for publishing gem to include repo. gem build lists files by git, so it is needed to have them commited. --- docs/_docs/themes.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index 4db8d404143..2e6052a4002 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -225,16 +225,24 @@ If you do preview your theme locally, be sure to add `/_site` to your theme's `. Themes are published via [RubyGems.org](https://rubygems.org). You will need a RubyGems account, which you can [create for free](https://rubygems.org/sign_up). -1. First, package your theme, by running the following command, replacing `jekyll-theme-awesome` with the name of your theme: +1. First, you need to have it in a git repository: + + ```sh + git init # Only the first time + git add -A + git commit -m "Init commit" + ``` + +2. Next, package your theme, by running the following command, replacing `jekyll-theme-awesome` with the name of your theme: ```sh gem build jekyll-theme-awesome.gemspec ``` -2. Next, push your packaged theme up to the RubyGems service, by running the following command, again replacing `jekyll-theme-awesome` with the name of your theme: +3. Finally, push your packaged theme up to the RubyGems service, by running the following command, again replacing `jekyll-theme-awesome` with the name of your theme: ```sh gem push jekyll-theme-awesome-*.gem ``` -3. To release a new version of your theme, update the version number in the gemspec file, ( `jekyll-theme-awesome.gemspec` in this example ), and then repeat Steps 1 & 2 above. We recommend that you follow [Semantic Versioning](http://semver.org/) while bumping your theme-version. +4. To release a new version of your theme, update the version number in the gemspec file, ( `jekyll-theme-awesome.gemspec` in this example ), and then repeat Steps 1 - 3 above. We recommend that you follow [Semantic Versioning](http://semver.org/) while bumping your theme-version. From e52fa8766548ace67a031f431e0db54459e3268b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 23 Feb 2017 03:36:34 -0500 Subject: [PATCH 1970/4996] Update history to reflect merge of #5900 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d876c6714f6..e447b7028cd 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ * Add note to collections doc on hard-coded collections. (#5882) * Makes uri_escape template docs more specific. (#5887) * Remove duplicate footnote_nr from default config (#5891) + * Fixed tutorial for publishing gem to include repo. (#5900) ### Development Fixes From 90d747238870bc178b533428559d1673dc56563e Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 25 Feb 2017 08:15:56 +0530 Subject: [PATCH 1971/4996] Remove dependency on include from default about.md This ensures better portability, allowing to switch and preview themes without having to delete the code block. --- lib/site_template/about.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/site_template/about.md b/lib/site_template/about.md index d441cde3009..8b4e0b28c83 100644 --- a/lib/site_template/about.md +++ b/lib/site_template/about.md @@ -6,10 +6,13 @@ permalink: /about/ This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](https://jekyllrb.com/) -You can find the source code for the Jekyll new theme at: -{% include icon-github.html username="jekyll" %} / +You can find the source code for Minima at GitHub: +[jekyll][jekyll-organization] / [minima](https://github.com/jekyll/minima) -You can find the source code for Jekyll at -{% include icon-github.html username="jekyll" %} / +You can find the source code for Jekyll at GitHub: +[jekyll][jekyll-organization] / [jekyll](https://github.com/jekyll/jekyll) + + +[jekyll-organization]: https://github.com/jekyll From 1f5612dd1be62c05edf74425090b48a6d755c357 Mon Sep 17 00:00:00 2001 From: Antonio Argote Date: Sun, 26 Feb 2017 16:02:17 +0800 Subject: [PATCH 1972/4996] update broken links where once there was a working url, there's now a broken redirect --- docs/_docs/templates.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 19ad65193e6..c612df497d8 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -4,8 +4,8 @@ permalink: /docs/templates/ --- Jekyll uses the [Liquid](https://shopify.github.io/liquid/) templating language to -process templates. All of the standard Liquid [tags](https://shopify.github.io/liquid/tags/) and -[filters](https://shopify.github.io/liquid/filters/) are +process templates. All of the standard Liquid [tags](https://shopify.github.io/liquid/tags/control-flow/) and +[filters](https://shopify.github.io/liquid/filters/abs/) are supported. Jekyll even adds a few handy filters and tags of its own to make common tasks easier. From 21106b5431148a1fe536fd57315b2c541b4d5d86 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 26 Feb 2017 04:47:13 -0500 Subject: [PATCH 1973/4996] Update history to reflect merge of #5905 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e447b7028cd..ee1098f92bc 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Makes uri_escape template docs more specific. (#5887) * Remove duplicate footnote_nr from default config (#5891) * Fixed tutorial for publishing gem to include repo. (#5900) + * update broken links (#5905) ### Development Fixes From b9c645d4c3ac9aacdbef46d09283a853779f85ec Mon Sep 17 00:00:00 2001 From: Roger Sheen Date: Mon, 27 Feb 2017 23:27:30 +0100 Subject: [PATCH 1974/4996] Fix typo in contribution information MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Minor subject/verb agreement (use plural “pull request**s**” to agree with verb form) --- docs/_docs/contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index 724c6641801..b0b85e0f31c 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -32,7 +32,7 @@ Whether you're a developer, a designer, or just a Jekyll devotee, there are lots * The more information, the better. Make judicious use of the pull request body. Describe what changes were made, why you made them, and what impact they will have for users. -* Pull request are easy and fun. If this is your first pull request, it may help to [understand GitHub Flow](https://guides.github.com/introduction/flow/). +* Pull requests are easy and fun. If this is your first pull request, it may help to [understand GitHub Flow](https://guides.github.com/introduction/flow/). * If you're submitting a code contribution, be sure to read the [code contributions](#code-contributions) section below. From 31b8a2ba5c437f7ddb29e9c74ddbf789c4e9673e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 27 Feb 2017 17:41:57 -0500 Subject: [PATCH 1975/4996] Update history to reflect merge of #5910 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ee1098f92bc..2f74dfd652f 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * Remove duplicate footnote_nr from default config (#5891) * Fixed tutorial for publishing gem to include repo. (#5900) * update broken links (#5905) + * Fix typo in contribution information (#5910) ### Development Fixes From 0ecbf40d0e28a44c80db8ba2a5eaa0d8b5d0edd7 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Tue, 28 Feb 2017 10:15:20 -0800 Subject: [PATCH 1976/4996] fixes from parkr's review. removed yellow style line. moved tutorials link from primary nav to Help page. removed .giignore change. --- docs/_includes/primary-nav-items.html | 3 --- docs/_sass/_style.scss | 3 +-- docs/help/index.md | 4 ++++ 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/_includes/primary-nav-items.html b/docs/_includes/primary-nav-items.html index a431d846d50..21200b3e97c 100644 --- a/docs/_includes/primary-nav-items.html +++ b/docs/_includes/primary-nav-items.html @@ -5,9 +5,6 @@
  • Docs
  • -
  • - Tutorials -
  • News
  • diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 3a038966558..d8b0bf38297 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -1033,6 +1033,5 @@ code.output { } .result { - border: 1px solid yellow; - padding: 10px; + padding: 12px; } diff --git a/docs/help/index.md b/docs/help/index.md index 46ddcd4d3f1..c4674a21e2f 100644 --- a/docs/help/index.md +++ b/docs/help/index.md @@ -14,6 +14,10 @@ Known breaking changes are listed in the upgrading docs. Our guide to Jekyll covering installation, writing, customization, deployment, and more. +### [Tutorials](/tutorials/home) + +Similar to documentation, but more detailed scenario-based walk-throughs covering a variety of topics. + ### [View source](https://github.com/jekyll/jekyll/wiki/sites) Learn from the source of others' Jekyll-powered sites. From 05790460c1d2479334428e1eb42891232aba008f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 28 Feb 2017 14:04:53 -0500 Subject: [PATCH 1977/4996] Update history to reflect merge of #5698 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2f74dfd652f..c923f1bf981 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,7 @@ * Corrected date for version 3.4.0 (#5842) * Add the correct year to the 3.4.0 release date (#5858) * Add documentation about order of interpretation (#5834) + * Documentation on how to build navigation (#5698) ### Bug Fixes From f7d1a9c9996ba9b3a124ba38637cdc04fe39c3f9 Mon Sep 17 00:00:00 2001 From: jekylltools Date: Tue, 28 Feb 2017 17:32:40 -0800 Subject: [PATCH 1978/4996] update plugin URL to reflect repo move --- docs/_docs/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index a0c61cd3f58..4c09d2275f3 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -865,7 +865,7 @@ LESS.js files during generation. - [jekyll-figure](https://github.com/paulrobertlloyd/jekyll-figure): A liquid tag for Jekyll that generates `
    ` elements. - [Jekyll Video Embed](https://github.com/eug/jekyll-video-embed): It provides several tags to easily embed videos (e.g. Youtube, Vimeo, UStream and Ted Talks) - [jekyll-i18n_tags](https://github.com/KrzysiekJ/jekyll-i18n_tags): Translate your templates. -- [Jekyll Ideal Image Slider](https://github.com/xHN35RQ/jekyll-ideal-image-slider): Liquid tag plugin to create image sliders using [Ideal Image Slider](https://github.com/gilbitron/Ideal-Image-Slider). +- [Jekyll Ideal Image Slider](https://github.com/jekylltools/jekyll-ideal-image-slider): Liquid tag plugin to create image sliders using [Ideal Image Slider](https://github.com/gilbitron/Ideal-Image-Slider). - [Jekyll Tags List Plugin](https://github.com/crispgm/jekyll-tags-list-plugin): A Liquid tag plugin that creates tags list in specific order. - [Jekyll Maps](https://github.com/ayastreb/jekyll-maps) by [Anatoliy Yastreb](https://github.com/ayastreb): A Jekyll plugin to easily embed maps with filterable locations. - [Jekyll Cloudinary](https://nhoizey.github.io/jekyll-cloudinary/) by [Nicolas Hoizey](https://nicolas-hoizey.com/): a Jekyll plugin adding a Liquid tag to ease the use of Cloudinary for responsive images in your Markdown/Kramdown posts. From 0300a7017b8e69d86d267d1e252d561b34906e77 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 28 Feb 2017 21:21:27 -0500 Subject: [PATCH 1979/4996] Update history to reflect merge of #5916 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c923f1bf981..6b2b3561e4c 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ * Fixed tutorial for publishing gem to include repo. (#5900) * update broken links (#5905) * Fix typo in contribution information (#5910) + * update plugin repo URL to reflect repo move (#5916) ### Development Fixes From 8a0c0727eab4c39ad7ee160100ac939adb152649 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 1 Mar 2017 21:38:55 -0500 Subject: [PATCH 1980/4996] Failing test: abbreviated post dates are no longer read. This is a regression introduced by https://github.com/jekyll/jekyll/pull/5609. --- test/source/_posts/2017-2-5-i-dont-like-zeroes.md | 5 +++++ test/test_generated_site.rb | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 test/source/_posts/2017-2-5-i-dont-like-zeroes.md diff --git a/test/source/_posts/2017-2-5-i-dont-like-zeroes.md b/test/source/_posts/2017-2-5-i-dont-like-zeroes.md new file mode 100644 index 00000000000..201b96dc745 --- /dev/null +++ b/test/source/_posts/2017-2-5-i-dont-like-zeroes.md @@ -0,0 +1,5 @@ +--- +foo: barj +--- +I have an abbreviated date. Instead of "2017-02-05", I am instead "2017-2-5". +Zeros have always seemed superfluous. diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 3a520b24cc3..debb4ceb8c0 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -11,7 +11,7 @@ class TestGeneratedSite < JekyllUnitTest end should "ensure post count is as expected" do - assert_equal 51, @site.posts.size + assert_equal 52, @site.posts.size end should "insert site.posts into the index" do @@ -48,6 +48,11 @@ class TestGeneratedSite < JekyllUnitTest assert_exist dest_dir("dynamic_file.php") end + should "include a post with a abbreviated dates" do + refute_nil -1, @site.posts.index { |post| post.relative_path == "_posts/2017-2-5-i-dont-like-zeroes.md" } + assert_exist dest_dir("2017", "02", "05", "i-dont-like-zeroes.html") + end + should "print a nice list of static files" do time_regexp = "\\d+:\\d+" # From 4085e29f80fbb760cd2050a9a8cc93bc18dbb6ee Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 1 Mar 2017 21:39:23 -0500 Subject: [PATCH 1981/4996] Document::DATE_FILENAME_MATCHER: allow abbreviated dates in post filenames --- lib/jekyll/document.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index fecd58285c3..386683d6d5a 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -9,7 +9,7 @@ class Document YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m DATELESS_FILENAME_MATCHER = %r!^(?:.+/)*(.*)(\.[^.]+)$! - DATE_FILENAME_MATCHER = %r!^(?:.+/)*(\d{4}-\d{2}-\d{2})-(.*)(\.[^.]+)$! + DATE_FILENAME_MATCHER = %r!^(?:.+/)*(\d{2,4}-\d{1,2}-\d{1,2})-(.*)(\.[^.]+)$! # Create a new Document. # From ca87c99a3c6bc4324741c8cba31dfe2981881281 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 1 Mar 2017 22:08:21 -0500 Subject: [PATCH 1982/4996] Fix fmt issues in test for 'include a post with a abbreviated dates' --- test/test_generated_site.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index debb4ceb8c0..e7cc52cb5f0 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -49,7 +49,9 @@ class TestGeneratedSite < JekyllUnitTest end should "include a post with a abbreviated dates" do - refute_nil -1, @site.posts.index { |post| post.relative_path == "_posts/2017-2-5-i-dont-like-zeroes.md" } + refute_nil @site.posts.index { |post| + post.relative_path == "_posts/2017-2-5-i-dont-like-zeroes.md" + } assert_exist dest_dir("2017", "02", "05", "i-dont-like-zeroes.html") end From 3e4dbc83e3efb25edf47ffcfe798611c34a7a267 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 1 Mar 2017 22:36:25 -0500 Subject: [PATCH 1983/4996] Attempt to alleviate strange Windows encoding error. Error: TestGeneratedSite#test_: generated sites should render latest post's content. : Encoding::CompatibilityError: incompatible character encodings: IBM437 and UTF-8 C:/projects/jekyll/test/test_generated_site.rb:22:in `include?' C:/projects/jekyll/test/test_generated_site.rb:22:in `block (2 levels) in ' C:/projects/jekyll/test/test_generated_site.rb:34:in `instance_exec' C:/projects/jekyll/test/test_generated_site.rb:34:in `block in create_test_from_should_hash' --- test/source/_posts/2017-2-5-i-dont-like-zeroes.md | 2 +- test/test_generated_site.rb | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/test/source/_posts/2017-2-5-i-dont-like-zeroes.md b/test/source/_posts/2017-2-5-i-dont-like-zeroes.md index 201b96dc745..95e11f12c00 100644 --- a/test/source/_posts/2017-2-5-i-dont-like-zeroes.md +++ b/test/source/_posts/2017-2-5-i-dont-like-zeroes.md @@ -1,5 +1,5 @@ --- -foo: barj +foo: bar --- I have an abbreviated date. Instead of "2017-02-05", I am instead "2017-2-5". Zeros have always seemed superfluous. diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index e7cc52cb5f0..41e7c3a1f5d 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -7,7 +7,10 @@ class TestGeneratedSite < JekyllUnitTest @site = fixture_site @site.process - @index = File.read(dest_dir("index.html")) + @index = File.read( + dest_dir("index.html"), + Utils.merged_file_read_opts(@site, {}) + ) end should "ensure post count is as expected" do From 56dfe18c5dd2ac769670480600e5e1c63ecdac8d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 2 Mar 2017 12:32:15 -0500 Subject: [PATCH 1984/4996] Update history to reflect merge of #5920 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6b2b3561e4c..f3a55f689ef 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Exclude Gemfile by default (#5860) * Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty (#5878) + * Allow abbreviated post dates (#5920) ## 3.4.0 / 2017-01-27 From 47f54dbecaf15fe485c9dc345505f3f3cb1348ea Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Mar 2017 12:39:02 -0500 Subject: [PATCH 1985/4996] Add script/backport-pr --- script/backport-pr | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 script/backport-pr diff --git a/script/backport-pr b/script/backport-pr new file mode 100755 index 00000000000..fa0df835ea1 --- /dev/null +++ b/script/backport-pr @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# This script is pulled from https://github.com/git-lfs/git-lfs/blob/master/script/backport-pr +# Many thanks, git-lfs team! +# +# Backports a PR into a release branch: +# +# # backport PR #123 into 1.1-stable-backport-1023 +# $ git checkout master +# $ git pull +# $ script/backport-pr 1.1 1023 + +usage() { + echo "usage: $0 " + echo "example: $0 3.4 5623" +} + +if test -z "$1"; then + echo "fatal: no minor release version, e.g. '3.4'" > /dev/stderr + usage + exit 1 +fi + +if test -z "$2"; then + echo "fatal: no pull request number, e.g. '5623'" > /dev/stderr + usage + exit 1 +fi + +relversion="v$1.x" +relbranch="$1-stable" +pr="$2" +prbranch="$relbranch-backport-$pr" +pullsurl="https://api.github.com/repos/jekyll/jekyll/pulls" +prurl="https://api.github.com/repos/jekyll/jekyll/pulls/$pr" +prjson="$(curl -n $pullsurl/$pr 2>/dev/null)" +headref="$(echo $prjson | jq -r -e ".head.ref")" +[ "$?" -ne 0 ] && { + echo "PR #$pr is invalid." + exit 1 +} +prtitle="$(echo $prjson | jq -r ".title" | sed "s/\"/'/g")" + +git checkout -q -f $relbranch +git clean -q -fdx +git pull -q +git checkout -q -f -B $prbranch + +commit=`git log -1 --pretty=%H "--grep=Merge pull request #$pr" "--grep=Merge branch '.*$headref'" master` + +echo "Backporting:\n" + +git log -1 $commit + +conflicts="" + +git cherry-pick -x --allow-empty -m1 $commit &> /dev/null || { + unmerged=$(git ls-files --unmerged --stage | cut -f 2 -d$'\t' | uniq) + conflicts="\n\nConflicting files:" + for file in $unmerged; do + git add "$file" + conflicts="$conflicts\n- $file" + done + git commit -q --no-edit +} + +commitmsg="Backport $headref from #$pr to $relbranch" +if [ "$conflicts" ]; then + commitmsg="$commitmsg [merge conflicts]" +fi + +git commit -q --allow-empty --amend -m "$commitmsg" +git push -q -f origin $prbranch +git checkout -q -f $relbranch +git branch -q -D $prbranch + +curl -in $pullsurl -d "{ + \"title\": \"Backport #$pr for $relversion: $prtitle\", + \"head\": \"$prbranch\", + \"base\": \"$relbranch\", + \"body\": \"This backports #$pr.$conflicts\" +}" 2>/dev/null From e2cfd7cb4c25b9f6e5f815a41d962c11d8919c98 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Mar 2017 12:47:43 -0500 Subject: [PATCH 1986/4996] rake/release: allow releases from *-stable branches. --- rake/release.rake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rake/release.rake b/rake/release.rake index 832b5bb33de..e9b638457ab 100644 --- a/rake/release.rake +++ b/rake/release.rake @@ -6,7 +6,8 @@ desc "Release #{name} v#{version}" task :release => :build do - unless `git branch` =~ %r!^\* master$! + current_branch = `git branch`.to_s.strip.match(%r!^\* (.+)$!)[1] + unless current_branch == "master" || current_branch.end_with?("-stable") puts "You must be on the master branch to release!" exit! end From ac727f22a35af4665bf6ee1d0e413c22471c458b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Mar 2017 12:49:54 -0500 Subject: [PATCH 1987/4996] travis: build *-stable branches. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 3a6ef68bb67..e88878de0e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,7 @@ branches: only: - master - themes + - /*-stable$/ notifications: slack: From 1fbca40f0b4c1dc94a9deeeb57cff6505dd243da Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Mar 2017 12:50:36 -0500 Subject: [PATCH 1988/4996] appveyor: build *-stable branches. --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 2fe407f4cd6..224770f8373 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,6 +6,7 @@ branches: only: - master - themes + - /*-stable$/ build: off From fa9a80b15f9e206c19b1626ea52c8ee6ccc9b760 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Mar 2017 12:56:20 -0500 Subject: [PATCH 1989/4996] You never really know what 'regexp support' means until you break it. --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e88878de0e5..36f2d6ff160 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ branches: only: - master - themes - - /*-stable$/ + - /*-stable/ notifications: slack: diff --git a/appveyor.yml b/appveyor.yml index 224770f8373..d03507d166f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,7 +6,7 @@ branches: only: - master - themes - - /*-stable$/ + - /*-stable/ build: off From 97375b38c7a08eaf9c0469ae3a07dc0d78c5f66c Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Mar 2017 12:59:34 -0500 Subject: [PATCH 1990/4996] Appveyor couldn't possibly support what it says it does in the docs. https://ci.appveyor.com/project/jekyll/jekyll/build/1.0.1402 --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index d03507d166f..2fe407f4cd6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,7 +6,6 @@ branches: only: - master - themes - - /*-stable/ build: off From 29ced3764152767fe259b7dc2ae0dfbcb534ee2a Mon Sep 17 00:00:00 2001 From: Pedro Lamas Date: Thu, 2 Mar 2017 21:54:51 +0000 Subject: [PATCH 1991/4996] Navigation has been moved out from docs Change introduced in a05e64c9d360e8357dc9c23a76656d231f0665dd has broken the bottom navigation as the page no longer exists, so I removed it from docs.yml --- docs/_data/docs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/_data/docs.yml b/docs/_data/docs.yml index 8b1d9c4813c..bb9d3b14c74 100644 --- a/docs/_data/docs.yml +++ b/docs/_data/docs.yml @@ -26,7 +26,6 @@ - includes - permalinks - pagination - - navigation - plugins - themes - extras From 9b91b248ab9ec1efac57c64db48cb357293ec344 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 2 Mar 2017 12:48:31 -0500 Subject: [PATCH 1992/4996] Release :gem: 3.4.1 --- History.markdown | 4 ++++ docs/_docs/history.md | 6 ++++++ docs/latest_version.txt | 2 +- lib/jekyll/version.rb | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/History.markdown b/History.markdown index f3a55f689ef..66a2236d2fb 100644 --- a/History.markdown +++ b/History.markdown @@ -37,6 +37,10 @@ * Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty (#5878) * Allow abbreviated post dates (#5920) +## 3.4.1 / 2017-03-02 + + * Backport #5920 for v3.4.x: Allow abbreviated post dates (#5924) + ## 3.4.0 / 2017-01-27 ### Minor Enhancements diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 7d96660a389..acc7e1cfeda 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,6 +4,12 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.4.1 / 2017-03-02 +{: #v3-4-1} + +- Backport [#5920]({{ site.repository }}/issues/5920) for v3.4.x: Allow abbreviated post dates ([#5924]({{ site.repository }}/issues/5924)) + + ## 3.4.0 / 2017-01-27 {: #v3-4-0} diff --git a/docs/latest_version.txt b/docs/latest_version.txt index 18091983f59..47b322c971c 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.4.0 +3.4.1 diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 4babc2082bc..20060c51c7c 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.4.0".freeze + VERSION = "3.4.1".freeze end From 7b9e64af854e4e891a07979f8e613e8c604ebef0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 3 Mar 2017 12:09:15 -0500 Subject: [PATCH 1993/4996] Release post for v3.4.1 --- .../2017-03-02-jekyll-3-4-1-released.markdown | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 docs/_posts/2017-03-02-jekyll-3-4-1-released.markdown diff --git a/docs/_posts/2017-03-02-jekyll-3-4-1-released.markdown b/docs/_posts/2017-03-02-jekyll-3-4-1-released.markdown new file mode 100644 index 00000000000..c90e7cfb1b9 --- /dev/null +++ b/docs/_posts/2017-03-02-jekyll-3-4-1-released.markdown @@ -0,0 +1,106 @@ +--- +title: 'Jekyll 3.4.1, or "Unintended Consequences"' +date: 2017-03-02 14:20:26 -0500 +author: parkr +version: 3.4.1 +categories: [release] +--- + +Conformity is a confounding thing. + +We write tests to ensure that a piece of functionality that works today +will work tomorrow, as further modifications are made to the codebase. This +is a principle of modern software development: every change must have a +test to guard against regressions to the functionality implemented by that +change. + +And yet, occasionally, our very best efforts to test functionality will be +thwarted. This is because of how our code produces unintended +functionality, which naturally goes untested. + +In our documentation, we tell users to name their posts with the following +format: + +```text +YYYY-MM-DD-title.extension +``` + +That format specifies exactly four numbers for the year, e.g. 2017, two +letters for the month, e.g. 03, and two letters for the day, e.g. 02. To +match this, we had the following regular expression: + +```ruby +%r!^(?:.+/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$! +``` + +You might already see the punchline. While our documentation specifies the +exact number of numbers that is required for each section of the date, our +regular expression does not enforce this precision. What happens if a user +doesn't conform to our documentation? + +We recently [received a bug report](https://github.com/jekyll/jekyll/issues/5603) +that detailed how the following file was considered a post: + +```text +84093135-42842323-42000001-b890-136270f7e5f1.md +``` + +Of course! It matches the above regular expression, but doesn't satisfy +other requirements about those numbers being a valid date (unless you're +living in a world that has 43 million months, and 42 million (and one) +days). So, we [modified the regular expression to match our +documentation](https://github.com/jekyll/jekyll/pull/5609): + +```ruby +%r!^(?:.+/)*(\d{4}-\d{2}-\d{2})-(.*)(\.[^.]+)$! +``` + +Our tests all passed and we were properly excluding this crazy date with 43 +million months and days. This change shipped in Jekyll v3.4.0 and all was +well. + +Well, not so much. + +A very common way to specify the month of February is `2`. This is true for +all single-digit months and days of the month. Notice anything about our +first regular expression versus our second? The second regular expression +imposes a **minimum**, as well as maximum, number of digits. This change +made Jekyll ignore dates with single-digit days and months. + +The first eight years of Jekyll's existence had allowed single-digit days +and months due to an imprecise regular expression. For some people, their +entire blog was missing, and there were no errors that told them why. + +After receiving a few bug reports, it became clear what had happened. +Unintended functionality of the last eight years had been broken. Thus, +v3.4.0 was broken for a non-negligible number of sites. With a test site +in-hand from @andrewbanchich, I tracked it down to this regular expression +and [reintroduced](https://github.com/jekyll/jekyll/pull/5920) a proper +minimum number of digits for each segment: + +```ruby +%r!^(?:.+/)*(\d{2,4}-\d{1,2}-\d{1,2})-(.*)(\.[^.]+)$! +``` + +And, I wrote a test. + +This change was quickly backported to v3.4.0 and here we are: releasing +v3.4.1. It will fix the problem for all users who were using single-digit +months and days. + +With this, I encourage all of you to look at your code for *unintended* +functionality and make a judgement call: if it's allowed, *should it be*? +If it should be allowed, make it *intended* functionality and test it! I +know I'll be looking at my code with much greater scrutiny going forward, +looking for unintended consequences. + +Many thanks to our Jekyll affinity team captains who helped out, including +@pathawks, @pnn, and @DirtyF. Thanks, too, to @ashmaroli for reviewing my +change with an eye for consistency and precision. This was certainly a team +effort. + +We hope Jekyll v3.4.1 brings your variable-digit dates back to their +previous glory. We certainly won't let that unintended functionality be +unintended any longer. + +As always, Happy Jekylling! From ea91864af89662d33e14040c9f8cdd573481977d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 3 Mar 2017 15:38:25 -0500 Subject: [PATCH 1994/4996] Update history to reflect merge of #5927 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 66a2236d2fb..15636bb04db 100644 --- a/History.markdown +++ b/History.markdown @@ -30,6 +30,7 @@ * Add the correct year to the 3.4.0 release date (#5858) * Add documentation about order of interpretation (#5834) * Documentation on how to build navigation (#5698) + * Navigation has been moved out from docs (#5927) ### Bug Fixes From 635e3365cc56421e7a9cfcb3369094ec7e7c8c58 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 4 Mar 2017 23:29:04 +0530 Subject: [PATCH 1995/4996] appease classifier-reborn --- test/source/_posts/2010-01-16-override-data.markdown | 2 ++ test/source/_posts/2011-04-12-text-extension.text | 1 + test/source/_posts/2013-08-01-mkdn-extension.mkdn | 1 + test/source/_posts/2014-11-24-Rmd-extension.Rmd | 1 + test/source/_posts/2015-12-27-extra-spaces.markdown | 2 ++ 5 files changed, 7 insertions(+) diff --git a/test/source/_posts/2010-01-16-override-data.markdown b/test/source/_posts/2010-01-16-override-data.markdown index 5b1a95c4bda..e5106488d32 100644 --- a/test/source/_posts/2010-01-16-override-data.markdown +++ b/test/source/_posts/2010-01-16-override-data.markdown @@ -2,3 +2,5 @@ date: 2010-01-10 13:07:09 tags: A string --- + +Best **post** ever diff --git a/test/source/_posts/2011-04-12-text-extension.text b/test/source/_posts/2011-04-12-text-extension.text index e69de29bb2d..6b4ef010ad1 100644 --- a/test/source/_posts/2011-04-12-text-extension.text +++ b/test/source/_posts/2011-04-12-text-extension.text @@ -0,0 +1 @@ +Best **post** ever diff --git a/test/source/_posts/2013-08-01-mkdn-extension.mkdn b/test/source/_posts/2013-08-01-mkdn-extension.mkdn index e69de29bb2d..6b4ef010ad1 100644 --- a/test/source/_posts/2013-08-01-mkdn-extension.mkdn +++ b/test/source/_posts/2013-08-01-mkdn-extension.mkdn @@ -0,0 +1 @@ +Best **post** ever diff --git a/test/source/_posts/2014-11-24-Rmd-extension.Rmd b/test/source/_posts/2014-11-24-Rmd-extension.Rmd index e69de29bb2d..6b4ef010ad1 100644 --- a/test/source/_posts/2014-11-24-Rmd-extension.Rmd +++ b/test/source/_posts/2014-11-24-Rmd-extension.Rmd @@ -0,0 +1 @@ +Best **post** ever diff --git a/test/source/_posts/2015-12-27-extra-spaces.markdown b/test/source/_posts/2015-12-27-extra-spaces.markdown index 595a9cd9afe..d8f785b06f5 100644 --- a/test/source/_posts/2015-12-27-extra-spaces.markdown +++ b/test/source/_posts/2015-12-27-extra-spaces.markdown @@ -1,3 +1,5 @@ --- extra: spaces --- + +Best **post** ever From 3e2875f39c1cfb9162a01f4883739d8a95423451 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 6 Mar 2017 20:58:05 -0500 Subject: [PATCH 1996/4996] Update history to reflect merge of #5820 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 15636bb04db..03c163d5fbc 100644 --- a/History.markdown +++ b/History.markdown @@ -31,6 +31,7 @@ * Add documentation about order of interpretation (#5834) * Documentation on how to build navigation (#5698) * Navigation has been moved out from docs (#5927) + * Make links in sidebar for current page more prominent (#5820) ### Bug Fixes From 085b5f56f302a22a90426b9f7ab69a07b69b62d0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 6 Mar 2017 20:58:53 -0500 Subject: [PATCH 1997/4996] Update history to reflect merge of #5934 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 03c163d5fbc..42ad3bc4f80 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ ### Development Fixes * [Rubocop] add missing comma (#5835) + * Appease classifier-reborn (#5934) ### Site Enhancements From bfb6341339dc62c228a1cccf6d080766c24f7624 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 6 Mar 2017 20:59:58 -0500 Subject: [PATCH 1998/4996] Update history to reflect merge of #5926 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 42ad3bc4f80..1c12057d461 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * [Rubocop] add missing comma (#5835) * Appease classifier-reborn (#5934) + * Allow releases & development on *-stable branches (#5926) ### Site Enhancements From 67a7c22defd8e342a8c900dd858335e259a35970 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 6 Mar 2017 21:00:25 -0500 Subject: [PATCH 1999/4996] Fix typo in backport-pr --- script/backport-pr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/backport-pr b/script/backport-pr index fa0df835ea1..5ef6c4dec7a 100755 --- a/script/backport-pr +++ b/script/backport-pr @@ -4,7 +4,7 @@ # # Backports a PR into a release branch: # -# # backport PR #123 into 1.1-stable-backport-1023 +# # backport PR #1023 into 1.1-stable-backport-1023 # $ git checkout master # $ git pull # $ script/backport-pr 1.1 1023 From 31a0aef59487893ad78bf50b203545682fec331a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 6 Mar 2017 21:00:53 -0500 Subject: [PATCH 2000/4996] Update history to reflect merge of #5925 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1c12057d461..37da6256627 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * [Rubocop] add missing comma (#5835) * Appease classifier-reborn (#5934) * Allow releases & development on *-stable branches (#5926) + * Add script/backport-pr (#5925) ### Site Enhancements From ea4a2fd57b3f0cc48823710b47cacef269b5104c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 6 Mar 2017 21:05:06 -0500 Subject: [PATCH 2001/4996] Update history to reflect merge of #5903 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 37da6256627..c7ef4aa88ee 100644 --- a/History.markdown +++ b/History.markdown @@ -41,6 +41,7 @@ * Exclude Gemfile by default (#5860) * Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty (#5878) * Allow abbreviated post dates (#5920) + * Remove dependency on include from default about.md (#5903) ## 3.4.1 / 2017-03-02 From d7822aba33457b538a7d80a06303c15bd1d99ebf Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 9 Mar 2017 15:36:56 -0500 Subject: [PATCH 2002/4996] Release :gem: 3.4.2 --- rake/release.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rake/release.rake b/rake/release.rake index e9b638457ab..9d9220a49a7 100644 --- a/rake/release.rake +++ b/rake/release.rake @@ -13,7 +13,7 @@ task :release => :build do end sh "git commit --allow-empty -m 'Release :gem: #{version}'" sh "git tag v#{version}" - sh "git push origin master" + sh "git push origin #{current_branch}" sh "git push origin v#{version}" sh "gem push pkg/#{name}-#{version}.gem" end From 511481e626db0beba1b0b847d2ab109f8e5edbf8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 9 Mar 2017 15:36:10 -0500 Subject: [PATCH 2003/4996] Release :gem: 3.4.2 --- History.markdown | 5 +++++ docs/_docs/history.md | 7 +++++++ docs/latest_version.txt | 2 +- lib/jekyll/version.rb | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/History.markdown b/History.markdown index c7ef4aa88ee..a4c99c20258 100644 --- a/History.markdown +++ b/History.markdown @@ -43,6 +43,11 @@ * Allow abbreviated post dates (#5920) * Remove dependency on include from default about.md (#5903) +## 3.4.2 / 2017-03-09 + + * Backport #5871 for v3.4.x: Convert StaticFile liquid representation to + a Drop & add front matter defaults support to StaticFiles (#5940) + ## 3.4.1 / 2017-03-02 * Backport #5920 for v3.4.x: Allow abbreviated post dates (#5924) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index acc7e1cfeda..3c821edad51 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,6 +4,13 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.4.2 / 2017-03-09 +{: #v3-4-2} + +- Backport [#5871]({{ site.repository }}/issues/5871) for v3.4.x: Convert StaticFile liquid representation to + a Drop & add front matter defaults support to StaticFiles ([#5940]({{ site.repository }}/issues/5940)) + + ## 3.4.1 / 2017-03-02 {: #v3-4-1} diff --git a/docs/latest_version.txt b/docs/latest_version.txt index 47b322c971c..4d9d11cf505 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.4.1 +3.4.2 diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 20060c51c7c..fc43a4c354a 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.4.1".freeze + VERSION = "3.4.2".freeze end From b3725e202eb7c5ff838da434384f166f34c62338 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 9 Mar 2017 15:41:33 -0500 Subject: [PATCH 2004/4996] Fix typo in CONTRIBUTING doc. --- .github/CONTRIBUTING.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.markdown b/.github/CONTRIBUTING.markdown index 6a239fc7452..14442f6dc55 100644 --- a/.github/CONTRIBUTING.markdown +++ b/.github/CONTRIBUTING.markdown @@ -28,7 +28,7 @@ Whether you're a developer, a designer, or just a Jekyll devotee, there are lots * The more information, the better. Make judicious use of the pull request body. Describe what changes were made, why you made them, and what impact they will have for users. -* Pull request are easy and fun. If this is your first pull request, it may help to [understand GitHub Flow](https://guides.github.com/introduction/flow/). +* Pull requests are easy and fun. If this is your first pull request, it may help to [understand GitHub Flow](https://guides.github.com/introduction/flow/). * If you're submitting a code contribution, be sure to read the [code contributions](#code-contributions) section below. From 266d1255505d15c28f78eeccabe1a990ef915c74 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 9 Mar 2017 16:06:16 -0500 Subject: [PATCH 2005/4996] Add v3.4.2 release post --- .../2017-03-09-jekyll-3-4-2-released.markdown | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 docs/_posts/2017-03-09-jekyll-3-4-2-released.markdown diff --git a/docs/_posts/2017-03-09-jekyll-3-4-2-released.markdown b/docs/_posts/2017-03-09-jekyll-3-4-2-released.markdown new file mode 100644 index 00000000000..6493d933bf5 --- /dev/null +++ b/docs/_posts/2017-03-09-jekyll-3-4-2-released.markdown @@ -0,0 +1,51 @@ +--- +title: 'Jekyll 3.4.2 Released' +date: 2017-03-09 15:41:57 -0500 +author: parkr +version: 3.4.2 +categories: [release] +--- + +Another one-PR patch update, though without the same [lessons as for the +previous release]({% link _posts/2017-03-02-jekyll-3-4-1-released.markdown %}). + +This release includes a fairly critical change for a number of plugins: +**static files now respect front matter defaults**. + +You might be asking yourself: "why would static files, files that are +static files explicitly because they *don't* have YAML front matter, want +to respect YAML front matter?" That's a great question. Let me illustrate +with an example. + +Let's look at `jekyll-sitemap`. This plugin generates a list of documents, +pages, and static files, and some metadata for them in an XML file for a +Google/Yahoo/Bing/DuckDuckGo crawler to consume. If you don't want a given +file in this list, you set `sitemap: false` in the YAML front matter. But +what about static files, which don't have YAML front matter? Before this +release, they could not be excluded because they had no properties in YAML +other than [the ones we explicitly assigned](https://github.com/jekyll/jekyll/blob/v3.4.1/lib/jekyll/static_file.rb#L98-L106). +So if you had a PDF you didn't want to be in your sitemap, you couldn't use +`jekyll-sitemap`. + +With this release, you can now set [front matter +defaults](/docs/configuration/#front-matter-defaults) for static files: + +```yaml +defaults: + - + scope: + path: "pdfs/" + values: + sitemap: false +``` + +Now, for every file in the Liquid `site.static_files` loop which is in the +folder `pdfs/`, you'll see `sitemap` equal to `false`. + +Many thanks to @benbalter for coming up with the solution and ensuring +sitemaps everywhere are filled with just the right content. + +As always, if you notice any bugs, please search the issues and file one if +you can't find another related to your issue. + +Happy Jekylling! From 754cd2f1b24372acbcfc0c32355dd90ba43b27a7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 9 Mar 2017 16:12:32 -0500 Subject: [PATCH 2006/4996] Don't be so "doomsdayesque" --- docs/_posts/2017-03-09-jekyll-3-4-2-released.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2017-03-09-jekyll-3-4-2-released.markdown b/docs/_posts/2017-03-09-jekyll-3-4-2-released.markdown index 6493d933bf5..40d591e5e7e 100644 --- a/docs/_posts/2017-03-09-jekyll-3-4-2-released.markdown +++ b/docs/_posts/2017-03-09-jekyll-3-4-2-released.markdown @@ -9,7 +9,7 @@ categories: [release] Another one-PR patch update, though without the same [lessons as for the previous release]({% link _posts/2017-03-02-jekyll-3-4-1-released.markdown %}). -This release includes a fairly critical change for a number of plugins: +This release includes a beneficial change for a number of plugins: **static files now respect front matter defaults**. You might be asking yourself: "why would static files, files that are From 06223e510e270365cba2d015d75dd9541f10f58f Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 11 Mar 2017 17:23:18 +0530 Subject: [PATCH 2007/4996] add a tutorial on serving custom Error 404 page --- docs/_tutorials/custom-404-page.md | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 docs/_tutorials/custom-404-page.md diff --git a/docs/_tutorials/custom-404-page.md b/docs/_tutorials/custom-404-page.md new file mode 100644 index 00000000000..40bb3262752 --- /dev/null +++ b/docs/_tutorials/custom-404-page.md @@ -0,0 +1,66 @@ +--- +layout: tutorials +permalink: /tutorials/custom-404-page/ +title: Custom 404 Page +--- + +You can easily serve custom 404 error pages with Jekyll to replace the default **Error 404 -- File Not Found** page displayed when one tries to access a broken link on your site. + + +## On GitHub Pages + +Any `404.html` at the **root of your `_site` directory** will be served automatically by GitHub Pages and the local WEBrick development server. + +Simply add a `404.md` or `404.html` at the root of your site's source directory and include the YAML Front Matter data to use the theme's base layout. + +If you plan to organize your files under subdirectories, the error page should have the following Front Matter Data, set: `permalink: /404.html`. This is to ensure that the compiled `404.html` resides at the root of your processed site, where it'll be picked by the server. + +``` +--- +# example 404.md + +layout: default +permalink: /404.html +--- + +# 404 + +Page not found! :( +``` + +## Hosting on Apache Web Servers + +Apache Web Servers load a configuration file named [`.htaccess`](http://www.htaccess-guide.com/) that modifies the functionality of these servers. + +Simply add the following to your `.htaccess` file. + +``` +ErrorDocument 404 /404.html +``` + +With an `.htaccess` file, you have the freedom to place your error page within a subdirectory. + +``` +ErrorDocument 404 /error_pages/404.html +``` + +Where the path is relative to your site's domain. + +More info on configuring Apache Error Pages can found in [official documentation](https://httpd.apache.org/docs/current/mod/core.html#errordocument). + + +## Hosting on Nginx server + +The procedure is just as simple as configuring Apache servers, but slightly different. + +Add the following to the ngnix configuration file, `nginx.conf`, which is usually located inside `/etc/nginx/` or `/etc/nginx/conf/`: + +``` +server { + error_page 404 /404.html; + location /404.html { + internal; + } +} +``` +The `location` directive prevents users from directly browsing the 404.html page. From 6a7c49c5b89b5ecab63e77e930f305b7d41e7aee Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 11 Mar 2017 17:42:03 +0530 Subject: [PATCH 2008/4996] update exclude array in configuration.md --- docs/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 79de5a98ffc..50750869674 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -603,7 +603,7 @@ collections: # Handling Reading safe: false include: [".htaccess"] -exclude: ["node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"] +exclude: ["Gemfile", "Gemfile.lock", node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"] keep_files: [".git", ".svn"] encoding: "utf-8" markdown_ext: "markdown,mkdown,mkdn,mkd,md" From b87a4358ee97b94f45bb51298d6016035f68839a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 12 Mar 2017 06:02:06 -0400 Subject: [PATCH 2009/4996] Update history to reflect merge of #5947 [ci skip] --- History.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/History.markdown b/History.markdown index a4c99c20258..cb6f447dc9b 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * update broken links (#5905) * Fix typo in contribution information (#5910) * update plugin repo URL to reflect repo move (#5916) + * Update exclude array in configuration.md (#5947) ### Development Fixes @@ -45,8 +46,7 @@ ## 3.4.2 / 2017-03-09 - * Backport #5871 for v3.4.x: Convert StaticFile liquid representation to - a Drop & add front matter defaults support to StaticFiles (#5940) + * Backport #5871 for v3.4.x: Convert StaticFile liquid representation to a Drop & add front matter defaults support to StaticFiles (#5940) ## 3.4.1 / 2017-03-02 From 4df6753109ed255895ffe3ca0e46f797f6ae6fb3 Mon Sep 17 00:00:00 2001 From: Lukasz Brodowski Date: Sun, 12 Mar 2017 14:22:16 -0700 Subject: [PATCH 2010/4996] Removed navigation paragraph Removed the paragraph telling a user to visit the navigations page to learn how to build more robust navigation. The permalink was broken since Navigation no longer exists and no other suitable substitute (closest being ./permalinks) fits the description. --- docs/_docs/datafiles.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index a389a65887d..c0e109976c0 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -152,5 +152,3 @@ author: dave {% endraw %} ``` - -For information on how to build robust navigation for your site (especially if you have a documentation website or another type of Jekyll site with a lot of pages to organize), see [Navigation](../navigation). From cf65d2cd8ed256d962f9c145ca53416c58d916b7 Mon Sep 17 00:00:00 2001 From: Lukasz Brodowski Date: Sun, 12 Mar 2017 14:55:47 -0700 Subject: [PATCH 2011/4996] Corrected permalink Fixed the permalink to navigation page since it was moved to under tutorials. --- docs/_docs/datafiles.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index c0e109976c0..671a32060b9 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -152,3 +152,5 @@ author: dave {% endraw %} ``` + +For information on how to build robust navigation for your site (especially if you have a documentation website or another type of Jekyll site with a lot of pages to organize), see [Navigation](/tutorials/navigation). From 99775e4b5168d63dbac4b7f677a1fe07fac08f0b Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Mon, 13 Mar 2017 09:55:27 -0700 Subject: [PATCH 2012/4996] Fixed path in "Improve this page" link in Tutorials section The path in the "Improve this page" link that is auto-generated in the Tutorials section had an incorrect parameter. This PR fixes it. --- docs/_layouts/tutorials.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_layouts/tutorials.html b/docs/_layouts/tutorials.html index e3f7794bdd5..3850971c336 100644 --- a/docs/_layouts/tutorials.html +++ b/docs/_layouts/tutorials.html @@ -10,7 +10,7 @@

    {{ page.title }}

    From 88ad56c9e0be3cd2332d30efd6a0f55477752285 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Mon, 13 Mar 2017 09:58:02 -0700 Subject: [PATCH 2013/4996] Add link to order of interpretation tutorial in Tutorials nav Added a link to the Order of interpretation tutorial into the Tutorials nav. This tutorial is published, just not linked. --- docs/_data/tutorials.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_data/tutorials.yml b/docs/_data/tutorials.yml index 73a0184a195..ad4f4e5c96b 100644 --- a/docs/_data/tutorials.yml +++ b/docs/_data/tutorials.yml @@ -2,7 +2,8 @@ tutorials: - home - navigation + - orderofinterpretation #- title: Another section # tutorials: -# - sample \ No newline at end of file +# - sample From 0f0ac6f586d26be761f1147c345442be8556111f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 14 Mar 2017 01:13:38 -0400 Subject: [PATCH 2014/4996] Update history to reflect merge of #5951 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cb6f447dc9b..053e1ee52d2 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * Fix typo in contribution information (#5910) * update plugin repo URL to reflect repo move (#5916) * Update exclude array in configuration.md (#5947) + * Fixed path in "Improve this page" link in Tutorials section (#5951) ### Development Fixes From ec5b45cd7c1a2df1520ada1df9b235101ea11ba2 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 16 Mar 2017 07:54:13 -0500 Subject: [PATCH 2015/4996] Allow colons in `uri_escape` filter Fixes #5954 --- lib/jekyll/filters.rb | 2 +- test/test_filters.rb | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 0393ea241d6..3020bfbcb6b 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -152,7 +152,7 @@ def cgi_escape(input) # # Returns the escaped String. def uri_escape(input) - Addressable::URI.encode(input) + Addressable::URI.normalize_component(input) end # Replace any whitespace in the input string with a single space diff --git a/test/test_filters.rb b/test/test_filters.rb index d18b57e3ef3..898f7e3ed90 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -317,6 +317,11 @@ def select; end assert_equal "my%20things", @filter.uri_escape("my things") end + should "escape colon" do + assert_equal "foo:bar", @filter.uri_escape("foo:bar") + assert_equal "foo%20bar:baz", @filter.uri_escape("foo bar:baz") + end + context "absolute_url filter" do should "produce an absolute URL from a page URL" do page_url = "/about/my_favorite_page/" From 6bc9f71050be590478d1d47b1050f4dddb5471f7 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 16 Mar 2017 07:59:13 -0500 Subject: [PATCH 2016/4996] Rename test for clarity --- test/test_filters.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index 898f7e3ed90..782b5be984f 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -317,7 +317,7 @@ def select; end assert_equal "my%20things", @filter.uri_escape("my things") end - should "escape colon" do + should "allow colons in URI" do assert_equal "foo:bar", @filter.uri_escape("foo:bar") assert_equal "foo%20bar:baz", @filter.uri_escape("foo bar:baz") end From 7b1841a78e8b88fdbec34e9732e24c8c81dfe25a Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 17 Mar 2017 16:19:19 +0530 Subject: [PATCH 2017/4996] Fix Appveyor with dst-aware cucumber steps --- features/site_configuration.feature | 10 +++++----- features/step_definitions.rb | 24 ++++++++++++++++++++++++ features/support/helpers.rb | 11 +++++++++++ 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/features/site_configuration.feature b/features/site_configuration.feature index 3aace7946ef..cc6f01fbadd 100644 --- a/features/site_configuration.feature +++ b/features/site_configuration.feature @@ -172,12 +172,12 @@ Feature: Site configuration | entry2 | 2013-04-10 03:14 -0400 | post | content for entry2. | When I run jekyll build Then I should get a zero exit status - And the _site directory should exist + And the _site directory should exist And I should see "Page Layout: 2" in "_site/index.html" - And I should see "Post Layout:

    content for entry1.

    \n built at 2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html" unless Windows - And I should see "Post Layout:

    content for entry1.

    \n built at 2013-04-09T22:22:00-05:00" in "_site/2013/04/09/entry1.html" if on Windows - And I should see "Post Layout:

    content for entry2.

    \n built at 2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html" unless Windows - And I should see "Post Layout:

    content for entry2.

    \n built at 2013-04-10T02:14:00-05:00" in "_site/2013/04/10/entry2.html" if on Windows + And I should see date "2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html" unless Windows + And I should see date "2013-04-09T22:22:00-05:00" in "_site/2013/04/09/entry1.html" if on Windows + And I should see date "2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html" unless Windows + And I should see date "2013-04-10T02:14:00-05:00" in "_site/2013/04/10/entry2.html" if on Windows Scenario: Generate proper dates with explicitly set timezone (different than posts' time) Given I have a _layouts directory diff --git a/features/step_definitions.rb b/features/step_definitions.rb index 5d318a02f1e..bcbfcb9a362 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -246,6 +246,30 @@ # +Then(%r!^I should see date "(.*)" in "(.*)" unless Windows$!) do |text, file| + step %(the "#{file}" file should exist) + regexp = Regexp.new(text) + if Jekyll::Utils::Platforms.really_windows? && !dst_active? + expect(file_contents(file)).not_to match regexp + else + expect(file_contents(file)).to match regexp + end +end + +# + +Then(%r!^I should see date "(.*)" in "(.*)" if on Windows$!) do |text, file| + step %(the "#{file}" file should exist) + regexp = Regexp.new(text) + if Jekyll::Utils::Platforms.really_windows? && !dst_active? + expect(file_contents(file)).to match regexp + else + expect(file_contents(file)).not_to match regexp + end +end + +# + Then(%r!^I should see exactly "(.*)" in "(.*)"$!) do |text, file| step %(the "#{file}" file should exist) expect(file_contents(file).strip).to eq text diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 06d768fe547..5081d3f1aae 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -163,3 +163,14 @@ def seconds_agnostic_time(time) hour, minutes, = time.split(":") "#{hour}:#{minutes}" end + +# Helper method for Windows +def dst_active? + config = Jekyll.configuration("quiet" => true) + ENV["TZ"] = config["timezone"] + dst = Time.now.isdst + + # reset variable to default state on Windows + ENV["TZ"] = nil + dst +end From 336b488d70038a9b54ec9cd5e57c7edc0549bf62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Ku=C5=9B?= Date: Fri, 17 Mar 2017 16:18:52 +0100 Subject: [PATCH 2018/4996] Create buddyworks Added description for configuring a Jekyll build using a free https://buddy.works project. --- docs/_docs/continuous-integration/buddyworks | 63 ++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 docs/_docs/continuous-integration/buddyworks diff --git a/docs/_docs/continuous-integration/buddyworks b/docs/_docs/continuous-integration/buddyworks new file mode 100644 index 00000000000..45daa1f2a50 --- /dev/null +++ b/docs/_docs/continuous-integration/buddyworks @@ -0,0 +1,63 @@ +--- +title: "BuddyWorks" +--- + +[BuddyWorks][0] is a [Docker][1]-based CI server that you can set up in 15-20 minutes to build, test, and deploy your Jekyll websites. It supports [GitHub][2], [Bitbucket][3], and [GitLab][4] repositories, can be installed on-premises or in cloud. The following guide will show you how to set up a free environment to build and test your Jekyll project. + +[0]: https://buddy.works +[1]: https://www.docker.com/ +[2]: https://github.com +[3]: https://https://bitbucket.org/ +[4]: https://gitlab.com + +## 1. Getting started + +1. Log in at with your GitHub/Bitbucket account or email +2. Choose your Git provider and select or push your Jekyll Project +3. Create a new pipeline and set the trigger mode to 'On every push' +4. Add the Jekyll action and save the pipeline + +## 2. How it works + +Whenever you make a push to the selected branch, the Jekyll action runs `jekyll build` in an isolated [Jekyll Docker image][0]. The output is generated to the `/filesystem` directory, and can be further deployed to FTP/SFTP and Cloud services. You can add your own commands, install additional packages, attach services, and run Selenium tests, as well as add other actions down the pipeline, eg. a Slack notification or an SSH script that will restart your server. + +![Jekyll Build](https://buddy.works/data/blog/_images/buddyworks-jekyll-small.png) + +[0]: https://hub.docker.com/r/jekyll/jekyll/ + +## 3. Using YAML for configuration + +If you prefer configuration as code over GUI, you can generate `buddy.yml` that will create a pipeline with the Jekyll action once pushed to the repository: + +```ruby +- pipeline: "Build and Deploy Jekyll site" + trigger_mode: "ON_EVERY_PUSH" + ref_name: "master" + actions: + - action: "Execute: jekyll build" + type: "BUILD" + docker_image_name: "jekyll/jekyll" + docker_image_tag: "latest" + execute_commands: + - "# Working directory with cloned repository: /srv/jekyll" + - "jekyll build" +``` + +## 4. Setting up on-premises server + +The self-hosted version of BuddyWorks can be installed on any type of server supporting Docker, including [Linux][1], [Mac][2], [AWS EC2][3], [DigitalOcean][4], and [Microsoft Azure][5]. + +[0]: https://buddy.works/buddy-go +[1]: https://buddy.works/knowledge/standalone/installation-linux +[2]: https://buddy.works/knowledge/standalone/installation-mac-osx +[3]: https://buddy.works/knowledge/standalone/installation-amazon-ec2 +[4]: https://buddy.works/knowledge/standalone/installation-digitalocean +[5]: https://buddy.works/knowledge/standalone/installation-azure + +## 5. Questions? + +This entire guide is open-source. Go ahead and [edit it][0] if you want to expand it or have a fix or [ask for help][1] if you run into trouble and need assistance. BuddyWorks also has an [online community][2] for help. + +[0]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/buddyworks.md +[1]: https://jekyllrb.com/help/ +[2]: http://forum.buddy.works/ From be7fc8a2c4e9fa77ab6e367d55060cf07b353ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Ku=C5=9B?= Date: Fri, 17 Mar 2017 16:46:31 +0100 Subject: [PATCH 2019/4996] added extension + fixed line 15 --- docs/_docs/continuous-integration/{buddyworks => buddyworks.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/_docs/continuous-integration/{buddyworks => buddyworks.md} (97%) diff --git a/docs/_docs/continuous-integration/buddyworks b/docs/_docs/continuous-integration/buddyworks.md similarity index 97% rename from docs/_docs/continuous-integration/buddyworks rename to docs/_docs/continuous-integration/buddyworks.md index 45daa1f2a50..5c845270f5a 100644 --- a/docs/_docs/continuous-integration/buddyworks +++ b/docs/_docs/continuous-integration/buddyworks.md @@ -12,7 +12,7 @@ title: "BuddyWorks" ## 1. Getting started -1. Log in at with your GitHub/Bitbucket account or email +1. Log in at https://buddy.works with your GitHub/Bitbucket account or email 2. Choose your Git provider and select or push your Jekyll Project 3. Create a new pipeline and set the trigger mode to 'On every push' 4. Add the Jekyll action and save the pipeline From 9e55247dac8f463d60b53885572405857ae2e97f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Ku=C5=9B?= Date: Mon, 20 Mar 2017 11:59:25 +0100 Subject: [PATCH 2020/4996] fix in line 42 --- docs/_docs/continuous-integration/buddyworks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/continuous-integration/buddyworks.md b/docs/_docs/continuous-integration/buddyworks.md index 5c845270f5a..7a3a7eee652 100644 --- a/docs/_docs/continuous-integration/buddyworks.md +++ b/docs/_docs/continuous-integration/buddyworks.md @@ -39,7 +39,7 @@ If you prefer configuration as code over GUI, you can generate `buddy.yml` that docker_image_name: "jekyll/jekyll" docker_image_tag: "latest" execute_commands: - - "# Working directory with cloned repository: /srv/jekyll" + - "chown jekyll:jekyll $WORKING_DIR" - "jekyll build" ``` From ddc9931c203f5cc84a8451ac684992bf3b82ce25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Ku=C5=9B?= Date: Mon, 20 Mar 2017 12:04:46 +0100 Subject: [PATCH 2021/4996] added (buddyworks) to ci list This can only be approved once https://github.com/jekyll/jekyll/pull/5962 has been merged. --- docs/_docs/continuous-integration/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/continuous-integration/index.md b/docs/_docs/continuous-integration/index.md index 14c5c7490a4..a9a12267502 100644 --- a/docs/_docs/continuous-integration/index.md +++ b/docs/_docs/continuous-integration/index.md @@ -7,3 +7,4 @@ Continuous Integration (CI) enables you to publish your Jekyll generated website * [Travis CI](travis-ci) * [CircleCI](circleci) +* [BuddyWorks](buddyworks) From f93453368a91ab0df79c5389b30ebfb2d5cbf2f2 Mon Sep 17 00:00:00 2001 From: William Entriken Date: Mon, 20 Mar 2017 10:56:34 -0400 Subject: [PATCH 2022/4996] Prefer .yaml over .toml --- lib/jekyll/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index b4bf7c5aba3..1e2ca01c7b1 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -137,7 +137,7 @@ def safe_load_file(filename) SafeYAML.load_file(filename) || {} else raise ArgumentError, "No parser for '#{filename}' is available. - Use a .toml or .y(a)ml file instead." + Use a .y(a)ml or .toml file instead." end end From 428ff04b7f8009dcf594d102a1c6d919bf8dc17c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 20 Mar 2017 15:21:27 -0400 Subject: [PATCH 2023/4996] Update history to reflect merge of #5966 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 053e1ee52d2..f28c18e2332 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,7 @@ * Appease classifier-reborn (#5934) * Allow releases & development on *-stable branches (#5926) * Add script/backport-pr (#5925) + * Prefer .yaml over .toml (#5966) ### Site Enhancements From 93f472d1eb8251762321cfcc3af5957fc61c7fd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Ku=C5=9B?= Date: Tue, 21 Mar 2017 09:34:43 +0100 Subject: [PATCH 2024/4996] Update buddyworks.md added unique links + minor text changes --- .../continuous-integration/buddyworks.md | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/docs/_docs/continuous-integration/buddyworks.md b/docs/_docs/continuous-integration/buddyworks.md index 7a3a7eee652..d33259dfe3b 100644 --- a/docs/_docs/continuous-integration/buddyworks.md +++ b/docs/_docs/continuous-integration/buddyworks.md @@ -2,12 +2,12 @@ title: "BuddyWorks" --- -[BuddyWorks][0] is a [Docker][1]-based CI server that you can set up in 15-20 minutes to build, test, and deploy your Jekyll websites. It supports [GitHub][2], [Bitbucket][3], and [GitLab][4] repositories, can be installed on-premises or in cloud. The following guide will show you how to set up a free environment to build and test your Jekyll project. +[BuddyWorks][0] is a [Docker][1]-based CI server that you can set up in 15-20 minutes to build, test, and deploy your Jekyll websites. It supports [GitHub][2], [Bitbucket][3], and [GitLab][4] repositories, and can be installed on-premises or used in cloud. The following guide will show you how to set up a free environment to build and test your Jekyll project. [0]: https://buddy.works [1]: https://www.docker.com/ [2]: https://github.com -[3]: https://https://bitbucket.org/ +[3]: https://bitbucket.org/ [4]: https://gitlab.com ## 1. Getting started @@ -15,19 +15,19 @@ title: "BuddyWorks" 1. Log in at https://buddy.works with your GitHub/Bitbucket account or email 2. Choose your Git provider and select or push your Jekyll Project 3. Create a new pipeline and set the trigger mode to 'On every push' -4. Add the Jekyll action and save the pipeline +4. Add and configure the Jekyll action and save the pipeline ## 2. How it works -Whenever you make a push to the selected branch, the Jekyll action runs `jekyll build` in an isolated [Jekyll Docker image][0]. The output is generated to the `/filesystem` directory, and can be further deployed to FTP/SFTP and Cloud services. You can add your own commands, install additional packages, attach services, and run Selenium tests, as well as add other actions down the pipeline, eg. a Slack notification or an SSH script that will restart your server. +Whenever you make a push to the selected branch, the Jekyll action runs `jekyll build` in an isolated [Jekyll Docker image][5]. The output is generated to the `/filesystem` directory, and can be further deployed to FTP/SFTP and IaaS services. You can add your own commands, install additional packages, attach services, and run Selenium tests, as well as add other actions down the pipeline, eg. a Slack notification or an SSH script that will restart your server. ![Jekyll Build](https://buddy.works/data/blog/_images/buddyworks-jekyll-small.png) -[0]: https://hub.docker.com/r/jekyll/jekyll/ +[5]: https://hub.docker.com/r/jekyll/jekyll/ ## 3. Using YAML for configuration -If you prefer configuration as code over GUI, you can generate `buddy.yml` that will create a pipeline with the Jekyll action once pushed to the repository: +If you prefer configuration as code over GUI, you can generate `buddy.yml` that will create a pipeline with the Jekyll action once you push it to the target branch: ```ruby - pipeline: "Build and Deploy Jekyll site" @@ -45,19 +45,18 @@ If you prefer configuration as code over GUI, you can generate `buddy.yml` that ## 4. Setting up on-premises server -The self-hosted version of BuddyWorks can be installed on any type of server supporting Docker, including [Linux][1], [Mac][2], [AWS EC2][3], [DigitalOcean][4], and [Microsoft Azure][5]. +The self-hosted version of BuddyWorks can be installed on any type of server supporting Docker, including [Linux][6], [Mac][7], [AWS EC2][8], [DigitalOcean][9], and [Microsoft Azure][10]. -[0]: https://buddy.works/buddy-go -[1]: https://buddy.works/knowledge/standalone/installation-linux -[2]: https://buddy.works/knowledge/standalone/installation-mac-osx -[3]: https://buddy.works/knowledge/standalone/installation-amazon-ec2 -[4]: https://buddy.works/knowledge/standalone/installation-digitalocean -[5]: https://buddy.works/knowledge/standalone/installation-azure +[6]: https://buddy.works/knowledge/standalone/installation-linux +[7]: https://buddy.works/knowledge/standalone/installation-mac-osx +[8]: https://buddy.works/knowledge/standalone/installation-amazon-ec2 +[9]: https://buddy.works/knowledge/standalone/installation-digitalocean +[10]: https://buddy.works/knowledge/standalone/installation-azure ## 5. Questions? -This entire guide is open-source. Go ahead and [edit it][0] if you want to expand it or have a fix or [ask for help][1] if you run into trouble and need assistance. BuddyWorks also has an [online community][2] for help. +This entire guide is open-source. Go ahead and [edit it][11] if you want to expand it or have a fix or [ask for help][12] if you run into trouble and need assistance. BuddyWorks also has an [online community][13] for help. -[0]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/buddyworks.md -[1]: https://jekyllrb.com/help/ -[2]: http://forum.buddy.works/ +[11]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/buddyworks.md +[12]: https://jekyllrb.com/help/ +[13]: http://forum.buddy.works/ From 086bf13a33ae132af7009acf456dea8158212f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Ku=C5=9B?= Date: Tue, 21 Mar 2017 10:49:48 +0100 Subject: [PATCH 2025/4996] Update buddyworks.md added article to `buddy.yml` --- docs/_docs/continuous-integration/buddyworks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/continuous-integration/buddyworks.md b/docs/_docs/continuous-integration/buddyworks.md index d33259dfe3b..c60b5b3657a 100644 --- a/docs/_docs/continuous-integration/buddyworks.md +++ b/docs/_docs/continuous-integration/buddyworks.md @@ -27,7 +27,7 @@ Whenever you make a push to the selected branch, the Jekyll action runs `jekyll ## 3. Using YAML for configuration -If you prefer configuration as code over GUI, you can generate `buddy.yml` that will create a pipeline with the Jekyll action once you push it to the target branch: +If you prefer configuration as code over GUI, you can generate a `buddy.yml` that will create a pipeline with the Jekyll action once you push it to the target branch: ```ruby - pipeline: "Build and Deploy Jekyll site" From d592f5781ab7ccba005a20e0d18286cd7410bf40 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 21 Mar 2017 09:12:18 -0400 Subject: [PATCH 2026/4996] Update history to reflect merge of #5957 [ci skip] --- History.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/History.markdown b/History.markdown index f28c18e2332..3f995c3a3cf 100644 --- a/History.markdown +++ b/History.markdown @@ -45,6 +45,9 @@ * Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty (#5878) * Allow abbreviated post dates (#5920) * Remove dependency on include from default about.md (#5903) + * Allow colons in `uri_escape` filter + +Fixes #5954 (#5957) ## 3.4.2 / 2017-03-09 From df0d3f20c4075c3853b59be40c057a5b5145ba8e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 21 Mar 2017 09:58:26 -0400 Subject: [PATCH 2027/4996] Fix some errant entries in History.markdown. --- History.markdown | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/History.markdown b/History.markdown index 3f995c3a3cf..128772266f3 100644 --- a/History.markdown +++ b/History.markdown @@ -26,7 +26,7 @@ * [Rubocop] add missing comma (#5835) * Appease classifier-reborn (#5934) - * Allow releases & development on *-stable branches (#5926) + * Allow releases & development on `*-stable` branches (#5926) * Add script/backport-pr (#5925) * Prefer .yaml over .toml (#5966) @@ -45,9 +45,7 @@ * Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty (#5878) * Allow abbreviated post dates (#5920) * Remove dependency on include from default about.md (#5903) - * Allow colons in `uri_escape` filter - -Fixes #5954 (#5957) + * Allow colons in `uri_escape` filter (#5957) ## 3.4.2 / 2017-03-09 From 9d66fc2292080335db5adabbf507693d6c02cedb Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 21 Mar 2017 08:38:37 -0500 Subject: [PATCH 2028/4996] Release :gem: 3.4.3 --- History.markdown | 4 ++++ docs/_docs/history.md | 6 ++++++ docs/latest_version.txt | 2 +- lib/jekyll/version.rb | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/History.markdown b/History.markdown index 128772266f3..c9aae111206 100644 --- a/History.markdown +++ b/History.markdown @@ -47,6 +47,10 @@ * Remove dependency on include from default about.md (#5903) * Allow colons in `uri_escape` filter (#5957) +## 3.4.3 / 2017-03-21 + + * Backport #5957 for v3.4.x: Allow colons in `uri_escape` filter (#5968) + ## 3.4.2 / 2017-03-09 * Backport #5871 for v3.4.x: Convert StaticFile liquid representation to a Drop & add front matter defaults support to StaticFiles (#5940) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 3c821edad51..9a504af606d 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,6 +4,12 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.4.3 / 2017-03-21 +{: #v3-4-3} + +- Backport [#5957]({{ site.repository }}/issues/5957) for v3.4.x: Allow colons in `uri_escape` filter ([#5968]({{ site.repository }}/issues/5968)) + + ## 3.4.2 / 2017-03-09 {: #v3-4-2} diff --git a/docs/latest_version.txt b/docs/latest_version.txt index 4d9d11cf505..6cb9d3dd0d6 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.4.2 +3.4.3 diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index fc43a4c354a..1c4a0b96025 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.4.2".freeze + VERSION = "3.4.3".freeze end From eab83c3653685ccb51af01be489fa5b6412c8045 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 21 Mar 2017 10:00:47 -0400 Subject: [PATCH 2029/4996] Update generated history for jekyllrb.com --- docs/_docs/history.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 9a504af606d..d0938169520 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -13,8 +13,7 @@ note: This file is autogenerated. Edit /History.markdown instead. ## 3.4.2 / 2017-03-09 {: #v3-4-2} -- Backport [#5871]({{ site.repository }}/issues/5871) for v3.4.x: Convert StaticFile liquid representation to - a Drop & add front matter defaults support to StaticFiles ([#5940]({{ site.repository }}/issues/5940)) +- Backport [#5871]({{ site.repository }}/issues/5871) for v3.4.x: Convert StaticFile liquid representation to a Drop & add front matter defaults support to StaticFiles ([#5940]({{ site.repository }}/issues/5940)) ## 3.4.1 / 2017-03-02 From ca9d6be061aaa1b5c28d2c75ee942c21d647b9fe Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 21 Mar 2017 09:58:02 -0500 Subject: [PATCH 2030/4996] Release post for v3.4.3 --- .../2017-03-21-jekyll-3-4-3-released.markdown | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 docs/_posts/2017-03-21-jekyll-3-4-3-released.markdown diff --git a/docs/_posts/2017-03-21-jekyll-3-4-3-released.markdown b/docs/_posts/2017-03-21-jekyll-3-4-3-released.markdown new file mode 100644 index 00000000000..a51fdf498c0 --- /dev/null +++ b/docs/_posts/2017-03-21-jekyll-3-4-3-released.markdown @@ -0,0 +1,49 @@ +--- +title: 'Jekyll 3.4.3 Released' +date: 2017-03-21 08:52:53 -0500 +author: pathawks +version: 3.4.3 +categories: [release] +--- + +Another one-PR patch update as we continue our quest to destroy all bugs. A +fairly technical debriefing follows, but the TLDR is that we have updated the +`uri_escape` filter to more closely follow the pre-v3.4.0 behavior. + +In [v3.4.0]({% link _posts/2017-01-18-jekyll-3-4-0-released.markdown %}), we +moved away from using the deprecated +[`URI.escape`](https://ruby-doc.org/stdlib-2.3.0/libdoc/uri/rdoc/URI/Escape.html#method-i-encode) +in favor of +[`Addressable::URI.encode`](http://www.rubydoc.info/gems/addressable/Addressable/URI#encode-class_method). +This is what powers our [`uri_escape` +filter](https://jekyllrb.com/docs/templates/). + +While this transition was mostly a smooth one, the two methods are not +identical. While `URI.escape` was happy to escape any string, +`Addressable::URI.encode` first turns the string into an `Addressable::URI` +object, and will then escape each component of that object. In most cases, this +difference was insignificant, but there were a few cases where this caused some +unintended regressions when encoding colons. + +While **Addressable** can understand that something like `"/example :page"` is a +relative URI, without the slash it cannot figure out how to turn +`"example :page"` into an `Addressable::URI` object. `URI.escape` had no such +objection. This lead to the following Liquid code working fine in Jekyll 3.3.x +but breaking in 3.4.0: + +{% raw %} +```liquid +{{ "example :page" | uri_escape }} +``` +{% endraw %} + +This was not an intended consequence of switching to **Addressable**. + +Fortunately, the solution was not complicated. **Addressable** has a method +[`Addressable::URI.normalize_component`](http://www.rubydoc.info/gems/addressable/Addressable/URI#normalize_component-class_method) +which will simply escape the characters in a string, much like `URI.escape`. + +Thanks to @cameronmcefee and @FriesFlorian for reporting +[this issue](https://github.com/jekyll/jekyll/issues/5954). + +Happy Jekylling! From f9243c5ab1c0ae6113180e8c650094e71bd08262 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Tue, 21 Mar 2017 08:52:33 -0700 Subject: [PATCH 2031/4996] Included more details about adding defaults to static files Based on the functionality released in [3.4.2](http://jekyllrb.com/news/2017/03/09/jekyll-3-4-2-released/) re adding defaults to static files, I thought this page needed some more detail. --- docs/_docs/static_files.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/_docs/static_files.md b/docs/_docs/static_files.md index 523c29dfc41..fbb03e792de 100644 --- a/docs/_docs/static_files.md +++ b/docs/_docs/static_files.md @@ -65,3 +65,35 @@ following metadata:
    + +Note that in the above table, `file` can be anything. It's simply an arbitrarily set variable used in your own logic (such as in a for loop). It isn't a global site or page variable. + +## Add front matter to static files + +Although you can't directly add front matter values to static files, you can actually set front matter values through the [defaults property](../configuration/#front-matter-defaults) in your configuration file. When Jekyll builds the site, it will use the front matter values you set. + +Here's an example: + +In your `_config.yml` file, add the following values to the `defaults` property: + +```yaml +defaults: + - scope: + path: "assets/img" + values: + image: true +``` + +This assumes that your Jekyll site has a folder path of `assets/img` where you have images (static files) stored. When Jekyll builds the site, it will treat each image as if it had the front matter value of `image: true`. + +Suppose you want to list all your image assets as contained in `assets/img`. You could use this for loop to look in the `static_files` object and get all static files that have this front matter property: + +```liquid +{% raw %}{% for myfile in site.static_files %} + {% if myfile.image == true %} + {{ myfile.path }} + {% endif %} +{% endfor %}{% endraw %} +``` + +When you build your site, the output will list the path to each file that meets this front matter condition. From 161902eda266167e0fc239e96e38190b6462b9aa Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 21 Mar 2017 12:26:06 -0400 Subject: [PATCH 2032/4996] Update history to reflect merge of #5949 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c9aae111206..8c262f24621 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,7 @@ * update plugin repo URL to reflect repo move (#5916) * Update exclude array in configuration.md (#5947) * Fixed path in "Improve this page" link in Tutorials section (#5951) + * Corrected permalink (#5949) ### Development Fixes From fe6d4c7beaf315b55623b2c686116f055cd62f2a Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Tue, 21 Mar 2017 10:27:05 -0700 Subject: [PATCH 2033/4996] updates from parkr's review - removed "actually" - switched code example to use `where` --- docs/_docs/static_files.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/_docs/static_files.md b/docs/_docs/static_files.md index fbb03e792de..a4dda58892d 100644 --- a/docs/_docs/static_files.md +++ b/docs/_docs/static_files.md @@ -70,7 +70,7 @@ Note that in the above table, `file` can be anything. It's simply an arbitrarily ## Add front matter to static files -Although you can't directly add front matter values to static files, you can actually set front matter values through the [defaults property](../configuration/#front-matter-defaults) in your configuration file. When Jekyll builds the site, it will use the front matter values you set. +Although you can't directly add front matter values to static files, you can set front matter values through the [defaults property](../configuration/#front-matter-defaults) in your configuration file. When Jekyll builds the site, it will use the front matter values you set. Here's an example: @@ -89,10 +89,9 @@ This assumes that your Jekyll site has a folder path of `assets/img` where you Suppose you want to list all your image assets as contained in `assets/img`. You could use this for loop to look in the `static_files` object and get all static files that have this front matter property: ```liquid -{% raw %}{% for myfile in site.static_files %} - {% if myfile.image == true %} - {{ myfile.path }} - {% endif %} +{% raw %}{% assign image_files = site.static_files | where: "image", true %} +{% for myimage in image_files %} + {{ myimage.path }} {% endfor %}{% endraw %} ``` From c55cc1d9ef72ecd4083b1911b8f70a821808203c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 21 Mar 2017 15:34:57 -0400 Subject: [PATCH 2034/4996] Update history to reflect merge of #5971 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8c262f24621..f46b46dcbe1 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * Update exclude array in configuration.md (#5947) * Fixed path in "Improve this page" link in Tutorials section (#5951) * Corrected permalink (#5949) + * Included more details about adding defaults to static files (#5971) ### Development Fixes From b60b78cfc4c8743446284a88d85c251634eff624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Ku=C5=9B?= Date: Wed, 22 Mar 2017 13:55:56 +0100 Subject: [PATCH 2035/4996] changed link references to names --- .../continuous-integration/buddyworks.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/_docs/continuous-integration/buddyworks.md b/docs/_docs/continuous-integration/buddyworks.md index c60b5b3657a..1dea8be53db 100644 --- a/docs/_docs/continuous-integration/buddyworks.md +++ b/docs/_docs/continuous-integration/buddyworks.md @@ -2,13 +2,13 @@ title: "BuddyWorks" --- -[BuddyWorks][0] is a [Docker][1]-based CI server that you can set up in 15-20 minutes to build, test, and deploy your Jekyll websites. It supports [GitHub][2], [Bitbucket][3], and [GitLab][4] repositories, and can be installed on-premises or used in cloud. The following guide will show you how to set up a free environment to build and test your Jekyll project. +[BuddyWorks][buddyworks-homepage] is a [Docker][docker-homepage]-based CI server that you can set up in 15-20 minutes to build, test, and deploy your Jekyll websites. It supports [GitHub][github-homepage], [Bitbucket][bitbucket-homepage], and [GitLab][gitlab-homepage] repositories, and can be installed on-premises or used in cloud. The following guide will show you how to set up a free environment to build and test your Jekyll project. -[0]: https://buddy.works -[1]: https://www.docker.com/ -[2]: https://github.com -[3]: https://bitbucket.org/ -[4]: https://gitlab.com +[buddyworks-homepage]: https://buddy.works +[docker-homepage]: https://www.docker.com/ +[github-homepage]: https://github.com +[bitbucket-homepage]: https://bitbucket.org/ +[gitlab-homepage]: https://gitlab.com ## 1. Getting started @@ -19,11 +19,11 @@ title: "BuddyWorks" ## 2. How it works -Whenever you make a push to the selected branch, the Jekyll action runs `jekyll build` in an isolated [Jekyll Docker image][5]. The output is generated to the `/filesystem` directory, and can be further deployed to FTP/SFTP and IaaS services. You can add your own commands, install additional packages, attach services, and run Selenium tests, as well as add other actions down the pipeline, eg. a Slack notification or an SSH script that will restart your server. +Whenever you make a push to the selected branch, the Jekyll action runs `jekyll build` in an isolated [Jekyll Docker image][jekyll-docker-image]. The output is generated to the `/filesystem` directory, and can be further deployed to FTP/SFTP and IaaS services. You can add your own commands, install additional packages, attach services, and run Selenium tests, as well as add other actions down the pipeline, eg. a Slack notification or an SSH script that will restart your server. ![Jekyll Build](https://buddy.works/data/blog/_images/buddyworks-jekyll-small.png) -[5]: https://hub.docker.com/r/jekyll/jekyll/ +[jekyll-docker-image]: https://hub.docker.com/r/jekyll/jekyll/ ## 3. Using YAML for configuration @@ -45,18 +45,18 @@ If you prefer configuration as code over GUI, you can generate a `buddy.yml` tha ## 4. Setting up on-premises server -The self-hosted version of BuddyWorks can be installed on any type of server supporting Docker, including [Linux][6], [Mac][7], [AWS EC2][8], [DigitalOcean][9], and [Microsoft Azure][10]. +The self-hosted version of BuddyWorks can be installed on any type of server supporting Docker, including [Linux][bw-linux], [Mac][bw-mac], [AWS EC2][bw-aws-ec2], [DigitalOcean][bw-digitalocean], and [Microsoft Azure][bw-azure]. -[6]: https://buddy.works/knowledge/standalone/installation-linux -[7]: https://buddy.works/knowledge/standalone/installation-mac-osx -[8]: https://buddy.works/knowledge/standalone/installation-amazon-ec2 -[9]: https://buddy.works/knowledge/standalone/installation-digitalocean -[10]: https://buddy.works/knowledge/standalone/installation-azure +[bw-linux]: https://buddy.works/knowledge/standalone/installation-linux +[bw-mac]: https://buddy.works/knowledge/standalone/installation-mac-osx +[bw-aws-ec2]: https://buddy.works/knowledge/standalone/installation-amazon-ec2 +[bw-digitalocean]: https://buddy.works/knowledge/standalone/installation-digitalocean +[bw-azure]: https://buddy.works/knowledge/standalone/installation-azure ## 5. Questions? -This entire guide is open-source. Go ahead and [edit it][11] if you want to expand it or have a fix or [ask for help][12] if you run into trouble and need assistance. BuddyWorks also has an [online community][13] for help. +This entire guide is open-source. Go ahead and [edit it][jekyll-docs-ci-buddyworks] if you want to expand it or have a fix or [ask for help][jekyll-help] if you run into trouble and need assistance. BuddyWorks also has an [online community][buddyworks-forum] for help. -[11]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/buddyworks.md -[12]: https://jekyllrb.com/help/ -[13]: http://forum.buddy.works/ +[jekyll-docs-ci-buddyworks]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/buddyworks.md +[jekyll-help]: https://jekyllrb.com/help/ +[buddyworks-forum]: http://forum.buddy.works/ From c48f147192d417294aac72c559599a46ef0e3410 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 22 Mar 2017 10:02:05 -0400 Subject: [PATCH 2036/4996] Update history to reflect merge of #5962 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f46b46dcbe1..86b2fe79c7b 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * Fixed path in "Improve this page" link in Tutorials section (#5951) * Corrected permalink (#5949) * Included more details about adding defaults to static files (#5971) + * Create buddyworks (#5962) ### Development Fixes From 16e807a41dd9170b0c7b2b683372ebf463f284fe Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 22 Mar 2017 11:28:40 -0400 Subject: [PATCH 2037/4996] Update history to reflect merge of #5965 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 86b2fe79c7b..6140fb92e4b 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * Corrected permalink (#5949) * Included more details about adding defaults to static files (#5971) * Create buddyworks (#5962) + * added (buddyworks) to ci list (#5965) ### Development Fixes From 58dce4f0995b7085618e36fd869c35a2d12b1410 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 23 Mar 2017 10:10:38 +0530 Subject: [PATCH 2038/4996] Check for given content in posts --- features/site_configuration.feature | 2 ++ 1 file changed, 2 insertions(+) diff --git a/features/site_configuration.feature b/features/site_configuration.feature index cc6f01fbadd..6dc6f5b09fa 100644 --- a/features/site_configuration.feature +++ b/features/site_configuration.feature @@ -174,6 +174,8 @@ Feature: Site configuration Then I should get a zero exit status And the _site directory should exist And I should see "Page Layout: 2" in "_site/index.html" + And I should see "Post Layout:

    content for entry1.

    \n built at" in "_site/2013/04/09/entry1.html" + And I should see "Post Layout:

    content for entry2.

    \n built at" in "_site/2013/04/10/entry2.html" And I should see date "2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html" unless Windows And I should see date "2013-04-09T22:22:00-05:00" in "_site/2013/04/09/entry1.html" if on Windows And I should see date "2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html" unless Windows From 3142f31a7aa3554f5dbeae716b8fe2e691fdd85f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 24 Mar 2017 21:19:54 +0100 Subject: [PATCH 2039/4996] add custom 404 to tutorial navigation --- docs/_data/tutorials.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_data/tutorials.yml b/docs/_data/tutorials.yml index 73a0184a195..df6b4c207ca 100644 --- a/docs/_data/tutorials.yml +++ b/docs/_data/tutorials.yml @@ -2,6 +2,7 @@ tutorials: - home - navigation + - custom-404-page #- title: Another section # tutorials: From 990809ba0793c09e0801ed87933c6de686025765 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Mar 2017 16:21:38 -0400 Subject: [PATCH 2040/4996] Update history to reflect merge of #5946 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6140fb92e4b..72a24fa3772 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Included more details about adding defaults to static files (#5971) * Create buddyworks (#5962) * added (buddyworks) to ci list (#5965) + * Add a tutorial on serving custom Error 404 page (#5946) ### Development Fixes From a3aed14d4107f85628ce03aeff6d80d5ce64c149 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Mar 2017 17:14:20 -0400 Subject: [PATCH 2041/4996] Update history to reflect merge of #5978 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 72a24fa3772..fdb618fa456 100644 --- a/History.markdown +++ b/History.markdown @@ -26,6 +26,7 @@ * Create buddyworks (#5962) * added (buddyworks) to ci list (#5965) * Add a tutorial on serving custom Error 404 page (#5946) + * add custom 404 to tutorial navigation (#5978) ### Development Fixes From a9830fadac277b709bb9212ad8b266d9faa50128 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 25 Mar 2017 06:16:03 -0400 Subject: [PATCH 2042/4996] Update history to reflect merge of #5952 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fdb618fa456..fcf59e3042b 100644 --- a/History.markdown +++ b/History.markdown @@ -27,6 +27,7 @@ * added (buddyworks) to ci list (#5965) * Add a tutorial on serving custom Error 404 page (#5946) * add custom 404 to tutorial navigation (#5978) + * Add link to order of interpretation tutorial in Tutorials nav (#5952) ### Development Fixes From f2bf9841608b631376b7cc699198589eb743a5ce Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 27 Mar 2017 13:03:42 -0400 Subject: [PATCH 2043/4996] Update philosophy document based on benbalter's feedback. --- docs/philosophy.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/philosophy.md b/docs/philosophy.md index ad9cbb4f170..b058183eaa0 100644 --- a/docs/philosophy.md +++ b/docs/philosophy.md @@ -11,7 +11,8 @@ is about, the following principles should come to mind: Jekyll is not magic. A user should be able to understand the underlying processes that make up the Jekyll build without much reading. It should -behave "as you'd expect." +do only what you ask it to and nothing more. When a user takes a certain +action, the outcome should be easily understandable and focused. ### 2. It "Just Works" @@ -19,7 +20,7 @@ The out-of-the-box experience should be that it "just works." Run `gem install jekyll` and it should build any Jekyll site that it's given. Features like auto-regeneration and settings like the markdown renderer should represent sane defaults that work perfectly for the vast majority of -cases. The burden of configuration should not be placed on the user. +cases. The burden of initial configuration should not be placed on the user. ### 3. Content is King @@ -31,6 +32,12 @@ should find the management of their content enjoyable and simple. If a user's site builds today, it should build tomorrow. Backwards-compatibility should be strongly preferred over breaking changes. +Breaking changes should be made to support a strong practical goal, and +breaking changes should never be made to drive forward "purity" of the +codebase, or other changes purely to make the maintainers' lives easier. +Breaking changes provide a significant amount of friction between upgrades +and reduce the confidence of users in this software, and should thus be +avoided unless absolutely necessary. Upon breaking changes, provide a clear path for users to upgrade. ### 5. Small & Extensible @@ -38,4 +45,6 @@ Upon breaking changes, provide a clear path for users to upgrade. The core of Jekyll should be simple and small, and extensibility should be a first-class feature to provide added functionality from community contributors. The core should be kept to features used by at least 90% of -users–everything else should be provided as a plugin. +users–everything else should be provided as a plugin. New features should +be shipped as plugins and focus should be put on creating extensible core +API's to support rich plugins. From a6518c1de3ac54df01dc06b45d687100124c20e3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 27 Mar 2017 13:08:00 -0400 Subject: [PATCH 2044/4996] Update history to reflect merge of #5792 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fcf59e3042b..56084528056 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,7 @@ * Add a tutorial on serving custom Error 404 page (#5946) * add custom 404 to tutorial navigation (#5978) * Add link to order of interpretation tutorial in Tutorials nav (#5952) + * Document Jekyll's Philosophy (#5792) ### Development Fixes From b36731442401a03c3fd5d40c6497821b0b7b7c52 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 27 Mar 2017 13:38:09 -0400 Subject: [PATCH 2045/4996] Fix whitespace issue in philosophy document. /cc https://github.com/jekyll/jekyll/issues/5342#issuecomment-247358296 --- docs/philosophy.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/philosophy.md b/docs/philosophy.md index b058183eaa0..7d9c414fb28 100644 --- a/docs/philosophy.md +++ b/docs/philosophy.md @@ -16,8 +16,8 @@ action, the outcome should be easily understandable and focused. ### 2. It "Just Works" -The out-of-the-box experience should be that it "just works." Run `gem -install jekyll` and it should build any Jekyll site that it's given. +The out-of-the-box experience should be that it "just works." Run +`gem install jekyll` and it should build any Jekyll site that it's given. Features like auto-regeneration and settings like the markdown renderer should represent sane defaults that work perfectly for the vast majority of cases. The burden of initial configuration should not be placed on the user. From a2e82b72649d8fad1f6cd4101b2c987049310ed2 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 26 Mar 2017 13:23:17 +0200 Subject: [PATCH 2046/4996] mention Ruby > 2.1.0 in docs --- docs/_docs/troubleshooting.md | 2 +- docs/_docs/upgrading/2-to-3.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/troubleshooting.md b/docs/_docs/troubleshooting.md index 8fb669425c1..48163fdc5bb 100644 --- a/docs/_docs/troubleshooting.md +++ b/docs/_docs/troubleshooting.md @@ -17,7 +17,7 @@ that might be of help. If the problem you’re experiencing isn’t covered belo ## Installation Problems If you encounter errors during gem installation, you may need to install -the header files for compiling extension modules for Ruby 2.0.0. This +the header files for compiling extension modules for Ruby 2.x This can be done on Ubuntu or Debian by running: ```sh diff --git a/docs/_docs/upgrading/2-to-3.md b/docs/_docs/upgrading/2-to-3.md index a378d2f7e78..2b1b13573c6 100644 --- a/docs/_docs/upgrading/2-to-3.md +++ b/docs/_docs/upgrading/2-to-3.md @@ -12,7 +12,7 @@ Before we dive in, go ahead and fetch the latest version of Jekyll: $ gem update jekyll ``` -Please note: Jekyll 3 requires Ruby version >= 2.0.0. +Please note: Jekyll 3.2 requires Ruby version >= 2.1
    Diving in
    From 7affec23478a25228929996f825f4f475151f7b5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 27 Mar 2017 15:38:37 -0400 Subject: [PATCH 2047/4996] Update history to reflect merge of #5983 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 56084528056..dd8c57607c2 100644 --- a/History.markdown +++ b/History.markdown @@ -29,6 +29,7 @@ * add custom 404 to tutorial navigation (#5978) * Add link to order of interpretation tutorial in Tutorials nav (#5952) * Document Jekyll's Philosophy (#5792) + * Require Ruby > 2.1.0 (#5983) ### Development Fixes From f598b7e6804548c61e8a5bc0a4fd72075faf8aa4 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 27 Mar 2017 15:39:20 -0400 Subject: [PATCH 2048/4996] Update history to reflect merge of #5961 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index dd8c57607c2..5411ac240b1 100644 --- a/History.markdown +++ b/History.markdown @@ -38,6 +38,7 @@ * Allow releases & development on `*-stable` branches (#5926) * Add script/backport-pr (#5925) * Prefer .yaml over .toml (#5966) + * Fix Appveyor with DST-aware cucumber steps (#5961) ### Site Enhancements From 86703f100908dd6aadb29a68904ed7ab81cb8fdd Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Tue, 28 Mar 2017 09:05:54 +0530 Subject: [PATCH 2049/4996] Use Rubocop v0.47.1 till we're ready for v0.48 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 3a65e9ba2f6..a310188ffa8 100644 --- a/Gemfile +++ b/Gemfile @@ -25,7 +25,7 @@ group :test do gem "nokogiri" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.47" + gem "rubocop", "~> 0.47.1" gem "test-theme", :path => File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) gem "jruby-openssl" if RUBY_ENGINE == "jruby" From 73e70da9e5d97c1b7e1bd85f93a2bda89811207d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 28 Mar 2017 11:35:45 -0400 Subject: [PATCH 2050/4996] Update history to reflect merge of #5989 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5411ac240b1..d1fef356ec6 100644 --- a/History.markdown +++ b/History.markdown @@ -39,6 +39,7 @@ * Add script/backport-pr (#5925) * Prefer .yaml over .toml (#5966) * Fix Appveyor with DST-aware cucumber steps (#5961) + * Use Rubocop v0.47.1 till we're ready for v0.48 (#5989) ### Site Enhancements From 3688640d59a5b53a85cb6f31d336b474165ef4d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20P=C3=A4per?= Date: Wed, 29 Mar 2017 00:36:29 +0200 Subject: [PATCH 2051/4996] add /_data/*.tsv support (#5985) * Update data.feature - add .tsv - add .csv with `\t` - add .csv with `;` * Fix Appveyor with dst-aware cucumber steps * Check for given content in posts * mention Ruby > 2.1.0 in docs * Update history to reflect merge of #5983 [ci skip] * Update history to reflect merge of #5961 [ci skip] * Update data_reader.rb - add .tsv support with tab separated columns - not adding support for auto-detecting `:col_sep` ftp://ftp.iana.org/assignments/media-types/text/tab-separated-values https://www.ietf.org/rfc/rfc4180.txt (CSV) https://ruby-doc.org/stdlib-2.4.1/libdoc/csv/rdoc/CSV.html * Update data.feature don't do semicolons and tabs in .csv within this patch * Update data.feature I don't know which component replaced my tab characters by space before. * Update data.feature t * Update data_reader.rb add a single space to satisfy format checker --- features/data.feature | 14 ++++++++++++++ lib/jekyll/readers/data_reader.rb | 10 ++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/features/data.feature b/features/data.feature index e44be8a5cf6..41f476a4996 100644 --- a/features/data.feature +++ b/features/data.feature @@ -59,6 +59,20 @@ Feature: Data And I should see "Jack" in "_site/index.html" And I should see "Leon" in "_site/index.html" + Scenario: autoload *.tsv files in _data directory + Given I have a _data directory + And I have a "_data/members.tsv" file with content: + """ + name age + Jack 28 + Leon 34 + """ + And I have an "index.html" page that contains "{% for member in site.data.members %}{{member.name}}{% endfor %}" + When I run jekyll build + Then the "_site/index.html" file should exist + And I should see "Jack" in "_site/index.html" + And I should see "Leon" in "_site/index.html" + Scenario: autoload *.yml files in _data directory with space in file name Given I have a _data directory And I have a "_data/team members.yml" file with content: diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index 1083d62b26b..63db7c6d920 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -19,7 +19,7 @@ def read(dir) @content end - # Read and parse all .yaml, .yml, .json, and .csv + # Read and parse all .yaml, .yml, .json, .csv and .tsv # files under and add them to the variable. # # dir - The string absolute path of the directory to read. @@ -30,7 +30,7 @@ def read_data_to(dir, data) return unless File.directory?(dir) && !@entry_filter.symlink?(dir) entries = Dir.chdir(dir) do - Dir["*.{yaml,yml,json,csv}"] + Dir["*"].select { |fn| File.directory?(fn) } + Dir["*.{yaml,yml,json,csv,tsv}"] + Dir["*"].select { |fn| File.directory?(fn) } end entries.each do |entry| @@ -56,6 +56,12 @@ def read_data_file(path) :headers => true, :encoding => site.config["encoding"], }).map(&:to_hash) + when ".tsv" + CSV.read(path, { + :col_sep => "\t", + :headers => true, + :encoding => site.config["encoding"], + }).map(&:to_hash) else SafeYAML.load_file(path) end From 6edc546d36916c9cc521fd6e341ada1bb95c5fce Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 28 Mar 2017 18:39:30 -0400 Subject: [PATCH 2052/4996] Update history to reflect merge of #5985 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d1fef356ec6..ff4e81e23c7 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Upgrade to Liquid v4 (#4362) * Convert StaticFile liquid representation to a Drop & add front matter defaults support to StaticFiles (#5871) + * Add support for Tab-Separated Values data files (`*.tsv`) (#5985) ### Documentation From 8325d56a1acf39689bf0b679eb2bbb2cd568237c Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Thu, 30 Mar 2017 14:00:31 -0700 Subject: [PATCH 2053/4996] Fix broken link (#5994) Merge pull request 5994 --- docs/_tutorials/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_tutorials/index.md b/docs/_tutorials/index.md index b0988b09f62..f023dc11e5c 100644 --- a/docs/_tutorials/index.md +++ b/docs/_tutorials/index.md @@ -5,7 +5,7 @@ permalink: /tutorials/home/ redirect_from: /tutorials/index.html --- -In contrast to [Docs](../docs), Tutorials provide more detailed, narrative instruction that cover a variety of Jekyll topics and scenarios. Tutorials might contain the following: +In contrast to [Docs](/docs/home/), Tutorials provide more detailed, narrative instruction that cover a variety of Jekyll topics and scenarios. Tutorials might contain the following: * Step-by-step processes through particular scenarios or challenges * Full walk-throughs using sample data, showing inputs and results from the sample data From fe388a885e3883f16ff55bf64de5b5890aaab0a3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 30 Mar 2017 17:00:33 -0400 Subject: [PATCH 2054/4996] Update history to reflect merge of #5994 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ff4e81e23c7..f35894107d1 100644 --- a/History.markdown +++ b/History.markdown @@ -31,6 +31,7 @@ * Add link to order of interpretation tutorial in Tutorials nav (#5952) * Document Jekyll's Philosophy (#5792) * Require Ruby > 2.1.0 (#5983) + * Fix broken link (#5994) ### Development Fixes From 711a8483c680e70906b23f081070f62f4e10b52f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 30 Mar 2017 20:14:04 -0400 Subject: [PATCH 2055/4996] travis: upgrade Ruby 2.2 and 2.1 to latest PATCH release --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 36f2d6ff160..088fadaebdd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,8 +5,8 @@ language: ruby sudo: false rvm: - - &ruby1 2.3.3 - - &ruby2 2.2.6 + - &ruby1 2.3.4 + - &ruby2 2.2.7 - &ruby3 2.1.10 - &jruby jruby-9.1.7.0 From 0d02a25b04ae0da5e63d349f8fd022e3b7b8a6ec Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 31 Mar 2017 04:02:04 +0200 Subject: [PATCH 2056/4996] Default options for script/proof (#5995) Merge pull request 5995 --- docs/_docs/posts.md | 2 +- docs/_docs/quickstart.md | 4 ++-- docs/_docs/themes.md | 6 +++--- docs/_tutorials/navigation.md | 2 +- script/proof | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index f43b72e8af3..ce00e2dde74 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -42,7 +42,7 @@ file. For example, the following are examples of valid post filenames:
    ProTip™: Link to other posts

    - Use the post_url + Use the post_url tag to link to other posts without having to worry about the URL's breaking when the site permalink style changes.

    diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index a8a2ae98cb5..9bd164b3b5e 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -4,7 +4,7 @@ permalink: /docs/quickstart/ --- -If you already have a full [Ruby](https://www.ruby-lang.org/en/downloads/) development environment with all headers and [RubyGems](https://rubygems.org/pages/download) installed (see Jekyll's [requirements](/docs/installation/#requirements/)), you can create a new Jekyll site by doing the following: +If you already have a full [Ruby](https://www.ruby-lang.org/en/downloads/) development environment with all headers and [RubyGems](https://rubygems.org/pages/download) installed (see Jekyll's [requirements](/docs/installation/#requirements)), you can create a new Jekyll site by doing the following: ```sh # Install Jekyll and Bundler gems through RubyGems @@ -22,7 +22,7 @@ If you already have a full [Ruby](https://www.ruby-lang.org/en/downloads/) devel # Now browse to http://localhost:4000 ``` -If you encounter any unexpected errors during the above, please refer to the already-mentioned [requirements](/docs/installation/#requirements/) page, as you might be missing development headers or other prerequisites. +If you encounter any unexpected errors during the above, please refer to the already-mentioned [requirements](/docs/installation/#requirements) page, as you might be missing development headers or other prerequisites. ## About Bundler diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index 2e6052a4002..5ad3b2da8b2 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -141,7 +141,7 @@ To install a gem-based theme: bundle exec jekyll serve ``` -You can have multiple themes listed in your site's `Gemfile`, but only one theme can be selected in your site's `_config.yml`. +You can have multiple themes listed in your site's `Gemfile`, but only one theme can be selected in your site's `_config.yml`. {: .note .info } If you're publishing your Jekyll site on [GitHub Pages](https://pages.github.com/), note that GitHub Pages supports only some gem-based themes. See [Supported Themes](https://pages.github.com/themes/) in GitHub's documentation to see which themes are supported. @@ -184,7 +184,7 @@ For example, if your theme has a `/_layouts/page.html` file, and a page has `lay Any file in `/assets` will be copied over to the user's site upon build unless they have a file with the same relative path. You can ship any kind of asset here: SCSS, an image, a webfont, etc. These files behave like pages and static files in Jekyll: -- If the file has [YAML front matter](../docs/frontmatter/) at the top, it will be rendered. +- If the file has [YAML front matter](/docs/frontmatter/) at the top, it will be rendered. - If the file does not have YAML front matter, it will simply be copied over into the resulting site. This allows theme creators to ship a default `/assets/styles.scss` file which their layouts can depend on as `/assets/styles.css`. @@ -218,7 +218,7 @@ Themes are visual. Show users what your theme looks like by including a screensh To preview your theme as you're authoring it, it may be helpful to add dummy content in, for example, `/index.html` and `/page.html` files. This will allow you to use the `jekyll build` and `jekyll serve` commands to preview your theme, just as you'd preview a Jekyll site. -If you do preview your theme locally, be sure to add `/_site` to your theme's `.gitignore` file to prevent the compiled site from also being included when you distribute your theme. +If you do preview your theme locally, be sure to add `/_site` to your theme's `.gitignore` file to prevent the compiled site from also being included when you distribute your theme. {: .info .note} ### Publishing your theme diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index 7d4bafa372f..324fe8ad3a2 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -68,7 +68,7 @@ docs:
    {: .note .info } -For the results in these fictitious samples, `#` is manually substituted for the actual link value to avoid 404 errors.) +For the results in these fictitious samples, `#` is manually substituted for the actual link value to avoid 404 errors.) When you use a `for` loop, you choose how you want to refer to the items you're looping through. The variable you choose (in this case, `item`) becomes how you access the properties of each item in the list. Dot notation is used to get a property of the item (for example, `item.url`). diff --git a/script/proof b/script/proof index 664e778d22a..e8b796b2299 100755 --- a/script/proof +++ b/script/proof @@ -9,7 +9,7 @@ function msg { printf "\e[0;37m==> $1\e[0m\n" } -INGORE_HREFS=$(ruby -e 'puts %w{ +IGNORE_HREFS=$(ruby -e 'puts %w{ Chrononaut twitter.com nearlyfreespeech.net @@ -32,4 +32,4 @@ bundle exec jekyll build -s $SOURCE -d $DESTINATION --trace # 3. msg "Proofing..." -time bundle exec htmlproofer ./$DESTINATION --url-ignore $INGORE_HREFS $@ +time bundle exec htmlproofer ./$DESTINATION --allow-hash-href --url-ignore $IGNORE_HREFS $@ From 3921e523c5303583959fb9c04dcc62ca98e559a0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 30 Mar 2017 22:02:05 -0400 Subject: [PATCH 2057/4996] Update history to reflect merge of #5995 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f35894107d1..d1c79e0c367 100644 --- a/History.markdown +++ b/History.markdown @@ -32,6 +32,7 @@ * Document Jekyll's Philosophy (#5792) * Require Ruby > 2.1.0 (#5983) * Fix broken link (#5994) + * Default options for script/proof (#5995) ### Development Fixes From 409c8f9f3146e9af142f891172c6a31e7226460f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Mar 2017 00:49:42 -0400 Subject: [PATCH 2058/4996] Make stackprof a ruby script [ci skip] --- script/stackprof | 59 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/script/stackprof b/script/stackprof index f78f11aa042..e6e77f8d85f 100755 --- a/script/stackprof +++ b/script/stackprof @@ -1,26 +1,49 @@ -#!/usr/bin/env bash +#!/usr/bin/env ruby -set -e +require "bundler/setup" +require "json" +require "stackprof" +require File.expand_path("../../lib/jekyll", __FILE__) -case "$1" in - cpu|object) STACKPROF_MODE="$1"; shift ;; - *) STACKPROF_MODE="cpu" ;; -esac +MODE = ARGV.first || "cpu" +PROF_OUTPUT_FILE = File.expand_path("../../tmp/stackprof-#{MODE}-#{Time.now.strftime("%Y%m%d%H%M")}.dump", __FILE__) -export BENCHMARK=true -command -v stackprof > /dev/null || script/bootstrap +puts "Stackprof Mode: #{MODE}" -TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'docs'})" -PROF_OUTPUT_FILE=tmp/stackprof-${STACKPROF_MODE}-$(date +%Y%m%d%H%M).dump +unless File.exist?(PROF_OUTPUT_FILE) + StackProf.run( + mode: MODE.to_sym, + interval: 100, + raw: true, + out: PROF_OUTPUT_FILE + ) do + puts "GC Stats:", JSON.pretty_generate(GC.stat) + GC.disable -GC_BEFORE="puts 'GC Stats:'; puts JSON.pretty_generate(GC.stat); GC.disable" -GC_AFTER="puts 'GC Stats:'; GC.start(full_mark: true, immediate_sweep: false); puts JSON.pretty_generate(GC.stat);" + Jekyll::Commands::Build.process({'source' => 'docs'}) -echo Stackprof Mode: $STACKPROF_MODE -test -f "$PROF_OUTPUT_FILE" || { - bundle exec ruby -r./lib/jekyll -rstackprof -rjson \ - -e "StackProf.run(mode: :${STACKPROF_MODE}, interval: 100, out: '${PROF_OUTPUT_FILE}') { ${GC_BEFORE}; ${TEST_SCRIPT}; ${GC_AFTER}; }" + puts 'GC Stats:' + GC.start(full_mark: true, immediate_sweep: false) + puts JSON.pretty_generate(GC.stat) + end +end + +options = { + sort: true, + limit: 30, + format: :text, } -set -x -bundle exec stackprof $PROF_OUTPUT_FILE $@ --sort-total +# You can also do other things. Examples: +# https://github.com/tmm1/stackprof/blob/master/bin/stackprof +report = StackProf::Report.new(Marshal.load(IO.binread(PROF_OUTPUT_FILE))) +report.print_text( + options[:sort], + options[:limit], + options[:select_files], + options[:reject_files], + options[:select_names], + options[:reject_names] +) + +puts "Results stored in #{PROF_OUTPUT_FILE}" From 15e133f6274b577519b1695a962aa1fb78f7bddf Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Mar 2017 00:56:15 -0400 Subject: [PATCH 2059/4996] Depend on my branch of yajl-ruby with Ruby 2.4 Integer fix /cc https://github.com/brianmario/yajl-ruby/pull/173 --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index a310188ffa8..8355c1b9570 100644 --- a/Gemfile +++ b/Gemfile @@ -76,6 +76,7 @@ group :jekyll_optional_dependencies do gem "classifier-reborn", "~> 2.1.0" gem "liquid-c", "~> 3.0" gem "pygments.rb", "~> 0.6.0" + gem "yajl-ruby", git: "https://github.com/parkr/yajl-ruby", branch: "1.2.x-unify-fixnum-to-integer" gem "rdiscount", "~> 2.0" gem "redcarpet", "~> 3.2", ">= 3.2.3" end From db06288448b65f7e4206fc05810f2603c0576e26 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Mar 2017 01:03:56 -0400 Subject: [PATCH 2060/4996] Update history to reflect merge of #5687 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d1c79e0c367..ec0b2ca85b0 100644 --- a/History.markdown +++ b/History.markdown @@ -43,6 +43,7 @@ * Prefer .yaml over .toml (#5966) * Fix Appveyor with DST-aware cucumber steps (#5961) * Use Rubocop v0.47.1 till we're ready for v0.48 (#5989) + * Test against Ruby 2.4.0 (#5687) ### Site Enhancements From 1c33bd579796d6f77abafc1af78e496298b4d74d Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Sun, 3 Jul 2016 16:43:37 +0300 Subject: [PATCH 2061/4996] rubocop: reduce code complexity and remove duplicated code --- .rubocop.yml | 1 - lib/jekyll/convertible.rb | 2 +- lib/jekyll/page.rb | 10 +-- lib/jekyll/renderer.rb | 167 +++++++++++++++++++++++--------------- 4 files changed, 108 insertions(+), 72 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 4193f4b4afd..168e779ae67 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,7 +4,6 @@ AllCops: Include: - lib/**/*.rb Exclude: - - lib/jekyll/renderer.rb - bin/**/* - exe/**/* - benchmark/**/* diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 11d5fa865cf..34741c8ff1d 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -78,7 +78,7 @@ def validate_permalink!(filename) # # Returns the transformed contents. def transform - _renderer.transform + _renderer.convert(content) end # Determine the extension depending on content_type. diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 324a867d475..2fb899cc5e3 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -127,12 +127,12 @@ def process(name) # layouts - The Hash of {"name" => "layout"}. # site_payload - The site payload Hash. # - # Returns nothing. + # Returns String rendered page. def render(layouts, site_payload) - site_payload["page"] = to_liquid - site_payload["paginator"] = pager.to_liquid - - do_layout(site_payload, layouts) + self.output = _renderer.tap do |renderer| + renderer.layouts = layouts + renderer.payload = site_payload + end.run end # The path to the source file diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 749882bf77d..3a4aedc9d0f 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -33,50 +33,44 @@ def layouts # Determine which converters to use based on this document's # extension. # - # Returns an array of Converter instances. + # Returns Array of Converter instances. def converters @converters ||= site.converters.select { |c| c.matches(document.extname) }.sort end # Determine the extname the outputted file should have # - # Returns the output extname including the leading period. + # Returns String the output extname including the leading period. def output_ext @output_ext ||= (permalink_ext || converter_output_ext) end - ###################### - ## DAT RENDER THO - ###################### - + # Prepare payload and render the document + # + # Returns String rendered document output def run Jekyll.logger.debug "Rendering:", document.relative_path - payload["page"] = document.to_liquid - - if document.respond_to? :pager - payload["paginator"] = document.pager.to_liquid - end - - if document.is_a?(Document) && document.collection.label == "posts" - payload["site"]["related_posts"] = document.related_posts - else - payload["site"]["related_posts"] = nil - end - - # render and transform content (this becomes the final content of the object) - payload["highlighter_prefix"] = converters.first.highlighter_prefix - payload["highlighter_suffix"] = converters.first.highlighter_suffix + assign_pages! + assign_related_posts! + assign_highlighter_options! Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path document.trigger_hooks(:pre_render, payload) + render_document + end + + # Render the document. + # + # Returns String rendered document output + # rubocop: disable AbcSize + def render_document info = { + :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload["page"] } } - output = document.content - if document.render_with_liquid? Jekyll.logger.debug "Rendering Liquid:", document.relative_path output = render_liquid(output, payload, info, document.path) @@ -88,21 +82,16 @@ def run if document.place_in_layout? Jekyll.logger.debug "Rendering Layout:", document.relative_path - place_in_layouts( - output, - payload, - info - ) - else - output + output = place_in_layouts(output, payload, info) end + + output end + # rubocop: enable AbcSize - # Convert the given content using the converters which match this renderer's document. - # - # content - the raw, unconverted content + # Convert the document using the converters which match this renderer's document. # - # Returns the converted content. + # Returns String the converted content. def convert(content) converters.reduce(content) do |output, converter| begin @@ -124,7 +113,7 @@ def convert(content) # info - # path - (optional) the path to the file, for use in ex # - # Returns the content, rendered by Liquid. + # Returns String the content, rendered by Liquid. def render_liquid(content, payload, info, path = nil) template = site.liquid_renderer.file(path).parse(content) template.warnings.each do |e| @@ -144,26 +133,18 @@ def render_liquid(content, payload, info, path = nil) # # layout - the layout to check # - # Returns true if the layout is invalid, false if otherwise + # Returns Boolean true if the layout is invalid, false if otherwise def invalid_layout?(layout) !document.data["layout"].nil? && layout.nil? && !(document.is_a? Jekyll::Excerpt) end - # Render layouts and place given content inside. - # - # content - the content to be placed in the layout - # + # Render layouts and place document content inside. # - # Returns the content placed in the Liquid-rendered layouts + # Returns String rendered content def place_in_layouts(content, payload, info) output = content.dup layout = layouts[document.data["layout"]] - - Jekyll.logger.warn( - "Build Warning:", - "Layout '#{document.data["layout"]}' requested in "\ - "#{document.relative_path} does not exist." - ) if invalid_layout? layout + validate_layout(layout) used = Set.new([layout]) @@ -171,33 +152,87 @@ def place_in_layouts(content, payload, info) payload["layout"] = nil while layout - payload["content"] = output - payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) - - output = render_liquid( - layout.content, - payload, - info, - layout.relative_path - ) - - # Add layout to dependency tree - site.regenerator.add_dependency( - site.in_source_dir(document.path), - site.in_source_dir(layout.path) - ) if document.write? - - if (layout = layouts[layout.data["layout"]]) + output = render_layout(output, layout, info) + add_regenerator_dependencies(layout) + + if (layout = site.layouts[layout.data["layout"]]) break if used.include?(layout) used << layout end end - output end + # Checks if the layout specified in the document actually exists + # + # layout - the layout to check + # Returns nothing + private + def validate_layout(layout) + Jekyll.logger.warn( + "Build Warning:", + "Layout '#{document.data["layout"]}' requested "\ + "in #{document.relative_path} does not exist." + ) if invalid_layout?(layout) + end + + # Render layout content into document.output + # + # Returns String rendered content private + def render_layout(output, layout, info) + payload["content"] = output + payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) + + render_liquid( + layout.content, + payload, + info, + layout.relative_path + ) + end + private + def add_regenerator_dependencies(layout) + site.regenerator.add_dependency( + site.in_source_dir(document.path), + site.in_source_dir(layout.path) + ) if document.write? + end + + # Set page content to payload and assign pager if document has one. + # + # Returns nothing + private + def assign_pages! + payload["page"] = document.to_liquid + payload["paginator"] = if document.respond_to?(:pager) + document.pager.to_liquid + end + end + + # Set related posts to payload if document is a post. + # + # Returns nothing + private + def assign_related_posts! + if document.is_a?(Document) && document.collection.label == "posts" + payload["site"]["related_posts"] = document.related_posts + else + payload["site"]["related_posts"] = nil + end + end + + # Set highlighter prefix and suffix + # + # Returns nothing + private + def assign_highlighter_options! + payload["highlighter_prefix"] = converters.first.highlighter_prefix + payload["highlighter_suffix"] = converters.first.highlighter_suffix + end + + private def permalink_ext if document.permalink && !document.permalink.end_with?("/") permalink_ext = File.extname(document.permalink) @@ -205,6 +240,7 @@ def permalink_ext end end + private def converter_output_ext if output_exts.size == 1 output_exts.last @@ -213,6 +249,7 @@ def converter_output_ext end end + private def output_exts @output_exts ||= converters.map do |c| c.output_ext(document.extname) From d49c78177986365dd204442e09b35c9086647a5f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Mar 2017 01:20:50 -0400 Subject: [PATCH 2062/4996] Address my comments in #5052. --- lib/jekyll/page.rb | 8 ++++---- lib/jekyll/renderer.rb | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 2fb899cc5e3..02c6cfae9f1 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -129,10 +129,10 @@ def process(name) # # Returns String rendered page. def render(layouts, site_payload) - self.output = _renderer.tap do |renderer| - renderer.layouts = layouts - renderer.payload = site_payload - end.run + site_payload["page"] = to_liquid + site_payload["paginator"] = pager.to_liquid + + do_layout(site_payload, layouts) end # The path to the source file diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 3a4aedc9d0f..eb1f54ab509 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -67,8 +67,7 @@ def run # rubocop: disable AbcSize def render_document info = { - :filters => [Jekyll::Filters], - :registers => { :site => site, :page => payload["page"] } + :registers => { :site => site, :page => payload["page"] }, } output = document.content if document.render_with_liquid? @@ -169,11 +168,12 @@ def place_in_layouts(content, payload, info) # Returns nothing private def validate_layout(layout) + return unless invalid_layout?(layout) Jekyll.logger.warn( "Build Warning:", "Layout '#{document.data["layout"]}' requested "\ "in #{document.relative_path} does not exist." - ) if invalid_layout?(layout) + ) end # Render layout content into document.output @@ -194,10 +194,11 @@ def render_layout(output, layout, info) private def add_regenerator_dependencies(layout) + return unless document.write? site.regenerator.add_dependency( site.in_source_dir(document.path), site.in_source_dir(layout.path) - ) if document.write? + ) end # Set page content to payload and assign pager if document has one. From 20ed6d0a3ccdd760bbaab15a30f1e335bb079673 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Mar 2017 01:23:54 -0400 Subject: [PATCH 2063/4996] Update history to reflect merge of #5052 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ec0b2ca85b0..fd2ba1a8079 100644 --- a/History.markdown +++ b/History.markdown @@ -44,6 +44,7 @@ * Fix Appveyor with DST-aware cucumber steps (#5961) * Use Rubocop v0.47.1 till we're ready for v0.48 (#5989) * Test against Ruby 2.4.0 (#5687) + * rubocop: lib/jekyll/renderer.rb complexity fixes (#5052) ### Site Enhancements From 1b1fe27d75c1f4933138b7738a006749d7bba65c Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 31 Mar 2017 11:00:08 +0530 Subject: [PATCH 2064/4996] Re-surface missing public methods in `Jekyll::Document` (#5975) Merge pull request 5975 --- lib/jekyll/document.rb | 70 +++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 386683d6d5a..a37ca1e41f5 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -3,10 +3,13 @@ module Jekyll class Document include Comparable + extend Forwardable attr_reader :path, :site, :extname, :collection attr_accessor :content, :output + def_delegator :self, :read_post_data, :post_read + YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m DATELESS_FILENAME_MATCHER = %r!^(?:.+/)*(.*)(\.[^.]+)$! DATE_FILENAME_MATCHER = %r!^(?:.+/)*(\d{2,4}-\d{1,2}-\d{1,2})-(.*)(\.[^.]+)$! @@ -375,6 +378,38 @@ def respond_to_missing?(method, *) data.key?(method.to_s) || super end + # Add superdirectories of the special_dir to categories. + # In the case of es/_posts, 'es' is added as a category. + # In the case of _posts/es, 'es' is NOT added as a category. + # + # Returns nothing. + def categories_from_path(special_dir) + superdirs = relative_path.sub(%r!#{special_dir}(.*)!, "") + .split(File::SEPARATOR) + .reject do |c| + c.empty? || c == special_dir || c == basename + end + merge_data!({ "categories" => superdirs }, :source => "file path") + end + + def populate_categories + merge_data!({ + "categories" => ( + Array(data["categories"]) + Utils.pluralized_array_from_hash( + data, + "category", + "categories" + ) + ).map(&:to_s).flatten.uniq, + }) + end + + def populate_tags + merge_data!({ + "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten, + }) + end + private def merge_categories!(other) if other.key?("categories") && !other["categories"].nil? @@ -445,41 +480,6 @@ def modify_date(date) end end - # Add superdirectories of the special_dir to categories. - # In the case of es/_posts, 'es' is added as a category. - # In the case of _posts/es, 'es' is NOT added as a category. - # - # Returns nothing. - private - def categories_from_path(special_dir) - superdirs = relative_path.sub(%r!#{special_dir}(.*)!, "") - .split(File::SEPARATOR) - .reject do |c| - c.empty? || c == special_dir || c == basename - end - merge_data!({ "categories" => superdirs }, :source => "file path") - end - - private - def populate_categories - merge_data!({ - "categories" => ( - Array(data["categories"]) + Utils.pluralized_array_from_hash( - data, - "category", - "categories" - ) - ).map(&:to_s).flatten.uniq, - }) - end - - private - def populate_tags - merge_data!({ - "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten, - }) - end - private def generate_excerpt if generate_excerpt? From bdcdfa694f16154346d9d998b5befdeb319cb275 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 31 Mar 2017 01:30:09 -0400 Subject: [PATCH 2065/4996] Update history to reflect merge of #5975 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fd2ba1a8079..a25bb4158db 100644 --- a/History.markdown +++ b/History.markdown @@ -62,6 +62,7 @@ * Allow abbreviated post dates (#5920) * Remove dependency on include from default about.md (#5903) * Allow colons in `uri_escape` filter (#5957) + * Re-surface missing public methods in `Jekyll::Document` (#5975) ## 3.4.3 / 2017-03-21 From b807799f24685f5ca6d13a355840928a4a1b479d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Mar 2017 01:30:59 -0400 Subject: [PATCH 2066/4996] Specify version constraint in subcommand error message. (#5974) Merge pull request 5974 --- exe/jekyll | 4 ++-- lib/jekyll/external.rb | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/exe/jekyll b/exe/jekyll index 3bd37e544de..f0f41c93e6f 100755 --- a/exe/jekyll +++ b/exe/jekyll @@ -25,13 +25,13 @@ Mercenary.program(:jekyll) do |p| "Layouts directory (defaults to ./_layouts)" p.option "profile", "--profile", "Generate a Liquid rendering profile" - Jekyll::External.require_if_present(Jekyll::External.blessed_gems) do |g| + Jekyll::External.require_if_present(Jekyll::External.blessed_gems) do |g, ver_constraint| cmd = g.split("-").last p.command(cmd.to_sym) do |c| c.syntax cmd c.action do Jekyll.logger.abort_with "You must install the '#{g}' gem" \ - " to use the 'jekyll #{cmd}' command." + " version #{ver_constraint} to use the 'jekyll #{cmd}' command." end end end diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index 503569dba7a..bdefc798ae8 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -23,12 +23,25 @@ def require_if_present(names) require name rescue LoadError Jekyll.logger.debug "Couldn't load #{name}. Skipping." - yield(name) if block_given? + yield(name, version_constraint(name)) if block_given? false end end end + # + # The version constraint required to activate a given gem. + # Usually the gem version requirement is "> 0," because any version + # will do. In the case of jekyll-docs, however, we require the exact + # same version as Jekyll. + # + # Returns a String version constraint in a parseable form for + # RubyGems. + def version_constraint(gem_name) + return "= #{Jekyll::VERSION}" if gem_name.to_s.eql?("jekyll-docs") + "> 0" + end + # # Require a gem or gems. If it's not present, show a very nice error # message that explains everything and is much more helpful than the From a4d2ceb320628e9a35b6ca4dc25be25ed11836c3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 31 Mar 2017 01:31:00 -0400 Subject: [PATCH 2067/4996] Update history to reflect merge of #5974 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a25bb4158db..9822c68348c 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,7 @@ * Upgrade to Liquid v4 (#4362) * Convert StaticFile liquid representation to a Drop & add front matter defaults support to StaticFiles (#5871) * Add support for Tab-Separated Values data files (`*.tsv`) (#5985) + * Specify version constraint in subcommand error message. (#5974) ### Documentation From 4eb82706d8d508afd8c36bb65f0267d1021345df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kl=C3=ADmek?= Date: Fri, 31 Mar 2017 07:31:32 +0200 Subject: [PATCH 2068/4996] Mention Bash on Ubuntu on Windows (#5960) Merge pull request 5960 --- docs/_docs/windows.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index d3a0fa641d3..cc284567b6a 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -4,8 +4,9 @@ permalink: /docs/windows/ --- While Windows is not an officially-supported platform, it can be used to run -Jekyll with the proper tweaks. This page aims to collect some of the general -knowledge and lessons that have been unearthed by Windows users. +Jekyll with the proper tweaks. If you are using Windows 10 Anniversary Update, +the easiest way to run Jekyll is to use the new [Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about?f=255&MSPPError=-2147217396). +For older installations, this page aims to collect some of the general knowledge and lessons that have been unearthed by Windows users. ## Installation From 367c4521053fc4838615b6bddc4a82c065447b68 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 31 Mar 2017 01:31:33 -0400 Subject: [PATCH 2069/4996] Update history to reflect merge of #5960 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9822c68348c..0cfc736c6f7 100644 --- a/History.markdown +++ b/History.markdown @@ -34,6 +34,7 @@ * Require Ruby > 2.1.0 (#5983) * Fix broken link (#5994) * Default options for script/proof (#5995) + * Mention Bash on Ubuntu on Windows (#5960) ### Development Fixes From 201470902a7ccd7589e5c3276cf293f5d2001c96 Mon Sep 17 00:00:00 2001 From: "Yury V. Zaytsev" Date: Fri, 31 Mar 2017 07:32:14 +0200 Subject: [PATCH 2070/4996] Document `--unpublished` flag introduced in 91e9ecf (#5959) Merge pull request 5959 --- docs/_docs/frontmatter.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/_docs/frontmatter.md b/docs/_docs/frontmatter.md index cb55c444e53..cf5aad13f14 100644 --- a/docs/_docs/frontmatter.md +++ b/docs/_docs/frontmatter.md @@ -99,6 +99,14 @@ front matter of a page or post.
    +
    +
    ProTip™: Render Posts Marked As Unpublished
    +

    + To preview unpublished pages, simply run `jekyll serve` or `jekyll build` + with the `--unpublished` switch. Jekyll also has a handy drafts + feature tailored specifically for blog posts. +

    +
    ## Custom Variables From b7916f8a838e60658572d804e456e960633be225 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 31 Mar 2017 01:32:15 -0400 Subject: [PATCH 2071/4996] Update history to reflect merge of #5959 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0cfc736c6f7..a5c3cb5c666 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Fix broken link (#5994) * Default options for script/proof (#5995) * Mention Bash on Ubuntu on Windows (#5960) + * Document `--unpublished` flag introduced in 91e9ecf (#5959) ### Development Fixes From e4a09706f5b386a368ad4f3aa7a4b7e6630bfe21 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 31 Mar 2017 11:06:14 +0530 Subject: [PATCH 2072/4996] Add a template for custom 404 page (#5945) Merge pull request 5945 --- lib/site_template/404.html | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 lib/site_template/404.html diff --git a/lib/site_template/404.html b/lib/site_template/404.html new file mode 100644 index 00000000000..c472b4ea0a7 --- /dev/null +++ b/lib/site_template/404.html @@ -0,0 +1,24 @@ +--- +layout: default +--- + + + +
    +

    404

    + +

    Page not found :(

    +

    The requested page could not be found.

    +
    From 7c49070a0ecb2753b98d34b226a922a37a9f5079 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 31 Mar 2017 01:36:15 -0400 Subject: [PATCH 2073/4996] Update history to reflect merge of #5945 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a5c3cb5c666..e374b229883 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,7 @@ * Convert StaticFile liquid representation to a Drop & add front matter defaults support to StaticFiles (#5871) * Add support for Tab-Separated Values data files (`*.tsv`) (#5985) * Specify version constraint in subcommand error message. (#5974) + * Add a template for custom 404 page (#5945) ### Documentation From 0eb937935451377232724370b6228bb08f9a8cec Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 31 Mar 2017 11:16:15 +0530 Subject: [PATCH 2074/4996] Require `runtime_dependencies` of a Gem-based theme from its `.gemspec` file (#5914) Merge pull request 5914 --- Gemfile | 1 + docs/_docs/themes.md | 6 ++++++ features/theme.feature | 7 +++++++ lib/jekyll/plugin_manager.rb | 12 ++++++++++++ lib/jekyll/theme.rb | 4 ++++ .../test-dependency-theme.gemspec | 11 +++++++++++ test/test_plugin_manager.rb | 16 ++++++++++++++-- 7 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/test-dependency-theme/test-dependency-theme.gemspec diff --git a/Gemfile b/Gemfile index 8355c1b9570..7e509366d6d 100644 --- a/Gemfile +++ b/Gemfile @@ -27,6 +27,7 @@ group :test do gem "rspec-mocks" gem "rubocop", "~> 0.47.1" gem "test-theme", :path => File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) + gem "test-dependency-theme", :path => File.expand_path("./test/fixtures/test-dependency-theme", File.dirname(__FILE__)) gem "jruby-openssl" if RUBY_ENGINE == "jruby" end diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index 5ad3b2da8b2..6770a9ca998 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -206,6 +206,12 @@ Your theme's styles can be included in the user's stylesheet using the `@import` {% raw %}@import "{{ site.theme }}";{% endraw %} ``` +### Theme-gem dependencies + +From `v3.5`, Jekyll will automatically require all whitelisted `runtime_dependencies` of your theme-gem even if they're not explicitly included under the `gems` array in the site's config file. (NOTE: whitelisting is only required when building or serving with the `--safe` option.) + +With this, the end-user need not keep track of the plugins required to be included in their config file for their theme-gem to work as intended. + ### Documenting your theme Your theme should include a `/README.md` file, which explains how site authors can install and use your theme. What layouts are included? What includes? Do they need to add anything special to their site's configuration file? diff --git a/features/theme.feature b/features/theme.feature index 7729a0ebbb6..820283e889d 100644 --- a/features/theme.feature +++ b/features/theme.feature @@ -46,6 +46,13 @@ Feature: Writing themes And I should see "default.html from test-theme: I'm content." in "_site/index.html" And I should see "post.html from the project: I'm more content." in "_site/post.html" + Scenario: Requiring dependencies of a theme + Given I have a configuration file with "theme" set to "test-dependency-theme" + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And the "_site/test.txt" file should exist + Scenario: Complicated site that puts it all together Given I have a configuration file with "theme" set to "test-theme" And I have a _posts directory diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index 53c081130e6..fa183c628dd 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -15,6 +15,7 @@ def initialize(site) # # Returns nothing def conscientious_require + require_theme_deps if site.theme require_plugin_files require_gems deprecation_checks @@ -29,6 +30,17 @@ def require_gems ) end + # Require each of the runtime_dependencies specified by the theme's gemspec. + # + # Returns false only if no dependencies have been specified, otherwise nothing. + def require_theme_deps + return false unless site.theme.runtime_dependencies + site.theme.runtime_dependencies.each do |dep| + next if dep.name == "jekyll" + External.require_with_graceful_fail(dep.name) if plugin_allowed?(dep.name) + end + end + def self.require_from_bundler if !ENV["JEKYLL_NO_BUNDLER_REQUIRE"] && File.file?("Gemfile") require "bundler" diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index 803004f3ab8..045c91aa0c8 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -39,6 +39,10 @@ def configure_sass Sass.load_paths << sass_path end + def runtime_dependencies + gemspec.runtime_dependencies + end + private def path_for(folder) diff --git a/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec b/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec new file mode 100644 index 00000000000..f372354e275 --- /dev/null +++ b/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec @@ -0,0 +1,11 @@ +Gem::Specification.new do |s| + s.name = 'test-dependency-theme' + s.version = '0.1.0' + s.licenses = ['MIT'] + s.summary = "This is another theme used to test Jekyll" + s.authors = ["Jekyll"] + s.files = ["lib/example.rb"] + s.homepage = 'https://github.com/jekyll/jekyll' + + s.add_runtime_dependency "jekyll_test_plugin" +end diff --git a/test/test_plugin_manager.rb b/test/test_plugin_manager.rb index 702df593bb8..9217965b211 100644 --- a/test/test_plugin_manager.rb +++ b/test/test_plugin_manager.rb @@ -142,12 +142,24 @@ def with_no_gemfile end should "conscientious require" do - site = double + site = double({ + :config => { "theme" => "test-dependency-theme" }, + :in_dest_dir => "/tmp/_site/", + }) plugin_manager = PluginManager.new(site) + expect(site).to receive(:theme).and_return(true) + expect(site).to receive(:process).and_return(true) expect(plugin_manager).to( - receive_messages([:require_plugin_files, :require_gems, :deprecation_checks]) + receive_messages([ + :require_theme_deps, + :require_plugin_files, + :require_gems, + :deprecation_checks, + ]) ) plugin_manager.conscientious_require + site.process + assert site.in_dest_dir("test.txt") end end From e7a7215095b8abd8325b6e9646fe545c1bbaa974 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 31 Mar 2017 01:46:16 -0400 Subject: [PATCH 2075/4996] Update history to reflect merge of #5914 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e374b229883..1e1f1b18e42 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * Add support for Tab-Separated Values data files (`*.tsv`) (#5985) * Specify version constraint in subcommand error message. (#5974) * Add a template for custom 404 page (#5945) + * Require `runtime_dependencies` of a Gem-based theme from its `.gemspec` file (#5914) ### Documentation From a4c4388b8dc6b37878db2b94b3c4c60d8cd535f5 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 31 Mar 2017 07:48:54 +0200 Subject: [PATCH 2076/4996] Don't raise an error if URL contains a colon (#5889) Merge pull request 5889 --- lib/jekyll/url.rb | 9 +-------- test/test_url.rb | 10 ---------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index aefbebc9e26..8f3047d30cf 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -35,15 +35,8 @@ def initialize(options) # The generated relative URL of the resource # # Returns the String URL - # Raises a Jekyll::Errors::InvalidURLError if the relative URL contains a colon def to_s - sanitized_url = sanitize_url(generated_permalink || generated_url) - if sanitized_url.include?(":") - raise Jekyll::Errors::InvalidURLError, - "The URL #{sanitized_url} is invalid because it contains a colon." - else - sanitized_url - end + sanitize_url(generated_permalink || generated_url) end # Generates a URL from the permalink diff --git a/test/test_url.rb b/test/test_url.rb index fc3678d70d0..23ab9735861 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -61,16 +61,6 @@ class TestURL < JekyllUnitTest ).to_s end - should "throw an exception if the URL contains a colon" do - url = URL.new( - :template => "/:x/:y/:z", - :placeholders => { :x => "foo", :z => "bar" } - ) - assert_raises Jekyll::Errors::InvalidURLError do - url.to_s - end - end - should "check for key without trailing underscore" do _, matching_doc = fixture_document("_methods/configuration.md") assert_equal "/methods/configuration-configuration_methods_configuration", URL.new( From 57e93c463abb4ad73d2e879b65ede0b3dcabbfa8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 31 Mar 2017 01:48:55 -0400 Subject: [PATCH 2077/4996] Update history to reflect merge of #5889 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1e1f1b18e42..e203d2c2e60 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * Specify version constraint in subcommand error message. (#5974) * Add a template for custom 404 page (#5945) * Require `runtime_dependencies` of a Gem-based theme from its `.gemspec` file (#5914) + * Don't raise an error if URL contains a colon (#5889) ### Documentation From da5ee4685e9c9f9c4ba3b8bdd890507626ef842b Mon Sep 17 00:00:00 2001 From: Mer Date: Fri, 31 Mar 2017 07:00:51 +0100 Subject: [PATCH 2078/4996] Update upgrading.md to mention usage of `bundle update` (#5604) Merge pull request 5604 --- docs/_docs/upgrading.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/_docs/upgrading.md b/docs/_docs/upgrading.md index a1280672d96..e59187a496d 100644 --- a/docs/_docs/upgrading.md +++ b/docs/_docs/upgrading.md @@ -8,3 +8,6 @@ Upgrading from an older version of Jekyll? Upgrading to a new major version of J - [From 0.x to 1.x and 2.x](/docs/upgrading/0-to-2/) - [From 2.x to 3.x](/docs/upgrading/2-to-3/) + +If you are making a minor update (for example from 3.3.1 to the latest version at the time 3.3.2) run 'bundle update jekyll' when in your site directory. +If you would like to update all your gems, run 'bundle update' when in your site directory. From 5dee5a000ad9acb4ff3551a87328380c5b957dfd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 31 Mar 2017 02:00:52 -0400 Subject: [PATCH 2079/4996] Update history to reflect merge of #5604 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e203d2c2e60..2e7cf750bbd 100644 --- a/History.markdown +++ b/History.markdown @@ -39,6 +39,7 @@ * Default options for script/proof (#5995) * Mention Bash on Ubuntu on Windows (#5960) * Document `--unpublished` flag introduced in 91e9ecf (#5959) + * Update upgrading.md to mention usage of `bundle update` (#5604) ### Development Fixes From f3bfe2febde9d7289b4d027c4cb57ab49a497bd1 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Mar 2017 12:02:16 -0400 Subject: [PATCH 2080/4996] travis: upgrade to 2.4.1 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c582e11324f..a2bf5192376 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ language: ruby sudo: false rvm: - - &ruby1 2.4.0 + - &ruby1 2.4.1 - &ruby2 2.3.4 - &ruby3 2.2.7 - &ruby4 2.1.10 From 725c756ae14df9e20ce7d7046f2951467f1ebd87 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Mar 2017 12:04:36 -0400 Subject: [PATCH 2081/4996] travis: don't duplicate fmt & default-site tests --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index a2bf5192376..c8b8671bd42 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,10 +17,6 @@ matrix: env: TEST_SUITE=fmt - rvm: *ruby1 env: TEST_SUITE=default-site - - rvm: *ruby2 - env: TEST_SUITE=fmt - - rvm: *ruby2 - env: TEST_SUITE=default-site exclude: - rvm: *jruby env: TEST_SUITE=cucumber From faf5be46a588e782488cc163fdd29fc04ee73446 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 31 Mar 2017 14:44:46 -0400 Subject: [PATCH 2082/4996] Filters#time helper: Duplicate time before calling #localtime. (#5996) Merge pull request 5996 --- lib/jekyll/filters.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 3020bfbcb6b..ea0fc9054d5 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -352,7 +352,7 @@ def time(input) raise Errors::InvalidDateError, "Invalid Date: '#{input.inspect}' is not a valid datetime." end - date.to_time.localtime + date.to_time.dup.localtime end private From 55103132f953beed9a43434443994d65b568c392 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 31 Mar 2017 14:44:47 -0400 Subject: [PATCH 2083/4996] Update history to reflect merge of #5996 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 2e7cf750bbd..f96994ba2e9 100644 --- a/History.markdown +++ b/History.markdown @@ -71,6 +71,10 @@ * Allow colons in `uri_escape` filter (#5957) * Re-surface missing public methods in `Jekyll::Document` (#5975) +### fix + + * Filters#time helper: Duplicate time before calling #localtime. (#5996) + ## 3.4.3 / 2017-03-21 * Backport #5957 for v3.4.x: Allow colons in `uri_escape` filter (#5968) From 45b1f9e5ec4288f999f34d3c821bce74ca3f52a3 Mon Sep 17 00:00:00 2001 From: Adam Hollett Date: Mon, 3 Apr 2017 01:28:29 -0400 Subject: [PATCH 2084/4996] Fix missing quotation mark (#6002) Merge pull request 6002 --- docs/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 50750869674..989aa907eeb 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -603,7 +603,7 @@ collections: # Handling Reading safe: false include: [".htaccess"] -exclude: ["Gemfile", "Gemfile.lock", node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"] +exclude: ["Gemfile", "Gemfile.lock", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"] keep_files: [".git", ".svn"] encoding: "utf-8" markdown_ext: "markdown,mkdown,mkdn,mkd,md" From 370d28e290f9a7c01e00d81f9056734ab83d1289 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 3 Apr 2017 01:28:30 -0400 Subject: [PATCH 2085/4996] Update history to reflect merge of #6002 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f96994ba2e9..99b0c1851cf 100644 --- a/History.markdown +++ b/History.markdown @@ -40,6 +40,7 @@ * Mention Bash on Ubuntu on Windows (#5960) * Document `--unpublished` flag introduced in 91e9ecf (#5959) * Update upgrading.md to mention usage of `bundle update` (#5604) + * Fix missing quotation mark (#6002) ### Development Fixes From dede66936e814b7c0ef133b38ea1389211ff6b89 Mon Sep 17 00:00:00 2001 From: Tom Johnson Date: Tue, 4 Apr 2017 15:37:33 -0700 Subject: [PATCH 2086/4996] New tutorial: Convert an HTML site to Jekyll (#5881) Merge pull request 5881 --- docs/_data/tutorials.yml | 1 + docs/_tutorials/create-jekyll-theme.md | 490 +++++++++++++++++++++++++ docs/img/jekylllayoutconcept.png | Bin 0 -> 34133 bytes 3 files changed, 491 insertions(+) create mode 100644 docs/_tutorials/create-jekyll-theme.md create mode 100644 docs/img/jekylllayoutconcept.png diff --git a/docs/_data/tutorials.yml b/docs/_data/tutorials.yml index 809c7e55427..baf778963f9 100644 --- a/docs/_data/tutorials.yml +++ b/docs/_data/tutorials.yml @@ -4,6 +4,7 @@ - navigation - orderofinterpretation - custom-404-page + - create-jekyll-theme #- title: Another section # tutorials: diff --git a/docs/_tutorials/create-jekyll-theme.md b/docs/_tutorials/create-jekyll-theme.md new file mode 100644 index 00000000000..348ff31ad90 --- /dev/null +++ b/docs/_tutorials/create-jekyll-theme.md @@ -0,0 +1,490 @@ +--- +layout: tutorials +permalink: /tutorials/create-jekyll-theme/ +title: Create your first Jekyll theme +--- + +If you're looking for themes for your Jekyll site, you don't have to restrict yourself to existing Jekyll themes. It's pretty easy to convert almost any static HTML site into a Jekyll theme. + +In many ways, any site that is currently a static site *already* is a Jekyll site. Jekyll just allows you to automate parts of the site (like inserting pages into templates, rendering lists for navigation, generating feeds and sitemaps, and more) as it processes the files. + +Understanding how to convert any HTML site into a Jekyll website will open your world to many more options for Jekyll themes. Instead of searching online for "Jekyll themes," you can choose from the large variety of HTML templates for your site, quickly Jekyll-ize the HTML template as you need to, and build the output with Jekyll. + +Although websites can have sophisticated features and controls, we'll keep things simple in this tutorial. This tutorial contains the following sections: + +* TOC +{:toc} + +## Understand a basic Jekyll site + +First, let's start with a grounding in the basics. Stripping a Jekyll site down to an extremely basic level will help clarify what happens in a Jekyll site. If you haven't already installed the jekyll gem, [install it]({% link _docs/installation.md %}). + +A simple Jekyll site might consist of just 3 files: + +``` +├── _config.yaml +├── _layouts +│   └── default.html +└── index.md +``` + +Manually create these 3 files in a folder called `myjekyllsite`. (Put `default.html` inside a folder called `_layouts`.) Then populate the content of the `default.html` and `index.md` files as follows: + +**_layouts/default.html** + +```html + + + {% raw %}{{ content }}{% endraw %} + + +``` + +**index.md** + +```yaml +--- +title: My page +layout: default.html +--- + +Some **bold** content. +``` + +Now `cd` to `myjekyllsite` and build the site: + +``` +jekyll serve +``` + +When you build the site, you get a preview URL such as `http://127.0.0.1:4001/`. The site's files are built in the `_site` folder. + +This is a Jekyll site at the most basic level. Here's what is happening: + +* The `_config.yml` file contains settings that Jekyll uses as it processes your site. An empty config file will use default values for building a Jekyll site. For example, to convert Markdown to HTML, Jekyll will automatically use the [kramdown Markdown filter](https://rubygems.org/gems/kramdown/), without any need to specify it. +* Jekyll looks for files with [front matter tags]({% link _docs/frontmatter.md %}) (the two sets of dashed lines `---` like those in `index.md`) and processes the files (populating site variables, rendering any [Liquid](https://shopify.github.io/liquid/), and converting Markdown to HTML). +* Jekyll pushes the content from all pages and posts into the `{% raw %}{{ content }}{% endraw %}` tags in the layout specified (`default`) in the front matter tags. +* The processed files get written as `.html` files in the `_site` directory. + +You can read more about how Jekyll processes the files in [Order of Interpretation](/tutorials/orderofinterpretation/). + +With this basic foundation of how a Jekyll site works, you can convert almost any HTML theme into a Jekyll site. The following sections will take you through a step-by-step tutorial on converting an HTML template into a Jekyll site. + +## 1. Create a template for your default layout + +Find your HTML theme and save it as a default layout. If you're converting or cloning an existing site, you can right-click the page and view the source code. + +For example, suppose you're cloning your company site to create a documentation site with the same branding. Or suppose you have a personal site that you built with HTML and now want to make it a Jekyll theme. Get the HTML source code for your site. + +{: .note .info} +**Note:** Regardless of the site, check the license and make sure you have permission to copy the code. + +Copy and paste the source code into a file called `default.html`. Put the `default.html` file inside a folder called `_layouts`. This will be the default layout template for your pages and posts — that is, each page or post will use this layout when Jekyll builds the site. + +Note that in looking for templates, you want the HTML output of the template. If the template has PHP tags or other dynamic scripts, these dynamic elements will need to be converted to HTML or to [Liquid](https://shopify.github.io/liquid/) scripting where possible. Jekyll uses Liquid in its templating system to retrieve dynamic content. + +Open `default.html` into your browser locally to ensure the site looks and functions like it does online. You will likely need to adjust CSS, JS, and image paths so they work. + +For example, if the paths were relative on the site you copied, you'll need to either download the same assets into your Jekyll site or use absolute paths to the same assets in the cloud. (Syntax such as `src="//` requires a prefix such as `src="http://` to work in your local browser.) + +Jekyll provides some [filters](/docs/templates/#filters) to prepend a site URL before path. For example, you could preface your stylesheet like this: + +```liquid +{% raw %}{{ "/assets/style.css" | relative_url }}{% endraw %} +``` + +The `relative_url` filter will prepend the `baseurl` value from your config file to the input. This is useful if your site is hosted at a subpath rather than the root of the domain (for example, `http://mysite.com/blog/`). + +You can also use an `absolute_url` filter. This filter will prepend the `url` *and* `baseurl` value to the input: + +```liquid +{% raw %}{{ "/assets/style.css" | absolute_url }}{% endraw %} +``` + +Again, both `url` and `baseurl` must be defined in your site's config file, like this: + +``` +url: http://mysite.com +baseurl: /blog +``` + +The result in the output will be `http://mysite.com/blog/assets/style.css`. + +Note that the `url` property of any page begins with a forward slash (`/`), so omit this at the end of your `url` or `baseurl` property. + +You don't have to prepend filters to link paths like this. You could also use relative links across your entire site. However you decide to code the paths to your assets, make sure they render correctly. + +Does your local `default.html` page look good in your browser? Are all images, styles, and other elements showing up correctly? If so, great. Keep going. You'll use this template as the layout for all your pages and posts. + +In the next section, you'll blank out the content of the layout and replace it with placeholder tags that get populated dynamically with your Jekyll pages. + +## 2. Identify the content part of the layout + +In `default.html`, find where the page content begins (usually at `h1` or `h2` tags). Replace the title that appears inside these tags with `{% raw %}{{ page.title }}{% endraw %}`. + +Remove the page content (but not code from the top nav, sidebar, or footer) and replace the page content with `{% raw %}{{ content }}{% endraw %}`. + +Check the layout again in your browser and make sure you didn't corrupt or alter it up by inadvertently removing a crucial `div` tag or other element. The only change should be to the title and page content, which are now blanked out or showing the placeholder tag. + +## 3. Create a couple of files with front matter tags + +Create a couple of files (`index.md` and `about.md`) in your root directory. + +In your `index.md` file, add some front matter tags containing a `title` and `layout` property, like this: + +```yaml +--- +title: Home +layout: default +--- + +Some page content here... +``` + +Create another page for testing called `about.md` with similar front matter tags. + +{: .note .info} +**Note:** If you don't specify a layout in your pages, Jekyll will automatically use the template labeled `default`. We specify it here only to make it explicit what's happening. + +## 4. Add a configuration file + +Add a `_config.yml` file in your root directory. In `_config.yml`, you can optionally specify the markdown filter you want. By default, [kramdown](https://kramdown.gettalong.org/)) is used (without the need to specify it). If no other filter is specified, your config file will automatically apply the following as a default setting: + +``` +markdown: kramdown +``` + +You can also specify [some options](https://kramdown.gettalong.org/converter/html.html) for kramdown to make it behave more like Github-flavored Markdown: + +``` +kramdown: + input: GFM + auto_ids: true + hard_wrap: false + syntax_highlighter: rouge +``` + +## 5. Test your pages + +Now run `jekyll serve` and toggle between your `index.html` and `about.html` pages. The default layout should load for both pages. + +You've now extracted your content out into separate files and defined a common layout for pages. + +You could define any number of layouts you want for pages. Then just identify the layout you want that particular page to use. For example: + +``` +--- +title: Sample page +layout: homepage +--- +``` + +This page would then use the `homepage.html` template in the `_layouts` folder. + +You can even set [default front matter tags](/docs/configuration/#front-matter-defaults) for pages, posts, or [collections]({% link _docs/collections.md %}) in your `_config.yml` file so that you don't have to specify the layout in your front matter tags. However, setting defaults is more advanced than this basic tutorial will cover. + +## 6. Configure site variables + +You already configured the page title using `{% raw %}{{ page.title }}{% endraw %}` tags. But there are more `title` tags to populate. Pages also have a [`title`](https://moz.com/learn/seo/title-tag) tag that appears in the browser tab or window. Typically you put the page title followed by the site title here. + +In your `default.html` layout, look for the `title` tags below your `head` tags: + +``` +ACME Website +``` + +Insert the following site variables: + +``` +{% raw %}{{ page.title }} | {{ site.title }}{% endraw %} +``` + +Open `_config.yml` and add a `title` property for your site's name. + +``` +title: ACME Website +``` + +Any properties you add in your `_config.yml` file are accessible through the `site` namespace. Similarly, any properties in your page's front matter are accessible through the `page` namespace. Use dot notation after `site` or `page` to access the value. + +Stop your Jekyll server (**Ctrl + C**) and restart it. Verify that the `title` tags are populating correctly. + +{: .note .info} +**Note:** Every time you modify your config file, you have to restart Jekyll for the changes to take effect. When you modify other files, Jekyll automatically picks up the changes when it rebuilds. + +If you have other variables to populate in your site, do so following this same pattern. + +## 7. Show posts on a page + +It's common to show a list of posts on the homepage. First, let's create some posts so that our loop will have something to display. + +Add some posts in a `_posts` folder following the standard `YYYY-MM-DD-title.md` post format: + +* `2017-01-02-my-first-post.md` +* `2017-01-15-my-second-post.md` +* `2017-02-08-my-third-post.md` + +In each post, add some basic content: + +``` +--- +title: My First Post +layout: default +--- + +Some sample content... +``` + +Now let's create a layout that will display the posts. Create a new file in `_layouts` called `home.html`. In your `home.html` layout, add the following logic: + +``` +--- +layout: default +--- + +{% raw %}
      +{% for post in site.posts %} +
    • {{ post.title}} + +
    • +{% endfor %} +
    {% endraw %} +``` + +Create a file called `blog.md` in your root directory and specify the `home` layout: + +``` +--- +title: Blog +layout: home +--- +``` + +In this case, `home.md` will be pushed into the `{% raw %}{{ content }}{% endraw %}` tags in the `home` layout. Then the `home` layout will be pushed into the `{% raw %}{{ content }}{% endraw %}` tags of the `default` layout. + +### How layouts work + +When a layout specifies another layout, it means the content of the first layout will be stuffed into the `{% raw %}{{ content }}{% endraw %}` tag of the second layout. As an analogy, think of Russian dolls that fit into each other. Each layout fits into another layout that it specifies. + +The following diagram shows how layouts work in Jekyll: + +Concept of Jekyll layouts + +In this case, the content from a page that specifies the layout `page` gets pushed into the `{% raw %}{{ content }}{% endraw %}` tag of the layout file named `page`. Because the `page` layout itself specifies another layout (`docs`), the content from `page` gets pushed into the `{% raw %}{{ content }}{% endraw %}` tag in the `docs` layout. Because the `docs` layout specifies another layout (`default`), the content from docs gets pushed into the `{% raw %}{{ content }}{% endraw %}` tag of the `default` layout. + +You don't need multiple layouts. You could just use one: `default`. You have options for how you design your site. In general, it's common to define one layout for pages and another layout for posts, but for both of these layouts to inherit the `default` template (which usually defines the top and bottom parts of the site). + +In your browser, go to `home.html` and see the list of posts. (Note that you didn't have to use the method described here. You could have simply added the `for` loop to any page, such as `index.md`, to display these posts. But given that you may have more complex logic for other features, it can be helpful to store your logic in templates separate from the page area where you frequently type your content.) + +### For loops + +By the way, let's pause here to look at the `for` loop logic a little more closely. [For loops in Liquid](https://help.shopify.com/themes/liquid/tags/iteration-tags#for) are one of the most commonly used Liquid tags. For loops let you iterate through content in your Jekyll site and build out a result. The `for` loop also has [certain properties available](https://help.shopify.com/themes/liquid/objects/for-loops) (like first or last iteration) based on the loop's position in the loop as well. + +We've only scratched the surface of what you can do with `for` loops in retrieving posts. For example, if you wanted to display posts from a specific category, you could do so by adding a `categories` property to your post's front matter and then look in those categories. Further, you could limit the number of results by adding a `limit` property. Here's an example: + +```liquid +{% raw %}
      +{% for post in site.categories.podcasts limit:3 %} +
    • {{ post.title}} + +
    • +{% endfor %}{% endraw %} +``` + +This loop would get the latest 3 posts that have a category called `podcasts` in the front matter. + +## 8. Configure navigation + +Now that you've configured posts, let's configure page navigation. Most websites have some navigation either in the sidebar or header area. + +In this tutorial, we'll assume you've got a simple list of pages you want to generate. If you only have a handful of pages, you could list them by using a `for` loop to iterate through the `site.pages` object and then order them by a front matter property. + +Identify the part of your code where the list of pages appears. Usually this is a `
        ` element with various child `
      • ` elements. Replace the code with the following: + +```html +{% raw %}
          + {% assign mypages = site.pages | sort: "order" %} + {% for page in mypages %} +
        • {{ page.title }}
        • + {% endfor %} +
        {% endraw %} +``` + +This example assumes each page would have front matter containing both a `title` and `order` property like this: + +``` +--- +title: My page +order: 2 +--- +``` + +Here the `order` property will define how the pages get sorted, with `1` appearing first in the list. + +You could also iterate through a list of pages that you maintain in a separate data file. This might be more appropriate if you have a lot of pages, or you have other properties about the pages you want to store. + +To manage page links this way, create a folder in your Jekyll project called `_data`. In this folder, create a file called `sidebar_links.yml` with this content: + +``` +- title: Sample page 1 + url: /sample1/ + +- title: Sample page 2 + url: /sample2/ + +- title: Sample page 3 + url: /sample3/ +``` + +(You can store additional properties for each item in this data file as desired. Arrange the list items in the order you want them to appear. + +To print the list of pages from the data file, use code like this: + +```html +{% raw %}
          + {% for p in site.data.sidebar_links %} +
        • {{ p.title }}
        • + {% endfor %} +
        {% endraw %} +``` + +If you have more sophisticated requirements around navigation, such as when building a documentation site, see the [detailed tutorial on navigation](/tutorials/navigation/). + +## 9. Simplify your site with includes + +Let's suppose your `default.html` file is massive and hard to work with. You can break up your layout by putting some of the content in include files. + +Add a folder called `_includes` in your root directory. In that folder, add a file there called `sidebar.html`. + +Remove your sidebar code from your `default.html` layout and insert it into the `sidebar.html` file. + +In place of sidebar code in `default.html`, pull in your include like this: + +```liquid +{% raw %}{% include sidebar.html %}{% endraw %} +``` + +You can break up other elements of your theme like this, such as your header or footer. Then you can apply these common elements to other layout files. This way you won't have duplicate code. + +## 10. RSS feed + +Your Jekyll site needs an RSS feed. Here's the [basic RSS feed syntax](http://www.w3schools.com/xml/xml_rss.asp). To create an RSS file in Jekyll, create a file called `feed.xml` in your root directory and add the following: + +```xml +--- +layout: null +--- + +{% raw %} + + + + {{ site.title }} + {{ site.url }} + {{ site.description }} + {{ site.time | date_to_rfc822 }} + {% for post in site.posts %} + + + {{ post.content | escape | truncate: '400' }} + + {{ post.date | date_to_rfc822 }} + + {{ post.url | prepend: site.url }} + + + {% endfor %} + +{% endraw %} +``` + +Make sure your `_config.yml` file has properties for `title`, `url`, and `description`. + +This code uses a `for` loop to look through your last 20 posts. The content from the posts gets escaped and truncated to the last 400 characters using [Liquid filters](https://help.shopify.com/themes/liquid/filters). + +In your `default.html` layout, look for a reference to the RSS or Atom feed in your header, and replace it with a reference to the file you just created. For example: + +```html + +``` + +You can also auto-generate your feed by adding a gem called [`jekyll-feed`][jekyll-feed]. This gem will also work on GitHub Pages. + +## 11. Add a sitemap + +Finally, add a [site map](https://www.sitemaps.org/protocol.html). Create a `sitemap.xml` file in your root directory and add this code: + +```xml +--- +layout: null +search: exclude +--- + +{% raw %} + + + {% for page in site.pages %} + + {{page.url}} + {{site.time | date: '%Y-%B-%d' }} + daily + 0.5 + + {% endfor %} + + {% for post in site.posts %} + + {{post.url}} + {{site.time | date: '%Y-%B-%d' }} + daily + 0.5 + + {% endfor %} + +{% endraw %} +``` + +Again, we're using a for loop here to iterate through all posts and pages to add them to the sitemap. + +You can also auto-generate your sitemap by adding a gem called [`jekyll-sitemap`][jekyll-sitemap]. This gem will also work on GitHub Pages. + +## 12. Add external services + +For other services you might need (such as contact forms, search, comments, and more), look for third-party services. For example, you might use the following: + +* For comments: [Disqus](https://disqus.com/) +* For a newsletter: [Tinyletter](https://tinyletter.com/) +* For contact forms: [Wufoo](https://www.wufoo.com/) +* For search: [Algolia Docsearch](https://community.algolia.com/docsearch/) + +For more details on services for static sites, see the [Third Parties](https://learn.cloudcannon.com/jekyll-third-parties/) list and tutorials from CloudCannon. + +Your Jekyll pages consist of HTML, CSS, and JavaScript, so pretty much any code you need to embed will work without a problem. + +As you integrate code for these services, not that if a page in your Jekyll site doesn't have front matter tags, Jekyll won't process any of the content. The page will just be passed to the `_site` folder when you build your site. + +If you do want Jekyll to process some page content (for example, to populate a variable that you define in your site's config file), just add front matter tags to the page. If you don't want any layout applied to the page, specify `layout: null` like this: + +``` +--- +layout: null +--- +``` + +## 13. Conclusion + +Although websites can implement more sophisticated features and functionality, we've covered the basics in this tutorial. You now have a fully functional Jekyll site. + +To deploy your site, consider using [Github Pages](https://pages.github.com/), [Amazon AWS S3](https://aws.amazon.com/s3/) using the [s3_website plugin](https://github.com/laurilehmijoki/s3_website), or just FTP your files to your web server. + +You can also take your Jekyll theme to the next level by [packaging it as a Ruby gem](docs/themes/#creating-a-theme). + +## Additional resources + +Here are some additional tutorials on creating Jekyll sites: + +* [Convert a static site to Jekyll](http://jekyll.tips/jekyll-casts/converting-a-static-site-to-jekyll/) +* [Building a Jekyll Site – Part 1 of 3: Converting a Static Website To Jekyll](https://css-tricks.com/building-a-jekyll-site-part-1-of-3/) + +[jekyll-sitemap]: https://help.github.com/articles/sitemaps-for-github-pages/ +[jekyll-feed]: https://help.github.com/articles/atom-rss-feeds-for-github-pages/ diff --git a/docs/img/jekylllayoutconcept.png b/docs/img/jekylllayoutconcept.png new file mode 100644 index 0000000000000000000000000000000000000000..fe302c0a9d1f5f3430eb5771443fd41023130c23 GIT binary patch literal 34133 zcma&NWl&sQ&@D^|?tuiC;1Jy11`WYUAb4l?Y-gN+4YV1jNxONf1STR3X>R?->tzj0?F zqo8EHpyCA?Ycz;4gKH4~EQBYBCdCindK5XA!BYClNz$=>n(>=E?}PvPDLV@$J3qHtrPJ;H4Pu~J4i*TBd?TDH3zj?x3v|H)nUTw8>J9ij3Qly*on9nW;XU3Pt4ekhsGU2V>@RiP2BVs;R!bU-qL z`a*`!MPkkm9N8|Kq^^?#-^WH@Pv8^&2-9=lPG-_-5WE6Q}lh9R#NK|S0nFgFb?f1;5>o_ zE78;wn`23_n{ixF>cTtoQVHe0^0U_Pgo?8R~h{#t|;!-&RK|~31 z&V%Y^Tc7b3K|em-6VeaTPcf1y+&vs2z+^SyeR*V`F$AEzyx<9Ogj3qv3O&+5p6{l8viiNm)z;= zLfSm}ZPymjvp9HJGD+{~KB=GI_MT0JFVmWHWL3WjM&^dN$+4}ZLr^^8<$(7L7^*cj z!`HTg8fD+ffO~9uaQxn#$_N61D3TVyv|cOhqxQo`I?odWCG;(=&`(*E*MkC)EBCgs zteqqc@+Mb}SF$-alIr>nOXV(g0M8Y?*3GZ3rq*#W%;4yL3wHVnDX8yX&ls?N-7MTu z^Kt72(u{rCk1bdu5TBb`QjTGKUY*3FEpVa>a<;t|o5!>h-eQ?l^}ZX1+vONf8cdGW z*AhWTB`s*1i%}sqXuigH#MbAM2!jm=IJ&rtLgFMj?mKC=txJv&AuOG~AP)@*;Tx#o z5mU$z5ZaxAI>nlX(?C#-oqC^oVgb=&gsJror(f=}{1a7&!!`%CMi5bai9oou<5WP+EBp0)_?muuI`E&&KHBcHw54wo|mQ21-Ig zkjZzlR#sNl*Y)8X939`87`eE(`1*>x{jFX(t0AjokmX3!1Ae2Iw_FE>tGxpbB`JzE z&pXeZrI4f^`wH#mgqSp2rVQ+lElF$(8hU@-o6}My=Rq+RAG77R^EiA8I4@0VOJEss z6cNG(l~c840{JsGBff&5Wd;l=eR<@MB|1*^$mAxD88?rXz?X#uh^M}>5fcsVqte%} zL9CRQ7Z)BL9{58L$Q-h^ra~6Kq$ZUR|x+`I<=INnb3juG;S8XSnk7^S89NUUQ(5r!c5%k#%>jtu^2MS?Rl1S8hL_ zcAhRIA_1kRs?e-`P9>oqdF-*aww|eT0fiaMt!?UUa`5tR>GcWGEI%~k;~<6#8=#j= z&fy>$e8xTej8B51`!bYM|M@~t1Pv1tNRL-nS4KugNhv8iJ3AW;6t~BVgXQ(i(1nwL zt{4&l6jW4i8&p0+aT;or?w?=Mf8! zvx^HTFCHczb^bMha5fbb^tyVZ@+DM@5fQd|Tw8oMrIO0+=pfBOJA}v~RSOc31pL*p z+;Q&Y-{9dliYiWAyO3_+Os{kyG)a^5gI&&-gEi?ky`wQ!+k7xMzNq}Izq(~WDmHhW zF8!u;VQz-1Fk!BU;3=!r&-C}w+LbJe@y3Hk(EjC{6?#iqxcm@4zThrBcer!5irVZFSl}DZffgRGEy-|_ z2Ym-6IJ$rg@;-xIPyMN4pX;W=m+s;Uv`+akl7&AEqt6#})9$|K+joq>DqfR>ZB{xe zGy+N3K5L&HDA^6`FOH`!91U6cq?snF7S+jp#ir)%c^YY%FnAXTW3er$TWFlmX;@kE zvrbDyTF8X_PHst$BW8=BOpu-3;RsqC5`ut(yo#n@>>u)Be0-dHSpJsS^9xrUaq#Z; zwz&>Bd0$N*TkB~vv}Tyu!Q0RTo|EdQbNiF`#v6KjG+QXC2nQWEtoK8XH6WzBiJ1Z$h|l-)2~3$C6s&F=4% zX(bZT;c;of2u<9(alIdMG&iS@x&RIp^w4T!{;jovg{5U)lT66fgh|Zdz-&T7!o|f! zyXWnKdpv?gbe|QUG|ZH)j!t=}5qTf`+a9#~K;7aM-=RBY_W6$IS$kTsS(>oweeB{N zdWZfEEfFOMzTWsIrm8jkK0Ao4hc`%!C>FVu)(%Dlh!z^bn;Pplify(p!SSYz*2L29 zW?$0D&8IVCBuL+L&!<#vapiVA6cgqMY4PEX7Uq$MfI?GL*L$kmZHGx8y|;$mJ->NP zMt}R)*7#&-GU6-u4HVurC^R^)Hm-8jr_tXVWA#+yAU64=S#SjxOm@ zH~w9wicXz=1yy<>Qsq?wRt~Z;e>(mYa&R6M>6Bs;%PuwM;LQlB2V;5jD?-ia*r?Ph z=~2lgoPZdx4>5?w5Sz)3UnzIxcUAV)qrAh}>|qOQh6R#4?03TS2IQc)a7lsL|Z}qMqT_yep7{g3*!b zD>0#$4ukhB&B-!f=F@Y0h*1GMFXpeAD-410oW_9eA4_UBKYrwvmyb1!gOKcd=M6f^ zq>L2|HKju{T`LeEe1vV=MEpgOU;wZ+*sl8g4~!k7Gt^c*Xa=&KIe@1}gGKcO^eA20 ztYp5_glW~~7Gi-IEibd0Q^W@{=LLJXXd>^7l$S4aUam^M{A6DCc|7Jn1tC?-Tx8ap z>+aOxj?4?Wy1MdkaqSlZ;Y-0#rx5TTHpfaZ1xnTbA98nRMnglBAVV3aZ;c=LBgV(H zyu5squFkQ%+4fZniQFKsv9WOxzOm_q-Y%5wO%?_Ca%y6Ab#-Zpm|6@dKZ=U65FHsq z+>59$s|APgH(^HFRSvpkOhH&|!;Y~dLqjr<_f5U2ehSJP2{mmj+Gf^3g*{q0%4=(D z%ggK5&11(t+q*LqHPBH3g-Q16GXJWp`x|7~Y>5oMeCjP?|JVYcfE#?hxU8(PFSrR{ zh!>uXB(qh~k6!8mINd=jq?$_S1`$ehZujDs5cT3-6J?n$#BWB`|2|>ao~G;TI08kv znEITsaXnn$LRv~HxA?{*DVq83=7jU7_*7I8ap^IK$s}FMBITA$p)P9Gyxt1I==}7I zjB0_e*vLu*A-~JYMo)mP3v;uF6ciNPdHs97HI&OqNkL#Z3J<#YfQL6d4ph+Dxj9vD z@)Rf>ORMAVIB=NNzJBdmpqRqflchKMFdx6N*(NR~^*#&)Vq!s&b~!?lsSuJ~ctezP4oXTazv_li z6`<&gW*iW#S?qGhJFv&g#N~#egH5!|r&N)qKdO(6O2Mc?~5c z80!WuqVVXftl2rx^0B`mu$_JE@w@JM`T6-ZH8pK*#QJp1lzFW)Gc(`5eM>Ukt23QY zv$wYw7k|qImEqmO)%gDYO8BaO8_04G4-Y*(phAg{2{)JbFqr6c=rhybr~y=40f!f_ zTB0BXfaXh;zw@=GkB^T8tnoit^n?!$e7UsZv-McCoBZTm(npxXOxY1eWA2jOg^bxN zb%Z+>sDscwQQm>V=Y>u{mDmNs-W} ziMJ0e@D_zUr>fK!sZd)f71Q)b8uf-6zSQEFJvCq%uY?sQP`O9mgtqdX*Zj)DU2QOfauLSfu~_ zX{w2sk)Dndbw~v>8Qwv2n;e|GziIK0?2^$ z^CUfR#lGNaK2h0YzDDm8I!&ar4)4bw@zu!}R=2Ysnt)mwh>BxJN(<>*_FExDj);sj zZTIny1K?*E5fW5yJQ|-rGgt+sl9;=IsSZs#L05r(a&;Br;y`{2^z8gwA+vT<*Bt;d*QkK3vB|)_Zn+2Fcdb=retj@=SERwdTh{OMMOKy$EGa1|2etzc zxXl|N|J1TI&80P#+jaKnjLa%5bsWLl(Q{;GEi(5Ri6OUjhiK*o1i&T*_CYPCI9Pse zbg5At?(Lm5S9(@solG)MB!<`qlcQ7ciIqw}9tZZ&)|@dM;DGfrc*d|Q%FDUHa@InF zHU=Qf9M4#%9$Q{_8!M~6^UchMC29>f6Z@EtEfZfeWi$U=TsXWSWFDRXX^Y0w(vo3g zEaQ%}3ICH(Q&ACoL}aCa%aLf;6KRt$R`~Mqax0K?-ebPG6N)3%m&auZ3M11Wkhgk% zxRx3To9qgVy``jb6N7@l zBmPNmlOu)DNg^Fevt5o615Feb&l^qM!n`tl>1@s<3lu(^+8ZBoM44C_E6J?1EM%py zl8~jWNfRp3>NZTIZi_m?dlJI*1L`l8 zow?}}0=ZiQ=za4KhOamVQJ$1G8kvc3CV^ixt0&_}lt9P1;$iDq=;m&&l4!IWQpj|n zJmP(JdX$uuS4~GKSDXy_bSs+8dPl*UL&+s+(8PhS*~1pACi8Kh72%cpgvcNSR)30r zWb~SUHVn>IcmD61SL}rS7v>;w7@sxCs#*`XtwXm zWe$W+NMT}(XVt1h>VTsG0$YJebJ_Qnj>o|6Zpz+cwKV~XKrJ9#6 zG<}%c`sOr!k*0xAD6oi4QlFtN@j2?N<(9!>eR&NXR{qP~W~?|@uiA&lqB)dyW47!eDQ1 zZD9AgOS{Aftkq_iGhrSs+vmsgJk&D>VV%PqBR*b3b4j=fHtae2vJ!8lyg&-S22HwZ z_uaP_8LX_ig_^9;W8iGZ=~ipkI6G8kpr@!J!!dRyVqj?2=S}dQI|HJt=ba(H32A_` zJn7GUM+xhAG*^d{m|fZ_B&q;YJW_#A;GSmJ813G)JOSxyC|*Q;uzN?!y=+Xr+~xQq zv+pI3FUL<1kjm^ggzwe@oeyV^S36gEW*#FiuYda9|MY#@Bm=0|6W^ynU+roGcnXnw zu%gXs2T94%!OU-BYJay(y*>`~nvX(S+*LC+8*6Vrjths9o*jDME}LeT^n@IPfckPG ziqzOVIwU2YNaxVBOzuZS0_)TQ4O;wb-MEaPeB zeNG&S;)KkVFl;+z&JuH;whCf}LF{e@ljuvZXU0~ZvJ zt!Mqg4WMX!fbH=;w$y9gj1e%oYJCjsUdz`p;$`W)>u1^71NiQZke<`qUTGk8^;x6e zpP-HLhl;X*TZ@T@qDu%gy*LP$-X>+B|B6&)KoZR6P{ zoA&LU9YT(=8MQST-g*{V_ARgevsIJHDI2^;hA#ulV-o2xLPkr?jTglD$aKEaJg2O5Sp+s=18V-*;5`XP~-sqk| zgF0b#S-pBVY6(@NnlmYwnRI2eH~lPydp@(Q*HMk2T??Vw%in)gZu%TN(95=lyW>c7 zyM`ULKt3A0`{P?_Yn}&$Ta+IgMZXrc5hT{TKtgl#M<8YwrZ!jT#w>+7>>T`dVQFqI z)R659N==YVD^56ugey=uo16-6u{_nvS%b1PQGGwU)ohjFXS-154hl5y2E#VC&2zDi zdy*TRv!U(>MHJbV#ik6v<_yT$k&2}+92{79AiX>|RckB5@YDlM3Ok!o!tbsgU(xLN z)aFs+z(;y7yFKcl{J4Z*yLH!1&7;0w-^>d4NhG+GI=pS8>jbKE;VQMSDz$5KTi1F< zi52`S@50Bn$F?KvmjPU6zuY@KEUUd}wX_3DZ2CABp<;qeZxui(omN~*Toz^IhVkQP zoR0?hGCx3zqe2ow!DNv3Zhsv1ntf!00^P>K4pS;Snj%C~k?K-M zv@7ikfLizR^iYMZvdT(R)rNL<&I+Mg49?Y1DOu#&EqC)S>-a1-1A;(LEE~4Ga+mB! zg+llPaWUDY{V4DnjxJ-sF!k!X%<#yFd55@V55mEGv|gmWtAW_Lsde_=oySy2P2o}~ zp1$jQ^N{gCjnMjgZS*LwR|0W)?w_ z4TMlu&o}5p4gmQBw?_3H!v*eI(&KU*W+NWR8gS;Rq&!?f=O0TE&VoXgt(t;HPmv@g zsCcSYiB?H=IMmuz=xQpB?#4+8%`nYDNrvnv@N|?BNYmu2flLpGQ=eP$f zBt#B?utq)3_AVvB+F9$L-VF4_9g~8bvtcv}nAdLcX)>Un@-`*gA)(nyO~^D51G2zI zMUWfE*EhGqE^rr#EETM%dM!M`1)?Tme%nE6FpX9f_z~CunTFrcN+r2b1L<#j=_5}&+y#5#m3ex;wn%*m3REHf6Te@6^R2r(VN-FV zf{Y8nQ0R;(^u2MJwFS1hD?prTUiNn((q_h476g)YWILTE##jxWx2t!iZ@H(_^5Q5c zD(<#dR#(3}Fe8FrQWRgrj>oU~Sy_J;1I7U9p!94Ci`&X&ANJvLcrxV79F5Gp5Km!;A94{vAmbS||d68V8(UJg1CZ$~P z-$>`vh}`n%apS7ZAk~7ISOp2O zm4W4X4$mCsLSJ&b!-Ah!L4yo*n zU9gF*&C)&q52x6u--3;e=nV zX|vsYNl6)*eYY}yXUvX&gzRBC+}Coag^B#zbNP$nEMBhEn8c)5WOX01<=)-AY<#jU zno8a^Ha4atkHku}_sXYsd%64J2v+Mw$M^U5?*!u-u}yO;7s}(1nU-+~dm0%9t+%xB z%kXx9dX72udtC~#48$0Bk|R49o|D?w$Xa?Vs;0Bs*okUThz`6I$5>eiSZWxe>srqi zqEIUD^F?;^f<37hCU=%0;_&4DG2CQ#$4eubS?MqL_nrCp8Telj;_1f1SD&9|a1f~= z$OyDwY79|yqI^6l^h?LoQh&rMb8mJYxwU$EUPWioSn)=n;(hV6V;`khimb~0nMfavbpV~BP)kJ7 zJJ_wDYi%!1^Li~>sV;ZX=C!xC=NBEq5ppOAZA)O0pgO}3MWtC8 z_>7K*RtF^bDfwEHkaO;RQyto&NMdfWI@e1r6m`d$7no%NB#~}B8 zOJ|#_BAu7fdN2{0Lq{xz4xo6vD2}gUvW2jg93T4a^(@Cc|6#u$&p$sYxI?kOUabN1 zxMA=gcW#qLunDjGt^Xw{n!iBjzus!Sv-UYi>B7e~jmVIurCE1Y6ud^`df-%Zg2yq}jPOE^qLx6`-F3 z=7UYd)o53;w8N;cQMo?zN!ra|=}33-2*W|p^CX7>@^)jrEQ`eZ$@04eq1h4V^^3R_ z!XPb0>2&svrIAEG^y%a(rnAnnzo7CuTSvT^(^z!k@@kq}otj^!G7;u#sVt6F-!7euCY+B^M zg)QCiGOO>06$d7+r54~(^K3g}poG8mr}by6TXTOuPwW$27U#iJ2Z!wy0=(2{e)L(5 zNsVI1kg3y8@aTvqQigq)cHN||-@Gn7c5tfeztqv7`v9N4!rDnoOU1qDhg>g-fnC9@ z?k}gjml_@CSTE#jtxn|T%O_h*tMc>DA_wy>Z%n{xQPo~Q~Lhy@8$#Fu#;u$eA7SRf?vx)0hvIqFhq);hCE zN%r? zM|oKv0#t%$`}MwgJc^T(6QQaFnPN|cR2K}uBm-hwrf6<%#_IHbyh%<}h7MkN4w7o~c31SsM1ema_62Nkv6PX(^;c7V#4Dw6OKRoLHdoXhWKqU@58eLZOI1J)F}< zlu?S~L}Z&0-w_~NS#TpVW&<^w0iM{f~439k39?A0K-_ zQtuhO-)Sm?d!nNxZ+~y)VF`&k0hkjG9s0D(3Fp?X7;$<1+;hG`_1)&D_dkDfvwfi) zwe1|DCd*_~YCLvXsE`zFGPSJYl$IWhr;-20=p=C)9rBPJjP&-Wx_{YxV6B;5wfU}s z=^dIN^H1O6MH^e&U5gtm$py8X#a6*`|D6O&;YLZ4{buIbC=1J$mNAM6#^FEpEklWu z{3N3~h*@lUWSMpdUdOyAQT_?sr~uX4N9?a$QCSHYA8*jJ4$u^rUr!(a6BspTa&XR! z8iguW3?DgaWsF%Q0Fe+fpx&%B2T^>i}y!w-)N_hA^EMN5T@qr4I2TFx!>8q$zYYI6i z%Sbt1Y@C~&o&EcF?<*BWi9%Kni`)OmRiCqizhi9!)L^0E>^u_J7?#OUEyo?hj%144 z;uJVC*geTq5bW&awD!58x!GOn%i)HYU9m==_LfHUBB;;9wueOiFe`{{EKmo>v;#g^ zVL^#I5=@`teKY@f(yCa(*5a8xIJL02SkGz$`sj{JL1S_?@Hbj~?P;=WQJQ4BZM(Hr zixy=;P*t7Wo4D$c1yNLsovzDsrTkDVjLTheWz>%>! zH5E{4GQdB?Iwc+wA8$w`26W7vMDcRH=I(I`+l@dubPntd#S||b``Z9I(LkzxABC=% zd7r{zf7P=5IU{HGK8%N#Nie9krDcJXX)moMCW}jHZ+LhZ&_VzM1%O9Ve|$F$yNJ00GQe-PwOU^G=sD(>-V9EG|RX%^kf0 zR`EWeYFrOd`FKpjS??r>qnR3q5;Zh#FnDtqPEAh}tiib}*(hNCK-ncNJ$yh0XoOK( zw*#I-m7svu89H9g4Sz^d{?NHRdUrZX@HgWX(K9bITzy@prHN5oOl-`T4&x3eWo3julq5$sdJEaMzP^P5o`@g=YfOpI zP+-kGj`8S^?&M)Ff`y08imv=UwAK6P7F6dbc*G6ARov28oyH0sopp>DwV3-@!as4| zzWzfF*CT%gg^S>34=ZLCanD#|{`_jx)r1?jF=g7a#Tc_i2>EESujY^tD%-!*9pmw? zF5Dlf3MhHYG)sFM_C;0n<>lq?nXPWW~>>W`|V06bdFh?Spvv~ZGBLK+{U&kI%ehBA7n&n-KkAG)TDAYvr zP&TT3(2LTALS!BCh-~OvImmbQqu!Q|dT@Fdl_ z>u+ug6_oi^WD29qHS!AW3xoSMi)M|U(N9Smr#1Z4wzf|@aAE==B`9IK-PtkTc^c4; zMY?BCPfwE%2)5vp8N3o^_M0_8v)mxFnB~IyCptPh&o&*~<)vGEF)@$=TcfGrgPvDD z;TUX^-v!V;efI$pg=y4DT~PTt*WppjtnStfxjoG>?pF?|ykTH4prgM-@GLSdld-mD z8XTPZoI#xu85s%aIRN}P(@^qUWuN%*v5jc~1 zGbR;4_uC_A)=nk+F=lhRbDiz^DjZ(VX@K&huxTS&2*F}yVly0EFqW!zliiz|AQ<6y zCR^JhKOxydkubuYPunaReNnqKZ`mmZwv5vN*OQp8A}&JHE&ib)N}cQOJ)vgf2y-^} z(F1UaHgCusOHS%-t@p*&=cRzNQdAaxVb|PVImh+gmzUelSW#nRni*GDgt|N0q4K%4Z zZ4PYoyW~2g=a_nZyOm2*QwFWN9Y=#M=`k@F9rX}YD6&(v-xdD6cqV&n%*vNCh{;?(8EDre2xYAF^~rYw zj`#QdQ!cH2!q`l=CHx{))6|cmT7LfgdAitWi>t#5_!|0P4LT>h48fNZ0x!vyxb8}+ zVOdp?sz5PV*cf(~q^qW;rbcs25^nv<`%K%wP8~|HK%LamB|bMdm!W?AdULCtv|HA+ z>UB%Vh1cP9vD6`tup}fTHxm5Cw^T>4pLTS(ri-H?Rkp|~ZPkNSlu!Ln`JaV?u>dzl za^%Zss}t!);?mMmLcRCqa|2QK}iF?WL@X+RX-U3~?$xBmJ7xiLfYo8l=we6w}2oER( zjM0KTJUpJbKW?a?t*$InseCl1>JCt@489UqsOMhPY+UvYUGaK^>YIOM)Q%9GUA^{& zhoQUuyDUlUnci17VNp54*REyL#IZ0dHFc4C2G^HIh>zs6Vm>%zU{v}+n(Yt zB^;&~@TY4%x+lqfi8Gly9)m2WaFrjO-^w=GTKvL;hf=Y=X-IqggZ!DZ{Wa9Spp7C@ zO`L!^vg?1{wLL#9?r&lQ z1wL>X9QFB6lHn<|U0Z<2`j2Rka9&qiPYxh1%;-~~hdq`7*cdytps|OWA=rO!YE=Lu z>LLZ6cYe_hQBhTY-A8TYVV8Cna-<-IM^1es#_3n*qw|Zak%Qu6vx+v~i@H8OH{B z(2?zc+V}6RI)qyE5Sbq-#bFp%Gpb>sfTTN~hE~2EkX%$$ls#a56we-IG+}}>K-u30 zzJ%HdKJoi^+*Id$1C7$y>fRgEYgvA*Fcc~8n^PpdV|s4`*bdJ+z6)46)b1<|G~sdRV#-qTqyfNaA^ctoYxMR1f1lEKzkz{`5SB@j6<&7RkdbJ`&8ofiVIqf`chg!;|+YJ(jq-Ke?c+tjwg{ z)xu(lDV3KL?_~bnPOR_ouZ1L`;5IRvb4(LFS!A%0IFA$I!|{RBI}(lt{_MM_bF+&! zdq|(w;H&*GipxNyQzm(7U_Fs8Z2Xviu)$sz()Pt_3X_J@^vQ?Vh$lrxLEZ5aUC?Z4;N@m zqb;EcM~W+~8m-8&rGrj`*p`$u|sEoqU?=>WINoRGDmj0(JJS0OBrR<>KNRc% z)CG<<>$d*jG-%S>rk6Jdp=Z3=>}_BS$@R^RL+-r6(B&}KIR#`{n&eySKdiQ5p#zkP z^bUfRIkr;QlPmdal#BsWgrka$D)hO;DBW~94mX>lzBk;diYE+?4xK=zGY+uinJ(?w z&#Sx^HMKUV5Y@|o_z2641W^HQWc~&O;?U=^7noom@x1HD#Kql^rVnnKdb7zu%(RQi zhI%75(hMTwfE|YzD{`pl=;)}Z^e|iFbOQLn%NRTqoIt+9n9`9}nV;TseB~v(mf$OV z$TcgYFL25T);@h)3*xBXRjG`4LlC&^^xy;`yKO_u@>+fAQe+@^kP*L)!bi%U-hZ58 z&RGmO;`9K_lk;0Qa=mtlzP`+M&rTF^Dpoy?FdKPU8 z2_2gc^ue!h)~B$b%iCO3)UP{4pcj3@o|YET*RZC&9&ai6Se#<2@HM!@TK#NF;9M|B z>$NJ3=w;9k#Oa%rL3A32WoqIN9v(a@Z~zk?vZGuuM)Iz)L+y|^eoi;0-rP3e?99D= zWiNJzZ<=de#ry#CzPgGE=*>>y5@5trGLx|doH@I5j4UjJb5$dPju+NeI+>D;xDkJ& z08;raS>~Con-!S$?)@uribgWR$0f*ya+*0Vf9kVq8GCy2YO?T3r!GT5L8;>UBgjJZ zadiA?(YAAM_33Kk2}ST90kifYhk(E$YZZ4&H=XKY<6Pv<>iF}FK5v4M}cIO$Ic9m)SZ%B}b?zkOOEHkXUm>E#w#_xC4}6eLL`?92>`xa3H|S z+U1uum6R42g&x~kjmV$XcHH0mo+Fk)jp=f+Zq+w5QbCg9qD16*|7gBevsyNcPk&JZ zr#J?rK}1A!sdL15b16#JV}G8Uz|fsVH3PBm--ADIwXY;T2=J_W zaVX#ko2CP5x`bTUDX40`l`(f1hyctsZ%*@Nn_u+`LjkaxA4HM?)%q;I-Voxk3vZ0UVvx$vX&fav4Q(q(8DO7EE{Ob7t3jEUJVIhyshC&kA=S5g!pDq zvn=%gp1b?VMQJ`FwhFZa$ODCt*W)44wx;K-4hW@dKh)Qrl>he+o0^lY7%xq&G1|P} zQ$;mJASVg&Cx^3e=W-$BAMu3c0IRv^Ph=EoIpXZmdL(AYvar5s!9LGSbhqo|4bAc zL0dg!{3y>mj=-DjS^YP{*oRn3a5i!0o4aeH&(?(ordP7HnPe?Nclj;M{> z9=yulz`y_ymT1Y??xBO7(w%HgGtC>w#U&0U0onsj~*I&ZdEkU0M*gX=`+UO=~x#~s}60qr< z#Khj9VkQqvJUiggEh!MRqr+r?7|1kvS}%}N8FxhO^08I`|3eRN5$f$%@|}PcV4oP< zK(>sR&*~zpwHtBOX($|R^jDalWbR8#OX(RIgA4(o#WWrG;D8?3_p#&GFC;b@RiNWV zqew#bd8ehU33wFg+uGZ+U_-D82?>8Nyc4ZP61{k*r=fvNeYn3bcCY{YXHHH|Mn=ZE zik4O+zL#Vg)Y;jY>&pPmU$UGqG5EOAuZ#i$MAVc*zeD?ekq%!S!OvHRhe9?%WA1HX zgK6E$1zTlhpN_J?RmgAp){d0J1^D@^uFnU_OsO^4u|FCY7T~<@c8!{uda`NW1Qt0R zL*3vW;$I{R={Jk5u9aE%>~G;g24OgL6LeU9cO?8ybai|`HOCFAS@wuIF+D<#gd0hq zDS#K6R-iD+lkE}IpGq38?C8a%_;!1H`xicC8bbXBK-Qn*y&LI540%+8*_P~5;sFc=vjmb!jqZ*rE|J&2@g<&T=9)8wl28(3t}dk@0B zgncpe32dmgp^%U!YI1OR(8Pl5TV;viDxGpDTs`14_A@l`WN|?Z4pi908CKs05pX|7 zg8)1|Y3^p@1tM8oSjerk8k2gSNBc2HMjsC|HS%db7Ivxhe4367tb}x-Vs;+RD(#s@ zi>%5%{`MwDn+{i&xbzLoT46O>RE$xx1s2pEa+20w14 zj}03O2=BuwudDLyj^L-hm=|V?{r>nB`mTo#@gcera5F@1WQ%u`RwL&CKAqw*u6c3k z>Y|bofHht~{IIVKGGbk&PcdM)MI{@1Xqx!E3yC%k{I`WSOgbHQ^0_N z(^Si{(%z^mreX%Z1H1r|b%>j&G~Y&edwE@6-rE8w|Je8s9OPw#6855@0=cK4d?MG5 zg?=6`_9foA5G+tVfv4%R(#Px%qbFG6T4=E`z3aKGcbYbmRG6RYLg0$*`vA~n?=Atw zyA5MCursMj2FroJnhAR0kDTy%Wq#l4`8-e>b2UMUn`4Aw1X!;ndpk{jpLRZocwhf( z-<;058)@xy8YFR*W0=CqzCN52&p!byauBZ_4y+FyBz4}8E^Zx)z(}u>u+>B1Naw%D zPVorA<&!?HB~mycQ=Q(kN+Mj|9LF8I70;}lo?$j0(%tZ8_+f* z(}C$}6fN7d>P`T-_0Q!tTaW2;w0VTYn-JIUY5HXCi);1GNTsb@gTT@6yOd>u7+!gv&$j zGwGwoHULk*^T3&C7h}aMuL5|5xx1TLOUYaPp>mP`N&){-fSb7OO5u+HJ`qqB|K8px z`_AqF%4$|W^r&mCd2LT=!GDh4|8t`cv$5sa5~kOY6N&7X`HN_R8Ka|;WO}V^5D5*L zYz=qOif`COW}Cetp!atTc3#|fYs8tm64<54{1?FTE(%b38^9tNw!R<>3aQd1$U zr%LeuCO$M64Srv3uq@u}H}Gz2dYZgTGbNE0;IGTSGyW%UIq0K-w`Vz6T$q{vm*wx> z6g$a1G0DYhjrm5odfuPcR@{%~4kFS*(u{?yg%%jI>zDMzJ|t4k+5`0Mlq^(ye4SD3 zM<*xhLq)&kUYGMOx{|Vmwdvms1YwJA3iaQxD3A&|I#aQiljm=KE76QGrt)5Y$Jbvu zORa5fX5}{uW^vCE*A;*X4#|B`H&V$UZ!fKACv{xxUAHm!QvEopWr>CC9lV6_uzW+y#8&&9AYIo2eYrzt=y%KroN zwP>xdg7^2K6*7c!##~dDK`zV@0)eu+&2Bo8Jj6HcisRo>=kq)_V1lOW%SG@{g)J7< zkZKEB?~TDkw{pd&mZ3{M`}`XZv-X2ht0K-N8B;)?BOUY5QZsCF5Pq4MH7};Fowo$8 zfT6YZLMqGTbQ?GSAzkrDe*C^|pBtfA;gsh6#qRFE17Kt?wr_KprORkU3-z@-n82x( zTu|PK)75R@7C`T(CrBK)^>}PGnt54s#>wvg4T<-=D2F~jK_Ne^JJ+vpVs+E^e7c>U z$1}baeG*t67$-H)GW7N9>I7(^@<-9LPjYQ_8o+J%jysMo>$OiJ9aVX?NSR5S>?Tg& zG~Rho!5hCGhIo-j3HepRVUKSi5L;-B5RFz+UZbZQ;CO9Xk;VJ3Y?`>8V%m3v25QE8 z6n;`5%x$)-$N~Aa*#Jz9s*H~#)1J8pDGST7wmEF=maLLTTjy$gwiSIv>*0li>dgG| z)8cr zsdHq<1kQf%Z_o_RkwXklD`6i{o4RVH@eiu0skynkzaAbK0MNGf!*qR9Q_38nQW^;N zpv?esEAAjwZEbB$&1SdDJ^$DZDjYu?85!}4{br zsb4=LxkK4A{^`xjtE#FpGJNn^C(z#<0*slMCIy=tnO_e|&Yhja+qwaw4yIqiZf>0Z zc42Nl{f>q0t5)Rd-FiH^S`)>5sqVt3Y3Y7hya?xVur&yveF) z9R@%=2-L2 zfW+O~+gs(FDCpM#lG>8&mUbmexv(QV$inql0p$pAlmitz0hObqA{;{fQ4!E8W51J4+@|$Ob^eu03SThMXd{y4&W@mR|e|ZOV z{l1-Y;-FIc;yX*mD3``Fxk3s^(6$%|J-Tnd<0`;!R@G&w00zmra@@3qRKIKQ7el~I>-JrJL*O!(7j zw|u7;=jV|8Ue*^Zx?$M%j(_E3wIdf+SgX$Fx4-3^zTh4u|8hD7m=TOL9(?Y}o3n&g zi(l8MPba9~*)DsOUakccCQvMSTRv<|cR#w5K9c&B2LB=F!~v}F5Op+O;{+mQYY~wk zqKS?6fgcGuKb%kKX;xJTt1=7(#z7gP--8mUD?IBkSZaa1l^0SqWCh0bSnp}V zIzz^U4FbeMQuR6vEK~#+Epbq*2p#{@K`e30R zqxRjB`GHF?wiQnkk1o~GC%B$9mMA2)T-Bze08M(FJ^c;5XG;u2JmuNh1}))4K_CM% z)j8edIQbp2GEc|ZJWzlqR*!mbPb@cmHts7TsIgSn@ckWGAP&JAU`y@orG#`)Qc;~! ztS93?1m^)p`ZCJ+y1-gGyodxQ4$eGk0>~x0kbHPo)7p)+c#nZ7?oBSxJ~af;BT>OJ zHu$W@`!m;(uMP*qz9-|g-TwCHWpB6fK|@9cR;aQ-rwDE3zlXn z=+D8F0x@x4->1Yc2pY1wPFkvItvN)UMZd|X$Hu-6w4HDCBw*$@b|brk7H~XB!;M0t zTou0_uaQ;M*W)QuKgK#lgT~h2_~$iRzhul;(v>l|Y`IX~SxrDP%JU|+-)J+}`2Mp_ zVacyC|1@D6GQJ)Beo-L&IT6vh1nBj%4RBBMA%BB3n*nb;`_pQEc9fiaut=H|%K@xY zwW{$SOHc-+G2-A)#2&((Z{=;b;Qsu9V>7vWcCI0PV^7~a>@oE{wz;e-p$jkd}3$RL^8w&8Q zPEJpso1&un-egM%>t!=nj+LX{w+A48km~3$`nt6MZLBfCU9>!(I6&$f_WV)EwwKaL zfT;{uyvuYY6&4J8gTP=kFPBfiIwXK(gQg19i*r@rt^~8Q4gucI)Ioqsj>;h0sB$nf zED&e*SQP|HlW^E|4tlULGOpQ+JQC<`Hc7tJhN1#>dz0ATXDiIEjaH;{XP8Kky&L-^R!KXN{cA1tw<^T)zx*mg0PJ+r1JzO(?!x1=wI#}&|D6G{e@VB0+g z56)vLOD{F$1SpuZ78M^KpJ?_3#5wxuub7Xj>eu(-B&8F8_Bz^_LEA=EIFQG(7cTj> z>UB+WClAdAoV}q*C8V+sH)%YkFhBpp)o+$w^tpZ_R=d-x`ja5D(SO(A@jP!HG%{yq zRJ4F}RH&_KC#1N87VgjVG?}5TEknTQgurk?WBx_T+-NU-_O#?dmqxB%J-A|f4e^%Et6f_Jt zuw|4^pLaqg<#swynHi5PY;A4L%L@uY*06vP0%k1R+uQ4vKYu>obl*DrjuLy*8%6fP ze*{gV88{`Z`St=>B3sp;BRP9W0IuG+e1(7e%{btPF;_=&cHS)1N7m`^$2w-{XM^A; zp(2pI+G<+#nklP~Fk{o`wTS}E>=z8y2q2oz9CrDk^8NL$e#ciP8Hr>lz*{cMzqGQT^mDB z@4%40BQ#r(MuI||#%Yd89DZ`1o;=F7S3)YUlGH+FvKg}4-j>hh0OU?WD3kw(CMILn zZoCCU?)lbPtj2(~?XXJ5bsQkZixKn#^lk6%HFS>nLR`%Oxz)^UZ-2jX9q2@XJ^^r? zZdndEMS@jC3FA#-jlpR3T*fY6*TtffV4X5Q_d#h6bq z&D16@;OKbSo=R)Xdk7%1b6-p9i7qmLlZCo=7X={o`PY>5%}7H|{VFO9=W%q2Oh!jX zAzhdC158CUpuGZ(|2yf9!^vzDF+W8Q^CX{`xK0Iw~@Ccqi!Ri08J*R zJn3=2J}S=7k7RW(KA#r>IsvsHak!|_d|R$BeZ9RV!2RaAYvvT*Q_9C`c}F9EG`kVK z5KJ`+(k4f(bD>mVwFDmYo3de$YEHQ>TB(8xZbOw?9oxRz)LkrMcHq2g;^tzTJ9}9g zE@~(Ln4@HOX9uK0Y=h=Qm7??_eMP^13EaMaiJ7`9J+X6Udru# z)8IX+38fpX=5cKPlyIPJdV0L)ga@O95q)rQup_{3=_}hsLq}JO?5Cia?|skC26JD+EEAJ)B8Gch{R;bJmwV}-BV@;|hy zKl2x1#52V&JQPakFbb)ntZZ%^z3bHCHJ@BwKA!DI=MEu@Td5xQ)4aJbw$vIV`S4+@ z4XEEQ*=YS2>;?4L=*VP2gFw+wl9=!XSCNWosyIK7MRPK>_@8Rdsbl%fQ-|2dit2`z7sZG$*dWA8p_zixmZW z%00fCkguf1}fSD&b_)<~&VJN^wsWOxWaZp6LJ#E0O1N zmd~kaERe|0Ki25mi5q8FHksBZl z5|&QA#cAe&8r~PbHUZuy1z5yoA_{c)%<;5L7=0yWr2;|~p$*WU$2B3V`Vj9qXwUrt zs?rPf2iQBTTCZ}P#}T5ktRc$q-r-?RXuvSgr3qBNhCf6~?kd9N;c~4R5HWRO*SVc} zjT3v3Pj|@`4GAjF^fLc9M;VNojeUGnRcDJDEeJM2Fb>A+`7-f1CqbR;rT0!>a)$Z_ zx>BmE6I{J;v^Fz4Q|MD5v+#Ty7x7cTy&|(ew`-pFZDpXt3_b#BXPD2FyR^lM!>*qr zW%pAl9rYIe$jJo&Z|=?$5!H@4UXT6H0|x^G#X8H<%#N{u??DiLEk@jAp)&XZ3NAq) zLR_d+d7eF_)g9!B0)5y3Kjg7!C}o;yY2_k^*ZGEkg6C4InW@_+u<2j^u4TB&g#=UpxmG@zHeU#+6~M^i zR09i!7DLOvRAL8HC!@49Vsiy!Hxr0VhIpNajB0Z1seXMq@P#<(wwDL<>_^C`Ep>Mb zSJG|(qXgFSv@ILS^87MY5B$wCUZ>&``w^n018f8yBGGq&5dKjUb29!{S~tgwGO(yrkJ){c%||c;3Sd znvh{&y$1c@|2duRxt)l}s~{`94mH3k1s)$vZ)bOgy!2R21U+A)j(nr%l~T6y^5T7t zCbZ)mD{LxG7VX-tHIxL}KTKi`Y;BQ;jhT6rN03^Vsz5B5&u#-Qt_aisay_RSqa4}B zjSLFd=`-JCRCMo@^WPv-jgu{Dsp9D(Fd=-M(bx9Crx#`wp8=jtDtE_#J`88CtxZCy zQ(HpDW0zRKA$w?qLyW&3^%9kY-GlJ`F9Rgzpor6q$Zjj6>(bdh_w#z4W!tB%y!CD8 zrnx&fUeKq%sbt;#1=?i3z`jlbqTJzsLEGst0l3*%ga_h4(}8_~W>mFwp6>0y#jA|j zn&Pm(jlGTZ3TU=|9-2>?G;e?Yyw5|24<=Zs6!0CY!s~Ya8t*IGU|DNz!466*g7b@) zuSQl)eY`Z`qUxY^BCAD(R-IuI$Y%h^41Yy*T|7^em#5?Kf!<{}J)UEB>d?!PnEHf; zCT3}xBXY3%F?ovfoBM4Rz|pq$9aS|#k;G8KQ8?h03>fJUb+HXZ?)K*7#$tE^A22RdusM(OZf`yRD>&zArWxu2h=$0TKmPbmum!e90Bdsor* znGwoNOJHOLs8bpC7cHg{El27M4ws$JVu%}pFGl%-sU|$uLat9afTNeGTn%>sEL<`X z>C1l(ZrOjV)Qqp*DMt^*JVVbgI3kKWJs6uE2!X-y9F}-C>PWFUDiUKDuBF`f=M@T2 zTV?HQ1atiCwk#*4+g}I*361Oydy%@`urwU8Kh5nCk8E9ex)Ns;0ZIFIXJh!yiw|FI zN>r0SxB~{4^j*qZ|EyXyGMsOz9v4oNoGy-VbCS;cVh3>cYVV_OHJeH9bF%i!2Kt;i z8||~%%rUOm0d&?Gk$(HEYW6tS`5RG#5LrBnwVrB0KJ*V&1)-?4m79j=fOtk~#8C zOuV3e6rBlV$;p&4m`|OSR)v=asBB$zr9@V^w0Mk2x~x)DMS})JMN5YAVo3+Hld{mp zF57qRQjM6{dmE5P*D;Qc>Z25kH$S1pj`UWJSS|;0%QQKr2$m2wHtET|xQ+i)O}tYi z_4OkRa&tQ20~P}F_~h6r6Ca$`BRx=iW%||p@I3q4cK9u@(wQ=*m1K(m@6gJw2fLA_ z+&O`nC71eeY})u*=^8l9Is)U({clp3OYX-!sjvX=w0~8YU%G;$XhL%?ssqx4*sB-1I{}>ydNTI>)kkQ_&CDk0I*R5ib~bw9rKuq zBX~=jz&N(E!BkF`2VCL?OOK23&fEPoVp){O7rc*?j>Y@(afF_x)7eraL~5rdk`rly zaX7bO+kjNFxcaj-Tr~^h17L0s{~+E8%}br_T=UrobN6k1BI-n%ONnk>{$7!`;AZ@q zl>>ReS$bF|tpY3F84LZKrT}yLkKM$#wFC~hfv7z$rl_$ULtwx+6LV<4{KHp(tIzIR z`=6cz25&yDJl%@j=-o`I7?x`;ph>Kn4Zl_x$7!bd>vq(5+ybyx+P(Ft` z69?iNEn2G!0z%e~fIX3Ll55E$1v2}#!2S{e_ zra0~i6wQ~5?#wVDAR{0(5(7;KD5K({c}=@^pw&()rJ-T4nvl_G3lhR593)9seeQJG z9VB#!`Y~J7tX8e+Mq;Ce@92NKgm@2j!hEN?ZNk?~nM8scyEZ z5t~mguC7o}xr}(&*l=`(jf{=2udkWPfW6#bTBv1n-I!Rzbsve z*7BS$)?RjkTXweP4UKWvMbIRRbWJRC+G5jP>Fc?OBkO;Dv$fZHE#^ICL<9Q3l-mIXTM&ocl&*Q& zK$saG7(My#ZPI!~XN~`q4OmS82dZFqUntiXnQ>tnP{HKn;sW+ z>CfWgVaR7G0kXpmz-?G{Fcl3+l4(o;E}(?U*?O-u9J&yoWTHWmj;*}Eg+~ZYw}hYF z#3&&wKYdo28rE3BTw`XIr8_@AKTMR_N{x@l-XZV61FlfES)vtER#r#r5q#kw5#VG( zdjZEJzNIC=wmO)>3(&c4!H^P_@}{vOT>%Z~_rxI5Mg<*5X}V62bhIBpZ3SwHVC*m* zkhTH^lU}|7=HlAg8bCIJX@xiyJj2|=fX~*4`IVo{NeZw((6_J{Kt{+aq&qE|n2@kt zx%D@Y_Uhu|O<1BaCPVk}PjQfzvBMgC{(AG7G_8RY9UjeepGurbo2Qzkeo$A>IaiX9 z2$A~Z$JH;OXJ3&IQZP=t?4Df&s%>akDAy1j5}mUfb)EdRzJLDs3yb>$HwosLC}z>S z_M2?pS$r7M>=uFNS+&GL;zZeqLJVZ{eVMv5bO@#v78}Yl+6VZ0-*IV&ze3L5qQ@~e zX4%0YxJDq3XFO=&xKGc}IR!}>wZd|Kvm1o@mfBS{P9V0m9>8$)0eLn|xkl#ozE8ua z$|yOUQYeuw#dho7LAyFhBp`4@_6M-9J1D3DRqBc3a*JnLt_Ax6FcXsdx}pjqRJAY* zscE-|pla9|p6nY;6uggZ%q?(&&p+zle3tsrz2O^CT2dnXuIN_*YA4-%SBaB~tMK9p zmTNiAyPEqSQMi}PMBNU}q7h`iYU?`|GS=#rv4M9h)ULy*>aC`yQ8?r$1$tw5D*-C7 zf9hyH2Md%om{-KP^G*%waM8!oIT%vzp@mfx^T>+V*b&UEAo;li3x#=~K%&n^POz$7 zOQ$OQ*Y#e1-6|1d0v-7Wdwb!+is%F|92`yv+gi?XCEChQc00p6zv5tHyCtDM9}ye8S({YNV-!sOgtqJYtSMLHgynC2%SNCU+09Qb%GtaoQo7QF#iGfA+s ze#-&RKP7*hRQQDXqAP&mG8R755R#nXL|+j}Ymzx)DQzr#r$Ba+|E_BET#|mG<1_Lp zCVE2%c6uXI>Lz7qNQSHF7kQWTR;81FW6*^m9<`bkrs)(bSw&EuZDSL{@P4b; z(#f>)*QlMr_6$S#>&ku8GzD%{S`WfcUmV7bVm`+24RDt2CT|DjiMCV6(|jWRtnePR zXbxI&!qXqrPWB8j;Ir!ey?KFZ1aKqZG+I1vfmgMcx_a`g{|yjU3XgcLwg)^udcj7X zQEA`y`vUW1dSbDp2cQDB_2z7pt_(h zqVEhsAyOOt^^?~KcUt4FCO~$*2JP)LOipyd=d8sBfkYkT{=r%E;nH8x7$_aaxAIa0 ziaA?Kawr1+73*0+R}sd${&1ulKvzYF`d4R4##(xMq8JT`7lU2SMsHjEjvq*#FdW=S zm4F{RKvGGKvPSvvJlfbw&+Y!9JHhpKSAxqhPy5L+2s|@67;pcr<~RXNpPucbT^~JqNJofUln>{_sEEUbzqKFiGlc`b1y_09P@A^vGt*G?j<6Q)9I1 zoxtaJ>=(nGiPoQN^|fI-TCJ4NeqC}p{`(5p2P5k>i=gW3S)O6aVoL_A`nZDLzx@jk z1H6Znde|b6WgI++SUFube-4NIi?D2Zm?^-(|1@$oWd+4=fy`zG+|v7elldS(gQ+W7z%c2X-FW@brh`=8DPBSsAt%Gpl| zQtMwurf*9w?v;#WlJy@3QQtRci_WUW0EqzLhP(-)a^gFdnP<*}As|X}sa^D*m;-hV zY-9{+JLWRL1_6WVbm|m1B~X3S7Uo#b+n24a@+4}hlGNmY-tiyhQ(7^Tr@Hs#`V>tc z!baHg@*d8!YJZDSEZ!T)9d(RhfTB&&?h&XQh$yQ@)2mIxv4DXD!M&*=(0~}d8_@@6 ze5RguI_mQiEyPZV`|b`}^tBAiF`D zh!+jz-BjNzAB-m&g|jDS#z*g`tta<`#OWqBPhJj3>SK+NbF;odhfn0hbb zY5%PZK8=gK70C%N7cZ*s)-c%C^R{x-Ylmm8G>zRS7T89Fvy9AbyupJwH;@0vVr(y*ChA2s>G+t@K+F9E zqi0q^QCUMeSgb<{gufGAHjk4ig?w!Ivm*9Pi~2IPW$SMqPy4|iCKj?Eas>MD(#GeL zq&xZg>gi8ZE=uz??ZYocg5-{!H7c@xFAj4XT2yrB=?CA>&7!9@oswpY;d8(8L`L!K z6n&DaC57l3?K9KVG0mBuENp1sOyQ@`=N=l=o6>N_@w9Moc(>|TPbfiMQ!sdK`Ipo{ z{-=`b#yzuXaxxkqrpqdhG^UxDT9s)rj@J{06vX!pN+zJ##QQa9Hd2Kqx;UBO^vMvI zjquv8)XJKeY*)8zyO#g5A}tYpqEztA>tdL?H9UwEcIi6W&KZK{wTx#yewtc5PAoI! z$%*@<9ZnRsdW5lsL&KyNUT)H!gEm#My357Ot>ei+qolRfUCwcLRz;UP89nFpvk z4D>BgBz|5Z<=4g~m!-WxPtza5dx1295DuB|sGLxmt)9H32E+cY>D{ZR(M`B>g;zAp zxU>_mD;4+GXYqO*d^~$>sll>=ZH4ogoD!u07&IC@wh;8>no=?>?GbMG>dV*0+|yIr zQE!U4xr&!>4cD#o*(-`{?8E*RMMsZ(S<3{>lHcJe!@DBd>HEo=0>J^DBuFnEu{)74 z2P}`P$z8{>J4gV+u4FIO=(!O^=nbHBpceV=&AYnnKKu>QkubCc zlJkRBSxn#PXG@-E=4-|LvDufBu4DNys*Y7YSf$C&B~rwnWpjo-A2Z8gY%-yIasIXd zldxJM*GFN}vW-ryXZ1+x5a0TjJnEF{WLYzFc^tnw*Xz+StD4_xzV*(__FgxAea#62 zt@{Jdcu7=6MqG!_AJVo{?1!!&(#})1uh(BqUpbGAnN&45YhH&x_4-^RnfHEaaTvrf zQg?RK&!p(?nr}X&bdK8YVyPweJQ$4714AR zMJW+6U6X|b@!=M9QJh@@zcV76$?ad_)Che_f`dRJja6#sWst~eiO!XJ&+^&Sc;3s~n^t zx2q$xJ@88jbfAC*F=Jdj3sa6@e3n1L4^;wvRL<+O14YT8!Hm5I?9{eACo+?X2D2em zEK8tD_6<<}cGHzLEyGRNY9p&<=XE)7%Tk&-1cB@?y2pzvDkx;PgvOa5qo9bNIEe0j z2w=Tdv(o~YcxYF)2l@cG+kor5na<@rj35eE{BwL<|F-Vxz51;Zf1)^0&6-a)6BCn= zB(Nl=4%90%5cn(i{L$0b&oUnq-3yF4)KT^`a+GuXP*75$bs*}6EhdT76_h5UL2!wE zJJ*1t_!83Q{@BYVm28b*Rzb6APnWHzbt`USE^Q+xWSV&~->lWo@GFt!^{K8`IR^vhzYGBWDLaFh~*YxA!efRTH6TZFxIkESu6p1O&{ zY5CARf^fRp!9>v-kINIMT;nb{^x7W}qN5l&@!OK4PF`OAs{Tu~1s5rEt2_r{;uHCc zxB_yZmbsVPDJh}dZBQrCPW)~BBKdWE9L6-vCw2Atwl*L9q1hkPC;0R z4-55(TmjIWCO?oDgx_>bi}x1CTFw5be8+TN+YY|g*(WJ3pcK#$N~ENtOENzB8-bfID3c4pKA z{V+wkk)I6>ccYnt(NqAq2#eLCls8R|+-%Yf$q}nNZ<4BXRN&0pW1a0+WR~B8O~y?Q zo=fQAqZDNey#+|9SUqkE%U=2_4q&YHgA5fBXg^-W?+*zLR7HLem$ zeg>H$-ZwN;sUA_|%mUX-PTSgHmI{HmjHqVh<{G)U%=nT31?61(94(<8y>I|Jt&zR5 zazbcq3jWIMsFksCUJjS1MoZbuAmXmB+4b8;vkY4Mk~(#c$*t9n(@>G~ekY7Iu-ljG zFbetrSfDT{q%pCu5<9VRaMYzOEsJTcOjqOg_xIyW5iQj;aaK66L&X^V)+d3+&Av2@ zCOS@j3J6UDoMl)wuO-)edU{X^*+<95G9}fqJPeN$arW2RKhceLO*KFGK7&MVAG}$f zj?a!inwy)(?h)YpRaGNCk1$ztW9Jd=3H`y=hXs%n8#tcTp#@WqN-IlNX5Oj4uUX6ne zLWys)g zaQ%^%LNxVW_#O29nuEwv2#3_FitVoX(Pla1^KyCwSv3!X&(bz|t}ie98fh*VLNpKj z55c{D=Lpyj1%M!^$J!XE)bDsDz<%D32OSR1@uuIuKf&i^Pq))JJ2;4b2U`JTw^*&k z8K{_UPESs9Xi5^S%x0#nnA99_X`%)iNPp`AY&ycr%)C4iEJKlY3!_QAzRHH;v%L{; zyU2pFlBq5uNN6E#bML25(*U>donz=FFIaZpt%_MEO%t4+zgovZaSM$!5KQyF$RcUJ z+beu{rNY>H37!hddv}p0<2H9K-a9%4H8uQG3g12nt?juK$7$7ZJK(fK#N~A24R(uj zy#l^|D}%;yRS`vddwWwezSHS(n z7*!M|n_71qP#q;qRS%7lY*NfRYnoYEIb9)R$=-sFoH6}cP^$FaAo`l{faBFhVq7~& zEw&fl;KiKJEiTfGNy#-rPwJuNaVlhJM#ZOY`1TP$J>JCH8qn+}tvo%O$8)dE$iWlI z&V;0wcPIng*GF5z8)*B0s&h`x1UxpJX68Q&nz{;U0i&b3GXa~8^E4=PCpWscTfnOb z0_nAn;DaV{kZ^i=JVfA#;SJd4o8!Vpjt zBVcob?~P@iJp3iGw|XXH=5>5KXF{B=0399OH;KX-y^> z`7*>A$%{2Dc7Bm}hSj+0ez$;z$4qeeCg@@plp3hKH9q|?^o$4>_X8c>bVzDs96h~24SAX^DRh%iE)exTIvw20V*@MgS5S{Tq07J!+ zr6HHwq__9>z4FtnaESgmJ3ZB1qPS>UhRBk7l?|Q*xsX6gonjB|ki=cW&sLo-OJ)1U zswB%xt=`_Cg}eGK;k!`L+Vhf%R_9Llz)3-sm$hK^1T$!3-O1V6UO9SokqOeqNk&b| zU@;e4#nG`~0Z!Vqts$?iJ@OY0o|T1Xt(6_;3SQOL_B30j)0-!~m~IM$nLlSptGZwX zjYq5ff?S(YM{}ho7sd^}caie%`oNs9a(+Z@0|ypv6qlcuXAG-`RBNoqm~rQASN7ev zm^;~`Lm>QV)41S4(d5lM)Sa^#)1v?0d$0ypw=ypkI=^{+eSPexw^ck%Vyi!&K_JJj z#1=Lxv}l2cY|+^6jSU02B13|s8Wa;M zWkq-#9yLulBe|2^!5^N=S`_FSzVoR`_;M}Zc4IAv?Z@HjFDWeROi*9eLPN*Gn=jvQ z(!Yd7L`YO=q=W!nTTKmXK|%2@83WU0HEKx;Qejh%W-fRvzPCd8}tV}%EDinUCKZnSi zLoHQhu*cJP@~D&_7AtA3_kw+!>9j>17d3dK3!1__3<3gbQ6N6oO>eSQ0PjTZqkRIo z>D8yG$GJI78Y(44#T>>t#np@>@h(Lz^6Ki#_dqQTCP;xGV6fN^4Y4*Wgn|Y|LHU~m zpRl%h39D_vdCW2}u=CZB$+O-`8ONEI4akR}*Pymwl6OR_Q5A+fD16kwz(w8jC7nD6 zr4(<9g%f@`{23rfn>1~y-%>OERM#y z=xCtHZxRkvHs3p=;x*85z985bRZ<>F4Ye<|{K>zE_(IXP1O6zQQvS*@$w*{qH_6;w z_(J84Uqg-3QuwcLCH1tXW}~rH#d*a!X^kPzOUepMXjQ!r3>4q&GCzaZiM$O;;jrKO z`igi4h|<~zw42=&L#DO8HL*7R$=iowWO#4)3QLU^4=(tWM;^BAXR8ZB6IYKU#IDqB;2QrT1EC1$4kZu$P=4Y`L4idr1~-dD56+YO(untu2w z282OuiF6dv_6)@u8X6X^73>Us3;BbPZ`HwMIlD?qN~*BpZm0(lICfwnsx*<)Ux#jZ zz{6Mim(ya8wH-fbhDFo*h9QVP#9BY*Tjg*Rf$+}ykP-OH0|a2b@*l1xcDjeTRLd`z z<#P$jMJ;)Dj&r9FgoW%YpDi5sYlRhN-<~x$bIe zZeICJMzLIZEVDU$FZuCq-o)u@^L8TcG{i5&JgYMOQ&0$a%4RDlKfyb9-2VdhWvDG17to#!jv+9kJ%NOxAyyD)m4fUS1e8S!+X)m#ak^qmD-C<)~U`n z8(L|~8|4s)oeXipn+KP(rgHkTASMp4c+UNpSPph}Tn$mh@Cqjo;}plarLiIt4iM_# zZz;)|nQd7Hwgl+nKAhE;gVouiHQ~vrzKX~D`|`Q>I}+qH++sFfgb@Dl zzHKoN#mJjrMN=Ho3o*Vs%_bj;yO)q&(1aQO_0sMN0m7 z)5GWWcVF9CaL81>6>PwHU}8pt)dFa%-j{{iU|U_O@KO}dJ^6Gw0pn~&?T0lSI<2Ps z=T~$0<2e!_-0y9-FL!PDgolS?oz6Yec|pjOJOoEd;dN@_v2*)C#5Xv#t%z>)w^$p? zd09zH`=GP!#Z*PT1-4)gpet=?%k9qQ0F}6ina^e0OWNOiF5l-gc5g=$!Z%%Pqv<1c z*DlV?RTZ$*Ps2)6osO##D3W>X zL2qjrJ2L{ZFD8GnG>IDXWL(!UiDyu>$z;P-J_M7K_YRTv1t=wubmex|4x>OV*p1O- zNgi*0qv}W4g+im~q)638RIggf8|-u!iKn_&2;}85PbsVGk^=go241TR^YIbSlE4B7 zsqJO+eqJkq_ftX$)v=IuBiU1$2Xzl>0*y8g z_U%glMXO^kskDcU5C_50y^&VIHCBaU-~C{MRl$9T(-Uy))KJf{e8aOAkxw=024Wr)^IXkM}g%ajmAl zZ1z_=kIiYc;y&aZY5b4f^IOaN9M>e>#Hp_L!LZ}m3IfTl-xB?mo|-y~YsH$XQ#qcJ zLafYm#fly*3R=>za-R&-#VXub3a4_a0VNiS4rEz@XsbS=N+LLZJ&VjB{s#jCUxp)7e*8;b{>k8cZV>~&lWKZ3=LU_G1 z&zvCw%Bx;u7H#_)f}H9zLvoALsP)Gq>2oWx$DPxngIoB4lrCo*<68UE-*JhRuTrD3 z1=*;z83)|lB3Y>pT_+#a4^>I8iT*}#VwjBGWo^U9IX~TKK7$UhdZvVP4;`VTB$6t9 zp~lUq^78r15>Ijz&QTJnvb!R-sp7*+aJRLPNIc&*+@3QTd+T&H@!ppdb1QQ+iY@)x z&0!NcP!ItC@ikvPFFMaX%ttFZHU&*X?&ax(jg@uZU$64K2V!dSf_Bq+Gev?{PO7)B zTRl7NQ#WnA*QBS}Ko)MSvXn|SPxDF*AvH9p?!IMLY8rp{N%kATgGQaOP~_ja|F3r~hr!`)or)MnZ#cQdgU*FH|ay&Dz2hWxyT_PWr&EIGc1d@eklc z*jjJR*^c0l)LUpGqXdpjfYSX8X}~tao;83gr0zJce+1<)iTISDvU?%YC+*$MD)jGc zvtL_`W!A@hhZAA&39YqlP}7xYk^|$J2SLio-63UgMXr+&w3R==>Y1_wULprV}YXfa6_644b$oYTofd#pl&%sLVOEy z548#&UJsYUuCFhl-!zVEG)mNC$Mru8aHeerTinKCGX+RcaCy2Wp_LIS^L2$q?PoWm z9geNwXOJSNn=&)x@^X6X{iVc-TCi;sK0GX>RER+agOn>yE+tahOJS>YC2Zmz( z+tJWcjGk{S`jAzGTCK^G1JPE(4WMQ#PUM3c>JT4|_LZxo#;mhsHtgVU9`&){HVii3i>w0Pq&C&036U;oD&_Fs_00A07IxnrIr=a3U(O|Gitc zp-25%*t*pmeA{-Z=it)O@L93l=rZ#t*7MR=^`N*W8ukXyK+si7inhT`8P{nio?d3y?W@S4u6BmNf%pI@Wj(XI1snt>%N z9$CZJ@%nR(q4Gw5qc;x6!`gZ}^bcV2n;hLuHG^B{{&Y2hjuT<~pJ7F$YyDz##U{^W z{YW;^`ER5VpST?V9=D#?pfkZN2Wt?l`~JI91h4CR)U!hEa7mfrlt*mR;{O~BohAZm znqCyVcI=j4K?mpb)Rq<#da3n_J2a^MLBoyiGQa2n5gG{v1%OT_1c4>e0Dii@ru!uh z7|pe~5G67Xl^0PvTm63|3(f$c66gZ3(!BOUKAmZ(t2drdf{qDL04(T1=UAAmii*qC z!E6TifNR{`tV%8O2nq`u8&E9(W?Q}o=t(pwhU8B;)-U#d5i&KCeIGY5KVKLv4uq)+ z3JNC5L%WgV6-3eMA?8PeyG%5)ZdyHnFPkk<9>aS{`v=EtG6GY|NXsC@pO0r6{ zB5c+2xr7|2=}I5hH#Vw!nE?#C*?nq?TZd?_-ae1pi0Y%a@;qQ~Nr2u-G2txelc`V} zd0C#ksM+hcvzfk~5@#O(@G>Gk(%W@V-&J@VEpQmma%LO>j*3`XeF&s&g|$fPor?_5 zrGmEhGP;(4jI=a16tp&@DsT$QE*d!aLH)zfcBSpv5hkRF;UtZeXIM9mfYMk2{$rJt zfBX?KpH~ye?kZnkMMe}hVDUzqIg0{w>jq!)MND&YMir%r;dZctW*0IeA33b^p<#`U z;BzsMkbyHbflbIopTJ(@VJ{f~{pS%-&*SDi2ra{?$J0hTa;0r3OO;D31qTABYn?*HKxSP8&cq3`&= zzxwyV|Bm~Ac=iA50)0*@zDks(ak!qn!vVL*HPFTuY<+A08UhgzWsVZH!I~m%y Date: Tue, 4 Apr 2017 18:37:34 -0400 Subject: [PATCH 2087/4996] Update history to reflect merge of #5881 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 99b0c1851cf..564c44f7acb 100644 --- a/History.markdown +++ b/History.markdown @@ -41,6 +41,7 @@ * Document `--unpublished` flag introduced in 91e9ecf (#5959) * Update upgrading.md to mention usage of `bundle update` (#5604) * Fix missing quotation mark (#6002) + * New tutorial: Convert an HTML site to Jekyll (#5881) ### Development Fixes From 94e6b65ad4a25094846e810a1f91dc388a69e171 Mon Sep 17 00:00:00 2001 From: Ryan Lue Date: Wed, 5 Apr 2017 06:40:29 +0800 Subject: [PATCH 2088/4996] Revamp Permalink section (#5912) Merge pull request 5912 --- docs/_docs/collections.md | 153 +++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 86 deletions(-) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 97ca6ecb9ab..fa82e096324 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -89,18 +89,75 @@ choice and written out to `/my_collection/some_subdir/some_doc.html`. ## Configuring permalinks for collections {#permalinks} -You can customize the [Permalinks](../permalinks/) for your collection's documents by setting `permalink` property in the collection's configuration as follows: +If you wish to specify a custom pattern for the URLs where your Collection pages +will reside, you may do so with the [`permalink` property](../permalinks/): ```yaml collections: my_collection: output: true - permalink: /awesome/:path/:title.:output_ext + permalink: /:collection/:name ``` -In this example, the collection documents will the have the URL of `awesome` followed by the path to the document and its file extension. +### Examples -Collections have the following template variables available for permalinks: +For a collection with the following source file structure, + +``` +_my_collection/ +└── some_subdir + └── some_doc.md +``` + +each of the following `permalink` configurations will produce the document structure shown below it. + +* **Default** + Same as `permalink: /:collection/:path`. + + ``` + _site/ + ├── my_collection + │   └── some_subdir + │   └── some_doc.html + ... + ``` +* `permalink: pretty` + Same as `permalink: /:collection/:path/`. + + ``` + _site/ + ├── my_collection + │   └── some_subdir + │   └── some_doc + │   └── index.html + ... + ``` +* `permalink: /doc/:path` + + ``` + _site/ + ├── doc + │   └── some_subdir + │   └── some_doc.html + ... + ``` +* `permalink: /doc/:name` + + ``` + _site/ + ├── doc + │   └── some_doc.html + ... + ``` +* `permalink: /:name` + + ``` + _site/ + ├── some_doc.html + ... + ``` + +### Template Variables
        @@ -113,7 +170,7 @@ Collections have the following template variables available for permalinks:
        -

        collection

        +

        :collection

        Label of the containing collection.

        @@ -121,7 +178,7 @@ Collections have the following template variables available for permalinks:
        -

        path

        +

        :path

        Path to the document relative to the collection's directory.

        @@ -129,7 +186,7 @@ Collections have the following template variables available for permalinks:
        -

        name

        +

        :name

        The document's base filename, with every sequence of spaces @@ -138,7 +195,7 @@ Collections have the following template variables available for permalinks:

        -

        title

        +

        :title

        The document's lowercase title (as defined in its front matter), with every sequence of spaces and non-alphanumeric characters replaced by a hyphen. If the document does not define a title in its front matter, this is equivalent to name.

        @@ -146,92 +203,16 @@ Collections have the following template variables available for permalinks:
        -

        output_ext

        +

        :output_ext

        -

        Extension of the output file.

        +

        Extension of the output file. (Included by default and usually unnecessary.)

        -## Permalink examples for collections - -Depending on how you declare the permalinks in your configuration file, the permalinks and paths get written differently in the `_site` folder. A few examples will help clarify the options. - -Let's say your collection is called `apidocs` with `doc1.md` in your collection. `doc1.md` is grouped inside a folder called `mydocs`. Your project's source directory for the collection looks this: - -``` -├── \_apidocs -│   └── mydocs -│   └── doc1.md -``` - -Based on this scenario, here are a few permalink options. - -**Permalink configuration 1**: [Nothing configured]
        -**Output**: - -``` -├── apidocs -│   └── mydocs -│   └── doc1.html -``` - -**Permalink configuration 2**: `/:collection/:path/:title:output_ext`
        -**Output**: - -``` -├── apidocs -│   └── mydocs -│   └── doc1.html -``` - -**Permalink configuration 3**: No collection permalinks configured, but `pretty` configured for pages/posts.
        -**Output**: - -``` -├── apidocs -│   └── mydocs -│   └── doc1 -│   └── index.html -``` - -**Permalink configuration 4**: `/awesome/:path/:title.html`
        -**Output**: - -``` -├── awesome -│   └── mydocs -│   └── doc1.html -``` - -**Permalink configuration 5**: `/awesome/:path/:title/`
        -**Output**: - -``` -├── awesome -│   └── mydocs -│   └── doc1 -│   └── index.html -``` - -**Permalink configuration 6**: `/awesome/:title.html`
        -**Output**: - -``` -├── awesome -│   └── doc1.html -``` - -**Permalink configuration 7**: `:title.html` -**Output**: - -``` -├── doc1.html -``` - ## Liquid Attributes ### Collections From 4d689ec0518bd69e6d7682bf75f9e8e871a1fcee Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 4 Apr 2017 18:40:30 -0400 Subject: [PATCH 2089/4996] Update history to reflect merge of #5912 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 564c44f7acb..0ee4e11a104 100644 --- a/History.markdown +++ b/History.markdown @@ -42,6 +42,7 @@ * Update upgrading.md to mention usage of `bundle update` (#5604) * Fix missing quotation mark (#6002) * New tutorial: Convert an HTML site to Jekyll (#5881) + * Revamp Permalink section (#5912) ### Development Fixes From 52ac75b484408bc47bf31d7c10dbcb8c3a9024e8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 4 Apr 2017 19:47:11 -0400 Subject: [PATCH 2090/4996] Date filters should never raise an exception (#5722) Merge pull request 5722 --- lib/jekyll/filters.rb | 3 +++ test/test_filters.rb | 8 +++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index ea0fc9054d5..c8da0e526ce 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -80,6 +80,7 @@ def date_to_string(date) # # Returns the formatted String. def date_to_long_string(date) + return date if date.to_s.empty? time(date).strftime("%d %B %Y") end @@ -94,6 +95,7 @@ def date_to_long_string(date) # # Returns the formatted String. def date_to_xmlschema(date) + return date if date.to_s.empty? time(date).xmlschema end @@ -108,6 +110,7 @@ def date_to_xmlschema(date) # # Returns the formatted String. def date_to_rfc822(date) + return date if date.to_s.empty? time(date).rfc822 end diff --git a/test/test_filters.rb b/test/test_filters.rb index 782b5be984f..9e35df92c5a 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -284,11 +284,9 @@ def select; end end context "without input" do - should "raise an error if input is nil" do - err = assert_raises Jekyll::Errors::InvalidDateError do - @filter.date_to_xmlschema(nil) - end - assert_equal "Invalid Date: 'nil' is not a valid datetime.", err.message + should "return input" do + assert_nil(@filter.date_to_xmlschema(nil)) + assert_equal("", @filter.date_to_xmlschema("")) end end end From b4926daf3a3419773c247bc33d471712f674f42f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 4 Apr 2017 19:47:12 -0400 Subject: [PATCH 2091/4996] Update history to reflect merge of #5722 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0ee4e11a104..339911e1557 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,7 @@ * Add a template for custom 404 page (#5945) * Require `runtime_dependencies` of a Gem-based theme from its `.gemspec` file (#5914) * Don't raise an error if URL contains a colon (#5889) + * Date filters should never raise an exception (#5722) ### Documentation From 5f19b1a7e0a2ca3d3cd8424c51a07396d0ccf29d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 5 Apr 2017 15:36:29 -0400 Subject: [PATCH 2092/4996] Use yajl-ruby 1.2.2 (now with 2.4 support) (#6007) Merge pull request 6007 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 7e509366d6d..f4e60e12b3e 100644 --- a/Gemfile +++ b/Gemfile @@ -77,7 +77,7 @@ group :jekyll_optional_dependencies do gem "classifier-reborn", "~> 2.1.0" gem "liquid-c", "~> 3.0" gem "pygments.rb", "~> 0.6.0" - gem "yajl-ruby", git: "https://github.com/parkr/yajl-ruby", branch: "1.2.x-unify-fixnum-to-integer" + gem "yajl-ruby", "~> 1.2" gem "rdiscount", "~> 2.0" gem "redcarpet", "~> 3.2", ">= 3.2.3" end From f46dffcc8e9285c4a7a76d84042e406079bb2bf2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 5 Apr 2017 15:36:31 -0400 Subject: [PATCH 2093/4996] Update history to reflect merge of #6007 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 339911e1557..90d1c4b2204 100644 --- a/History.markdown +++ b/History.markdown @@ -56,6 +56,7 @@ * Use Rubocop v0.47.1 till we're ready for v0.48 (#5989) * Test against Ruby 2.4.0 (#5687) * rubocop: lib/jekyll/renderer.rb complexity fixes (#5052) + * Use yajl-ruby 1.2.2 (now with 2.4 support) (#6007) ### Site Enhancements From 768d2bb5a304d25a3114a3cfb1eeced91ab00598 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 5 Apr 2017 16:16:55 -0400 Subject: [PATCH 2094/4996] absolute_url should not mangle URL if called more than once (#5789) Merge pull request 5789 --- lib/jekyll/filters/url_filters.rb | 1 + test/test_filters.rb | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index ccc4dcb9829..7db83c800c9 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -10,6 +10,7 @@ module URLFilters # Returns the absolute URL as a String. def absolute_url(input) return if input.nil? + return input if Addressable::URI.parse(input).absolute? site = @context.registers[:site] return relative_url(input).to_s if site.config["url"].nil? Addressable::URI.parse(site.config["url"] + relative_url(input)).normalize.to_s diff --git a/test/test_filters.rb b/test/test_filters.rb index 9e35df92c5a..03d2732abd5 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -402,6 +402,11 @@ def select; end }) assert_equal "http://xn--mlaut-jva.example.org/", filter.absolute_url(page_url) end + + should "not modify an absolute URL" do + page_url = "http://example.com/" + assert_equal "http://example.com/", @filter.absolute_url(page_url) + end end context "relative_url filter" do From 84d1f2d408cf73988d2b2067ceb9fc6fc5dc945c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 5 Apr 2017 16:16:56 -0400 Subject: [PATCH 2095/4996] Update history to reflect merge of #5789 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 90d1c4b2204..d38d1af6e22 100644 --- a/History.markdown +++ b/History.markdown @@ -75,6 +75,7 @@ * Remove dependency on include from default about.md (#5903) * Allow colons in `uri_escape` filter (#5957) * Re-surface missing public methods in `Jekyll::Document` (#5975) + * absolute_url should not mangle URL if called more than once (#5789) ### fix From d1c7bdb985b82eaa233f9f1b2ca983415005491e Mon Sep 17 00:00:00 2001 From: Chris Finazzo Date: Wed, 5 Apr 2017 17:18:23 -0400 Subject: [PATCH 2096/4996] Update normalize.css to v6.0.0 (#6008) Merge pull request 6008 --- docs/_sass/_normalize.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_sass/_normalize.scss b/docs/_sass/_normalize.scss index b1f94f9db46..36186c9931a 100644 --- a/docs/_sass/_normalize.scss +++ b/docs/_sass/_normalize.scss @@ -1 +1 @@ -/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none} +/*! normalize.css v6.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none} From a83b6684092ef3efebc7b7ac5d653b950f87ca04 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 5 Apr 2017 17:18:24 -0400 Subject: [PATCH 2097/4996] Update history to reflect merge of #6008 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d38d1af6e22..8842ffc7a95 100644 --- a/History.markdown +++ b/History.markdown @@ -66,6 +66,7 @@ * Documentation on how to build navigation (#5698) * Navigation has been moved out from docs (#5927) * Make links in sidebar for current page more prominent (#5820) + * Update normalize.css to v6.0.0 (#6008) ### Bug Fixes From 7d7a312b33cf1cbf92d73435146d37a568885994 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Sun, 9 Apr 2017 16:54:45 +0530 Subject: [PATCH 2098/4996] Bump Rubocop to v0.48 (#5997) Merge pull request 5997 --- .rubocop.yml | 10 ++++++++++ Gemfile | 6 +++--- Rakefile | 2 +- jekyll.gemspec | 1 + lib/jekyll/reader.rb | 1 + lib/jekyll/site.rb | 1 + .../test-dependency-theme.gemspec | 8 ++++---- test/fixtures/test-theme/test-theme.gemspec | 8 ++++---- test/test_collections.rb | 4 +++- test/test_document.rb | 6 +++--- test/test_front_matter_defaults.rb | 4 ++-- test/test_generated_site.rb | 8 +++++--- test/test_tags.rb | 1 + 13 files changed, 39 insertions(+), 21 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 168e779ae67..5ab7a7e84ed 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -35,6 +35,8 @@ Metrics/LineLength: - !ruby/regexp /features\/.*.rb/ - Rakefile - rake/*.rake + - Gemfile + - jekyll.gemspec Max: 90 Severity: warning Metrics/MethodLength: @@ -82,6 +84,8 @@ Style/EmptyLinesAroundAccessModifier: Enabled: false Style/EmptyLinesAroundModuleBody: Enabled: false +Style/EndOfLine: + EnforcedStyle: lf Style/ExtraSpacing: AllowForAlignment: true Style/FileName: @@ -99,8 +103,12 @@ Style/IndentArray: EnforcedStyle: consistent Style/IndentHash: EnforcedStyle: consistent +Style/IndentHeredoc: + Enabled: false Style/IndentationWidth: Severity: error +Style/InverseMethods: + Enabled: false Style/ModuleFunction: Enabled: false Style/MultilineMethodCallIndentation: @@ -138,6 +146,8 @@ Style/StringLiterals: EnforcedStyle: double_quotes Style/StringLiteralsInInterpolation: EnforcedStyle: double_quotes +Style/SymbolArray: + Enabled: false Style/TrailingCommaInLiteral: EnforcedStyleForMultiline: consistent_comma Style/UnneededCapitalW: diff --git a/Gemfile b/Gemfile index f4e60e12b3e..5da04ca66c7 100644 --- a/Gemfile +++ b/Gemfile @@ -25,9 +25,9 @@ group :test do gem "nokogiri" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.47.1" - gem "test-theme", :path => File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) + gem "rubocop", "~> 0.48.1" gem "test-dependency-theme", :path => File.expand_path("./test/fixtures/test-dependency-theme", File.dirname(__FILE__)) + gem "test-theme", :path => File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) gem "jruby-openssl" if RUBY_ENGINE == "jruby" end @@ -77,9 +77,9 @@ group :jekyll_optional_dependencies do gem "classifier-reborn", "~> 2.1.0" gem "liquid-c", "~> 3.0" gem "pygments.rb", "~> 0.6.0" - gem "yajl-ruby", "~> 1.2" gem "rdiscount", "~> 2.0" gem "redcarpet", "~> 3.2", ">= 3.2.3" + gem "yajl-ruby", "~> 1.2" end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem diff --git a/Rakefile b/Rakefile index ab934e27416..949e0fd8e76 100644 --- a/Rakefile +++ b/Rakefile @@ -106,7 +106,7 @@ def siteify_file(file, overrides_front_matter = {}) front_matter = { "title" => title, "permalink" => "/docs/#{slug}/", - "note" => "This file is autogenerated. Edit /#{file} instead." + "note" => "This file is autogenerated. Edit /#{file} instead.", }.merge(overrides_front_matter) contents = "#{front_matter.to_yaml}---\n\n#{content_for(file)}" File.write("#{docs_folder}/_docs/#{slug}.md", contents) diff --git a/jekyll.gemspec b/jekyll.gemspec index a55392090f3..f95862594e2 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -1,4 +1,5 @@ # coding: utf-8 + lib = File.expand_path("../lib", __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require "jekyll/version" diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index e1d3b8f5663..cdd45ab0f74 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 + require "csv" module Jekyll diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 87ea719b6a8..347cea97641 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 + require "csv" module Jekyll diff --git a/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec b/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec index f372354e275..5c260329d3b 100644 --- a/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec +++ b/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec @@ -1,11 +1,11 @@ Gem::Specification.new do |s| - s.name = 'test-dependency-theme' - s.version = '0.1.0' - s.licenses = ['MIT'] + s.name = "test-dependency-theme" + s.version = "0.1.0" + s.licenses = ["MIT"] s.summary = "This is another theme used to test Jekyll" s.authors = ["Jekyll"] s.files = ["lib/example.rb"] - s.homepage = 'https://github.com/jekyll/jekyll' + s.homepage = "https://github.com/jekyll/jekyll" s.add_runtime_dependency "jekyll_test_plugin" end diff --git a/test/fixtures/test-theme/test-theme.gemspec b/test/fixtures/test-theme/test-theme.gemspec index 5f950ae18b9..73e5deb2e94 100644 --- a/test/fixtures/test-theme/test-theme.gemspec +++ b/test/fixtures/test-theme/test-theme.gemspec @@ -1,9 +1,9 @@ Gem::Specification.new do |s| - s.name = 'test-theme' - s.version = '0.1.0' - s.licenses = ['MIT'] + s.name = "test-theme" + s.version = "0.1.0" + s.licenses = ["MIT"] s.summary = "This is a theme used to test Jekyll" s.authors = ["Jekyll"] s.files = ["lib/example.rb"] - s.homepage = 'https://github.com/jekyll/jekyll' + s.homepage = "https://github.com/jekyll/jekyll" end diff --git a/test/test_collections.rb b/test/test_collections.rb index 0607208b8f3..5b80a6c7e03 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -217,7 +217,9 @@ class TestCollections < JekyllUnitTest end should "read document in subfolders with dots" do - assert @collection.docs.any? { |d| d.path.include?("all.dots") } + assert( + @collection.docs.any? { |d| d.path.include?("all.dots") } + ) end end end diff --git a/test/test_document.rb b/test/test_document.rb index f274dd5327c..37e709ac6dc 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -424,9 +424,9 @@ def assert_equal_value(key, one, other) context "with output overrides" do should "be output according its front matter" do - assert_nil @files.find { |doc| - doc.relative_path == "_slides/non-outputted-slide.html" - } + assert_nil( + @files.find { |doc| doc.relative_path == "_slides/non-outputted-slide.html" } + ) end end end diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index 0d066c11f15..d45ab6de9a5 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -184,8 +184,8 @@ class TestFrontMatterDefaults < JekyllUnitTest should "parse date" do @site.process date = Time.parse("2015-01-01 00:00:01") - assert @site.pages.find { |page| page.data["date"] == date } - assert @site.posts.find { |page| page.data["date"] == date } + assert(@site.pages.find { |page| page.data["date"] == date }) + assert(@site.posts.find { |page| page.data["date"] == date }) end end end diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 41e7c3a1f5d..46f55484fba 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -52,9 +52,11 @@ class TestGeneratedSite < JekyllUnitTest end should "include a post with a abbreviated dates" do - refute_nil @site.posts.index { |post| - post.relative_path == "_posts/2017-2-5-i-dont-like-zeroes.md" - } + refute_nil( + @site.posts.index do |post| + post.relative_path == "_posts/2017-2-5-i-dont-like-zeroes.md" + end + ) assert_exist dest_dir("2017", "02", "05", "i-dont-like-zeroes.html") end diff --git a/test/test_tags.rb b/test/test_tags.rb index 0fe07aa6991..f077615defb 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -1,4 +1,5 @@ # coding: utf-8 + require "helper" class TestTags < JekyllUnitTest From cce53abe3d64cfc4057fcfd75f3f16a3e829d886 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 9 Apr 2017 07:24:46 -0400 Subject: [PATCH 2099/4996] Update history to reflect merge of #5997 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8842ffc7a95..ef2ef088b02 100644 --- a/History.markdown +++ b/History.markdown @@ -57,6 +57,7 @@ * Test against Ruby 2.4.0 (#5687) * rubocop: lib/jekyll/renderer.rb complexity fixes (#5052) * Use yajl-ruby 1.2.2 (now with 2.4 support) (#6007) + * Bump Rubocop to v0.48 (#5997) ### Site Enhancements From 029b993225ed63c6e03bf1c965035b9d6a50d741 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 10 Apr 2017 02:15:44 +0530 Subject: [PATCH 2100/4996] Fixup tutorial on creating theme from existing HTML templates (#6006) Merge pull request 6006 --- docs/_data/tutorials.yml | 2 +- docs/_sass/_style.scss | 13 ++ ....md => convert-existing-site-to-jekyll.md} | 179 ++++++++++-------- docs/img/jekylllayoutconcept.png | Bin 34133 -> 40209 bytes 4 files changed, 119 insertions(+), 75 deletions(-) rename docs/_tutorials/{create-jekyll-theme.md => convert-existing-site-to-jekyll.md} (57%) diff --git a/docs/_data/tutorials.yml b/docs/_data/tutorials.yml index baf778963f9..a394345bbd4 100644 --- a/docs/_data/tutorials.yml +++ b/docs/_data/tutorials.yml @@ -4,7 +4,7 @@ - navigation - orderofinterpretation - custom-404-page - - create-jekyll-theme + - convert-site-to-jekyll #- title: Another section # tutorials: diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index c56d6a94741..005781b6e12 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -1038,3 +1038,16 @@ code.output { .result { padding: 12px; } + +.image-description { + margin: -20px 0 20px; + padding: 10px 15px; + font-size: 0.81em; + text-align: justify; + background: #5c5c5c; + + pre, code { + font-size: 0.75em; + background: #454545; + } +} diff --git a/docs/_tutorials/create-jekyll-theme.md b/docs/_tutorials/convert-existing-site-to-jekyll.md similarity index 57% rename from docs/_tutorials/create-jekyll-theme.md rename to docs/_tutorials/convert-existing-site-to-jekyll.md index 348ff31ad90..6a041e8ba64 100644 --- a/docs/_tutorials/create-jekyll-theme.md +++ b/docs/_tutorials/convert-existing-site-to-jekyll.md @@ -1,38 +1,49 @@ --- layout: tutorials -permalink: /tutorials/create-jekyll-theme/ -title: Create your first Jekyll theme +permalink: /tutorials/convert-site-to-jekyll/ +title: Convert an HTML site to Jekyll --- -If you're looking for themes for your Jekyll site, you don't have to restrict yourself to existing Jekyll themes. It's pretty easy to convert almost any static HTML site into a Jekyll theme. +If you're looking for themes for your Jekyll site, you don't have to restrict yourself to existing Jekyll themes. It's pretty easy to convert almost any static HTML files into a Jekyll website. -In many ways, any site that is currently a static site *already* is a Jekyll site. Jekyll just allows you to automate parts of the site (like inserting pages into templates, rendering lists for navigation, generating feeds and sitemaps, and more) as it processes the files. +In many ways, any site that is currently a static site is *already* a Jekyll website. Jekyll just allows you to automate parts of the site (like inserting pages into templates, rendering lists for navigation, generating feeds and sitemaps, and more) as it processes the files. -Understanding how to convert any HTML site into a Jekyll website will open your world to many more options for Jekyll themes. Instead of searching online for "Jekyll themes," you can choose from the large variety of HTML templates for your site, quickly Jekyll-ize the HTML template as you need to, and build the output with Jekyll. +Understanding how to convert any HTML site into Jekyll templates will open your world to many more options for Jekyll themes. Instead of [searching online for *Jekyll themes*](https://duckduckgo.com/?q=Jekyll+themes), you can choose from the large variety of HTML templates for your site, quickly Jekyll-ize the HTML templates as you need to, and build the output with Jekyll. -Although websites can have sophisticated features and controls, we'll keep things simple in this tutorial. This tutorial contains the following sections: +Although websites can have sophisticated features and controls, we'll keep things simple in this tutorial. -* TOC -{:toc} - -## Understand a basic Jekyll site +## What is a Jekyll Website? First, let's start with a grounding in the basics. Stripping a Jekyll site down to an extremely basic level will help clarify what happens in a Jekyll site. If you haven't already installed the jekyll gem, [install it]({% link _docs/installation.md %}). -A simple Jekyll site might consist of just 3 files: +We'll start with a *basic Jekyll site* consisting of three files: ``` -├── _config.yaml +├── _config.yml ├── _layouts │   └── default.html └── index.md ``` -Manually create these 3 files in a folder called `myjekyllsite`. (Put `default.html` inside a folder called `_layouts`.) Then populate the content of the `default.html` and `index.md` files as follows: +Manually create these three files in a folder called `my_jekyll_site` or whatever suits you the most, and place `default.html` inside a folder named `_layouts`. + +```sh +$ touch _config.yml index.md default.html +$ mkdir _layouts && mv default.html _layouts +``` + +Fire up your favorite editor, and populate the contents of the `default.html` and `index.md` files as follows: + +**_config.yml** + +```yaml +name: My Jekyll Website +``` **_layouts/default.html** ```html + {% raw %}{{ content }}{% endraw %} @@ -48,52 +59,62 @@ title: My page layout: default.html --- -Some **bold** content. +# {% raw %}{{ page.title }}{% endraw %} + +Content is written in [Markdown](https://learnxinyminutes.com/docs/markdown/). Plain text format allows you to focus on your **content**. + + ``` -Now `cd` to `myjekyllsite` and build the site: +Now `cd` to `my_jekyll_site` and serve the site with the built-in server: ``` +cd my_jekyll_site jekyll serve ``` -When you build the site, you get a preview URL such as `http://127.0.0.1:4001/`. The site's files are built in the `_site` folder. +If you have a Gemfile, [use Bundler]({% link _docs/quickstart.md %}#about-bundler) by typing `bundle exec jekyll serve` instead. +{: .note .info} + +When you serve the site, you get a preview URL such as `http://127.0.0.1:4000/` (which is the same as `http://localhost:4000/`). The site's files are built into the `_site` folder by default. -This is a Jekyll site at the most basic level. Here's what is happening: +This is a Jekyll site at the most basic functional level. Here's what is happening: -* The `_config.yml` file contains settings that Jekyll uses as it processes your site. An empty config file will use default values for building a Jekyll site. For example, to convert Markdown to HTML, Jekyll will automatically use the [kramdown Markdown filter](https://rubygems.org/gems/kramdown/), without any need to specify it. -* Jekyll looks for files with [front matter tags]({% link _docs/frontmatter.md %}) (the two sets of dashed lines `---` like those in `index.md`) and processes the files (populating site variables, rendering any [Liquid](https://shopify.github.io/liquid/), and converting Markdown to HTML). -* Jekyll pushes the content from all pages and posts into the `{% raw %}{{ content }}{% endraw %}` tags in the layout specified (`default`) in the front matter tags. -* The processed files get written as `.html` files in the `_site` directory. + * The `_config.yml` file contains settings that Jekyll uses as it processes your site. An empty config file will use default values for building a Jekyll site. For example, to convert [Markdown](https://learnxinyminutes.com/docs/markdown/) to HTML, Jekyll will automatically use the [kramdown Markdown filter](https://rubygems.org/gems/kramdown/), without any need to specify it. + * Jekyll looks for files with [front matter tags]({% link _docs/frontmatter.md %}) (the two sets of dashed lines `---` like those in `index.md`) and processes the files (populating site variables, rendering any [Liquid](https://shopify.github.io/liquid/), and converting Markdown to HTML). + * Jekyll pushes the content from all pages and posts into the `{% raw %}{{ content }}{% endraw %}` variable in the layout specified (`default`) in the front matter tags. + * The processed files get written as `.html` files in the `_site` directory. -You can read more about how Jekyll processes the files in [Order of Interpretation](/tutorials/orderofinterpretation/). +You can read more about how Jekyll processes the files in [order of Interpretation]({% link _tutorials/orderofinterpretation.md %}). -With this basic foundation of how a Jekyll site works, you can convert almost any HTML theme into a Jekyll site. The following sections will take you through a step-by-step tutorial on converting an HTML template into a Jekyll site. +With this basic understanding of how a Jekyll site works, you can convert almost any HTML theme for Jekyll. The following sections will take you through a step-by-step tutorial to do so. ## 1. Create a template for your default layout -Find your HTML theme and save it as a default layout. If you're converting or cloning an existing site, you can right-click the page and view the source code. +Find your HTML theme and save it as a `default` layout. If you're converting or cloning an existing site, you can right-click the page and view the source code. -For example, suppose you're cloning your company site to create a documentation site with the same branding. Or suppose you have a personal site that you built with HTML and now want to make it a Jekyll theme. Get the HTML source code for your site. +For example, suppose you're cloning your company site to create a documentation site with the same branding. Or suppose you have a personal site that you built with HTML and now want to make it a Jekyll site. Get the HTML source code for your site. {: .note .info} -**Note:** Regardless of the site, check the license and make sure you have permission to copy the code. +Regardless of the site, do check the license and make sure you have permission to copy and use the code. -Copy and paste the source code into a file called `default.html`. Put the `default.html` file inside a folder called `_layouts`. This will be the default layout template for your pages and posts — that is, each page or post will use this layout when Jekyll builds the site. +Copy and paste the source code into a file called `default.html`. Put the `default.html` file inside the `_layouts` folder. This will be the default layout template for your pages and posts — that is, each page or post will use this layout when Jekyll builds the site. -Note that in looking for templates, you want the HTML output of the template. If the template has PHP tags or other dynamic scripts, these dynamic elements will need to be converted to HTML or to [Liquid](https://shopify.github.io/liquid/) scripting where possible. Jekyll uses Liquid in its templating system to retrieve dynamic content. +Note that in looking for templates, you want the HTML output of the template. If the template has PHP tags or other dynamic scripts, these dynamic elements will need to be converted to HTML or to [Liquid](https://shopify.github.io/liquid/). Liquid is [Jekyll templating system]({% link _docs/templates.md %}) to retrieve dynamic content. -Open `default.html` into your browser locally to ensure the site looks and functions like it does online. You will likely need to adjust CSS, JS, and image paths so they work. +Open `default.html` into your browser locally to ensure the site looks and behaves like it does online. You will likely need to adjust CSS, JS, and image paths so they work. For example, if the paths were relative on the site you copied, you'll need to either download the same assets into your Jekyll site or use absolute paths to the same assets in the cloud. (Syntax such as `src="//` requires a prefix such as `src="http://` to work in your local browser.) -Jekyll provides some [filters](/docs/templates/#filters) to prepend a site URL before path. For example, you could preface your stylesheet like this: +Jekyll provides some [filters]({% link _docs/templates.md %}#filters) to prepend a site URL before path. For example, you could preface your stylesheet like this: ```liquid {% raw %}{{ "/assets/style.css" | relative_url }}{% endraw %} ``` -The `relative_url` filter will prepend the `baseurl` value from your config file to the input. This is useful if your site is hosted at a subpath rather than the root of the domain (for example, `http://mysite.com/blog/`). +The `relative_url` filter will prepend the [`baseurl`](https://byparker.com/blog/2014/clearing-up-confusion-around-baseurl/) value from your config file (as`blog` for instance) to the input. This is useful if your site is hosted at a subpath rather than at the root of the domain (for example, `http://mysite.com/blog/`). You can also use an `absolute_url` filter. This filter will prepend the `url` *and* `baseurl` value to the input: @@ -101,7 +122,7 @@ You can also use an `absolute_url` filter. This filter will prepend the `url` *a {% raw %}{{ "/assets/style.css" | absolute_url }}{% endraw %} ``` -Again, both `url` and `baseurl` must be defined in your site's config file, like this: +Again, both `url` and `baseurl` can be defined in your site's config file, like this: ``` url: http://mysite.com @@ -114,7 +135,7 @@ Note that the `url` property of any page begins with a forward slash (`/`), so o You don't have to prepend filters to link paths like this. You could also use relative links across your entire site. However you decide to code the paths to your assets, make sure they render correctly. -Does your local `default.html` page look good in your browser? Are all images, styles, and other elements showing up correctly? If so, great. Keep going. You'll use this template as the layout for all your pages and posts. +Does your local `default.html` page look good in your browser? Are all images, styles, and other elements showing up correctly? If so, great. Keep going. You can use this template as the layout for all your pages and posts or create as many templates as you need. In the next section, you'll blank out the content of the layout and replace it with placeholder tags that get populated dynamically with your Jekyll pages. @@ -122,7 +143,7 @@ In the next section, you'll blank out the content of the layout and replace it w In `default.html`, find where the page content begins (usually at `h1` or `h2` tags). Replace the title that appears inside these tags with `{% raw %}{{ page.title }}{% endraw %}`. -Remove the page content (but not code from the top nav, sidebar, or footer) and replace the page content with `{% raw %}{{ content }}{% endraw %}`. +Remove the content part (keep everything else: navigation menu, sidebar, footer, etc.) and replace it with `{% raw %}{{ content }}{% endraw %}`. Check the layout again in your browser and make sure you didn't corrupt or alter it up by inadvertently removing a crucial `div` tag or other element. The only change should be to the title and page content, which are now blanked out or showing the placeholder tag. @@ -144,17 +165,17 @@ Some page content here... Create another page for testing called `about.md` with similar front matter tags. {: .note .info} -**Note:** If you don't specify a layout in your pages, Jekyll will automatically use the template labeled `default`. We specify it here only to make it explicit what's happening. +If you don't specify a layout in your pages, Jekyll will simply render that page as an unstyled basic HTML page. ## 4. Add a configuration file -Add a `_config.yml` file in your root directory. In `_config.yml`, you can optionally specify the markdown filter you want. By default, [kramdown](https://kramdown.gettalong.org/)) is used (without the need to specify it). If no other filter is specified, your config file will automatically apply the following as a default setting: +Add a `_config.yml` file in your root directory. In `_config.yml`, you can optionally specify the markdown filter you want. By default, [kramdown](https://kramdown.gettalong.org/) is used (without the need to specify it). If no other filter is specified, your config file will automatically apply the following as a default setting: ``` markdown: kramdown ``` -You can also specify [some options](https://kramdown.gettalong.org/converter/html.html) for kramdown to make it behave more like Github-flavored Markdown: +You can also specify [some options](https://kramdown.gettalong.org/converter/html.html) for kramdown to make it behave more like [GitHub Flavored Markdown (GFM)](https://github.github.com/gfm/): ``` kramdown: @@ -181,7 +202,7 @@ layout: homepage This page would then use the `homepage.html` template in the `_layouts` folder. -You can even set [default front matter tags](/docs/configuration/#front-matter-defaults) for pages, posts, or [collections]({% link _docs/collections.md %}) in your `_config.yml` file so that you don't have to specify the layout in your front matter tags. However, setting defaults is more advanced than this basic tutorial will cover. +You can even set [default front matter tags]({% link _docs/configuration.md %}#front-matter-defaults) for pages, posts, or [collections]({% link _docs/collections.md %}) in your `_config.yml` file so that you don't have to specify the layout in the front matter variables. Anywayd, setting defaults is beyond the scope of this tutorial, let's get back to work. ## 6. Configure site variables @@ -207,22 +228,22 @@ title: ACME Website Any properties you add in your `_config.yml` file are accessible through the `site` namespace. Similarly, any properties in your page's front matter are accessible through the `page` namespace. Use dot notation after `site` or `page` to access the value. -Stop your Jekyll server (**Ctrl + C**) and restart it. Verify that the `title` tags are populating correctly. +Stop your Jekyll server with Ctrl + C and restart it. Verify that the `title` tags are populating correctly. {: .note .info} -**Note:** Every time you modify your config file, you have to restart Jekyll for the changes to take effect. When you modify other files, Jekyll automatically picks up the changes when it rebuilds. +Every time you modify your config file, you have to restart Jekyll for the changes to take effect. When you modify other files, Jekyll automatically picks up the changes when it rebuilds. -If you have other variables to populate in your site, do so following this same pattern. +If you have other variables to populate in your site, rinse and repeat. ## 7. Show posts on a page -It's common to show a list of posts on the homepage. First, let's create some posts so that our loop will have something to display. +It's common to show a list of posts on the homepage. First, let's create some posts so that we have something to showcase. Add some posts in a `_posts` folder following the standard `YYYY-MM-DD-title.md` post format: -* `2017-01-02-my-first-post.md` -* `2017-01-15-my-second-post.md` -* `2017-02-08-my-third-post.md` + * `2017-01-02-my-first-post.md` + * `2017-01-15-my-second-post.md` + * `2017-02-08-my-third-post.md` In each post, add some basic content: @@ -235,14 +256,15 @@ layout: default Some sample content... ``` -Now let's create a layout that will display the posts. Create a new file in `_layouts` called `home.html`. In your `home.html` layout, add the following logic: +Now let's create a layout that will display the posts. Create a new file in `_layouts` called `home.html` and add the following logic: ``` --- layout: default --- -{% raw %}
          +{% raw %}{{ content }} +
            {% for post in site.posts %}
          • {{ post.title}} @@ -260,7 +282,8 @@ layout: home --- ``` -In this case, `home.md` will be pushed into the `{% raw %}{{ content }}{% endraw %}` tags in the `home` layout. Then the `home` layout will be pushed into the `{% raw %}{{ content }}{% endraw %}` tags of the `default` layout. +In this case, contents of `blog.md` will be pushed into the `{% raw %}{{ content }}{% endraw %}` tag in the `home` layout. Then the `home` layout will be pushed into the `{% raw %}{{ content }}{% endraw %}` tag of the `default` layout. + ### How layouts work @@ -270,15 +293,20 @@ The following diagram shows how layouts work in Jekyll: Concept of Jekyll layouts -In this case, the content from a page that specifies the layout `page` gets pushed into the `{% raw %}{{ content }}{% endraw %}` tag of the layout file named `page`. Because the `page` layout itself specifies another layout (`docs`), the content from `page` gets pushed into the `{% raw %}{{ content }}{% endraw %}` tag in the `docs` layout. Because the `docs` layout specifies another layout (`default`), the content from docs gets pushed into the `{% raw %}{{ content }}{% endraw %}` tag of the `default` layout. +{: .image-description} +In this example, the content from a Markdown document `document.md` that specifies `layout: docs` gets pushed into the `{% raw %}{{ content }}{% endraw %}` tag of the layout file `docs.html`. Because the `docs` layout itself specifies `layout: page`, the content from `docs.html` gets pushed into the `{% raw %}{{ content }}{% endraw %}` tag in the layout file `page.html`. Finally because the `page` layout specifies `layout: default`, the content from `page.html` gets pushed into the `{% raw %}{{ content }}{% endraw %}` tag of the layout file `default.html`. You don't need multiple layouts. You could just use one: `default`. You have options for how you design your site. In general, it's common to define one layout for pages and another layout for posts, but for both of these layouts to inherit the `default` template (which usually defines the top and bottom parts of the site). -In your browser, go to `home.html` and see the list of posts. (Note that you didn't have to use the method described here. You could have simply added the `for` loop to any page, such as `index.md`, to display these posts. But given that you may have more complex logic for other features, it can be helpful to store your logic in templates separate from the page area where you frequently type your content.) +In your browser, go to `blog.html` and see the list of posts. +Note that you don't have to use the method described here. You could have simply added the `for` loop to any page, such as `index.md`, to display these posts. But given that you may have more complex logic for other features, it can be helpful to store your logic in templates separate from the page area where you frequently type your content. + +{: .note .info} +At minimum, a layout should contain `{% raw %}{{ content }}{% endraw %}`, which acts as a receiver for the *content* to be rendered. ### For loops -By the way, let's pause here to look at the `for` loop logic a little more closely. [For loops in Liquid](https://help.shopify.com/themes/liquid/tags/iteration-tags#for) are one of the most commonly used Liquid tags. For loops let you iterate through content in your Jekyll site and build out a result. The `for` loop also has [certain properties available](https://help.shopify.com/themes/liquid/objects/for-loops) (like first or last iteration) based on the loop's position in the loop as well. +By the way, let's pause here to look at the `for` loop logic a little more closely. [For loops in Liquid](https://help.shopify.com/themes/liquid/tags/iteration-tags#for) are one of the most commonly used Liquid tags. *For loops* let you iterate through content in your Jekyll site and build out a result. The `for` loop also has [certain properties available](https://help.shopify.com/themes/liquid/objects/for-loops) (like first or last iteration) based on the loop's position in the loop as well. We've only scratched the surface of what you can do with `for` loops in retrieving posts. For example, if you wanted to display posts from a specific category, you could do so by adding a `categories` property to your post's front matter and then look in those categories. Further, you could limit the number of results by adding a `limit` property. Here's an example: @@ -291,11 +319,11 @@ We've only scratched the surface of what you can do with `for` loops in retrievi {% endfor %}{% endraw %} ``` -This loop would get the latest 3 posts that have a category called `podcasts` in the front matter. +This loop would get the latest three posts that have a category called `podcasts` in the front matter. ## 8. Configure navigation -Now that you've configured posts, let's configure page navigation. Most websites have some navigation either in the sidebar or header area. +Now that you've configured posts, let's configure page navigation. Most websites have some navigation either in the sidebar or header area. In this tutorial, we'll assume you've got a simple list of pages you want to generate. If you only have a handful of pages, you could list them by using a `for` loop to iterate through the `site.pages` object and then order them by a front matter property. @@ -323,27 +351,30 @@ Here the `order` property will define how the pages get sorted, with `1` appeari You could also iterate through a list of pages that you maintain in a separate data file. This might be more appropriate if you have a lot of pages, or you have other properties about the pages you want to store. -To manage page links this way, create a folder in your Jekyll project called `_data`. In this folder, create a file called `sidebar_links.yml` with this content: +To manage page links this way, create a folder in your Jekyll project called `_data`. In this folder, create a file called e.g. `navigation.yml` with this content: -``` +```yaml - title: Sample page 1 - url: /sample1/ + url: /page-1-permalink/ - title: Sample page 2 - url: /sample2/ + url: /page-2-permalink/ - title: Sample page 3 - url: /sample3/ + url: /page-3-permalink/ ``` -(You can store additional properties for each item in this data file as desired. Arrange the list items in the order you want them to appear. +{: .note .info} +If you never wrote any YAML before, you'll get quickly familiar with it. Take a look at [what you can do with YAML](https://learnxinyminutes.com/docs/yaml/). + +You can store additional properties for each item in this data file as desired. Arrange the list items in the order you want them to appear. To print the list of pages from the data file, use code like this: ```html {% raw %}{% endraw %} ``` @@ -352,13 +383,13 @@ If you have more sophisticated requirements around navigation, such as when buil ## 9. Simplify your site with includes -Let's suppose your `default.html` file is massive and hard to work with. You can break up your layout by putting some of the content in include files. +Let's suppose your `default.html` file is massive and hard to work with. You can break up your layout by putting some of the HTML code in *include* files. Add a folder called `_includes` in your root directory. In that folder, add a file there called `sidebar.html`. Remove your sidebar code from your `default.html` layout and insert it into the `sidebar.html` file. -In place of sidebar code in `default.html`, pull in your include like this: +Where the sidebar code previously existed in `default.html`, pull in your "include" like this: ```liquid {% raw %}{% include sidebar.html %}{% endraw %} @@ -408,7 +439,7 @@ In your `default.html` layout, look for a reference to the RSS or Atom feed in y ``` -You can also auto-generate your feed by adding a gem called [`jekyll-feed`][jekyll-feed]. This gem will also work on GitHub Pages. +You can also auto-generate your posts feed by adding a gem called [`jekyll-feed`][jekyll-feed]. This gem will also work on GitHub Pages. ## 11. Add a sitemap @@ -444,7 +475,7 @@ search: exclude {% endraw %} ``` -Again, we're using a for loop here to iterate through all posts and pages to add them to the sitemap. +Again, we're using a `for` loop here to iterate through all posts and pages to add them to the sitemap. You can also auto-generate your sitemap by adding a gem called [`jekyll-sitemap`][jekyll-sitemap]. This gem will also work on GitHub Pages. @@ -452,16 +483,16 @@ You can also auto-generate your sitemap by adding a gem called [`jekyll-sitemap` For other services you might need (such as contact forms, search, comments, and more), look for third-party services. For example, you might use the following: -* For comments: [Disqus](https://disqus.com/) -* For a newsletter: [Tinyletter](https://tinyletter.com/) -* For contact forms: [Wufoo](https://www.wufoo.com/) -* For search: [Algolia Docsearch](https://community.algolia.com/docsearch/) + * For comments: [Disqus](https://disqus.com/) + * For a newsletter: [Tinyletter](https://tinyletter.com/) + * For contact forms: [Wufoo](https://www.wufoo.com/) + * For search: [Algolia Docsearch](https://community.algolia.com/docsearch/) For more details on services for static sites, see the [Third Parties](https://learn.cloudcannon.com/jekyll-third-parties/) list and tutorials from CloudCannon. Your Jekyll pages consist of HTML, CSS, and JavaScript, so pretty much any code you need to embed will work without a problem. -As you integrate code for these services, not that if a page in your Jekyll site doesn't have front matter tags, Jekyll won't process any of the content. The page will just be passed to the `_site` folder when you build your site. +As you integrate code for these services, note that **if a page in your Jekyll site doesn't have front matter tags, Jekyll won't process any of the content in that page.** The page will just be passed to the `_site` folder when you build your site. If you do want Jekyll to process some page content (for example, to populate a variable that you define in your site's config file), just add front matter tags to the page. If you don't want any layout applied to the page, specify `layout: null` like this: @@ -475,16 +506,16 @@ layout: null Although websites can implement more sophisticated features and functionality, we've covered the basics in this tutorial. You now have a fully functional Jekyll site. -To deploy your site, consider using [Github Pages](https://pages.github.com/), [Amazon AWS S3](https://aws.amazon.com/s3/) using the [s3_website plugin](https://github.com/laurilehmijoki/s3_website), or just FTP your files to your web server. +To deploy your site, consider using [GitHub Pages](https://pages.github.com/), [Netlify](https://www.netlify.com/), [Amazon AWS S3](https://aws.amazon.com/s3/) using the [s3_website plugin](https://github.com/laurilehmijoki/s3_website), or just FTP your files to your web server. -You can also take your Jekyll theme to the next level by [packaging it as a Ruby gem](docs/themes/#creating-a-theme). +You can also package your layouts, includes and assets into a Ruby `gem` and [make it a Jekyll theme]({% link _docs/themes.md %}#creating-a-theme). ## Additional resources Here are some additional tutorials on creating Jekyll sites: -* [Convert a static site to Jekyll](http://jekyll.tips/jekyll-casts/converting-a-static-site-to-jekyll/) -* [Building a Jekyll Site – Part 1 of 3: Converting a Static Website To Jekyll](https://css-tricks.com/building-a-jekyll-site-part-1-of-3/) + * [Convert a static site to Jekyll](http://jekyll.tips/jekyll-casts/converting-a-static-site-to-jekyll/) + * [Building a Jekyll Site – Part 1 of 3: Converting a Static Website To Jekyll](https://css-tricks.com/building-a-jekyll-site-part-1-of-3/) [jekyll-sitemap]: https://help.github.com/articles/sitemaps-for-github-pages/ [jekyll-feed]: https://help.github.com/articles/atom-rss-feeds-for-github-pages/ diff --git a/docs/img/jekylllayoutconcept.png b/docs/img/jekylllayoutconcept.png index fe302c0a9d1f5f3430eb5771443fd41023130c23..bf0a3c34d56b144db38162256f758149d8e53d77 100644 GIT binary patch literal 40209 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 Date: Sun, 9 Apr 2017 16:45:45 -0400 Subject: [PATCH 2101/4996] Update history to reflect merge of #6006 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ef2ef088b02..e98b6c3336e 100644 --- a/History.markdown +++ b/History.markdown @@ -44,6 +44,7 @@ * Fix missing quotation mark (#6002) * New tutorial: Convert an HTML site to Jekyll (#5881) * Revamp Permalink section (#5912) + * Fixup tutorial on creating theme from existing HTML templates (#6006) ### Development Fixes From 034f03ed50f83183593095d4178063d8f18564a3 Mon Sep 17 00:00:00 2001 From: Zarino Zappia Date: Tue, 11 Apr 2017 16:19:49 +0100 Subject: [PATCH 2102/4996] Standardise on "URLs" without apostrophe in docs (#6018) Merge pull request 6018 --- History.markdown | 4 ++-- docs/_docs/github-pages.md | 4 ++-- docs/_docs/history.md | 4 ++-- docs/_docs/posts.md | 2 +- docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown | 2 +- docs/_posts/2016-10-06-jekyll-3-3-is-here.md | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/History.markdown b/History.markdown index e98b6c3336e..b51aae1358c 100644 --- a/History.markdown +++ b/History.markdown @@ -395,7 +395,7 @@ * Add `show_dir_listing` option for serve command and fix index file names (#4533) * Site Template: write a Gemfile which is educational to the new site (#4542) * Site template: add explanation of site variables in the example `_config.yml` (#4704) - * Adds `link` Liquid tag to make generation of URL's easier (#4624) + * Adds `link` Liquid tag to make generation of URLs easier (#4624) * Allow static files to be symlinked in unsafe mode or non-prod environments (#4640) * Add `:after_init` hook & add `Site#config=` to make resetting config easy (#4703) * DocumentDrop: add `#<=>` which sorts by date (falling back to path) (#4741) @@ -1178,7 +1178,7 @@ * Fix Rouge's RedCarpet plugin interface integration (#2951) * Remove `--watch` from the site template blog post since it defaults to watching in in 2.4.0 (#2922) * Fix code for media query mixin in site template (#2946) - * Allow post URL's to have `.htm` extensions (#2925) + * Allow post URLs to have `.htm` extensions (#2925) * `Utils.slugify`: Don't create new objects when gsubbing (#2997) * The jsonify filter should deep-convert to Liquid when given an Array. (#3032) * Apply `jsonify` filter to Hashes deeply and effectively (#3063) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 875bb0ece71..2d519f68e00 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -17,13 +17,13 @@ This guide will teach you what you need to know about Git, GitHub, and Jekyll to Sometimes it's nice to preview your Jekyll site before you push your `gh-pages` branch to GitHub. However, the subdirectory-like URL structure GitHub uses for -Project Pages complicates the proper resolution of URLs. In order to assure your site builds properly, use `site.github.url` in your URL's. +Project Pages complicates the proper resolution of URLs. In order to assure your site builds properly, use `site.github.url` in your URLs. ```html {% raw %} - + [{{ page.title }}]("{{ page.url | prepend: site.github.url }}") {% endraw %} ``` diff --git a/docs/_docs/history.md b/docs/_docs/history.md index d0938169520..c67f978ab08 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -346,7 +346,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Add `show_dir_listing` option for serve command and fix index file names ([#4533]({{ site.repository }}/issues/4533)) - Site Template: write a Gemfile which is educational to the new site ([#4542]({{ site.repository }}/issues/4542)) - Site template: add explanation of site variables in the example `_config.yml` ([#4704]({{ site.repository }}/issues/4704)) -- Adds `link` Liquid tag to make generation of URL's easier ([#4624]({{ site.repository }}/issues/4624)) +- Adds `link` Liquid tag to make generation of URLs easier ([#4624]({{ site.repository }}/issues/4624)) - Allow static files to be symlinked in unsafe mode or non-prod environments ([#4640]({{ site.repository }}/issues/4640)) - Add `:after_init` hook & add `Site#config=` to make resetting config easy ([#4703]({{ site.repository }}/issues/4703)) - DocumentDrop: add `#<=>` which sorts by date (falling back to path) ([#4741]({{ site.repository }}/issues/4741)) @@ -1200,7 +1200,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Fix Rouge's RedCarpet plugin interface integration ([#2951]({{ site.repository }}/issues/2951)) - Remove `--watch` from the site template blog post since it defaults to watching in in 2.4.0 ([#2922]({{ site.repository }}/issues/2922)) - Fix code for media query mixin in site template ([#2946]({{ site.repository }}/issues/2946)) -- Allow post URL's to have `.htm` extensions ([#2925]({{ site.repository }}/issues/2925)) +- Allow post URLs to have `.htm` extensions ([#2925]({{ site.repository }}/issues/2925)) - `Utils.slugify`: Don't create new objects when gsubbing ([#2997]({{ site.repository }}/issues/2997)) - The jsonify filter should deep-convert to Liquid when given an Array. ([#3032]({{ site.repository }}/issues/3032)) - Apply `jsonify` filter to Hashes deeply and effectively ([#3063]({{ site.repository }}/issues/3063)) diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index ce00e2dde74..79b918153c1 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -43,7 +43,7 @@ file. For example, the following are examples of valid post filenames:
            ProTip™: Link to other posts

            Use the post_url - tag to link to other posts without having to worry about the URL's + tag to link to other posts without having to worry about the URLs breaking when the site permalink style changes.

    diff --git a/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown b/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown index 4cf4b6f754a..c17b8ce5648 100644 --- a/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown +++ b/docs/_posts/2016-07-26-jekyll-3-2-0-released.markdown @@ -22,7 +22,7 @@ Some other notable changes: - Explicit support for Ruby 2.0.x was dropped - Added an `:after_init` Hook - Added a `where_exp` filter to provide more powerful filtering -- Added a `link` liquid tag which can be used to generate URL's for any +- Added a `link` liquid tag which can be used to generate URLs for any post or document based on its path relative to the site source - ... and lots more! diff --git a/docs/_posts/2016-10-06-jekyll-3-3-is-here.md b/docs/_posts/2016-10-06-jekyll-3-3-is-here.md index 8c756ef7291..1ddddac12b7 100644 --- a/docs/_posts/2016-10-06-jekyll-3-3-is-here.md +++ b/docs/_posts/2016-10-06-jekyll-3-3-is-here.md @@ -55,7 +55,7 @@ By default, `baseurl` is set to `""` and therefore yields (never set to A result of `relative_url` will safely always produce a URL which is relative to the domain root. A similar principle applies to `absolute_url`. -It prepends your `baseurl` and `url` values, making absolute URL's all the +It prepends your `baseurl` and `url` values, making absolute URLs all the easier to make: {% highlight liquid %} From 4e82518a019a931d5148f2cd9b5ff28bea145785 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 11 Apr 2017 11:19:51 -0400 Subject: [PATCH 2103/4996] Update history to reflect merge of #6018 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b51aae1358c..4797308c0fc 100644 --- a/History.markdown +++ b/History.markdown @@ -45,6 +45,7 @@ * New tutorial: Convert an HTML site to Jekyll (#5881) * Revamp Permalink section (#5912) * Fixup tutorial on creating theme from existing HTML templates (#6006) + * Standardise on "URLs" without apostrophe in docs (#6018) ### Development Fixes From 87dd49693b6549bfad5c7c4e735bf4bb71ee49a0 Mon Sep 17 00:00:00 2001 From: Ricky Han Date: Thu, 13 Apr 2017 08:13:18 -0400 Subject: [PATCH 2104/4996] Added txtpen in tutorial (#6021) Merge pull request 6021 --- docs/_docs/extras.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/_docs/extras.md b/docs/_docs/extras.md index 87971f74a33..e79b9e90d74 100644 --- a/docs/_docs/extras.md +++ b/docs/_docs/extras.md @@ -6,6 +6,16 @@ permalink: /docs/extras/ There are a number of (optional) extra features that Jekyll supports that you may want to install, depending on how you plan to use Jekyll. +## Web Highlights and Commenting + +Register your site with [txtpen](https://txtpen.com). Then append + +```html + ``` to your template files in `/_layout` folder. From be9b83dff6b3479a05ae787614c853cfbe0c5ba3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 14 Apr 2017 07:33:36 -0400 Subject: [PATCH 2109/4996] Update history to reflect merge of #6027 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 39a0bf414d2..d37a675ac8d 100644 --- a/History.markdown +++ b/History.markdown @@ -48,6 +48,7 @@ * Standardise on "URLs" without apostrophe in docs (#6018) * Added txtpen in tutorial (#6021) * fix typo using past participle (#6026) + * changed formatting to fit the style of the documentation (#6027) ### Development Fixes From edc7a7ae54f1b183faace8be70db5c113d4ada91 Mon Sep 17 00:00:00 2001 From: Jeff Puckett Date: Fri, 14 Apr 2017 15:28:32 -0500 Subject: [PATCH 2110/4996] doc fix typo word usage (#6028) Merge pull request 6028 --- docs/_tutorials/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_tutorials/index.md b/docs/_tutorials/index.md index f023dc11e5c..e0eacfa6297 100644 --- a/docs/_tutorials/index.md +++ b/docs/_tutorials/index.md @@ -16,7 +16,7 @@ In contrast to [Docs](/docs/home/), Tutorials provide more detailed, narrative i In short, tutorials aren't the core reference information in docs. They walk users through processes from beginning to end. {: .info .note} -**Note:** The Tutorials section is new, so there aren't many tutorials yet. You can add a tutorial here to help popular this section. +**Note:** The Tutorials section is new, so there aren't many tutorials yet. You can add a tutorial here to help populate this section. Some of these techniques might even guide you through a supporting tool, script, service, or other hack used with your Jekyll site. Feel free to include tutorials involving external services with Jekyll as well. However, note that Jekyll in no way endorses any third-party tools mentioned in tutorials. From 3df88b2e31d49a6eb8a782bb39f13d40a471c55a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 14 Apr 2017 16:28:33 -0400 Subject: [PATCH 2111/4996] Update history to reflect merge of #6028 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d37a675ac8d..e458583e714 100644 --- a/History.markdown +++ b/History.markdown @@ -49,6 +49,7 @@ * Added txtpen in tutorial (#6021) * fix typo using past participle (#6026) * changed formatting to fit the style of the documentation (#6027) + * doc fix typo word usage (#6028) ### Development Fixes From ccb133fd333e75ddbf51bf26efc5b95085c6e449 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Mon, 17 Apr 2017 12:46:33 +0100 Subject: [PATCH 2112/4996] add `plugins` config key as replacement for `gems` (#5130) Merge pull request 5130 --- docs/_docs/assets.md | 2 +- docs/_docs/configuration.md | 2 +- docs/_docs/plugins.md | 6 +++--- lib/jekyll/configuration.rb | 24 ++++++++++++++++++++++-- lib/jekyll/errors.rb | 9 +++++---- lib/jekyll/plugin_manager.rb | 14 +++++++------- lib/jekyll/site.rb | 5 ++++- test/test_configuration.rb | 16 ++++++++++++---- test/test_plugin_manager.rb | 2 +- 9 files changed, 56 insertions(+), 24 deletions(-) diff --git a/docs/_docs/assets.md b/docs/_docs/assets.md index 7418f984f34..b31cf16cfe3 100644 --- a/docs/_docs/assets.md +++ b/docs/_docs/assets.md @@ -88,6 +88,6 @@ To enable Coffeescript in Jekyll 3.0 and up you must * Ensure that your `_config.yml` is up-to-date and includes the following: ```yaml -gems: +plugins: - jekyll-coffeescript ``` diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 989aa907eeb..7789d52f6e7 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -616,7 +616,7 @@ unpublished: false # Plugins whitelist: [] -gems: [] +plugins: [] # Conversion markdown: kramdown diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 4c09d2275f3..bc6386e2c7c 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -27,12 +27,12 @@ You have 3 options for installing plugins: 1. In your site source root, make a `_plugins` directory. Place your plugins here. Any file ending in `*.rb` inside this directory will be loaded before Jekyll generates your site. -2. In your `_config.yml` file, add a new array with the key `gems` and the +2. In your `_config.yml` file, add a new array with the key `plugins` and the values of the gem names of the plugins you'd like to use. An example: - gems: [jekyll-coffeescript, jekyll-watch, jekyll-assets] - # This will require each of these gems automatically. + plugins: [jekyll-coffeescript, jekyll-watch, jekyll-assets] + # This will require each of these plugins automatically. Then install your plugins using `gem install jekyll-coffeescript jekyll-watch jekyll-assets` diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 1e2ca01c7b1..86bee3c10a9 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -33,7 +33,7 @@ class Configuration < Hash # Plugins "whitelist" => [], - "gems" => [], + "plugins" => [], # Conversion "markdown" => "kramdown", @@ -229,9 +229,10 @@ def backwards_compatibilize # Provide backwards-compatibility check_auto(config) check_server(config) + check_plugins(config) renamed_key "server_port", "port", config - renamed_key "plugins", "plugins_dir", config + renamed_key "gems", "plugins", config renamed_key "layouts", "layouts_dir", config renamed_key "data_source", "data_dir", config @@ -385,5 +386,24 @@ def check_maruku(config) "`_config.yml` file." end end + + # Private: Checks if the `plugins` config is a String + # + # config - the config hash + # + # Raises a Jekyll::Errors::InvalidConfigurationError if the config `plugins` + # is a string + private + def check_plugins(config) + if config.key?("plugins") && config["plugins"].is_a?(String) + Jekyll.logger.error "Configuration Error:", "You specified the" \ + " `plugins` config in your configuration file as a string, please" \ + " use an array instead. If you wanted to set the directory of your" \ + " plugins, use the config key `plugins_dir` instead." + raise Jekyll::Errors::InvalidConfigurationError, + "'plugins' should not be a string, but was: " \ + "#{config["plugins"].inspect}. Use 'plugins_dir' instead." + end + end end end diff --git a/lib/jekyll/errors.rb b/lib/jekyll/errors.rb index 6ae24337ab5..95aa04b4ccd 100644 --- a/lib/jekyll/errors.rb +++ b/lib/jekyll/errors.rb @@ -9,9 +9,10 @@ module Errors InvalidYAMLFrontMatterError = Class.new(FatalException) MissingDependencyException = Class.new(FatalException) - InvalidDateError = Class.new(FatalException) - InvalidPostNameError = Class.new(FatalException) - PostURLError = Class.new(FatalException) - InvalidURLError = Class.new(FatalException) + InvalidDateError = Class.new(FatalException) + InvalidPostNameError = Class.new(FatalException) + PostURLError = Class.new(FatalException) + InvalidURLError = Class.new(FatalException) + InvalidConfigurationError = Class.new(FatalException) end end diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index fa183c628dd..979004d63b6 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -26,7 +26,7 @@ def conscientious_require # Returns nothing. def require_gems Jekyll::External.require_with_graceful_fail( - site.gems.select { |gem| plugin_allowed?(gem) } + site.gems.select { |plugin| plugin_allowed?(plugin) } ) end @@ -59,12 +59,12 @@ def self.require_from_bundler # Check whether a gem plugin is allowed to be used during this build. # - # gem_name - the name of the gem + # plugin_name - the name of the plugin # - # Returns true if the gem name is in the whitelist or if the site is not + # Returns true if the plugin name is in the whitelist or if the site is not # in safe mode. - def plugin_allowed?(gem_name) - !site.safe || whitelist.include?(gem_name) + def plugin_allowed?(plugin_name) + !site.safe || whitelist.include?(plugin_name) end # Build an array of allowed plugin gem names. @@ -99,12 +99,12 @@ def plugins_path end def deprecation_checks - pagination_included = (site.config["gems"] || []).include?("jekyll-paginate") || + pagination_included = (site.config["plugins"] || []).include?("jekyll-paginate") || defined?(Jekyll::Paginate) if site.config["paginate"] && !pagination_included Jekyll::Deprecator.deprecation_message "You appear to have pagination " \ "turned on, but you haven't included the `jekyll-paginate` gem. " \ - "Ensure you have `gems: [jekyll-paginate]` in your configuration file." + "Ensure you have `plugins: [jekyll-paginate]` in your configuration file." end end end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 347cea97641..6476027577b 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -46,10 +46,13 @@ def config=(config) @config = config.clone %w(safe lsi highlighter baseurl exclude include future unpublished - show_drafts limit_posts keep_files gems).each do |opt| + show_drafts limit_posts keep_files).each do |opt| self.send("#{opt}=", config[opt]) end + # keep using `gems` to avoid breaking change + self.gems = config["plugins"] + configure_plugins configure_theme configure_include_paths diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 9602c5c309f..c9988d163bc 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -205,9 +205,9 @@ class TestConfiguration < JekyllUnitTest "exclude" => "READ-ME.md, Gemfile,CONTRIBUTING.hello.markdown", "include" => "STOP_THE_PRESSES.txt,.heloses, .git", "pygments" => true, - "plugins" => true, "layouts" => true, "data_source" => true, + "gems" => [], }] end should "unset 'auto' and 'watch'" do @@ -242,9 +242,6 @@ class TestConfiguration < JekyllUnitTest assert_equal @config.backwards_compatibilize["highlighter"], "pygments" end should "adjust directory names" do - assert @config.key?("plugins") - assert !@config.backwards_compatibilize.key?("plugins") - assert @config.backwards_compatibilize["plugins_dir"] assert @config.key?("layouts") assert !@config.backwards_compatibilize.key?("layouts") assert @config.backwards_compatibilize["layouts_dir"] @@ -252,6 +249,17 @@ class TestConfiguration < JekyllUnitTest assert !@config.backwards_compatibilize.key?("data_source") assert @config.backwards_compatibilize["data_dir"] end + should "raise an error if `plugins` key is a string" do + config = Configuration[{ "plugins" => "_plugin" }] + assert_raises Jekyll::Errors::InvalidConfigurationError do + config.backwards_compatibilize + end + end + should "set the `gems` config to `plugins`" do + assert @config.key?("gems") + assert !@config.backwards_compatibilize["gems"] + assert @config.backwards_compatibilize["plugins"] + end end context "#fix_common_issues" do setup do diff --git a/test/test_plugin_manager.rb b/test/test_plugin_manager.rb index 9217965b211..90f057641e7 100644 --- a/test/test_plugin_manager.rb +++ b/test/test_plugin_manager.rb @@ -132,7 +132,7 @@ def with_no_gemfile should "print no deprecation warning if jekyll-paginate is present" do site = double({ - :config => { "paginate" => true, "gems" => ["jekyll-paginate"] }, + :config => { "paginate" => true, "plugins" => ["jekyll-paginate"] }, }) plugin_manager = PluginManager.new(site) From 14f0db9dcc10bd3c80c4f1f9a69ef220a2bd9102 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 17 Apr 2017 07:46:34 -0400 Subject: [PATCH 2113/4996] Update history to reflect merge of #5130 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e458583e714..da5850561b9 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,7 @@ * Require `runtime_dependencies` of a Gem-based theme from its `.gemspec` file (#5914) * Don't raise an error if URL contains a colon (#5889) * Date filters should never raise an exception (#5722) + * add `plugins` config key as replacement for `gems` (#5130) ### Documentation From a2e5899450b740ac94b30c8766b5cdf51cc29a22 Mon Sep 17 00:00:00 2001 From: Sven Meyer Date: Mon, 17 Apr 2017 23:03:59 +0200 Subject: [PATCH 2114/4996] corrected reference to layout in index.md (#6032) Merge pull request 6032 --- docs/_tutorials/convert-existing-site-to-jekyll.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_tutorials/convert-existing-site-to-jekyll.md b/docs/_tutorials/convert-existing-site-to-jekyll.md index 6a041e8ba64..a1058d75d97 100644 --- a/docs/_tutorials/convert-existing-site-to-jekyll.md +++ b/docs/_tutorials/convert-existing-site-to-jekyll.md @@ -56,7 +56,7 @@ name: My Jekyll Website ```yaml --- title: My page -layout: default.html +layout: default --- # {% raw %}{{ page.title }}{% endraw %} From b37d8b13dc212daab4ee52aed71993d11a5e9893 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 17 Apr 2017 17:04:00 -0400 Subject: [PATCH 2115/4996] Update history to reflect merge of #6032 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index da5850561b9..6783db30f56 100644 --- a/History.markdown +++ b/History.markdown @@ -51,6 +51,7 @@ * fix typo using past participle (#6026) * changed formatting to fit the style of the documentation (#6027) * doc fix typo word usage (#6028) + * corrected reference to layout in index.md (#6032) ### Development Fixes From af5d0965c03b97130435a9e0cca1299cc5dc72c0 Mon Sep 17 00:00:00 2001 From: Jeff Puckett Date: Mon, 17 Apr 2017 16:06:59 -0500 Subject: [PATCH 2116/4996] doc use example.com (#6031) Merge pull request 6031 --- lib/site_template/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index 436d5999500..8cb35c70e85 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -14,7 +14,7 @@ # You can create any custom variable you would like, and they will be accessible # in the templates via {{ site.myvariable }}. title: Your awesome title -email: your-email@domain.com +email: your-email@example.com description: > # this means to ignore newlines until "baseurl:" Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for From 144d053226fbb69145501a946aaea160f96cbffd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 17 Apr 2017 17:07:00 -0400 Subject: [PATCH 2117/4996] Update history to reflect merge of #6031 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6783db30f56..b54331c396b 100644 --- a/History.markdown +++ b/History.markdown @@ -66,6 +66,7 @@ * rubocop: lib/jekyll/renderer.rb complexity fixes (#5052) * Use yajl-ruby 1.2.2 (now with 2.4 support) (#6007) * Bump Rubocop to v0.48 (#5997) + * doc use example.com (#6031) ### Site Enhancements From b728473a63433ab3187a481d815b0131d8d49740 Mon Sep 17 00:00:00 2001 From: Brent Yi Date: Mon, 17 Apr 2017 14:32:04 -0700 Subject: [PATCH 2118/4996] Update CDN for MathJax (#6013) Merge pull request 6013 --- docs/_docs/extras.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/extras.md b/docs/_docs/extras.md index 7a826802c80..05d4682e874 100644 --- a/docs/_docs/extras.md +++ b/docs/_docs/extras.md @@ -21,7 +21,7 @@ to your template files in `/_layout` folder. Kramdown comes with optional support for LaTeX to PNG rendering via [MathJax](https://www.mathjax.org) within math blocks. See the Kramdown documentation on [math blocks](http://kramdown.gettalong.org/syntax.html#math-blocks) and [math support](http://kramdown.gettalong.org/converter/html.html#math-support) for more details. MathJax requires you to include JavaScript or CSS to render the LaTeX, e.g. ```html - + ``` For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/visually-enforced/opinion/2014/02/16/Mathjax-with-jekyll/). From 4b8b3084cdd5a6c1a6d30002a725a6e8bac0ed8a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 17 Apr 2017 17:32:06 -0400 Subject: [PATCH 2119/4996] Update history to reflect merge of #6013 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b54331c396b..7486379fe62 100644 --- a/History.markdown +++ b/History.markdown @@ -52,6 +52,7 @@ * changed formatting to fit the style of the documentation (#6027) * doc fix typo word usage (#6028) * corrected reference to layout in index.md (#6032) + * (Minor) Update MathJax CDN (#6013) ### Development Fixes From c35f0ed71cce00c05735e22c293150ba1e9e9a99 Mon Sep 17 00:00:00 2001 From: Marc Bruins Date: Wed, 19 Apr 2017 00:43:36 +0200 Subject: [PATCH 2120/4996] Add MvvmCross to samples (#6035) Merge pull request 6035 --- docs/_docs/sites.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_docs/sites.md b/docs/_docs/sites.md index 65401551cdc..f01a7a77f15 100644 --- a/docs/_docs/sites.md +++ b/docs/_docs/sites.md @@ -13,6 +13,8 @@ learning purposes. ([source](https://github.com/github/training-kit)) - [Rasmus Andersson](https://rsms.me/) ([source](https://github.com/rsms/rsms.github.com)) +- [MvvmCross](https://mvvmcross.github.io/MvvmCross/) + ([source](https://github.com/MvvmCross/MvvmCross/tree/master/docs)) If you would like to explore more examples, you can find a list of sites and their sources on the ["Sites" page in the Jekyll wiki][jekyll-sites]. From 76fb728f7207ca9cf3457660f593a2794abec6d8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 Apr 2017 18:43:38 -0400 Subject: [PATCH 2121/4996] Update history to reflect merge of #6035 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7486379fe62..280fc471c7e 100644 --- a/History.markdown +++ b/History.markdown @@ -53,6 +53,7 @@ * doc fix typo word usage (#6028) * corrected reference to layout in index.md (#6032) * (Minor) Update MathJax CDN (#6013) + * Add MvvmCross to samples (#6035) ### Development Fixes From 0108b22f3c99fa1d9bfb0ba4e72e2ded3fe4e281 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Wed, 19 Apr 2017 19:50:25 +0100 Subject: [PATCH 2122/4996] create configuration from options only once in the boot process (#5487) Merge pull request 5487 --- lib/jekyll/command.rb | 1 + lib/jekyll/commands/serve.rb | 11 ++++++----- test/test_commands_serve.rb | 25 +++++++++++++++++++++---- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/command.rb b/lib/jekyll/command.rb index 2a4fc77f450..9150d24d806 100644 --- a/lib/jekyll/command.rb +++ b/lib/jekyll/command.rb @@ -37,6 +37,7 @@ def process_site(site) # # Returns a full Jekyll configuration def configuration_from_options(options) + return options if options.is_a?(Jekyll::Configuration) Jekyll.configuration(options) end diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 1691359569d..622eda49b49 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -32,11 +32,12 @@ def init_with_program(prog) cmd.action do |_, opts| opts["serving"] = true opts["watch" ] = true unless opts.key?("watch") - config = opts["config"] - opts["url"] = default_url(opts) if Jekyll.env == "development" - Build.process(opts) - opts["config"] = config - Serve.process(opts) + + config = configuration_from_options(opts) + if Jekyll.env == "development" + config["url"] = default_url(config) + end + [Build, Serve].each { |klass| klass.process(config) } end end end diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index fa0f7f67bf3..ef98bab4e2b 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -82,16 +82,26 @@ def custom_opts(what) end should "keep config between build and serve" do - custom_options = { + options = { "config" => %w(_config.yml _development.yml), "serving" => true, "watch" => false, # for not having guard output when running the tests "url" => "http://localhost:4000", } + config = Jekyll::Configuration.from(options) - expect(Jekyll::Commands::Serve).to receive(:process).with(custom_options) - @merc.execute(:serve, { "config" => %w(_config.yml _development.yml), - "watch" => false, }) + allow(Jekyll::Command).to( + receive(:configuration_from_options).with(options).and_return(config) + ) + allow(Jekyll::Command).to( + receive(:configuration_from_options).with(config).and_return(config) + ) + + expect(Jekyll::Commands::Build).to( + receive(:process).with(config).and_call_original + ) + expect(Jekyll::Commands::Serve).to receive(:process).with(config) + @merc.execute(:serve, options) end context "in development environment" do @@ -175,5 +185,12 @@ def custom_opts(what) end end end + + should "read `configuration` only once" do + allow(Jekyll::Commands::Serve).to receive(:start_up_webrick) + + expect(Jekyll).to receive(:configuration).once.and_call_original + @merc.execute(:serve, { "watch" => false }) + end end end From 4c61e1809a26ad9d0c419bb98c0dec97ee3ce41d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 19 Apr 2017 14:50:27 -0400 Subject: [PATCH 2123/4996] Update history to reflect merge of #5487 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 280fc471c7e..a41751b3d5b 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Don't raise an error if URL contains a colon (#5889) * Date filters should never raise an exception (#5722) * add `plugins` config key as replacement for `gems` (#5130) + * create configuration from options only once in the boot process (#5487) ### Documentation From 694dcbd9e0af70db0db9e7c562ce1d7e8f7ae9a0 Mon Sep 17 00:00:00 2001 From: dyang Date: Wed, 19 Apr 2017 18:42:22 -0400 Subject: [PATCH 2124/4996] fix typo (#6040) Merge pull request 6040 --- lib/jekyll/tags/post_url.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index 37c7e56546b..f7e52f42b57 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -81,7 +81,7 @@ def render(context) site.posts.docs.each do |p| next unless @post.deprecated_equality p Jekyll::Deprecator.deprecation_message "A call to "\ - "'{{ post_url #{@post.name} }}' did not match " \ + "'{% post_url #{@post.name} %}' did not match " \ "a post using the new matching method of checking name " \ "(path-date-slug) equality. Please make sure that you " \ "change this tag to match the post's name exactly." From 13976cfb33f19b9c8fb7c9e9b306f354c6ca500c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 19 Apr 2017 18:42:23 -0400 Subject: [PATCH 2125/4996] Update history to reflect merge of #6040 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a41751b3d5b..2633828363e 100644 --- a/History.markdown +++ b/History.markdown @@ -70,6 +70,7 @@ * Use yajl-ruby 1.2.2 (now with 2.4 support) (#6007) * Bump Rubocop to v0.48 (#5997) * doc use example.com (#6031) + * fix typo (#6040) ### Site Enhancements From 3a36fde2402f6341caf4494e423774d1b44bac82 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 22 Apr 2017 22:22:26 +0200 Subject: [PATCH 2126/4996] Fix CI after #6040 (#6044) Merge pull request 6044 --- test/test_tags.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_tags.rb b/test/test_tags.rb index f077615defb..68fd40398a8 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -643,7 +643,7 @@ def highlight_block_with_opts(options_string) should "throw a deprecation warning" do deprecation_warning = " Deprecation: A call to "\ - "'{{ post_url 2008-11-21-nested }}' did not match a post using the new matching "\ + "'{% post_url 2008-11-21-nested %}' did not match a post using the new matching "\ "method of checking name (path-date-slug) equality. Please make sure that you "\ "change this tag to match the post's name exactly." assert_includes Jekyll.logger.messages, deprecation_warning From 4aa073279fd34d95d4fb2852aba80406cfb0a208 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 22 Apr 2017 16:22:27 -0400 Subject: [PATCH 2127/4996] Update history to reflect merge of #6044 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2633828363e..8f1a3379cb0 100644 --- a/History.markdown +++ b/History.markdown @@ -71,6 +71,7 @@ * Bump Rubocop to v0.48 (#5997) * doc use example.com (#6031) * fix typo (#6040) + * Fix CI (#6044) ### Site Enhancements From 457e4515e80e16f2d59b35a97ddd641002460e58 Mon Sep 17 00:00:00 2001 From: Liu Cheng Date: Mon, 24 Apr 2017 03:44:57 -0400 Subject: [PATCH 2128/4996] Update travis-ci.md to correct procedure (#6043) Merge pull request 6043 --- docs/_docs/continuous-integration/travis-ci.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/continuous-integration/travis-ci.md b/docs/_docs/continuous-integration/travis-ci.md index e76e1a60c32..cf7d74997eb 100644 --- a/docs/_docs/continuous-integration/travis-ci.md +++ b/docs/_docs/continuous-integration/travis-ci.md @@ -15,7 +15,7 @@ Enabling Travis builds for your GitHub repository is pretty simple: 1. Go to your profile on travis-ci.org: https://travis-ci.org/profile/username 2. Find the repository for which you're interested in enabling builds. -3. Click the slider on the right so it says "ON" and is a dark grey. +3. Flick the repository switch on so that it turns blue. 4. Optionally configure the build by clicking on the gear icon. Further configuration happens in your `.travis.yml` file. More details on that below. From 2e34bb816a4e257c7db7dc05d6089fdbd67b4cb2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 24 Apr 2017 03:44:58 -0400 Subject: [PATCH 2129/4996] Update history to reflect merge of #6043 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8f1a3379cb0..c10fab27d8c 100644 --- a/History.markdown +++ b/History.markdown @@ -55,6 +55,7 @@ * corrected reference to layout in index.md (#6032) * (Minor) Update MathJax CDN (#6013) * Add MvvmCross to samples (#6035) + * Update travis-ci.md to correct procedure (#6043) ### Development Fixes From 5f7f9ff1967a29a6fde6422ff1b6cf637af3e794 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 24 Apr 2017 21:26:04 +0530 Subject: [PATCH 2130/4996] fix sentence in documentation (#6048) Merge pull request 6048 --- docs/_docs/continuous-integration/travis-ci.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/_docs/continuous-integration/travis-ci.md b/docs/_docs/continuous-integration/travis-ci.md index cf7d74997eb..91323958024 100644 --- a/docs/_docs/continuous-integration/travis-ci.md +++ b/docs/_docs/continuous-integration/travis-ci.md @@ -17,8 +17,7 @@ Enabling Travis builds for your GitHub repository is pretty simple: 2. Find the repository for which you're interested in enabling builds. 3. Flick the repository switch on so that it turns blue. 4. Optionally configure the build by clicking on the gear icon. Further - configuration happens in your `.travis.yml` file. More details on that - below. + configuration happens via your `.travis.yml` file. More details below. ## 2. The Test Script From fbd535278ecdc4ee0341b7fb3bebd0bad4a757ca Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 24 Apr 2017 11:56:05 -0400 Subject: [PATCH 2131/4996] Update history to reflect merge of #6048 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c10fab27d8c..28b4b100598 100644 --- a/History.markdown +++ b/History.markdown @@ -56,6 +56,7 @@ * (Minor) Update MathJax CDN (#6013) * Add MvvmCross to samples (#6035) * Update travis-ci.md to correct procedure (#6043) + * fix sentence in documentation (#6048) ### Development Fixes From 0aea7c526294a2d68acf9e378c09d5b2d5fd5d49 Mon Sep 17 00:00:00 2001 From: Ryan Streur Date: Tue, 25 Apr 2017 08:37:35 -0700 Subject: [PATCH 2132/4996] rephrase a sentence in posts.md to be more direct (#6049) Merge pull request 6049 --- docs/_docs/posts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index f26c1c92be2..7265a564919 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -78,7 +78,7 @@ digital assets along with your text content. While the syntax for linking to these resources differs between Markdown and Textile, the problem of working out where to store these files in your site is something everyone will face. -Because of Jekyll’s flexibility, there are many solutions to how to do this. +There are a number of ways to include digital assets in Jekyll. One common solution is to create a folder in the root of the project directory called something like `assets` or `downloads`, into which any images, downloads or other resources are placed. Then, from within any post, they can be linked From 46668744e4d14e17cbe05e0ce7d2904d29657551 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Apr 2017 11:37:37 -0400 Subject: [PATCH 2133/4996] Update history to reflect merge of #6049 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 28b4b100598..9e42055cd1b 100644 --- a/History.markdown +++ b/History.markdown @@ -57,6 +57,7 @@ * Add MvvmCross to samples (#6035) * Update travis-ci.md to correct procedure (#6043) * fix sentence in documentation (#6048) + * rephrase a sentence in posts.md to be more direct (#6049) ### Development Fixes From d37f604fe2af472643ced91559e9b6208fd50330 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 25 Apr 2017 17:40:13 +0200 Subject: [PATCH 2134/4996] Compress Website Sass output (#6009) Merge pull request 6009 --- docs/_config.yml | 2 + docs/_sass/_normalize.scss | 428 ++++++++++++++++++++++++++++++++++++- rake/site.rake | 6 +- 3 files changed, 431 insertions(+), 5 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index 3661906ae06..ab3d4bf3aa1 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,5 +1,7 @@ markdown: kramdown highlighter: rouge +sass: + style: compressed gauges_id: 503c5af6613f5d0f19000027 google_analytics_id: UA-50755011-1 diff --git a/docs/_sass/_normalize.scss b/docs/_sass/_normalize.scss index 36186c9931a..b26c1009564 100644 --- a/docs/_sass/_normalize.scss +++ b/docs/_sass/_normalize.scss @@ -1 +1,427 @@ -/*! normalize.css v6.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none} +/*! normalize.css v6.0.0 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ + +figcaption, +figure, +main { /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + margin: 0; +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ + +details, /* 1 */ +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/rake/site.rake b/rake/site.rake index 63b04fc8243..00ffd228b44 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -43,12 +43,10 @@ namespace :site do end task :build => :generate - desc "Update normalize.css library to the latest version and minify" + desc "Update normalize.css library to the latest version" task :update_normalize_css do Dir.chdir("#{docs_folder}/_sass") do - sh 'curl "https://necolas.github.io/normalize.css/latest/normalize.css" -o "normalize.scss"' - sh 'sass "normalize.scss":"_normalize.scss" --style compressed' - rm ["normalize.scss", Dir.glob("*.map")].flatten + sh 'curl "https://necolas.github.io/normalize.css/latest/normalize.css" -o "_normalize.scss"' end end From e3dae0065f3696ad29bf8e80c95bac3a20649cb2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Apr 2017 11:40:15 -0400 Subject: [PATCH 2135/4996] Update history to reflect merge of #6009 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9e42055cd1b..b719187be1e 100644 --- a/History.markdown +++ b/History.markdown @@ -58,6 +58,7 @@ * Update travis-ci.md to correct procedure (#6043) * fix sentence in documentation (#6048) * rephrase a sentence in posts.md to be more direct (#6049) + * Compress Website Sass output (#6009) ### Development Fixes From 501ef914d7db377ad6ca7103366fb9ae0ca941f2 Mon Sep 17 00:00:00 2001 From: zenHeart Date: Wed, 26 Apr 2017 00:09:19 +0800 Subject: [PATCH 2136/4996] doc correct spelling error (#6050) Merge pull request 6050 --- docs/_tutorials/orderofinterpretation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_tutorials/orderofinterpretation.md b/docs/_tutorials/orderofinterpretation.md index 1146c636200..8cf9da557b0 100644 --- a/docs/_tutorials/orderofinterpretation.md +++ b/docs/_tutorials/orderofinterpretation.md @@ -17,7 +17,7 @@ Jekyll converts your site in the following order: 1. **Site variables**. Jekyll looks across your files and populates [site variables]({% link _docs/variables.md %}), such as `site`, `page`, `post`, and collection objects. (From these objects, Jekyll determines the values for permalinks, tags, categories, and other details.) 2. **Liquid**. Jekyll processes any [Liquid](https://github.com/Shopify/liquid) formatting in pages that contain [front matter]({% link _docs/frontmatter.md %}). You can identify Liquid as follows: - * **Liguid tags** start with `{% raw %}{%{% endraw %}` and end with a `{% raw %}%}{% endraw %}`. For example: `{% raw %}{% highlight %}{% endraw %}` or `{% raw %}{% seo %}{% endraw %}`. Tags can define blocks or be inline. Block-defining tags will also come with a corresponding end tag — for example, `{% raw %}{% endhighlight %}{% endraw %}`. + * **Liquid tags** start with `{% raw %}{%{% endraw %}` and end with a `{% raw %}%}{% endraw %}`. For example: `{% raw %}{% highlight %}{% endraw %}` or `{% raw %}{% seo %}{% endraw %}`. Tags can define blocks or be inline. Block-defining tags will also come with a corresponding end tag — for example, `{% raw %}{% endhighlight %}{% endraw %}`. * **Liquid variables** start and end with double curly braces. For example: `{% raw %}{{ site.myvariable }}{% endraw %}` or `{% raw %}{{ content }}{% endraw %}`. * **Liquid filters** start with a pipe character (`|`) and can only be used within **Liquid variables** after the variable string. For example: the `relative_url` filter in `{% raw %}{{ "css/main.css" | relative_url }}{% endraw %}`. From 0126f4ab5ed9d66f56332d0083984c8fa12c3985 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Apr 2017 12:09:20 -0400 Subject: [PATCH 2137/4996] Update history to reflect merge of #6050 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b719187be1e..00497364be8 100644 --- a/History.markdown +++ b/History.markdown @@ -59,6 +59,7 @@ * fix sentence in documentation (#6048) * rephrase a sentence in posts.md to be more direct (#6049) * Compress Website Sass output (#6009) + * doc correct spelling error (#6050) ### Development Fixes From e5c0e91bc5bed7e8707bb9d44a9405c96de7e7e0 Mon Sep 17 00:00:00 2001 From: Sven Meyer Date: Thu, 27 Apr 2017 17:28:35 +0200 Subject: [PATCH 2138/4996] adjusted date-format in sitemap (#6053) Merge pull request 6053 --- docs/_tutorials/convert-existing-site-to-jekyll.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_tutorials/convert-existing-site-to-jekyll.md b/docs/_tutorials/convert-existing-site-to-jekyll.md index a1058d75d97..2a6db34d323 100644 --- a/docs/_tutorials/convert-existing-site-to-jekyll.md +++ b/docs/_tutorials/convert-existing-site-to-jekyll.md @@ -457,7 +457,7 @@ search: exclude {% for page in site.pages %} {{page.url}} - {{site.time | date: '%Y-%B-%d' }} + {{site.time | date: '%Y-%m-%d' }} daily 0.5 @@ -466,7 +466,7 @@ search: exclude {% for post in site.posts %} {{post.url}} - {{site.time | date: '%Y-%B-%d' }} + {{site.time | date: '%Y-%m-%d' }} daily 0.5 From be70e8edd736b2bd091bb2f11e843ab1ba0a0659 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 27 Apr 2017 11:28:36 -0400 Subject: [PATCH 2139/4996] Update history to reflect merge of #6053 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 00497364be8..bc07ae351fd 100644 --- a/History.markdown +++ b/History.markdown @@ -60,6 +60,7 @@ * rephrase a sentence in posts.md to be more direct (#6049) * Compress Website Sass output (#6009) * doc correct spelling error (#6050) + * adjusted date-format in sitemap (#6053) ### Development Fixes From d3a15fad8d01746fa74a23c04899d4a20302ecf3 Mon Sep 17 00:00:00 2001 From: Finn Ellis Date: Tue, 9 May 2017 00:45:03 -0700 Subject: [PATCH 2140/4996] Typo fix (welcomed change -> welcome change). (#6070) Merge pull request 6070 --- docs/_docs/posts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index 7265a564919..e3a749d5a5e 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -8,7 +8,7 @@ exactly? Well, simply put, it means that blogging is baked into Jekyll’s functionality. If you write articles and publish them online, you can publish and maintain a blog simply by managing a folder of text-files on your computer. Compared to the hassle of configuring and maintaining databases and web-based -CMS systems, this will be a welcomed change! +CMS systems, this will be a welcome change! ## The Posts Folder From c3c5745e4a4a632cdc00dd4790fead665d86f96a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 9 May 2017 03:45:04 -0400 Subject: [PATCH 2141/4996] Update history to reflect merge of #6070 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bc07ae351fd..c64994c071f 100644 --- a/History.markdown +++ b/History.markdown @@ -61,6 +61,7 @@ * Compress Website Sass output (#6009) * doc correct spelling error (#6050) * adjusted date-format in sitemap (#6053) + * Typo fix (welcomed change -> welcome change). (#6070) ### Development Fixes From 2b535792c7f9a227f1393047c3b6e52eb741e0b9 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Tue, 9 May 2017 01:46:24 -0600 Subject: [PATCH 2142/4996] Fixed documentation inconsistency (#6068) Merge pull request 6068 --- docs/_tutorials/navigation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index 324fe8ad3a2..94d79d0e8ed 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -33,7 +33,7 @@ You want to return a basic list of pages. **YAML** ```yaml -docs_list_title: Docs +docs_list_title: ACME Documentation docs: - title: Introduction From 86d2b77f3bded0832dbcb5a78578c89b206d47b4 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 9 May 2017 03:46:26 -0400 Subject: [PATCH 2143/4996] Update history to reflect merge of #6068 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c64994c071f..5b0cac48e84 100644 --- a/History.markdown +++ b/History.markdown @@ -62,6 +62,7 @@ * doc correct spelling error (#6050) * adjusted date-format in sitemap (#6053) * Typo fix (welcomed change -> welcome change). (#6070) + * Fixed documentation inconsistency (#6068) ### Development Fixes From 308ba550efeab34d786c43594d6cfb59744df184 Mon Sep 17 00:00:00 2001 From: Jonathan Hooper Date: Tue, 9 May 2017 19:17:36 -0500 Subject: [PATCH 2144/4996] Add option to fail a build with front matter syntax errors (#5832) Merge pull request 5832 --- docs/_docs/configuration.md | 25 ++++++++--- lib/jekyll/command.rb | 4 ++ lib/jekyll/configuration.rb | 79 +++++++++++++++++---------------- lib/jekyll/convertible.rb | 2 + lib/jekyll/document.rb | 18 ++++++-- test/source/_broken/bad_post.md | 4 ++ test/test_convertible.rb | 8 ++++ test/test_site.rb | 18 ++++++++ 8 files changed, 109 insertions(+), 49 deletions(-) create mode 100644 test/source/_broken/bad_post.md diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 7789d52f6e7..057e4ee29f8 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -305,6 +305,18 @@ class="flag">flags (specified on the command-line) that control them.

    --profile

    + + +

    Strict Front Matter

    +

    + Cause a build to fail if there is a YAML syntax error in a page's front matter. +

    + + +

    strict_front_matter: BOOL

    +

    --strict_front_matter

    + +
    @@ -601,12 +613,13 @@ collections: output: true # Handling Reading -safe: false -include: [".htaccess"] -exclude: ["Gemfile", "Gemfile.lock", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"] -keep_files: [".git", ".svn"] -encoding: "utf-8" -markdown_ext: "markdown,mkdown,mkdn,mkd,md" +safe: false +include: [".htaccess"] +exclude: ["Gemfile", "Gemfile.lock", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"] +keep_files: [".git", ".svn"] +encoding: "utf-8" +markdown_ext: "markdown,mkdown,mkdn,mkd,md" +strict_front_matter: false # Filtering Content show_drafts: null diff --git a/lib/jekyll/command.rb b/lib/jekyll/command.rb index 9150d24d806..f9f243dd9e6 100644 --- a/lib/jekyll/command.rb +++ b/lib/jekyll/command.rb @@ -46,6 +46,7 @@ def configuration_from_options(options) # c - the Jekyll::Command to add these options to # # Returns nothing + # rubocop:disable Metrics/MethodLength def add_build_options(c) c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", Array, "Custom configuration file" @@ -66,7 +67,10 @@ def add_build_options(c) c.option "quiet", "-q", "--quiet", "Silence output." c.option "verbose", "-V", "--verbose", "Print verbose output." c.option "incremental", "-I", "--incremental", "Enable incremental rebuild." + c.option "strict_front_matter", "--strict_front_matter", + "Fail if errors are present in front matter" end + # rubocop:enable Metrics/MethodLength end end end diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 86bee3c10a9..153d98fe009 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -6,71 +6,72 @@ class Configuration < Hash # Strings rather than symbols are used for compatibility with YAML. DEFAULTS = Configuration[{ # Where things are - "source" => Dir.pwd, - "destination" => File.join(Dir.pwd, "_site"), - "plugins_dir" => "_plugins", - "layouts_dir" => "_layouts", - "data_dir" => "_data", - "includes_dir" => "_includes", - "collections" => {}, + "source" => Dir.pwd, + "destination" => File.join(Dir.pwd, "_site"), + "plugins_dir" => "_plugins", + "layouts_dir" => "_layouts", + "data_dir" => "_data", + "includes_dir" => "_includes", + "collections" => {}, # Handling Reading - "safe" => false, - "include" => [".htaccess"], - "exclude" => %w( + "safe" => false, + "include" => [".htaccess"], + "exclude" => %w( Gemfile Gemfile.lock node_modules vendor/bundle/ vendor/cache/ vendor/gems/ vendor/ruby/ ), - "keep_files" => [".git", ".svn"], - "encoding" => "utf-8", - "markdown_ext" => "markdown,mkdown,mkdn,mkd,md", + "keep_files" => [".git", ".svn"], + "encoding" => "utf-8", + "markdown_ext" => "markdown,mkdown,mkdn,mkd,md", + "strict_front_matter" => false, # Filtering Content - "show_drafts" => nil, - "limit_posts" => 0, - "future" => false, - "unpublished" => false, + "show_drafts" => nil, + "limit_posts" => 0, + "future" => false, + "unpublished" => false, # Plugins - "whitelist" => [], - "plugins" => [], + "whitelist" => [], + "plugins" => [], # Conversion - "markdown" => "kramdown", - "highlighter" => "rouge", - "lsi" => false, - "excerpt_separator" => "\n\n", - "incremental" => false, + "markdown" => "kramdown", + "highlighter" => "rouge", + "lsi" => false, + "excerpt_separator" => "\n\n", + "incremental" => false, # Serving - "detach" => false, # default to not detaching the server - "port" => "4000", - "host" => "127.0.0.1", - "baseurl" => "", - "show_dir_listing" => false, + "detach" => false, # default to not detaching the server + "port" => "4000", + "host" => "127.0.0.1", + "baseurl" => "", + "show_dir_listing" => false, # Output Configuration - "permalink" => "date", - "paginate_path" => "/page:num", - "timezone" => nil, # use the local timezone + "permalink" => "date", + "paginate_path" => "/page:num", + "timezone" => nil, # use the local timezone - "quiet" => false, - "verbose" => false, - "defaults" => [], + "quiet" => false, + "verbose" => false, + "defaults" => [], - "liquid" => { + "liquid" => { "error_mode" => "warn", }, - "rdiscount" => { + "rdiscount" => { "extensions" => [], }, - "redcarpet" => { + "redcarpet" => { "extensions" => [], }, - "kramdown" => { + "kramdown" => { "auto_ids" => true, "toc_levels" => "1..6", "entity_output" => "as_char", diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 34741c8ff1d..16745dd5b6a 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -48,8 +48,10 @@ def read_yaml(base, name, opts = {}) end rescue SyntaxError => e Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" + raise e if self.site.config["strict_front_matter"] rescue => e Jekyll.logger.warn "Error reading file #{filename}: #{e.message}" + raise e if self.site.config["strict_front_matter"] end self.data ||= {} diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index a37ca1e41f5..90cfd1be97a 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -259,11 +259,8 @@ def read(opts = {}) merge_defaults read_content(opts) read_post_data - rescue SyntaxError => e - Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{e.message}" rescue => e - raise e if e.is_a? Jekyll::Errors::FatalException - Jekyll.logger.error "Error:", "could not read file #{path}: #{e.message}" + handle_read_error(e) end end end @@ -457,6 +454,19 @@ def read_post_data generate_excerpt end + private + def handle_read_error(error) + if error.is_a? SyntaxError + Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{error.message}" + else + Jekyll.logger.error "Error:", "could not read file #{path}: #{error.message}" + end + + if site.config["strict_front_matter"] || error.is_a?(Jekyll::Errors::FatalException) + raise error + end + end + private def populate_title if relative_path =~ DATE_FILENAME_MATCHER diff --git a/test/source/_broken/bad_post.md b/test/source/_broken/bad_post.md new file mode 100644 index 00000000000..f895dd26ebb --- /dev/null +++ b/test/source/_broken/bad_post.md @@ -0,0 +1,4 @@ +--- +bad yaml: [ +--- +Real content starts here diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 82d643748a7..6e6defa6519 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -33,6 +33,14 @@ class TestConvertible < JekyllUnitTest assert_match(%r!#{File.join(@base, name)}!, out) end + should "raise for broken front matter with `strict_front_matter` set" do + name = "broken_front_matter2.erb" + @convertible.site.config["strict_front_matter"] = true + assert_raises do + @convertible.read_yaml(@base, name) + end + end + should "not allow ruby objects in YAML" do out = capture_stderr do @convertible.read_yaml(@base, "exploit_front_matter.erb") diff --git a/test/test_site.rb b/test/test_site.rb index 65032ebdfd3..d039cb8a924 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -280,6 +280,24 @@ def generate(site) Site.new(site_configuration("destination" => File.join(source_dir, ".."))) end end + + should "raise for bad frontmatter if strict_front_matter is set" do + site = Site.new(site_configuration( + "collections" => ["broken"], + "strict_front_matter" => true + )) + assert_raises do + site.process + end + end + + should "not raise for bad frontmatter if strict_front_matter is not set" do + site = Site.new(site_configuration( + "collections" => ["broken"], + "strict_front_matter" => false + )) + site.process + end end context "with orphaned files in destination" do From 13b6c502b7d943cd188eca5018a0a93704dfd148 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 9 May 2017 20:17:37 -0400 Subject: [PATCH 2145/4996] Update history to reflect merge of #5832 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5b0cac48e84..c7a432df477 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ * Date filters should never raise an exception (#5722) * add `plugins` config key as replacement for `gems` (#5130) * create configuration from options only once in the boot process (#5487) + * Add option to fail a build with front matter syntax errors (#5832) ### Documentation From f93c155781a186e4fbf6c7a42048381e021de13a Mon Sep 17 00:00:00 2001 From: Oreonax Date: Sat, 13 May 2017 02:24:25 +0200 Subject: [PATCH 2146/4996] Add own plugin -> Jekyll Brand Social Wall (#6064) Merge pull request 6064 --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index bc6386e2c7c..05d76a20ff4 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -871,6 +871,7 @@ LESS.js files during generation. - [Jekyll Cloudinary](https://nhoizey.github.io/jekyll-cloudinary/) by [Nicolas Hoizey](https://nicolas-hoizey.com/): a Jekyll plugin adding a Liquid tag to ease the use of Cloudinary for responsive images in your Markdown/Kramdown posts. - [jekyll-include-absolute-plugin](https://github.com/tnhu/jekyll-include-absolute-plugin) by [Tan Nhu](https://github.com/tnhu): A Jekyll plugin to include a file from its path relative to Jekyll's source folder. - [Jekyll Download Tag](https://github.com/mattg/jekyll-download-tag): A Liquid tag that acts like `include`, but for external resources. +- [Jekyll Brand Social Wall](https://github.com/MediaComem/jekyll-brand-social-wall): A jekyll plugin to generate a social wall with your favorite social networks #### Collections From 72564f179b232f931e76072cdfcc151e6923c629 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 12 May 2017 20:24:26 -0400 Subject: [PATCH 2147/4996] Update history to reflect merge of #6064 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c7a432df477..e2548230d4c 100644 --- a/History.markdown +++ b/History.markdown @@ -64,6 +64,7 @@ * adjusted date-format in sitemap (#6053) * Typo fix (welcomed change -> welcome change). (#6070) * Fixed documentation inconsistency (#6068) + * Add own plugin -> Jekyll Brand Social Wall (#6064) ### Development Fixes From 3156f74a530246183f0228924048cfa565b4cd06 Mon Sep 17 00:00:00 2001 From: Hendrik Schneider Date: Sat, 13 May 2017 03:25:09 +0300 Subject: [PATCH 2148/4996] Added plugin jekyll-analytics (#6042) Merge pull request 6042 --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 05d76a20ff4..303967ca1e1 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -881,6 +881,7 @@ LESS.js files during generation. #### Other +- [Analytics for Jekyll](https://github.com/hendrikschneider/jekyll-analytics) by Hendrik Schneider: An effortless way to add various trackers like Google Analytics, Piwik, etc. to your site - [ditaa-ditaa](https://github.com/tmthrgd/ditaa-ditaa) by Tom Thorogood: a drastic revision of jekyll-ditaa that renders diagrams drawn using ASCII art into PNG images. - [Pygments Cache Path by Raimonds Simanovskis](https://github.com/rsim/blog.rayapps.com/blob/master/_plugins/pygments_cache_patch.rb): Plugin to cache syntax-highlighted code from Pygments. - [Draft/Publish Plugin by Michael Ivey](https://gist.github.com/49630): Save posts as drafts. From 771bae4ec5eb4714e011d69caf60f31be16c49ce Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 12 May 2017 20:25:10 -0400 Subject: [PATCH 2149/4996] Update history to reflect merge of #6042 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e2548230d4c..a3f63e04e1c 100644 --- a/History.markdown +++ b/History.markdown @@ -65,6 +65,7 @@ * Typo fix (welcomed change -> welcome change). (#6070) * Fixed documentation inconsistency (#6068) * Add own plugin -> Jekyll Brand Social Wall (#6064) + * Added plugin jekyll-analytics (#6042) ### Development Fixes From 1d55b703655819eebdb0a1f7d6d2970cc1d26c47 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Sat, 13 May 2017 05:58:03 +0530 Subject: [PATCH 2150/4996] Remove `ruby RUBY_VERSION` from generated Gemfile (#5803) Merge pull request 5803 --- lib/jekyll/commands/new.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 144fddf7a3e..81ed9201809 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -61,7 +61,6 @@ def initialized_post_name def gemfile_contents <<-RUBY source "https://rubygems.org" -ruby RUBY_VERSION # Hello! This is where you manage which Jekyll version is used to run. # When you want to use a different version, change it below, save the From e0dfff01227fb978a634b39afa79819fd7c90813 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 12 May 2017 20:28:04 -0400 Subject: [PATCH 2151/4996] Update history to reflect merge of #5803 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a3f63e04e1c..ccc720ae00a 100644 --- a/History.markdown +++ b/History.markdown @@ -83,6 +83,7 @@ * doc use example.com (#6031) * fix typo (#6040) * Fix CI (#6044) + * Remove `ruby RUBY_VERSION` from generated Gemfile (#5803) ### Site Enhancements From 4d9c93e4916627d3aff28db8ca9c22dc8eab2d7d Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Tue, 16 May 2017 01:36:23 +0530 Subject: [PATCH 2152/4996] Disable default layouts for documents with a `layout: none` declaration (#5933) Merge pull request 5933 --- features/rendering.feature | 38 ++++++++++++++++++++++++++++++++++++++ lib/jekyll/document.rb | 13 ++++++++++--- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/features/rendering.feature b/features/rendering.feature index fbe9ce57415..ecb31094fbc 100644 --- a/features/rendering.feature +++ b/features/rendering.feature @@ -40,6 +40,44 @@ Feature: Rendering And I should not see "Ahoy, indeed!" in "_site/index.css" And I should not see "Ahoy, indeed!" in "_site/index.js" + Scenario: Ignore defaults and don't place documents with layout set to 'none' + Given I have a "index.md" page with layout "none" that contains "Hi there, {{ site.author }}!" + And I have a _trials directory + And I have a "_trials/no-layout.md" page with layout "none" that contains "Hi there, {{ site.author }}!" + And I have a "_trials/test.md" page with layout "null" that contains "Hi there, {{ site.author }}!" + And I have a none layout that contains "{{ content }}Welcome!" + And I have a page layout that contains "{{ content }}Check this out!" + And I have a configuration file with: + | key | value | + | author | John Doe | + | collections | {trials: {output: true}} | + | defaults | [{scope: {path: ""}, values: {layout: page}}] | + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And I should not see "Welcome!" in "_site/trials/no-layout.html" + And I should not see "Check this out!" in "_site/trials/no-layout.html" + But I should see "Check this out!" in "_site/trials/test.html" + And I should see "Welcome!" in "_site/index.html" + + Scenario: Don't place documents with layout set to 'none' + Given I have a "index.md" page with layout "none" that contains "Hi there, {{ site.author }}!" + And I have a _trials directory + And I have a "_trials/no-layout.md" page with layout "none" that contains "Hi there, {{ site.author }}!" + And I have a "_trials/test.md" page with layout "page" that contains "Hi there, {{ site.author }}!" + And I have a none layout that contains "{{ content }}Welcome!" + And I have a page layout that contains "{{ content }}Check this out!" + And I have a configuration file with: + | key | value | + | author | John Doe | + | collections | {trials: {output: true}} | + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And I should not see "Welcome!" in "_site/trials/no-layout.html" + But I should see "Check this out!" in "_site/trials/test.html" + And I should see "Welcome!" in "_site/index.html" + Scenario: Render liquid in Sass Given I have an "index.scss" page that contains ".foo-bar { color:{{site.color}}; }" And I have a configuration file with "color" set to "red" diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 90cfd1be97a..002404e6368 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -161,12 +161,19 @@ def render_with_liquid? !(coffeescript_file? || yaml_file?) end + # Determine whether the file should be rendered with a layout. + # + # Returns true if the Front Matter specifies that `layout` is set to `none`. + def no_layout? + data["layout"] == "none" + end + # Determine whether the file should be placed into layouts. # - # Returns false if the document is either an asset file or a yaml file, - # true otherwise. + # Returns false if the document is set to `layouts: none`, or is either an + # asset file or a yaml file. Returns true otherwise. def place_in_layout? - !(asset_file? || yaml_file?) + !(asset_file? || yaml_file? || no_layout?) end # The URL template where the document would be accessible. From bd104c4ee0ec921f5b681c098595260155cd0106 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 15 May 2017 16:06:25 -0400 Subject: [PATCH 2153/4996] Update history to reflect merge of #5933 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ccc720ae00a..fe8c0fc4f6b 100644 --- a/History.markdown +++ b/History.markdown @@ -13,6 +13,7 @@ * add `plugins` config key as replacement for `gems` (#5130) * create configuration from options only once in the boot process (#5487) * Add option to fail a build with front matter syntax errors (#5832) + * Disable default layouts for documents with a `layout: none` declaration (#5933) ### Documentation From 33ff62ee03761cae0ff8ac212c2f0ef3386b286d Mon Sep 17 00:00:00 2001 From: David Zhang Date: Tue, 23 May 2017 14:45:44 +0800 Subject: [PATCH 2154/4996] Update _config.yml: gems to plugins (#6082) Merge pull request 6082 --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index ab3d4bf3aa1..044cb386c95 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -46,7 +46,7 @@ twitter: logo: /img/logo-2x.png -gems: +plugins: - jekyll-avatar - jekyll-feed - jekyll-mentions From 93c8b8556e0e649f92b6887488749e7431632490 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 23 May 2017 02:45:45 -0400 Subject: [PATCH 2155/4996] Update history to reflect merge of #6082 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fe8c0fc4f6b..772d62a8440 100644 --- a/History.markdown +++ b/History.markdown @@ -95,6 +95,7 @@ * Navigation has been moved out from docs (#5927) * Make links in sidebar for current page more prominent (#5820) * Update normalize.css to v6.0.0 (#6008) + * Docs: rename `gems` to `plugins` (#6082) ### Bug Fixes From 6c728120beeb363d59cd1adedb8d174840216ef9 Mon Sep 17 00:00:00 2001 From: Krzysztof Szafranek Date: Tue, 23 May 2017 08:47:39 +0200 Subject: [PATCH 2156/4996] Use more precise language when explaining links (#6078) Merge pull request 6078 --- docs/_docs/templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index c612df497d8..cc21b36bed7 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -542,7 +542,7 @@ You can also use the `link` tag to create a link in Markdown as follows: The path to the post, page, or collection is defined as the path relative to the root directory (where your config file is) to the file, not the path from your existing page to the other page. -For example, suppose you're creating a link `page_a.md` (stored in `pages/folder1/folder2`) to `page_b.md` (stored in `pages/folder1`). Your path in the link would not be `../page_b.html`. Instead, it would be `/pages/folder1/page_b.md`. +For example, suppose you're creating a link in `page_a.md` (stored in `pages/folder1/folder2`) to `page_b.md` (stored in `pages/folder1`). Your path in the link would not be `../page_b.html`. Instead, it would be `/pages/folder1/page_b.md`. If you're unsure of the path, add `{% raw %}{{ page.path }}{% endraw %}` to the page and it will display the path. From dcd54adbc0ac211c73ce7c2e0881fa0dc4972860 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 23 May 2017 02:47:40 -0400 Subject: [PATCH 2157/4996] Update history to reflect merge of #6078 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 772d62a8440..e5416d6c6ee 100644 --- a/History.markdown +++ b/History.markdown @@ -67,6 +67,7 @@ * Fixed documentation inconsistency (#6068) * Add own plugin -> Jekyll Brand Social Wall (#6064) * Added plugin jekyll-analytics (#6042) + * Use more precise language when explaining links (#6078) ### Development Fixes From f1a9af5ba6783ca72533600abb55fd10e9514732 Mon Sep 17 00:00:00 2001 From: Kevin Funk Date: Wed, 24 May 2017 17:57:03 -0700 Subject: [PATCH 2158/4996] Update plugins.md (#6088) Merge pull request 6088 --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 303967ca1e1..653d37a2c6f 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -872,6 +872,7 @@ LESS.js files during generation. - [jekyll-include-absolute-plugin](https://github.com/tnhu/jekyll-include-absolute-plugin) by [Tan Nhu](https://github.com/tnhu): A Jekyll plugin to include a file from its path relative to Jekyll's source folder. - [Jekyll Download Tag](https://github.com/mattg/jekyll-download-tag): A Liquid tag that acts like `include`, but for external resources. - [Jekyll Brand Social Wall](https://github.com/MediaComem/jekyll-brand-social-wall): A jekyll plugin to generate a social wall with your favorite social networks +- [Jekyll If File Exists](https://github.com/k-funk/jekyll-if-file-exists): A Jekyll Plugin that checks if a file exists with an if/else block. #### Collections From 2561470039cd290b136b7ad78477c629ec2ba0c5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 24 May 2017 20:57:04 -0400 Subject: [PATCH 2159/4996] Update history to reflect merge of #6088 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e5416d6c6ee..6ec0323be3d 100644 --- a/History.markdown +++ b/History.markdown @@ -68,6 +68,7 @@ * Add own plugin -> Jekyll Brand Social Wall (#6064) * Added plugin jekyll-analytics (#6042) * Use more precise language when explaining links (#6078) + * Update plugins.md (#6088) ### Development Fixes From b8430df6b1d4b1bc64a7f768d14f5ec05bf71dee Mon Sep 17 00:00:00 2001 From: Henry Kobin Date: Wed, 31 May 2017 07:35:54 -0700 Subject: [PATCH 2160/4996] windows 10 tutorial (#6100) Merge pull request 6100 --- docs/_docs/windows.md | 59 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index cc284567b6a..b72fd836cd8 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -8,9 +8,57 @@ Jekyll with the proper tweaks. If you are using Windows 10 Anniversary Update, the easiest way to run Jekyll is to use the new [Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about?f=255&MSPPError=-2147217396). For older installations, this page aims to collect some of the general knowledge and lessons that have been unearthed by Windows users. -## Installation +## Installation via Bash on Windows 10 -A quick way to install Jekyll is to follow the [installation instructions by David Burela](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/): +*Please note:* You must have [Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about?f=255&MSPPError=-2147217396) enabled. + +First let's make sure all our packages / repositories are up to date. Open a new Command Prompt instance, and type the following: + +``` +bash +``` +Your Command Prompt instance should now be a Bash instance. Now we must update our repo lists and packages. + +``` +sudo apt-get update -y && sudo apt-get upgrade -y +``` + +Now we can install Ruby. To do this we will use a repository from [BrightBox](https://www.brightbox.com/docs/ruby/ubuntu/), which hosts optimized versions of Ruby for Ubuntu. + +``` +sudo apt-add-repository ppa:brightbox/ruby-ng +sudo apt-get update +sudo apt-get install ruby2.3 ruby2.3-dev build-essentials +``` +Next let's update our Ruby gems: + +``` +sudo gem update + +``` + +Now all that is left to do is install Jekyll. + +``` +sudo gem install jekyll bundler + +``` + +You can test by running: + +``` +jekyll new my_project +``` + +**And that's it!** +If you `cd` into the folder, you can make sure time management is working by opening your `_posts` folder. You should see a markdown file with the current date listed. + +*Please note* Bash on Ubuntu on Windows is still under development, so you may run into issues. If you see an Auto-Regeneration error warning in your Bash instance, you can ignore it. + +## Installation via Chocolatey + + +A quick way to install Jekyll using Chocolatey is to follow the [installation instructions by David Burela](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/): 1. Install a package manager for Windows called [Chocolatey](https://chocolatey.org/install) 2. Install Ruby via Chocolatey: `choco install ruby -y` @@ -24,8 +72,6 @@ For a more conventional way of installing Jekyll you can follow this [complete g [windows-installjekyll3]: https://labs.sverrirs.com/jekyll/ -## Encoding - If you use UTF-8 encoding, make sure that no `BOM` header characters exist in your files or very, very bad things will happen to Jekyll. This is especially relevant if you're running Jekyll on Windows. @@ -37,9 +83,6 @@ the site generation process. It can be done with the following command: ```sh $ chcp 65001 ``` - -## Timezone Management - Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00. Though Windows users could alternatively define their blog's timezone by setting the key to use POSIX format of defining timezones, it wasn't as user-friendly when it came to having the clock altered to changing DST-rules. @@ -51,8 +94,6 @@ While 'new' blogs created with Jekyll v3.4 and greater, will have the following gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] ``` -## Auto-regeneration - As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the `--watch` switch is specified during a build or serve. While `listen` has built-in support for UNIX systems, it requires an extra gem for compatibility From 59db714d8bc5ba47c848ccfccafe8cb56232f10c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 31 May 2017 10:35:55 -0400 Subject: [PATCH 2161/4996] Update history to reflect merge of #6100 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6ec0323be3d..8fd01aaba57 100644 --- a/History.markdown +++ b/History.markdown @@ -69,6 +69,7 @@ * Added plugin jekyll-analytics (#6042) * Use more precise language when explaining links (#6078) * Update plugins.md (#6088) + * windows 10 tutorial (#6100) ### Development Fixes From 8a8b055150fca150c972397cebdf4df53fed93e4 Mon Sep 17 00:00:00 2001 From: Antonio Argote Date: Thu, 1 Jun 2017 04:10:10 +0800 Subject: [PATCH 2162/4996] Explain how to override theme styles (#6107) Merge pull request 6107 --- docs/_docs/themes.md | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index 6770a9ca998..c79ce54c4e1 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -35,23 +35,15 @@ The goal of gem-based themes is to allow you to get all the benefits of a robust Jekyll themes set default layouts, includes, and stylesheets. However, you can override any of the theme defaults with your own site content. -For example, if your selected theme has a `page` layout, you can override the theme's layout by creating your own `page` layout in the `_layouts` directory (that is, `_layouts/page.html`). - -Jekyll will look first to your site's content before looking to the theme's defaults for any requested file in the following folders: - -- `/assets` -- `/_layouts` -- `/_includes` -- `/_sass` +To replace layouts or includes in your theme, make a copy in your `_layouts` or `_includes` directory of the specific file you wish to modify, or create the file from scratch giving it the same name as the file you wish to override. -Refer to your selected theme's documentation and source repository for more information on what files you can override. -{: .note .info} +For example, if your selected theme has a `page` layout, you can override the theme's layout by creating your own `page` layout in the `_layouts` directory (that is, `_layouts/page.html`). -To locate theme's files on your computer: +To locate a theme's files on your computer: -1. Run `bundle show` followed by the name of the theme's gem, e.g., `bundle show minima` for default Jekyll's theme. +1. Run `bundle show` followed by the name of the theme's gem, e.g., `bundle show minima` for Jekyll's default theme. - This returns the location of the gem-based theme files. For example, Minima theme's files are located in `/usr/local/lib/ruby/gems/2.3.0/gems/minima-2.1.0` on macOS. + This returns the location of the gem-based theme files. For example, the Minima theme's files might be located in `/usr/local/lib/ruby/gems/2.3.0/gems/minima-2.1.0` on macOS. 2. Open the theme's directory in Finder or Explorer: @@ -92,9 +84,23 @@ To locate theme's files on your computer: └── main.scss ``` - With a clear understanding of the theme's files, you can now override any theme file by creating a similarly named file in your Jekyll site directory. +With a clear understanding of the theme's files, you can now override any theme file by creating a similarly named file in your Jekyll site directory. + +Let's say, for a second example, you want to override Minima's footer. In your Jekyll site, create an `_includes` folder and add a file in it called `footer.html`. Jekyll will now use your site's `footer.html` file instead of the `footer.html` file from the Minima theme gem. - Let's say you want to override Minima's footer. In your Jekyll site, create an `_includes` folder and add a file in it called `footer.html`. Jekyll will now use your site's `footer.html` file instead of the `footer.html` file from the Minima theme gem. +To modify any stylesheet you must take the extra step of also copying the main sass file (`_sass/minima.scss` in the Minima theme) into the `_sass` directory in your site's source. + +Jekyll will look first to your site's content before looking to the theme's defaults for any requested file in the following folders: + +- `/assets` +- `/_layouts` +- `/_includes` +- `/_sass` + +Note that making copies of theme files will prevent you from receiving any theme updates on those files. An alternative, to continue getting theme updates on all stylesheets, is to use higher specificity CSS selectors in your own additional, originally named CSS files. + +Refer to your selected theme's documentation and source repository for more information on what files you can override. +{: .note .info} ## Converting gem-based themes to regular themes From 5790510bebffc242458539454d1fc2b5252b44cd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 31 May 2017 16:10:12 -0400 Subject: [PATCH 2163/4996] Update history to reflect merge of #6107 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8fd01aaba57..71837442d7f 100644 --- a/History.markdown +++ b/History.markdown @@ -70,6 +70,7 @@ * Use more precise language when explaining links (#6078) * Update plugins.md (#6088) * windows 10 tutorial (#6100) + * Explain how to override theme styles (#6107) ### Development Fixes From b2e6e408eded454a8b4ee9be2d29de023c8d5b8d Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 1 Jun 2017 15:14:50 +0200 Subject: [PATCH 2164/4996] plugins -> gems (#6110) Merge pull request 6110 --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 044cb386c95..ab3d4bf3aa1 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -46,7 +46,7 @@ twitter: logo: /img/logo-2x.png -plugins: +gems: - jekyll-avatar - jekyll-feed - jekyll-mentions From 22b18543ef42730bd8157b51e489ce82edf4a6ae Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 1 Jun 2017 09:14:51 -0400 Subject: [PATCH 2165/4996] Update history to reflect merge of #6110 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 71837442d7f..8cc05ddd9be 100644 --- a/History.markdown +++ b/History.markdown @@ -100,6 +100,7 @@ * Make links in sidebar for current page more prominent (#5820) * Update normalize.css to v6.0.0 (#6008) * Docs: rename `gems` to `plugins` (#6082) + * plugins -> gems (#6110) ### Bug Fixes From 52b7e5245c88806333fd1f4b435821177c6a75bb Mon Sep 17 00:00:00 2001 From: Henry Kobin Date: Thu, 1 Jun 2017 12:54:01 -0700 Subject: [PATCH 2166/4996] updated Bash on Ubuntu on Windows link in tutorial (#6111) Merge pull request 6111 --- docs/_docs/windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index b72fd836cd8..cd489634142 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -5,7 +5,7 @@ permalink: /docs/windows/ While Windows is not an officially-supported platform, it can be used to run Jekyll with the proper tweaks. If you are using Windows 10 Anniversary Update, -the easiest way to run Jekyll is to use the new [Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about?f=255&MSPPError=-2147217396). +the easiest way to run Jekyll is to use the new [Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide). For older installations, this page aims to collect some of the general knowledge and lessons that have been unearthed by Windows users. ## Installation via Bash on Windows 10 From 18d8144dc19da0d9c7b8f207dcb2b9b91e80706e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 1 Jun 2017 15:54:02 -0400 Subject: [PATCH 2167/4996] Update history to reflect merge of #6111 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8cc05ddd9be..632a399010d 100644 --- a/History.markdown +++ b/History.markdown @@ -71,6 +71,7 @@ * Update plugins.md (#6088) * windows 10 tutorial (#6100) * Explain how to override theme styles (#6107) + * updated Bash on Ubuntu on Windows link in tutorial (#6111) ### Development Fixes From 5a1d78cadfc85a0e01be81656bed1b079175a3c4 Mon Sep 17 00:00:00 2001 From: sean delaney Date: Thu, 1 Jun 2017 16:54:23 -0700 Subject: [PATCH 2168/4996] Fix wording in _docs/templates.md links section (#6114) Merge pull request 6114 --- docs/_docs/templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index cc21b36bed7..c4eba3c888b 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -552,7 +552,7 @@ Note you cannot add filters to `link` tags. For example, you cannot append a str ### Linking to posts -If you want like to include a link to a post on your site, the `post_url` tag will generate the correct permalink URL for the post you specify. +If you want to include a link to a post on your site, the `post_url` tag will generate the correct permalink URL for the post you specify. ```liquid {% raw %} From 00d0b5de6bbfdea1902d0fe98eee5941b58dfcd9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 1 Jun 2017 19:54:24 -0400 Subject: [PATCH 2169/4996] Update history to reflect merge of #6114 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 632a399010d..03cf4d1294f 100644 --- a/History.markdown +++ b/History.markdown @@ -72,6 +72,7 @@ * windows 10 tutorial (#6100) * Explain how to override theme styles (#6107) * updated Bash on Ubuntu on Windows link in tutorial (#6111) + * Fix wording in _docs/templates.md links section (#6114) ### Development Fixes From 20c0576862fe2885aecf702a439be0ae55353607 Mon Sep 17 00:00:00 2001 From: Ashton Hellwig Date: Fri, 2 Jun 2017 03:32:07 -0600 Subject: [PATCH 2170/4996] Update windows.md (#6115) Merge pull request 6115 --- docs/_docs/windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index cd489634142..12e15815fef 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -28,7 +28,7 @@ Now we can install Ruby. To do this we will use a repository from [BrightBox](ht ``` sudo apt-add-repository ppa:brightbox/ruby-ng sudo apt-get update -sudo apt-get install ruby2.3 ruby2.3-dev build-essentials +sudo apt-get install ruby2.3 ruby2.3-dev build-essential ``` Next let's update our Ruby gems: From b6bd2f79d67673ccab0ddf3b73906e5cf0207554 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 2 Jun 2017 05:32:08 -0400 Subject: [PATCH 2171/4996] Update history to reflect merge of #6115 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 03cf4d1294f..7768548b84f 100644 --- a/History.markdown +++ b/History.markdown @@ -73,6 +73,7 @@ * Explain how to override theme styles (#6107) * updated Bash on Ubuntu on Windows link in tutorial (#6111) * Fix wording in _docs/templates.md links section (#6114) + * Update windows.md (#6115) ### Development Fixes From 9c7ac163cc3b9e4720f66080f463228a85fe2006 Mon Sep 17 00:00:00 2001 From: Henry Kobin Date: Fri, 2 Jun 2017 05:19:09 -0700 Subject: [PATCH 2172/4996] Added windows to docs.yml (#6109) Merge pull request 6109 --- docs/_data/docs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_data/docs.yml b/docs/_data/docs.yml index bb9d3b14c74..ef468fa1c9b 100644 --- a/docs/_data/docs.yml +++ b/docs/_data/docs.yml @@ -3,6 +3,7 @@ - home - quickstart - installation + - windows - usage - structure - configuration From 729472bbdaf65efdd0b0a0af730ada0036ab4b45 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 2 Jun 2017 08:19:11 -0400 Subject: [PATCH 2173/4996] Update history to reflect merge of #6109 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7768548b84f..76e4791f6cc 100644 --- a/History.markdown +++ b/History.markdown @@ -74,6 +74,7 @@ * updated Bash on Ubuntu on Windows link in tutorial (#6111) * Fix wording in _docs/templates.md links section (#6114) * Update windows.md (#6115) + * Added windows to docs.yml (#6109) ### Development Fixes From 4b7ebeb0141d6ff762065d2cebae7af57802589f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 5 Jun 2017 01:23:17 +0200 Subject: [PATCH 2174/4996] Upload the `_site` folder *content* (#6119) Merge pull request 6119 --- docs/_docs/deployment-methods.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md index 3e5fcfdcc90..ebf8bf12732 100644 --- a/docs/_docs/deployment-methods.md +++ b/docs/_docs/deployment-methods.md @@ -7,7 +7,7 @@ Sites built using Jekyll can be deployed in a large number of ways due to the st ## Web hosting providers (FTP) -Just about any traditional web hosting provider will let you upload files to their servers over FTP. To upload a Jekyll site to a web host using FTP, simply run the `jekyll build` command and copy the generated `_site` folder to the root folder of your hosting account. This is most likely to be the `httpdocs` or `public_html` folder on most hosting providers. +Just about any traditional web hosting provider will let you upload files to their servers over FTP. To upload a Jekyll site to a web host using FTP, simply run the `jekyll build` command and copy the contents of the generated `_site` folder to the root folder of your hosting account. This is most likely to be the `httpdocs` or `public_html` folder on most hosting providers. ## Self-managed web server @@ -78,7 +78,7 @@ Another way to deploy your Jekyll site is to use [Rake](https://github.com/ruby/ ### scp -Once you’ve generated the `_site` directory, you can easily scp it using a +Once you’ve generated the `_site` directory, you can easily scp its content using a `tasks/deploy` shell script similar to [this deploy script][]. You’d obviously need to change the values to reflect your site’s details. There is even [a matching TextMate command][] that will help you run this script. @@ -89,7 +89,7 @@ matching TextMate command][] that will help you run this script. ### rsync -Once you’ve 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). You’d obviously need to change the values to reflect your site’s details. +Once you’ve generated the `_site` directory, you can easily rsync its content using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/vitalyrepin/vrepinblog/blob/master/transfer.sh). You’d obviously need to change the values to reflect your site’s details. Certificate-based authorization is another way to simplify the publishing process. It makes sense to restrict rsync access only to the directory which it is supposed to sync. This can be done using rrsync. From 307c0c933d31ded13d5564e51b8c8ce32d689044 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 4 Jun 2017 19:23:18 -0400 Subject: [PATCH 2175/4996] Update history to reflect merge of #6119 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 76e4791f6cc..4fee3da83ae 100644 --- a/History.markdown +++ b/History.markdown @@ -75,6 +75,7 @@ * Fix wording in _docs/templates.md links section (#6114) * Update windows.md (#6115) * Added windows to docs.yml (#6109) + * Be more specific on what to upload (#6119) ### Development Fixes From 5dedd233bd8462e49517dd46c4a3cfcec15ae2b7 Mon Sep 17 00:00:00 2001 From: Eric Leong Date: Fri, 9 Jun 2017 04:07:16 -0400 Subject: [PATCH 2176/4996] Remove blank newlines. (#6126) Merge pull request 6126 --- docs/_docs/windows.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 12e15815fef..7c02fdc29f7 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -34,14 +34,12 @@ Next let's update our Ruby gems: ``` sudo gem update - ``` Now all that is left to do is install Jekyll. ``` sudo gem install jekyll bundler - ``` You can test by running: From 466a4a69eb3eda644f92b1e5d448e4c5ce04a721 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 9 Jun 2017 04:07:17 -0400 Subject: [PATCH 2177/4996] Update history to reflect merge of #6126 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4fee3da83ae..ae2a82cae9b 100644 --- a/History.markdown +++ b/History.markdown @@ -76,6 +76,7 @@ * Update windows.md (#6115) * Added windows to docs.yml (#6109) * Be more specific on what to upload (#6119) + * Remove Blank Newlines from "Jekyll on Windows" Page (#6126) ### Development Fixes From 33aafe0a45bfe754da85264cdefbdddcd130aeaf Mon Sep 17 00:00:00 2001 From: Kaligule Date: Wed, 14 Jun 2017 09:42:09 +0200 Subject: [PATCH 2178/4996] Link the troubleshooting page in the quickstart page (#6134) Merge pull request 6134 --- docs/_docs/quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index 9bd164b3b5e..08d2fd5f620 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -22,7 +22,7 @@ If you already have a full [Ruby](https://www.ruby-lang.org/en/downloads/) devel # Now browse to http://localhost:4000 ``` -If you encounter any unexpected errors during the above, please refer to the already-mentioned [requirements](/docs/installation/#requirements) page, as you might be missing development headers or other prerequisites. +If you encounter any unexpected errors during the above, please refer to the [troubleshooting](/docs/troubleshooting/#configuration-problems) page or the already-mentioned [requirements](/docs/installation/#requirements) page, as you might be missing development headers or other prerequisites. ## About Bundler From 35684dd1b8fd319f31a4b48bb21326cd15cd1425 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 03:42:10 -0400 Subject: [PATCH 2179/4996] Update history to reflect merge of #6134 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ae2a82cae9b..c69e986fa0e 100644 --- a/History.markdown +++ b/History.markdown @@ -77,6 +77,7 @@ * Added windows to docs.yml (#6109) * Be more specific on what to upload (#6119) * Remove Blank Newlines from "Jekyll on Windows" Page (#6126) + * Link the troubleshooting page in the quickstart page (#6134) ### Development Fixes From 73368f8f0d4c5476b80b96f9fb39fa19d120dbfa Mon Sep 17 00:00:00 2001 From: Christopher League Date: Wed, 14 Jun 2017 15:02:59 -0400 Subject: [PATCH 2180/4996] In `jekyll new`, make copied site template user-writable (#6072) Merge pull request 6072 --- lib/jekyll/commands/new.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 81ed9201809..ce1d5e7fe11 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -108,6 +108,7 @@ def preserve_source_location?(path, options) def create_sample_files(path) FileUtils.cp_r site_template + "/.", path + FileUtils.chmod_R "u+w", path FileUtils.rm File.expand_path(scaffold_path, path) end From c71c27a397e9fe15c5fbb458e3c480110e9897a5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 15:03:02 -0400 Subject: [PATCH 2181/4996] Update history to reflect merge of #6072 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c69e986fa0e..7234ef65bf8 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ * create configuration from options only once in the boot process (#5487) * Add option to fail a build with front matter syntax errors (#5832) * Disable default layouts for documents with a `layout: none` declaration (#5933) + * In `jekyll new`, make copied site template user-writable (#6072) ### Documentation From 2cfcb23a495372355ac2e7660e014fcbd129491c Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 15 Jun 2017 04:05:38 +0900 Subject: [PATCH 2182/4996] Fix layout front-matter variables rendering. #6071 (#6073) Merge pull request 6073 --- lib/jekyll/renderer.rb | 9 +++++++++ test/source/_layouts/default.html | 3 +++ test/source/index.html | 2 ++ test/test_generated_site.rb | 4 ++++ 4 files changed, 18 insertions(+) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index eb1f54ab509..b0f544e35e5 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -54,6 +54,7 @@ def run assign_pages! assign_related_posts! assign_highlighter_options! + assign_layout_data! Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path document.trigger_hooks(:pre_render, payload) @@ -233,6 +234,14 @@ def assign_highlighter_options! payload["highlighter_suffix"] = converters.first.highlighter_suffix end + private + def assign_layout_data! + layout = layouts[document.data["layout"]] + if layout + payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) + end + end + private def permalink_ext if document.permalink && !document.permalink.end_with?("/") diff --git a/test/source/_layouts/default.html b/test/source/_layouts/default.html index 1d51c496796..ef2d4384ba2 100644 --- a/test/source/_layouts/default.html +++ b/test/source/_layouts/default.html @@ -1,3 +1,6 @@ +--- +front_matter_var: variable from layout +--- diff --git a/test/source/index.html b/test/source/index.html index 493fce7cbc0..ec542002ce5 100644 --- a/test/source/index.html +++ b/test/source/index.html @@ -5,6 +5,8 @@ h1. Welcome to my site +{{ layout.front_matter_var }} + h2. Please read our {{ site.posts | size }} Posts
      diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 46f55484fba..84345524d74 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -21,6 +21,10 @@ class TestGeneratedSite < JekyllUnitTest assert @index.include?("#{@site.posts.size} Posts") end + should "insert variable from layout into the index" do + assert @index.include?("variable from layout") + end + should "render latest post's content" do assert @index.include?(@site.posts.last.content) end From cee3cc506e22b13faca25dccb019d8eae2411d75 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 15:05:40 -0400 Subject: [PATCH 2183/4996] Update history to reflect merge of #6073 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7234ef65bf8..c8b88e0dd09 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ * Add option to fail a build with front matter syntax errors (#5832) * Disable default layouts for documents with a `layout: none` declaration (#5933) * In `jekyll new`, make copied site template user-writable (#6072) + * Add top-level `layout` liquid variable to Documents (#6073) ### Documentation From 2a4d33e61515edb6be1cf299ddea42f4c5b8d56d Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Thu, 15 Jun 2017 00:36:55 +0530 Subject: [PATCH 2184/4996] patch URLFilters to prevent `//` (#6058) Merge pull request 6058 --- lib/jekyll/filters/url_filters.rb | 15 +++++++++---- test/test_filters.rb | 36 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index 7db83c800c9..40cacc22f13 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -11,7 +11,6 @@ module URLFilters def absolute_url(input) return if input.nil? return input if Addressable::URI.parse(input).absolute? - site = @context.registers[:site] return relative_url(input).to_s if site.config["url"].nil? Addressable::URI.parse(site.config["url"] + relative_url(input)).normalize.to_s end @@ -23,14 +22,22 @@ def absolute_url(input) # Returns a URL relative to the domain root as a String. def relative_url(input) return if input.nil? - site = @context.registers[:site] - return ensure_leading_slash(input.to_s) if site.config["baseurl"].nil? + return ensure_leading_slash(input.to_s) if sanitized_baseurl.nil? Addressable::URI.parse( - ensure_leading_slash(site.config["baseurl"]) + ensure_leading_slash(input.to_s) + ensure_leading_slash(sanitized_baseurl) + ensure_leading_slash(input.to_s) ).normalize.to_s end private + + def site + @context.registers[:site] + end + + def sanitized_baseurl + site.config["baseurl"].chomp("/") + end + def ensure_leading_slash(input) return input if input.nil? || input.empty? || input.start_with?("/") "/#{input}" diff --git a/test/test_filters.rb b/test/test_filters.rb index 03d2732abd5..76da6042177 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -394,6 +394,15 @@ def select; end assert_equal "http://example.com/", filter.absolute_url(page_url) end + should "not append a forward slash if both input and baseurl are simply '/'" do + page_url = "/" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => "/", + }) + assert_equal "http://example.com/", filter.absolute_url(page_url) + end + should "normalize international URLs" do page_url = "" filter = make_filter_mock({ @@ -448,6 +457,33 @@ def select; end }) assert_equal "/base", filter.relative_url(page_url) end + + should "not prepend a forward slash if baseurl ends with a single '/'" do + page_url = "/css/main.css" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => "/base/", + }) + assert_equal "/base/css/main.css", filter.relative_url(page_url) + end + + should "not return valid URI if baseurl ends with multiple '/'" do + page_url = "/css/main.css" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => "/base//", + }) + refute_equal "/base/css/main.css", filter.relative_url(page_url) + end + + should "not prepend a forward slash if both input and baseurl are simply '/'" do + page_url = "/" + filter = make_filter_mock({ + "url" => "http://example.com", + "baseurl" => "/", + }) + assert_equal "/", filter.relative_url(page_url) + end end context "jsonify filter" do From 61cdebf272726b3706fc866ebb580d6cb62c4fa2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 15:06:56 -0400 Subject: [PATCH 2185/4996] Update history to reflect merge of #6058 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c8b88e0dd09..c1f2fcf91ee 100644 --- a/History.markdown +++ b/History.markdown @@ -120,6 +120,7 @@ * Allow colons in `uri_escape` filter (#5957) * Re-surface missing public methods in `Jekyll::Document` (#5975) * absolute_url should not mangle URL if called more than once (#5789) + * patch URLFilters to prevent `//` (#6058) ### fix From b76b4a4e8a16125ffe511ec9429a67819a304ebb Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Wed, 31 Aug 2016 00:43:07 +0200 Subject: [PATCH 2186/4996] add test to use variable in where_exp condition --- test/test_filters.rb | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index 76da6042177..243f97af759 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -9,7 +9,7 @@ class JekyllFilter def initialize(opts = {}) @site = Jekyll::Site.new(opts.merge("skip_config_files" => true)) - @context = Liquid::Context.new({}, {}, { :site => @site }) + @context = Liquid::Context.new(@site.site_payload, {}, { :site => @site }) end end @@ -26,12 +26,13 @@ def select; end context "filters" do setup do + @sample_time = Time.utc(2013, 3, 27, 11, 22, 33) @filter = make_filter_mock({ - "timezone" => "UTC", - "url" => "http://example.com", - "baseurl" => "/base", + "timezone" => "UTC", + "url" => "http://example.com", + "baseurl" => "/base", + "dont_show_posts_before" => @sample_time, }) - @sample_time = Time.utc(2013, 3, 27, 11, 22, 33) @sample_date = Date.parse("2013-03-27") @time_as_string = "September 11, 2001 12:46:30 -0000" @time_as_numeric = 1_399_680_607 @@ -816,6 +817,14 @@ def to_liquid results = @filter.where_exp(SelectDummy.new, "obj", "1 == 1") assert_equal [], results end + + should "filter by variable values" do + @filter.site.tap(&:read) + posts = @filter.site.site_payload["site"]["posts"] + results = @filter.where_exp(posts, "post", + "post.date > site.dont_show_posts_before") + assert_equal posts.select { |p| p.date > @sample_time }.count, results.length + end end context "group_by_exp filter" do From b0afe5125c152f1a30543725447af79282952ff1 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 14 Jun 2017 15:23:47 -0400 Subject: [PATCH 2187/4996] Update history to reflect merge of #5315 [ci skip] --- History.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index c1f2fcf91ee..5e63e1fc282 100644 --- a/History.markdown +++ b/History.markdown @@ -74,7 +74,7 @@ * windows 10 tutorial (#6100) * Explain how to override theme styles (#6107) * updated Bash on Ubuntu on Windows link in tutorial (#6111) - * Fix wording in _docs/templates.md links section (#6114) + * Fix wording in `_docs/templates.md` links section (#6114) * Update windows.md (#6115) * Added windows to docs.yml (#6109) * Be more specific on what to upload (#6119) @@ -121,6 +121,7 @@ * Re-surface missing public methods in `Jekyll::Document` (#5975) * absolute_url should not mangle URL if called more than once (#5789) * patch URLFilters to prevent `//` (#6058) + * add test to ensure variables work in `where_exp` condition (#5315) ### fix From fcde83431e9389b57ede544bffd368e1301651e5 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Thu, 15 Jun 2017 01:08:38 +0530 Subject: [PATCH 2188/4996] Address reading non-binary static files in themes (#5918) Merge pull request 5918 --- features/theme.feature | 11 +++++++++++ lib/jekyll/readers/theme_assets_reader.rb | 2 +- test/fixtures/test-theme/assets/base.js | 1 + test/source/assets/base.js | 1 + test/test_theme_assets_reader.rb | 11 ++++++++--- 5 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/test-theme/assets/base.js create mode 100644 test/source/assets/base.js diff --git a/features/theme.feature b/features/theme.feature index 820283e889d..650c167577e 100644 --- a/features/theme.feature +++ b/features/theme.feature @@ -46,6 +46,17 @@ Feature: Writing themes And I should see "default.html from test-theme: I'm content." in "_site/index.html" And I should see "post.html from the project: I'm more content." in "_site/post.html" + Scenario: A theme with assets + Given I have a configuration file with "theme" set to "test-theme" + And I have an assets directory + And I have an "assets/application.coffee" file that contains "From your site." + And I have an "assets/base.js" file that contains "From your site." + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And I should see "From your site." in "_site/assets/application.coffee" + And I should see "From your site." in "_site/assets/base.js" + Scenario: Requiring dependencies of a theme Given I have a configuration file with "theme" set to "test-dependency-theme" When I run jekyll build diff --git a/lib/jekyll/readers/theme_assets_reader.rb b/lib/jekyll/readers/theme_assets_reader.rb index 035c0607832..80a6547d8a7 100644 --- a/lib/jekyll/readers/theme_assets_reader.rb +++ b/lib/jekyll/readers/theme_assets_reader.rb @@ -29,7 +29,7 @@ def read_theme_asset(path) Jekyll::Page.new(site, base, dir, name) else append_unless_exists site.static_files, - Jekyll::StaticFile.new(site, base, dir, name) + Jekyll::StaticFile.new(site, base, "/#{dir}", name) end end diff --git a/test/fixtures/test-theme/assets/base.js b/test/fixtures/test-theme/assets/base.js new file mode 100644 index 00000000000..00c238eddbc --- /dev/null +++ b/test/fixtures/test-theme/assets/base.js @@ -0,0 +1 @@ +alert("From your theme."); diff --git a/test/source/assets/base.js b/test/source/assets/base.js new file mode 100644 index 00000000000..40e8a468987 --- /dev/null +++ b/test/source/assets/base.js @@ -0,0 +1 @@ +alert("From your site."); diff --git a/test/test_theme_assets_reader.rb b/test/test_theme_assets_reader.rb index fc335248084..8d792f735d9 100644 --- a/test/test_theme_assets_reader.rb +++ b/test/test_theme_assets_reader.rb @@ -27,7 +27,7 @@ def refute_file_with_relative_path(haystack, relative_path) should "read all assets" do @site.reset ThemeAssetsReader.new(@site).read - assert_file_with_relative_path @site.static_files, "assets/img/logo.png" + assert_file_with_relative_path @site.static_files, "/assets/img/logo.png" assert_file_with_relative_path @site.pages, "assets/style.scss" end @@ -45,8 +45,13 @@ def refute_file_with_relative_path(haystack, relative_path) @site.read file = @site.pages.find { |f| f.relative_path == "assets/application.coffee" } + static_script = File.read( + @site.static_files.find { |f| f.relative_path == "/assets/base.js" }.path + ) refute_nil file + refute_nil static_script assert_includes file.content, "alert \"From your site.\"" + assert_includes static_script, "alert(\"From your site.\");" end end @@ -55,7 +60,7 @@ def refute_file_with_relative_path(haystack, relative_path) site = fixture_site("theme" => "test-theme") allow(site.theme).to receive(:assets_path).and_return(nil) ThemeAssetsReader.new(site).read - refute_file_with_relative_path site.static_files, "assets/img/logo.png" + refute_file_with_relative_path site.static_files, "/assets/img/logo.png" refute_file_with_relative_path site.pages, "assets/style.scss" end end @@ -64,7 +69,7 @@ def refute_file_with_relative_path(haystack, relative_path) should "not read any assets" do site = fixture_site("theme" => nil) ThemeAssetsReader.new(site).read - refute_file_with_relative_path site.static_files, "assets/img/logo.png" + refute_file_with_relative_path site.static_files, "/assets/img/logo.png" refute_file_with_relative_path site.pages, "assets/style.scss" end end From 4e3b5ba5b4e5c55aefb8006930c19c4a78052376 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 15:38:40 -0400 Subject: [PATCH 2189/4996] Update history to reflect merge of #5918 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5e63e1fc282..6a0d321f8f1 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Disable default layouts for documents with a `layout: none` declaration (#5933) * In `jekyll new`, make copied site template user-writable (#6072) * Add top-level `layout` liquid variable to Documents (#6073) + * Address reading non-binary static files in themes (#5918) ### Documentation From 2ceff6ab3e420e36af28761e224da7d04e726f2d Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 15 Jun 2017 04:42:43 +0900 Subject: [PATCH 2190/4996] Read explicitly included dot-files in collections. #6091 (#6092) Merge pull request 6092 --- lib/jekyll/collection.rb | 2 +- lib/jekyll/entry_filter.rb | 3 ++- test/source/_methods/with.dots/.gitignore | 1 + test/source/_methods/with.dots/.htaccess | 1 + test/test_collections.rb | 29 +++++++++++++++++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 test/source/_methods/with.dots/.gitignore create mode 100644 test/source/_methods/with.dots/.htaccess diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 9e906ab044f..08432933493 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -72,7 +72,7 @@ def read def entries return [] unless exists? @entries ||= - Utils.safe_glob(collection_dir, ["**", "*"]).map do |entry| + Utils.safe_glob(collection_dir, ["**", "*"], File::FNM_DOTMATCH).map do |entry| entry["#{collection_dir}/"] = "" entry end diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index e4187d42d8e..f4425037afc 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -36,7 +36,8 @@ def filter(entries) end def included?(entry) - glob_include?(site.include, entry) + glob_include?(site.include, entry) || + glob_include?(site.include, File.basename(entry)) end def special?(entry) diff --git a/test/source/_methods/with.dots/.gitignore b/test/source/_methods/with.dots/.gitignore new file mode 100644 index 00000000000..87e42cfcb65 --- /dev/null +++ b/test/source/_methods/with.dots/.gitignore @@ -0,0 +1 @@ +I should be copied diff --git a/test/source/_methods/with.dots/.htaccess b/test/source/_methods/with.dots/.htaccess new file mode 100644 index 00000000000..87e42cfcb65 --- /dev/null +++ b/test/source/_methods/with.dots/.htaccess @@ -0,0 +1 @@ +I should be copied diff --git a/test/test_collections.rb b/test/test_collections.rb index 5b80a6c7e03..cb122cd9e65 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -222,4 +222,33 @@ class TestCollections < JekyllUnitTest ) end end + + context "a collection with included dotfiles" do + setup do + @site = fixture_site({ + "collections" => { + "methods" => { + "permalink" => "/awesome/:path/", + }, + }, + "include" => %w(.htaccess .gitignore), + }) + @site.process + @collection = @site.collections["methods"] + end + + should "contain .htaccess file" do + assert(@collection.files.any? { |d| d.name == ".htaccess" }) + end + + should "contain .gitignore file" do + assert(@collection.files.any? { |d| d.name == ".gitignore" }) + end + + should "have custom URL in static file" do + assert( + @collection.files.any? { |d| d.url.include?("/awesome/with.dots/") } + ) + end + end end From 158ab6ce930e6feb690ef9a96397b285cf43c867 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 15:42:45 -0400 Subject: [PATCH 2191/4996] Update history to reflect merge of #6092 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6a0d321f8f1..31d81a99167 100644 --- a/History.markdown +++ b/History.markdown @@ -123,6 +123,7 @@ * absolute_url should not mangle URL if called more than once (#5789) * patch URLFilters to prevent `//` (#6058) * add test to ensure variables work in `where_exp` condition (#5315) + * Read explicitly included dot-files in collections. (#6092) ### fix From e031ac9b27bb3c76d318107edf8178c60ff67b21 Mon Sep 17 00:00:00 2001 From: Martin Desrumaux Date: Wed, 14 Jun 2017 22:18:07 +0200 Subject: [PATCH 2192/4996] Allow filters to sort & select based on subvalues (#5622) Merge pull request 5622 --- lib/jekyll/filters.rb | 4 +++- test/test_filters.rb | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index c8da0e526ce..e15cf7c66dd 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -361,7 +361,9 @@ def time(input) private def item_property(item, property) if item.respond_to?(:to_liquid) - item.to_liquid[property.to_s] + property.to_s.split(".").reduce(item.to_liquid) do |subvalue, attribute| + subvalue[attribute] + end elsif item.respond_to?(:data) item.data[property.to_s] else diff --git a/test/test_filters.rb b/test/test_filters.rb index 243f97af759..93ddb2cdd96 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -949,6 +949,12 @@ def to_liquid assert_equal [{ "a" => 1 }, { "a" => 2 }, { "b" => 1 }], @filter.sort([{ "a" => 2 }, { "b" => 1 }, { "a" => 1 }], "a", "last") end + should "return sorted by subproperty array" do + assert_equal [{ "a" => { "b" => 1 } }, { "a" => { "b" => 2 } }, + { "a" => { "b" => 3 } }, ], + @filter.sort([{ "a" => { "b" => 2 } }, { "a" => { "b" => 1 } }, + { "a" => { "b" => 3 } }, ], "a.b") + end end context "to_integer filter" do From 82218557356e259f2c03bdbcb25ffaf4399cf27b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 16:18:08 -0400 Subject: [PATCH 2193/4996] Update history to reflect merge of #5622 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 31d81a99167..22b83e0a49b 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * In `jekyll new`, make copied site template user-writable (#6072) * Add top-level `layout` liquid variable to Documents (#6073) * Address reading non-binary static files in themes (#5918) + * Allow filters to sort & select based on subvalues (#5622) ### Documentation From 4299539db5373c0fdbce837c40c5871345abbdcf Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Thu, 15 Jun 2017 01:56:56 +0530 Subject: [PATCH 2194/4996] Test if hidden collections output a document with a future date (#6103) Merge pull request 6103 --- features/collections.feature | 45 ++++++++++++++++++++++++++++++++++++ features/step_definitions.rb | 13 +++++++++++ 2 files changed, 58 insertions(+) diff --git a/features/collections.feature b/features/collections.feature index de5e2a22ed7..ba663510403 100644 --- a/features/collections.feature +++ b/features/collections.feature @@ -94,6 +94,51 @@ Feature: Collections And I should see "Collections: _methods/3940394-21-9393050-fifif1323-test.md _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" unless Windows And I should see "Collections: _methods/3940394-21-9393050-fifif1323-test.md _methods/collection/entries _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/yaml_with_dots.md" in "_site/index.html" if on Windows + Scenario: Rendered collection with document with future date + Given I have a _puppies directory + And I have the following documents under the puppies collection: + | title | date | content | + | Rover | 2007-12-31 | content for Rover. | + | Fido | 2120-12-31 | content for Fido. | + And I have a "_config.yml" file with content: + """ + collections: + puppies: + output: true + """ + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And I should see "content for Rover" in "_site/puppies/rover.html" + And the "_site/puppies/fido.html" file should not exist + When I run jekyll build --future + Then I should get a zero exit status + And the _site directory should exist + And the "_site/puppies/fido.html" file should exist + + Scenario: Hidden collection with document with future date + Given I have a _puppies directory + And I have the following documents under the puppies collection: + | title | date | content | + | Rover | 2007-12-31 | content for Rover. | + | Fido | 2120-12-31 | content for Fido. | + And I have a "_config.yml" file with content: + """ + collections: + puppies: + output: false + """ + And I have a "foo.txt" file that contains "random static file" + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And the "_site/puppies/rover.html" file should not exist + And the "_site/puppies/fido.html" file should not exist + When I run jekyll build --future + Then I should get a zero exit status + And the _site directory should exist + And the "_site/puppies/fido.html" file should not exist + Scenario: All the documents Given I have an "index.html" page that contains "All documents: {% for doc in site.documents %}{{ doc.relative_path }} {% endfor %}" And I have fixture collections diff --git a/features/step_definitions.rb b/features/step_definitions.rb index bcbfcb9a362..c22adb48667 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -93,6 +93,19 @@ # +Given(%r!^I have the following documents? under the (.*) collection:$!) do |folder, table| + table.hashes.each do |input_hash| + title = slug(input_hash["title"]) + filename = "#{title}.md" + dest_folder = "_#{folder}" + + path = File.join(dest_folder, filename) + File.write(path, file_content_from_hash(input_hash)) + end +end + +# + Given(%r!^I have a configuration file with "(.*)" set to "(.*)"$!) do |key, value| config = \ if source_dir.join("_config.yml").exist? From 36265128cd2233ad90c77b2de3e022f94670dcf2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 16:26:58 -0400 Subject: [PATCH 2195/4996] Update history to reflect merge of #6103 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 22b83e0a49b..6ecb615fbd0 100644 --- a/History.markdown +++ b/History.markdown @@ -100,6 +100,7 @@ * fix typo (#6040) * Fix CI (#6044) * Remove `ruby RUBY_VERSION` from generated Gemfile (#5803) + * Test if hidden collections output a document with a future date (#6103) ### Site Enhancements From 551d2ea8582ca8e2f5f2056e5cff95405ee15435 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 15 Jun 2017 04:36:40 +0800 Subject: [PATCH 2196/4996] Add test for uri_escape on reserved characters (#6086) Merge pull request 6086 --- test/test_filters.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/test_filters.rb b/test/test_filters.rb index 93ddb2cdd96..4370b31ee23 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -316,9 +316,15 @@ def select; end assert_equal "my%20things", @filter.uri_escape("my things") end - should "allow colons in URI" do - assert_equal "foo:bar", @filter.uri_escape("foo:bar") - assert_equal "foo%20bar:baz", @filter.uri_escape("foo bar:baz") + should "allow reserver characters in URI" do + assert_equal( + "foo!*'();:@&=+$,/?#[]bar", + @filter.uri_escape("foo!*'();:@&=+$,/?#[]bar") + ) + assert_equal( + "foo%20bar!*'();:@&=+$,/?#[]baz", + @filter.uri_escape("foo bar!*'();:@&=+$,/?#[]baz") + ) end context "absolute_url filter" do From 1dd3e3b593a96186f2c41cbdafc86463ed4ff6fb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 16:36:41 -0400 Subject: [PATCH 2197/4996] Update history to reflect merge of #6086 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6ecb615fbd0..511dce6afdb 100644 --- a/History.markdown +++ b/History.markdown @@ -101,6 +101,7 @@ * Fix CI (#6044) * Remove `ruby RUBY_VERSION` from generated Gemfile (#5803) * Test if hidden collections output a document with a future date (#6103) + * Add test for uri_escape on reserved characters (#6086) ### Site Enhancements From 13b9dcd466316b69d9ef1dd59d5c4130060b0ee1 Mon Sep 17 00:00:00 2001 From: David Zhang Date: Thu, 15 Jun 2017 04:37:21 +0800 Subject: [PATCH 2198/4996] Document difference between cgi_escape and uri_escape #5970 (#6081) Merge pull request 6081 --- docs/_docs/templates.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index c4eba3c888b..40a3e0327e9 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -178,15 +178,15 @@ common tasks easier.

      CGI Escape

      CGI escape a string for use in a URL. Replaces any special characters - with appropriate %XX replacements. + with appropriate %XX replacements. CGI escape normally replaces a space with a plus + sign.

      - {% raw %}{{ "foo,bar;baz?" | cgi_escape }}{% endraw %} + {% raw %}{{ "foo, bar; baz?" | cgi_escape }}{% endraw %}

      - foo%2Cbar%3Bbaz%3F + foo%2C+bar%3B+baz%3F

      @@ -194,15 +194,15 @@ common tasks easier.

      URI Escape

      - Percent encodes any special characters in a URI. + Percent encodes any special characters in a URI. URI escape normally replaces a space with %20. Reserved characters will not be escaped.

      - {% raw %}{{ "http://foo.com/?query=foo, bar \baz?" | uri_escape }}{% endraw %} + {% raw %}{{ "http://foo.com/?q=foo, \bar?" | uri_escape }}{% endraw %}

      - http://foo.com/?query=foo,%20bar%20%5Cbaz? + http://foo.com/?q=foo,%20%5Cbar?

      From ae8889ae2b3cc3b9257296e667f7442c4554c913 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Jun 2017 16:37:22 -0400 Subject: [PATCH 2199/4996] Update history to reflect merge of #6081 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 511dce6afdb..cdef91efae0 100644 --- a/History.markdown +++ b/History.markdown @@ -114,6 +114,7 @@ * Update normalize.css to v6.0.0 (#6008) * Docs: rename `gems` to `plugins` (#6082) * plugins -> gems (#6110) + * Document difference between cgi_escape and uri_escape #5970 (#6081) ### Bug Fixes From 79b3f00b21a558ac6c4a010dcd4498bce81bf995 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 15 Jun 2017 08:29:02 -0400 Subject: [PATCH 2200/4996] Allow you to specify the rouge version via an environemnt variable for testing (#6138) Merge pull request 6138 --- .travis.yml | 2 ++ jekyll.gemspec | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c8b8671bd42..587ca6f36f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,8 @@ matrix: env: TEST_SUITE=fmt - rvm: *ruby1 env: TEST_SUITE=default-site + - rvm: *ruby1 + env: ROUGE_VERSION=1.11.1 # runs everything with this version exclude: - rvm: *jruby env: TEST_SUITE=cucumber diff --git a/jekyll.gemspec b/jekyll.gemspec index f95862594e2..8fd62e81828 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -38,6 +38,6 @@ Gem::Specification.new do |s| s.add_runtime_dependency("liquid", "~> 4.0") s.add_runtime_dependency("mercenary", "~> 0.3.3") s.add_runtime_dependency("pathutil", "~> 0.9") - s.add_runtime_dependency("rouge", "~> 1.7") + s.add_runtime_dependency("rouge", "~> #{ENV["ROUGE_VERSION"] || "1.7"}") s.add_runtime_dependency("safe_yaml", "~> 1.0") end From 2c0f5b30594da8f7b70b1517182599b3223666f8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 15 Jun 2017 08:29:04 -0400 Subject: [PATCH 2201/4996] Update history to reflect merge of #6138 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cdef91efae0..07d84b55ae5 100644 --- a/History.markdown +++ b/History.markdown @@ -102,6 +102,7 @@ * Remove `ruby RUBY_VERSION` from generated Gemfile (#5803) * Test if hidden collections output a document with a future date (#6103) * Add test for uri_escape on reserved characters (#6086) + * Allow you to specify the rouge version via an environment variable for testing (#6138) ### Site Enhancements From d3b00cb84c8c796855d9b2c50109f903e1572158 Mon Sep 17 00:00:00 2001 From: Anatoliy Yastreb Date: Thu, 15 Jun 2017 21:29:35 +0900 Subject: [PATCH 2202/4996] Bump Rubocop to 0.49.1 (#6093) Merge pull request 6093 --- .rubocop.yml | 65 ++++++++++++++--------------- Gemfile | 2 +- features/support/helpers.rb | 2 +- lib/jekyll/collection.rb | 2 +- lib/jekyll/commands/serve.rb | 2 +- lib/jekyll/converter.rb | 4 +- lib/jekyll/convertible.rb | 2 +- lib/jekyll/document.rb | 4 +- lib/jekyll/hooks.rb | 2 +- lib/jekyll/liquid_renderer/table.rb | 4 +- lib/jekyll/plugin.rb | 2 +- lib/jekyll/utils/win_tz.rb | 4 +- test/test_document.rb | 10 ++--- test/test_filters.rb | 10 ++--- 14 files changed, 57 insertions(+), 58 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 5ab7a7e84ed..e5b26bccc9c 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -9,6 +9,38 @@ AllCops: - benchmark/**/* - script/**/* - vendor/**/* +Layout/AlignArray: + Enabled: false +Layout/AlignHash: + EnforcedHashRocketStyle: table +Layout/AlignParameters: + Enabled: false +Layout/EmptyLinesAroundAccessModifier: + Enabled: false +Layout/EmptyLinesAroundModuleBody: + Enabled: false +Layout/EndOfLine: + EnforcedStyle: lf +Layout/ExtraSpacing: + AllowForAlignment: true +Layout/FirstParameterIndentation: + EnforcedStyle: consistent +Layout/IndentationWidth: + Severity: error +Layout/IndentArray: + EnforcedStyle: consistent +Layout/IndentHash: + EnforcedStyle: consistent +Layout/IndentHeredoc: + Enabled: false +Layout/MultilineMethodCallIndentation: + EnforcedStyle: indented +Layout/MultilineOperationIndentation: + EnforcedStyle: indented +Layout/SpaceAroundOperators: + Enabled: true +Layout/SpaceInsideBrackets: + Enabled: false Lint/EndAlignment: Severity: error Lint/UnreachableCode: @@ -59,13 +91,6 @@ Security/YAMLLoad: - !ruby/regexp /test\/.*.rb$/ Style/Alias: Enabled: false -Style/AlignArray: - Enabled: false -Style/AlignHash: - EnforcedHashRocketStyle: table -Style/AlignParameters: - Enabled: false - EnforcedStyle: with_fixed_indentation Style/AndOr: Severity: error Style/Attr: @@ -80,18 +105,8 @@ Style/Documentation: - !ruby/regexp /features\/.*.rb$/ Style/DoubleNegation: Enabled: false -Style/EmptyLinesAroundAccessModifier: - Enabled: false -Style/EmptyLinesAroundModuleBody: - Enabled: false -Style/EndOfLine: - EnforcedStyle: lf -Style/ExtraSpacing: - AllowForAlignment: true Style/FileName: Enabled: false -Style/FirstParameterIndentation: - EnforcedStyle: consistent Style/GuardClause: Enabled: false Style/HashSyntax: @@ -99,22 +114,10 @@ Style/HashSyntax: Severity: error Style/IfUnlessModifier: Enabled: false -Style/IndentArray: - EnforcedStyle: consistent -Style/IndentHash: - EnforcedStyle: consistent -Style/IndentHeredoc: - Enabled: false -Style/IndentationWidth: - Severity: error Style/InverseMethods: Enabled: false Style/ModuleFunction: Enabled: false -Style/MultilineMethodCallIndentation: - EnforcedStyle: indented -Style/MultilineOperationIndentation: - EnforcedStyle: indented Style/MultilineTernaryOperator: Severity: error Style/PercentLiteralDelimiters: @@ -138,10 +141,6 @@ Style/SignalException: EnforcedStyle: only_raise Style/SingleLineMethods: Enabled: false -Style/SpaceAroundOperators: - Enabled: false -Style/SpaceInsideBrackets: - Enabled: false Style/StringLiterals: EnforcedStyle: double_quotes Style/StringLiteralsInInterpolation: diff --git a/Gemfile b/Gemfile index 5da04ca66c7..53cab0a5182 100644 --- a/Gemfile +++ b/Gemfile @@ -25,7 +25,7 @@ group :test do gem "nokogiri" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.48.1" + gem "rubocop", "~> 0.49.1" gem "test-dependency-theme", :path => File.expand_path("./test/fixtures/test-dependency-theme", File.dirname(__FILE__)) gem "test-theme", :path => File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 5081d3f1aae..118dd9cf925 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -55,7 +55,7 @@ def source_dir(*files) def all_steps_to_path(path) source = source_dir dest = Pathname.new(path).expand_path - paths = [] + paths = [] dest.ascend do |f| break if f == source diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 08432933493..f839915f599 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -34,7 +34,7 @@ def method_missing(method, *args, &blck) if docs.respond_to?(method.to_sym) Jekyll.logger.warn "Deprecation:", "#{label}.#{method} should be changed to #{label}.docs.#{method}." - Jekyll.logger.warn "", "Called by #{caller.first}." + Jekyll.logger.warn "", "Called by #{caller(0..0)}." docs.public_send(method.to_sym, *args, &blck) else super diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 622eda49b49..c16d5433740 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -136,7 +136,7 @@ def server_address(server, options = {}) private def format_url(ssl_enabled, address, port, baseurl = nil) - format("%{prefix}://%{address}:%{port}%{baseurl}", { + format("%s://%
      s:%i%s", { :prefix => ssl_enabled ? "https" : "http", :address => address, :port => port, diff --git a/lib/jekyll/converter.rb b/lib/jekyll/converter.rb index f9d2ce16d11..b7fa0091cb3 100644 --- a/lib/jekyll/converter.rb +++ b/lib/jekyll/converter.rb @@ -8,7 +8,7 @@ class Converter < Plugin # # Returns the String prefix. def self.highlighter_prefix(highlighter_prefix = nil) - if !defined?(@highlighter_prefix) || !highlighter_prefix.nil? + unless defined?(@highlighter_prefix) && highlighter_prefix.nil? @highlighter_prefix = highlighter_prefix end @highlighter_prefix @@ -22,7 +22,7 @@ def self.highlighter_prefix(highlighter_prefix = nil) # # Returns the String suffix. def self.highlighter_suffix(highlighter_suffix = nil) - if !defined?(@highlighter_suffix) || !highlighter_suffix.nil? + unless defined?(@highlighter_suffix) && highlighter_suffix.nil? @highlighter_suffix = highlighter_suffix end @highlighter_suffix diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 16745dd5b6a..74125f09b1d 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -160,7 +160,7 @@ def sass_file? # # Returns true if extname == .coffee, false otherwise. def coffeescript_file? - ".coffee" == ext + ext == ".coffee" end # Determine whether the file should be rendered with Liquid. diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 002404e6368..8634082c4d9 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -150,7 +150,7 @@ def sass_file? # # Returns true if extname == .coffee, false otherwise. def coffeescript_file? - ".coffee" == extname + extname == ".coffee" end # Determine whether the file should be rendered with Liquid. @@ -371,7 +371,7 @@ def method_missing(method, *args, &blck) if data.key?(method.to_s) Jekyll::Deprecator.deprecation_message "Document##{method} is now a key "\ "in the #data hash." - Jekyll::Deprecator.deprecation_message "Called by #{caller.first}." + Jekyll::Deprecator.deprecation_message "Called by #{caller(0..0)}." data[method.to_s] else super diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index 5f21b5f6fea..241dce3a7f1 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -60,7 +60,7 @@ def self.priority_value(priority) # register a single hook to be called later, internal API def self.register_one(owner, event, priority, &block) - @registry[owner] ||={ + @registry[owner] ||= { :post_init => [], :pre_render => [], :post_render => [], diff --git a/lib/jekyll/liquid_renderer/table.rb b/lib/jekyll/liquid_renderer/table.rb index a078f831e61..aab7fdf7845 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -32,7 +32,7 @@ def generate_table_head_border(row_data, widths) row_data.each_index do |cell_index| str << "-" * widths[cell_index] - str << "-+-" unless cell_index == row_data.length-1 + str << "-+-" unless cell_index == row_data.length - 1 end str << "\n" @@ -49,7 +49,7 @@ def generate_row(row_data, widths) cell_data.rjust(widths[cell_index], " ") end - str << " | " unless cell_index == row_data.length-1 + str << " | " unless cell_index == row_data.length - 1 end str << "\n" diff --git a/lib/jekyll/plugin.rb b/lib/jekyll/plugin.rb index 4680be32434..b6e5023d80e 100644 --- a/lib/jekyll/plugin.rb +++ b/lib/jekyll/plugin.rb @@ -60,7 +60,7 @@ def self.priority(priority = nil) # # Returns the safety Boolean. def self.safe(safe = nil) - if !defined?(@safe) || !safe.nil? + unless defined?(@safe) && safe.nil? @safe = safe end @safe || false diff --git a/lib/jekyll/utils/win_tz.rb b/lib/jekyll/utils/win_tz.rb index 0c2b5bd2923..06a10422274 100644 --- a/lib/jekyll/utils/win_tz.rb +++ b/lib/jekyll/utils/win_tz.rb @@ -46,7 +46,7 @@ def calculate(timezone) # # Returns a rational number. def rational_hour(seconds) - seconds.to_r/3600 + seconds.to_r / 3600 end # Private: Convert given seconds to an hour as an absolute number. @@ -56,7 +56,7 @@ def rational_hour(seconds) # # Returns an integer. def absolute_hour(seconds) - seconds.abs/3600 + seconds.abs / 3600 end # Private: Perform a modulo operation on a given fraction. diff --git a/test/test_document.rb b/test/test_document.rb index 37e709ac6dc..0c880a6b5b7 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -115,7 +115,7 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => ["slides"], "defaults" => [{ - "scope" => { "path"=>"", "type"=>"slides" }, + "scope" => { "path" => "", "type" => "slides" }, "values" => { "nested" => { "key" => "myval", @@ -139,7 +139,7 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => ["slides"], "defaults" => [{ - "scope" => { "path"=>"", "type"=>"slides" }, + "scope" => { "path" => "", "type" => "slides" }, "values" => { "nested" => { "test1" => "default1", @@ -156,7 +156,7 @@ def assert_equal_value(key, one, other) assert_equal "Override title", @document.data["title"] assert_equal "slide", @document.data["layout"] assert_equal( - { "test1"=>"override1", "test2"=>"override2" }, + { "test1" => "override1", "test2" => "override2" }, @document.data["nested"] ) end @@ -167,7 +167,7 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => ["slides"], "defaults" => [{ - "scope" => { "path"=>"_slides", "type"=>"slides" }, + "scope" => { "path" => "_slides", "type" => "slides" }, "values" => { "nested" => { "key" => "value123", @@ -191,7 +191,7 @@ def assert_equal_value(key, one, other) @site = fixture_site({ "collections" => ["slides"], "defaults" => [{ - "scope" => { "path"=>"somepath", "type"=>"slides" }, + "scope" => { "path" => "somepath", "type" => "slides" }, "values" => { "nested" => { "key" => "myval", diff --git a/test/test_filters.rb b/test/test_filters.rb index 4370b31ee23..e0af37a58bf 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -689,7 +689,7 @@ def to_liquid end should "filter objects in a hash appropriately" do - hash = { "a"=>{ "color"=>"red" }, "b"=>{ "color"=>"blue" } } + hash = { "a" => { "color"=>"red" }, "b" => { "color"=>"blue" } } assert_equal 1, @filter.where(hash, "color", "red").length assert_equal [{ "color"=>"red" }], @filter.where(hash, "color", "red") end @@ -754,7 +754,7 @@ def to_liquid end should "filter objects in a hash appropriately" do - hash = { "a"=>{ "color"=>"red" }, "b"=>{ "color"=>"blue" } } + hash = { "a" => { "color"=>"red" }, "b" => { "color"=>"blue" } } assert_equal 1, @filter.where_exp(hash, "item", "item.color == 'red'").length assert_equal( [{ "color"=>"red" }], @@ -882,9 +882,9 @@ def to_liquid should "allow more complex filters" do items = [ - { "version"=>"1.0", "result"=>"slow" }, - { "version"=>"1.1.5", "result"=>"medium" }, - { "version"=>"2.7.3", "result"=>"fast" }, + { "version" => "1.0", "result" => "slow" }, + { "version" => "1.1.5", "result" => "medium" }, + { "version" => "2.7.3", "result" => "fast" }, ] result = @filter.group_by_exp(items, "item", "item.version | split: '.' | first") From 401e20cfa6a908c226b8bfcd5a536ebed670729e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 15 Jun 2017 08:29:37 -0400 Subject: [PATCH 2203/4996] Update history to reflect merge of #6093 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 07d84b55ae5..1922edbc435 100644 --- a/History.markdown +++ b/History.markdown @@ -103,6 +103,7 @@ * Test if hidden collections output a document with a future date (#6103) * Add test for uri_escape on reserved characters (#6086) * Allow you to specify the rouge version via an environment variable for testing (#6138) + * Bump Rubocop to 0.49.1 (#6093) ### Site Enhancements From 69e97fa06fde3b73cee2e79b4f622e132821cc56 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 15 Jun 2017 14:28:41 -0400 Subject: [PATCH 2204/4996] Add strip_index filter (#6075) Merge pull request 6075 --- lib/jekyll/filters/url_filters.rb | 10 ++++++++++ test/test_filters.rb | 26 ++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index 40cacc22f13..fa2dc16a79d 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -28,6 +28,16 @@ def relative_url(input) ).normalize.to_s end + # Strips trailing `/index.html` from URLs to create pretty permalinks + # + # input - the URL with a possible `/index.html` + # + # Returns a URL with the trailing `/index.html` removed + def strip_index(input) + return if input.nil? || input.to_s.empty? + input.sub(%r!/index\.html?$!, "/") + end + private def site diff --git a/test/test_filters.rb b/test/test_filters.rb index e0af37a58bf..91ac386a5db 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -493,6 +493,28 @@ def select; end end end + context "strip_index filter" do + should "strip trailing /index.html" do + assert_equal "/foo/", @filter.strip_index("/foo/index.html") + end + + should "strip trailing /index.htm" do + assert_equal "/foo/", @filter.strip_index("/foo/index.htm") + end + + should "not strip HTML in the middle of URLs" do + assert_equal "/index.html/foo", @filter.strip_index("/index.html/foo") + end + + should "not raise an error on nil strings" do + assert_nil @filter.strip_index(nil) + end + + should "not mangle other URLs" do + assert_equal "/foo/", @filter.strip_index("/foo/") + end + end + context "jsonify filter" do should "convert hash to json" do assert_equal "{\"age\":18}", @filter.jsonify({ :age => 18 }) @@ -742,7 +764,7 @@ def to_liquid assert_equal 4.7, results[0]["rating"] end - should "always return an array if the object responds to `select`" do + should "always return an array if the object responds to 'select'" do results = @filter.where(SelectDummy.new, "obj", "1 == 1") assert_equal [], results end @@ -819,7 +841,7 @@ def to_liquid assert_equal site.posts.find { |p| p.title == "Foo Bar" }, results.first end - should "always return an array if the object responds to `select`" do + should "always return an array if the object responds to 'select'" do results = @filter.where_exp(SelectDummy.new, "obj", "1 == 1") assert_equal [], results end From 3439a0d947b592893bfde489c6a0f4362bf3be88 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 15 Jun 2017 14:28:42 -0400 Subject: [PATCH 2205/4996] Update history to reflect merge of #6075 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1922edbc435..5056d3d360b 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ * Add top-level `layout` liquid variable to Documents (#6073) * Address reading non-binary static files in themes (#5918) * Allow filters to sort & select based on subvalues (#5622) + * Add strip_index filter (#6075) ### Documentation From 1ae0e83b2d3369bfb26329626b1dd2661b3629a4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 15 Jun 2017 14:29:07 -0400 Subject: [PATCH 2206/4996] Default `baseurl` to `nil` instead of empty string (#6137) Merge pull request 6137 --- lib/jekyll/commands/serve.rb | 2 +- lib/jekyll/configuration.rb | 2 +- lib/jekyll/filters/url_filters.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index c16d5433740..50a85fac9be 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -104,7 +104,7 @@ def webrick_opts(opts) private def start_up_webrick(opts, destination) server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } - server.mount(opts["baseurl"], Servlet, destination, file_handler_opts) + server.mount(opts["baseurl"].to_s, Servlet, destination, file_handler_opts) Jekyll.logger.info "Server address:", server_address(server, opts) launch_browser server, opts if opts["open_url"] boot_or_detach server, opts diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 153d98fe009..ec8e2a22dc0 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -47,7 +47,7 @@ class Configuration < Hash "detach" => false, # default to not detaching the server "port" => "4000", "host" => "127.0.0.1", - "baseurl" => "", + "baseurl" => nil, # this mounts at /, i.e. no subdirectory "show_dir_listing" => false, # Output Configuration diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index fa2dc16a79d..80ffa850aba 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -45,7 +45,7 @@ def site end def sanitized_baseurl - site.config["baseurl"].chomp("/") + site.config["baseurl"].to_s.chomp("/") end def ensure_leading_slash(input) From fbdfbbb28ddc37226d8210d2e799687321359a24 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 15 Jun 2017 14:29:08 -0400 Subject: [PATCH 2207/4996] Update history to reflect merge of #6137 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5056d3d360b..e4e8480764c 100644 --- a/History.markdown +++ b/History.markdown @@ -131,6 +131,7 @@ * patch URLFilters to prevent `//` (#6058) * add test to ensure variables work in `where_exp` condition (#5315) * Read explicitly included dot-files in collections. (#6092) + * Default `baseurl` to `nil` instead of empty string (#6137) ### fix From aeb0fd7ddf452e48f95fb0ea01b81a9e7dc1b16e Mon Sep 17 00:00:00 2001 From: penny Date: Thu, 15 Jun 2017 23:33:47 +0200 Subject: [PATCH 2208/4996] add documentation about the "pinned" label (#6147) Merge pull request 6147 --- docs/_docs/maintaining/special-labels.md | 4 ++++ docs/_docs/maintaining/triaging-an-issue.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/_docs/maintaining/special-labels.md b/docs/_docs/maintaining/special-labels.md index a8696174191..964ff0e2e07 100644 --- a/docs/_docs/maintaining/special-labels.md +++ b/docs/_docs/maintaining/special-labels.md @@ -18,3 +18,7 @@ These labels are used to indicate that the Git state of a pull request must chan ## `stale` This label is automatically added and removed by @jekyllbot based on activity on an issue or pull request. The rules for this label are laid out in [Triaging an Issue: Staleness and automatic closure](../triaging-an-issue/#staleness-and-automatic-closure). + +## `pinned` + +This label is for @jekyllbot to ignore the age of the issue, which means that the `stale` label won't be automatically added, and the issue won't be closed after a while. This needs to be set manually, and should be set with care. (The `has-pull-request` label does the same thing, but shouldn't be used to _only_ keep an issue open) diff --git a/docs/_docs/maintaining/triaging-an-issue.md b/docs/_docs/maintaining/triaging-an-issue.md index bc87d96e19f..23660b17ef8 100644 --- a/docs/_docs/maintaining/triaging-an-issue.md +++ b/docs/_docs/maintaining/triaging-an-issue.md @@ -51,4 +51,4 @@ Is what they wanted to get something we want to happen? Sometimes a bug report i ### Staleness and automatic closure -@jekyllbot will automatically mark issues as `stale` if no activity occurs for at least one month. @jekyllbot leaves a comment asking for information about reproducibility in current versions. If no one responds after another month, the issue is automatically closed. +@jekyllbot will automatically mark issues as `stale` if no activity occurs for at least one month. @jekyllbot leaves a comment asking for information about reproducibility in current versions. If no one responds after another month, the issue is automatically closed. This behaviour can be suppressed by setting the [`pinned` label](../maintaining/special-labels.md/#pinned). From 7236e514eafb17382725c7aeeebd96cac0e74f74 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 15 Jun 2017 17:33:49 -0400 Subject: [PATCH 2209/4996] Update history to reflect merge of #6147 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e4e8480764c..e31248f24be 100644 --- a/History.markdown +++ b/History.markdown @@ -83,6 +83,7 @@ * Be more specific on what to upload (#6119) * Remove Blank Newlines from "Jekyll on Windows" Page (#6126) * Link the troubleshooting page in the quickstart page (#6134) + * add documentation about the "pinned" label (#6147) ### Development Fixes From 8dd76bc6c70c71f7f0a1ec82969acce3f996d67f Mon Sep 17 00:00:00 2001 From: KeJun Date: Sat, 17 Jun 2017 00:42:32 +0800 Subject: [PATCH 2210/4996] docs(JekyllOnWindows): Add a new Installation way (#6141) Merge pull request 6141 --- docs/_docs/windows.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 7c02fdc29f7..3cfc7ccea61 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -171,3 +171,26 @@ In the future the installation process of the github-pages should be as simple a [Bundler]: http://bundler.io/ "Ruby Dependencie Manager" [nokogiriReleases]: https://github.com/sparklemotion/nokogiri/releases "Nokogiri Releases" [nokogiriFails]: https://github.com/sparklemotion/nokogiri/issues/1456#issuecomment-206481794 "Nokogiri fails to install on Ruby 2.3 for Windows" + +## Installation via RubyInstaller + +RubyInstaller is a self-contained Windows-based installer that includes the Ruby language, an execution environment, important documentation, and more. + +1. Install a package manager for Windows called [RubyInstaller](https://rubyinstaller.org/). +2. Install Jekyll and Bundler via a command prompt window: `gem install jekyll bundler` +3. Check if the installation is accessible: `jekyll -v` + +See [Autoinstall Jekyll for Windows](https://github.com/KeJunMao/fastjekyll#autoinstall-jekyll-for-windows) + +### Auto-regeneration + +Although jekyll would suggest: + +``` +Please add the following to your Gemfile to avoid polling for changes: + gem 'wdm', '>= 0.1.0' if Gem.win_platform? +``` + +Auto-regeneration will work fine without including `gem 'wdm'` + +### [time-zone](/docs/windows/#timezone-management) From 6384724a091d7982bea8b29cf2bceba84f8e6e4e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 16 Jun 2017 12:42:34 -0400 Subject: [PATCH 2211/4996] Update history to reflect merge of #6141 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e31248f24be..8140b5940bd 100644 --- a/History.markdown +++ b/History.markdown @@ -84,6 +84,7 @@ * Remove Blank Newlines from "Jekyll on Windows" Page (#6126) * Link the troubleshooting page in the quickstart page (#6134) * add documentation about the "pinned" label (#6147) + * docs(JekyllOnWindows): Add a new Installation way (#6141) ### Development Fixes From 5ceef94c1b6fb15d01ff8db91ff46c6df5faead4 Mon Sep 17 00:00:00 2001 From: Henry Kobin Date: Sun, 18 Jun 2017 04:27:41 -0700 Subject: [PATCH 2212/4996] corrected windows.md (#6149) Merge pull request 6149 --- docs/_docs/windows.md | 68 ++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 3cfc7ccea61..a785a3d5e5b 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -12,7 +12,8 @@ For older installations, this page aims to collect some of the general knowledge *Please note:* You must have [Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about?f=255&MSPPError=-2147217396) enabled. -First let's make sure all our packages / repositories are up to date. Open a new Command Prompt instance, and type the following: +First let's make sure all our packages / repositories are up to date. +Open a new Command Prompt instance, and type the following: ``` bash @@ -42,16 +43,24 @@ Now all that is left to do is install Jekyll. sudo gem install jekyll bundler ``` -You can test by running: +Check to see if your installation worked. ``` -jekyll new my_project +jekyll -v ``` **And that's it!** + +To start a new project, just run: +``` +jekyll new my_project +``` + +replacing `my_project` with the name of your website. + If you `cd` into the folder, you can make sure time management is working by opening your `_posts` folder. You should see a markdown file with the current date listed. -*Please note* Bash on Ubuntu on Windows is still under development, so you may run into issues. If you see an Auto-Regeneration error warning in your Bash instance, you can ignore it. +*Please note* Bash on Ubuntu on Windows is still under development, so you may run into issues. If you see an Auto-Regeneration error warning in your Bash instance, you can ignore it. ## Installation via Chocolatey @@ -81,27 +90,8 @@ the site generation process. It can be done with the following command: ```sh $ chcp 65001 ``` -Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00. -Though Windows users could alternatively define their blog's timezone by setting the key to use POSIX format of defining timezones, it wasn't as user-friendly when it came to having the clock altered to changing DST-rules. - -Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). -While 'new' blogs created with Jekyll v3.4 and greater, will have the following added to their 'Gemfile' by default, existing sites *will* have to update their 'Gemfile' (and installed) to enable development on Windows: - -```ruby -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] -``` - -As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the -`--watch` switch is specified during a build or serve. While `listen` has -built-in support for UNIX systems, it requires an extra gem for compatibility -with Windows. Add the following to the Gemfile for your site: - -```ruby -gem 'wdm', '~> 0.1.0' if Gem.win_platform? -``` -### How to install github-pages +## How to install github-pages (Chocolatey Method) This section is part of an article written by [Jens Willmer][jwillmerPost]. To follow the instructions you need to have [Chocolatey][] installed on your system. If you already have a version of Ruby installed you need to uninstall it before you can continue. @@ -145,7 +135,7 @@ This gem is also needed in the github-pages and to get it running on Windows x64 --with-xslt-lib=C:\Chocolatey\lib\libxslt.redist.1.1.28.0\build\native\bin\v110\x64\Release\dynamic ``` -#### Install github-pages +#### Install github-pages * Open command prompt and install [Bundler][]: `gem install bundler` * Create a file called `Gemfile` without any extension in your root directory of your blog @@ -172,6 +162,8 @@ In the future the installation process of the github-pages should be as simple a [nokogiriReleases]: https://github.com/sparklemotion/nokogiri/releases "Nokogiri Releases" [nokogiriFails]: https://github.com/sparklemotion/nokogiri/issues/1456#issuecomment-206481794 "Nokogiri fails to install on Ruby 2.3 for Windows" + + ## Installation via RubyInstaller RubyInstaller is a self-contained Windows-based installer that includes the Ruby language, an execution environment, important documentation, and more. @@ -180,17 +172,27 @@ RubyInstaller is a self-contained Windows-based installer that includes the Ruby 2. Install Jekyll and Bundler via a command prompt window: `gem install jekyll bundler` 3. Check if the installation is accessible: `jekyll -v` -See [Autoinstall Jekyll for Windows](https://github.com/KeJunMao/fastjekyll#autoinstall-jekyll-for-windows) +Optionally you can use [Autoinstall Jekyll for Windows](https://github.com/KeJunMao/fastjekyll#autoinstall-jekyll-for-windows). -### Auto-regeneration -Although jekyll would suggest: +## Time-Zone Management +Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00. +Though Windows users could alternatively define their blog's timezone by setting the key to use POSIX format of defining timezones, it wasn't as user-friendly when it came to having the clock altered to changing DST-rules. -``` -Please add the following to your Gemfile to avoid polling for changes: - gem 'wdm', '>= 0.1.0' if Gem.win_platform? +Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). +While 'new' blogs created with Jekyll v3.4 and greater, will have the following added to their 'Gemfile' by default, existing sites *will* have to update their 'Gemfile' (and installed) to enable development on Windows: + +```ruby +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] ``` -Auto-regeneration will work fine without including `gem 'wdm'` +## Auto Regeneration +As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the +`--watch` switch is specified during a build or serve. While `listen` has +built-in support for UNIX systems, it requires an extra gem for compatibility +with Windows. Add the following to the Gemfile for your site: -### [time-zone](/docs/windows/#timezone-management) +```ruby +gem 'wdm', '~> 0.1.0' if Gem.win_platform? +``` From 0d96ac4700f68c4fa0b61ef450ff4f8482e8ccbb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 18 Jun 2017 07:27:42 -0400 Subject: [PATCH 2213/4996] Update history to reflect merge of #6149 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8140b5940bd..c50dc4606aa 100644 --- a/History.markdown +++ b/History.markdown @@ -85,6 +85,7 @@ * Link the troubleshooting page in the quickstart page (#6134) * add documentation about the "pinned" label (#6147) * docs(JekyllOnWindows): Add a new Installation way (#6141) + * corrected windows.md (#6149) ### Development Fixes From 01dd356564fa76eb82f393d63aa6937570fe60cd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 18 Jun 2017 13:20:09 -0400 Subject: [PATCH 2214/4996] Lock nokogiri to 1.7.x for Ruby 2.1 (#6140) Merge pull request 6140 --- Gemfile | 3 ++- appveyor.yml | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 53cab0a5182..146100698ff 100644 --- a/Gemfile +++ b/Gemfile @@ -22,7 +22,8 @@ group :test do gem "cucumber", "~> 2.1" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" - gem "nokogiri" + # nokogiri v1.8 does not work with ruby 2.1 and below + gem "nokogiri", RUBY_VERSION >= "2.2" ? "~> 1.7" : "~> 1.7.0" gem "rspec" gem "rspec-mocks" gem "rubocop", "~> 0.49.1" diff --git a/appveyor.yml b/appveyor.yml index 2fe407f4cd6..34f4d726b0d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,8 +20,6 @@ environment: TEST_SUITE: "test" - RUBY_FOLDER_VER: "23" TEST_SUITE: "cucumber" - - RUBY_FOLDER_VER: "23" - TEST_SUITE: "fmt" - RUBY_FOLDER_VER: "23" TEST_SUITE: "default-site" - RUBY_FOLDER_VER: "23-x64" From 6c88e5c24128d613073dd2d1972a64f00ceed9c6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 18 Jun 2017 13:20:10 -0400 Subject: [PATCH 2215/4996] Update history to reflect merge of #6140 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c50dc4606aa..2a636f8c303 100644 --- a/History.markdown +++ b/History.markdown @@ -108,6 +108,7 @@ * Add test for uri_escape on reserved characters (#6086) * Allow you to specify the rouge version via an environment variable for testing (#6138) * Bump Rubocop to 0.49.1 (#6093) + * Lock nokogiri to 1.7.x for Ruby 2.1 (#6140) ### Site Enhancements From 88e79430845c40091d90e67660d44753dd216c38 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 19 Jun 2017 01:40:47 +0530 Subject: [PATCH 2216/4996] Refine doc for Windows (#6153) Merge pull request 6153 --- docs/_docs/windows.md | 120 ++++++++++++++++++++++++------------------ 1 file changed, 69 insertions(+), 51 deletions(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index a785a3d5e5b..6ebc33db065 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -3,17 +3,19 @@ title: Jekyll on Windows permalink: /docs/windows/ --- -While Windows is not an officially-supported platform, it can be used to run -Jekyll with the proper tweaks. If you are using Windows 10 Anniversary Update, -the easiest way to run Jekyll is to use the new [Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide). -For older installations, this page aims to collect some of the general knowledge and lessons that have been unearthed by Windows users. +While Windows is not an officially-supported platform, it can be used to run Jekyll with the proper tweaks. This page aims to collect some of the general knowledge and lessons that have been unearthed by Windows users. -## Installation via Bash on Windows 10 -*Please note:* You must have [Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about?f=255&MSPPError=-2147217396) enabled. +## Installing Jekyll -First let's make sure all our packages / repositories are up to date. -Open a new Command Prompt instance, and type the following: +If you are using Windows 10 Anniversary Update, the easiest way to run Jekyll is by [installing][WSL-Guide] the new Bash on Ubuntu on Windows. + + +### Installation via Bash on Windows 10 + +*Note:* You must have [Bash on Ubuntu on Windows][BASH-WSL] enabled. + +First let's make sure all our packages / repositories are up to date. Open a new Command Prompt instance, and type the following: ``` bash @@ -23,7 +25,6 @@ Your Command Prompt instance should now be a Bash instance. Now we must update o ``` sudo apt-get update -y && sudo apt-get upgrade -y ``` - Now we can install Ruby. To do this we will use a repository from [BrightBox](https://www.brightbox.com/docs/ruby/ubuntu/), which hosts optimized versions of Ruby for Ubuntu. ``` @@ -31,6 +32,7 @@ sudo apt-add-repository ppa:brightbox/ruby-ng sudo apt-get update sudo apt-get install ruby2.3 ruby2.3-dev build-essential ``` + Next let's update our Ruby gems: ``` @@ -43,7 +45,7 @@ Now all that is left to do is install Jekyll. sudo gem install jekyll bundler ``` -Check to see if your installation worked. +Check if Jekyll installed properly by running: ``` jekyll -v @@ -51,23 +53,38 @@ jekyll -v **And that's it!** -To start a new project, just run: +To start a new project named `my_blog`, just run: + ``` -jekyll new my_project +jekyll new my_blog ``` -replacing `my_project` with the name of your website. +You can make sure time management is working properly by inspecting your `_posts` folder. You should see a markdown file with the current date in the filename. + +**Note:** Bash on Ubuntu on Windows is still under development, so you may run into issues. + + +[WSL-Guide]: https://msdn.microsoft.com/en-us/commandline/wsl/install_guide +[BASH-WSL]: https://msdn.microsoft.com/en-us/commandline/wsl/about + + +### Installation via RubyInstaller -If you `cd` into the folder, you can make sure time management is working by opening your `_posts` folder. You should see a markdown file with the current date listed. +[RubyInstaller][] is a self-contained Windows-based installer that includes the Ruby language, an execution environment, important documentation, and more. -*Please note* Bash on Ubuntu on Windows is still under development, so you may run into issues. If you see an Auto-Regeneration error warning in your Bash instance, you can ignore it. +1. Download and Install a package manager version from [RubyInstaller Downloads][RubyInstaller-downloads]. +2. Install Jekyll and Bundler via a command prompt window: `gem install jekyll bundler` +3. Check if Jekyll installed properly: `jekyll -v` + +[RubyInstaller]: https://rubyinstaller.org/ +[RubyInstaller-downloads]: https://rubyinstaller.org/downloads/ -## Installation via Chocolatey +### Installation via Chocolatey A quick way to install Jekyll using Chocolatey is to follow the [installation instructions by David Burela](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/): - 1. Install a package manager for Windows called [Chocolatey](https://chocolatey.org/install) + 1. Install a package manager for Windows called [Chocolatey][] 2. Install Ruby via Chocolatey: `choco install ruby -y` 3. Reopen a command prompt and install Jekyll: `gem install jekyll` @@ -75,26 +92,12 @@ Updates in the infrastructure of Ruby may cause SSL errors when attempting to us [ssl-certificate-update]: http://guides.rubygems.org/ssl-certificate-update/#installing-using-update-packages -For a more conventional way of installing Jekyll you can follow this [complete guide to install Jekyll 3 on Windows by Sverrir Sigmundarson][windows-installjekyll3]. - -[windows-installjekyll3]: https://labs.sverrirs.com/jekyll/ - -If you use UTF-8 encoding, make sure that no `BOM` header -characters exist in your files or very, very bad things will happen to -Jekyll. This is especially relevant if you're running Jekyll on Windows. -Additionally, you might need to change the code page of the console window to UTF-8 -in case you get a "Liquid Exception: Incompatible character encoding" error during -the site generation process. It can be done with the following command: - -```sh -$ chcp 65001 -``` - -## How to install github-pages (Chocolatey Method) +### Installing *github-pages* via Chocolatey This section is part of an article written by [Jens Willmer][jwillmerPost]. To follow the instructions you need to have [Chocolatey][] installed on your system. If you already have a version of Ruby installed you need to uninstall it before you can continue. + #### Install Ruby and Ruby development kit Open a command prompt and execute the following commands: @@ -102,6 +105,7 @@ Open a command prompt and execute the following commands: * `choco install ruby -version 2.2.4` * `choco install ruby2.devkit` - _needed for compilation of json gem_ + #### Configure Ruby development kit The development kit did not set the environment path for Ruby so we need to do it. @@ -111,14 +115,13 @@ The development kit did not set the environment path for Ruby so we need to do i * Edit the `config.yml` file and include the path to Ruby `- C:/tools/ruby22` * Execute the following command to set the path: `ruby dk.rb install` + #### Nokogiri gem installation This gem is also needed in the github-pages and to get it running on Windows x64 we have to install a few things. - **Note:** In the current [pre release][nokogiriFails] it works out of the box with Windows x64 but this version is not referenced in the github-pages. - `choco install libxml2 -Source "https://www.nuget.org/api/v2/"`{:.language-ruby} `choco install libxslt -Source "https://www.nuget.org/api/v2/"`{:.language-ruby} @@ -137,9 +140,9 @@ This gem is also needed in the github-pages and to get it running on Windows x64 #### Install github-pages - * Open command prompt and install [Bundler][]: `gem install bundler` - * Create a file called `Gemfile` without any extension in your root directory of your blog - * Copy & paste the two lines into the file: + * Open command prompt and install [Bundler][]: `gem install bundler` + * Create a file called `Gemfile` without any extension in your root directory of your blog + * Copy & paste the two lines into the file: ```ruby @@ -151,35 +154,47 @@ gem 'github-pages', group: :jekyll_plugins * Open a command prompt, target your local blog repository root, and install github-pages: `bundle install` -After this process you should have github-pages installed on your system and you can host your blog again with `jekyll s`. \\ +After this process you should have github-pages installed on your system and you can host your blog again with `jekyll s`. There will be a warning on startup that you should include `gem 'wdm', '>= 0.1.0' if Gem.win_platform?` to your `Gemfile` but I could not get `jekyll s` working if I include that line so for the moment I ignore that warning. In the future the installation process of the github-pages should be as simple as the setup of the blog. But as long as the new version of the Nokogiri ([v1.6.8][nokogiriReleases]) is not stable and referenced, it is work to get it up and running on Windows. [jwillmerPost]: https://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46 "Installation instructions by Jens Willmer" [Chocolatey]: https://chocolatey.org/install "Package manager for Windows" +[nokogiriFails]: https://github.com/sparklemotion/nokogiri/issues/1456#issuecomment-206481794 "Nokogiri fails to install on Ruby 2.3 for Windows" [Bundler]: http://bundler.io/ "Ruby Dependencie Manager" [nokogiriReleases]: https://github.com/sparklemotion/nokogiri/releases "Nokogiri Releases" -[nokogiriFails]: https://github.com/sparklemotion/nokogiri/issues/1456#issuecomment-206481794 "Nokogiri fails to install on Ruby 2.3 for Windows" +--- + +For a more conventional way of installing Jekyll you can follow this [complete guide to install Jekyll 3 on Windows by Sverrir Sigmundarson][windows-installjekyll3]. +Optionally you can use [Autoinstall Jekyll for Windows][fastjekyll-autoinstall]. -## Installation via RubyInstaller +--- -RubyInstaller is a self-contained Windows-based installer that includes the Ruby language, an execution environment, important documentation, and more. +[windows-installjekyll3]: https://labs.sverrirs.com/jekyll/ +[fastjekyll-autoinstall]: https://github.com/KeJunMao/fastjekyll#autoinstall-jekyll-for-windows -1. Install a package manager for Windows called [RubyInstaller](https://rubyinstaller.org/). -2. Install Jekyll and Bundler via a command prompt window: `gem install jekyll bundler` -3. Check if the installation is accessible: `jekyll -v` -Optionally you can use [Autoinstall Jekyll for Windows](https://github.com/KeJunMao/fastjekyll#autoinstall-jekyll-for-windows). +## Encoding + +If you use UTF-8 encoding, make sure that no `BOM` header characters exist in your files or very, very bad things will happen to +Jekyll. This is especially relevant when you're running Jekyll on Windows. + +Additionally, you might need to change the code page of the console window to UTF-8 in case you get a "Liquid Exception: Incompatible character encoding" error during the site generation process. It can be done with the following command: + +```sh +$ chcp 65001 +``` ## Time-Zone Management + Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00. Though Windows users could alternatively define their blog's timezone by setting the key to use POSIX format of defining timezones, it wasn't as user-friendly when it came to having the clock altered to changing DST-rules. -Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). +Jekyll now uses a rubygem to internally configure Timezone based on established [IANA Timezone Database][IANA-database]. While 'new' blogs created with Jekyll v3.4 and greater, will have the following added to their 'Gemfile' by default, existing sites *will* have to update their 'Gemfile' (and installed) to enable development on Windows: ```ruby @@ -187,11 +202,14 @@ While 'new' blogs created with Jekyll v3.4 and greater, will have the following gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] ``` +[IANA-database]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + + ## Auto Regeneration -As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the -`--watch` switch is specified during a build or serve. While `listen` has -built-in support for UNIX systems, it requires an extra gem for compatibility -with Windows. Add the following to the Gemfile for your site: + +As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the `--watch` switch is specified during a build or serve. While `listen` has built-in support for UNIX systems, it may require an extra gem for compatibility with Windows. + +Add the following to the Gemfile for your site if you have issues with auto-regeneration on Windows alone: ```ruby gem 'wdm', '~> 0.1.0' if Gem.win_platform? From e3917b6fa28bec6b98eec9cb6380cc353d0dccf3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 18 Jun 2017 16:10:48 -0400 Subject: [PATCH 2217/4996] Update history to reflect merge of #6153 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2a636f8c303..31d3a35b449 100644 --- a/History.markdown +++ b/History.markdown @@ -86,6 +86,7 @@ * add documentation about the "pinned" label (#6147) * docs(JekyllOnWindows): Add a new Installation way (#6141) * corrected windows.md (#6149) + * Refine documentation for Windows (#6153) ### Development Fixes From 9f302b34ae6a56b415aaef9f4e30495d5210af1b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 18 Jun 2017 18:15:48 -0400 Subject: [PATCH 2218/4996] Release post for Jekyll v3.5 (#6144) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add draft of release post for Jekyll v3.5 * add a few details about Liquid 4 * remove @ashmaroli doppelgânger * change layout: nil to layout: null --- .../2017-06-14-jekyll-3-5-0-released.markdown | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/_posts/2017-06-14-jekyll-3-5-0-released.markdown diff --git a/docs/_posts/2017-06-14-jekyll-3-5-0-released.markdown b/docs/_posts/2017-06-14-jekyll-3-5-0-released.markdown new file mode 100644 index 00000000000..54d1aed77df --- /dev/null +++ b/docs/_posts/2017-06-14-jekyll-3-5-0-released.markdown @@ -0,0 +1,38 @@ +--- +title: 'Jekyll turns 3.5, oh my!' +date: 2017-06-15 17:32:32 -0400 +author: parkr +version: 3.5.0 +categories: [release] +--- + +Good news! Nearly 400 commits later, Jekyll 3.5.0 has been released into +the wild. Some new shiny things you might want to test out: + +- Jekyll now uses Liquid 4, the latest! It comes with whitespace control, new filters `concat` annd `compact`, loop performance improvements and [many fixes](https://github.com/Shopify/liquid/blob/master/History.md#400--2016-12-14--branch-4-0-stable) +- Themes can specify runtime dependencies (in their gemspecs) and we'll require those. This makes it easier for theme writers to use plugins. +- Speaking of themes, we'll properly handle the discrepancy between a convertible file in the local site and a static file in the theme. Overriding a file locally now doesn't matter if it's convertible or static. +- Pages, posts, and other documents can now access layout variables via `{% raw %}{{ layout }}{% endraw %}`. +- The `gems` key in the `_config.yml` is now `plugins`. This is backwards-compatible, as Jekyll will gracefully upgrade `gems` to `plugins` if you use the former. +- Filters like `sort` now allow you to sort based on a subvalue, e.g. `{% raw %}{% assign sorted = site.posts | sort: "image.alt_text" %}{% endraw %}`. +- You can now create tab-separated data files. +- Using `layout: none` will now produce a file with no layout. Equivalent to `layout: null`, with the exception that `none` is a truthy value and won't be overwritten by front matter defaults. +- No more pesky errors if your URL contains a colon (sorry about those!) +- We now automatically exclude the `Gemfile` from the site manifest when compiling your site. No more `_site/Gemfile`! +- We fixed a bug where abbreviated post dates were ignored, e.g. `_posts/2016-4-4-april-fourth.md`. + +And [so much more!](/docs/history/) + +There was a huge amount of effort put into this release by our maintainers, +especially @pathawks, @DirtyF, and @pup. Huge thanks to them for ushering +this release along and keeping the contributions flowing! Jekyll wouldn't +work without the tireless dedication of our team captains & maintainers. +Thank you, all! + +A huge thanks as well to our contributors to this release: Adam Hollett, Aleksander Kuś, Alfred Myers, Anatoliy Yastreb, Antonio Argote, Ashton Hellwig, Ashwin Maroli, Ben Balter, BlueberryFoxtrot, Brent Yi, Chris Finazzo, Christoph Päper, Christopher League, Chun Fei Lung, Colin, David Zhang, Eric Leong, Finn Ellis, Florian Thomas, Frank Taillandier, Hendrik Schneider, Henry Kobin, Ivan Storck, Jakub Klímek, Jan Pobořil, Jeff Puckett, Jonathan Hooper, Kaligule, Kevin Funk, Krzysztof Szafranek, Liu Cheng, Lukasz Brodowski, Marc Bruins, Marcelo Canina, Martin Desrumaux, Mer, Nate, Oreonax, Parker Moore, Pat Hawks, Pedro Lamas, Phil Nash, Ricardo N Feliciano, Ricky Han, Roger Sheen, Ryan Lue, Ryan Streur, Shane Neuville, Sven Meyer, Tom Johnson, William Entriken, Yury V. Zaytsev, Zarino Zappia, dyang, jekylltools, sean delaney, zenHeart + +Please file any bugs with detailed replication instructions if you find any +bugs. Better yet, submit a patch if you find the bug in the code and know +how to fix it! :heart: + +Happy Jekylling! :tada: From 22072235598838311eb14d26f3aeebf39d435234 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 17 Jun 2017 21:42:59 -0400 Subject: [PATCH 2219/4996] Bump to v3.4.4 --- History.markdown | 4 ++++ lib/jekyll/version.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 31d3a35b449..273193e609a 100644 --- a/History.markdown +++ b/History.markdown @@ -142,6 +142,10 @@ * Filters#time helper: Duplicate time before calling #localtime. (#5996) +## 3.4.4 / 2016-06-17 + + * Backport #6137 for v3.4.x: Default `baseurl` to `nil` instead of empty string (#6146) + ## 3.4.3 / 2017-03-21 * Backport #5957 for v3.4.x: Allow colons in `uri_escape` filter (#5968) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 1c4a0b96025..23ea0c2cf7a 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.4.3".freeze + VERSION = "3.4.4".freeze end From 9eba49cd61dec8e72157a129e9fe9bb38ab4054d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 18 Jun 2017 18:40:35 -0400 Subject: [PATCH 2220/4996] Release :gem: 3.5.0 --- History.markdown | 5 +- docs/_docs/history.md | 153 ++++++++++++++++++++++++++++++++++++++++ docs/latest_version.txt | 2 +- lib/jekyll/version.rb | 2 +- 4 files changed, 156 insertions(+), 6 deletions(-) diff --git a/History.markdown b/History.markdown index 273193e609a..13997d04e69 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,4 @@ -## HEAD +## 3.5.0 / 2017-06-18 ### Minor Enhancements @@ -137,9 +137,6 @@ * add test to ensure variables work in `where_exp` condition (#5315) * Read explicitly included dot-files in collections. (#6092) * Default `baseurl` to `nil` instead of empty string (#6137) - -### fix - * Filters#time helper: Duplicate time before calling #localtime. (#5996) ## 3.4.4 / 2016-06-17 diff --git a/docs/_docs/history.md b/docs/_docs/history.md index c67f978ab08..de5dc4d822d 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,6 +4,159 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.5.0 / 2017-06-18 +{: #v3-5-0} + +### Minor Enhancements +{: #minor-enhancements-v3-5-0} + +- Upgrade to Liquid v4 ([#4362]({{ site.repository }}/issues/4362)) +- Convert StaticFile liquid representation to a Drop & add front matter defaults support to StaticFiles ([#5871]({{ site.repository }}/issues/5871)) +- Add support for Tab-Separated Values data files (`*.tsv`) ([#5985]({{ site.repository }}/issues/5985)) +- Specify version constraint in subcommand error message. ([#5974]({{ site.repository }}/issues/5974)) +- Add a template for custom 404 page ([#5945]({{ site.repository }}/issues/5945)) +- Require `runtime_dependencies` of a Gem-based theme from its `.gemspec` file ([#5914]({{ site.repository }}/issues/5914)) +- Don't raise an error if URL contains a colon ([#5889]({{ site.repository }}/issues/5889)) +- Date filters should never raise an exception ([#5722]({{ site.repository }}/issues/5722)) +- add `plugins` config key as replacement for `gems` ([#5130]({{ site.repository }}/issues/5130)) +- create configuration from options only once in the boot process ([#5487]({{ site.repository }}/issues/5487)) +- Add option to fail a build with front matter syntax errors ([#5832]({{ site.repository }}/issues/5832)) +- Disable default layouts for documents with a `layout: none` declaration ([#5933]({{ site.repository }}/issues/5933)) +- In `jekyll new`, make copied site template user-writable ([#6072]({{ site.repository }}/issues/6072)) +- Add top-level `layout` liquid variable to Documents ([#6073]({{ site.repository }}/issues/6073)) +- Address reading non-binary static files in themes ([#5918]({{ site.repository }}/issues/5918)) +- Allow filters to sort & select based on subvalues ([#5622]({{ site.repository }}/issues/5622)) +- Add strip_index filter ([#6075]({{ site.repository }}/issues/6075)) + +### Documentation + +- Install troubleshooting on Ubuntu ([#5817]({{ site.repository }}/issues/5817)) +- Add Termux section on troubleshooting ([#5837]({{ site.repository }}/issues/5837)) +- fix ial css classes in theme doc ([#5876]({{ site.repository }}/issues/5876)) +- Update installation.md ([#5880]({{ site.repository }}/issues/5880)) +- Update Aerobatic docs ([#5883]({{ site.repository }}/issues/5883)) +- Add note to collections doc on hard-coded collections. ([#5882]({{ site.repository }}/issues/5882)) +- Makes uri_escape template docs more specific. ([#5887]({{ site.repository }}/issues/5887)) +- Remove duplicate footnote_nr from default config ([#5891]({{ site.repository }}/issues/5891)) +- Fixed tutorial for publishing gem to include repo. ([#5900]({{ site.repository }}/issues/5900)) +- update broken links ([#5905]({{ site.repository }}/issues/5905)) +- Fix typo in contribution information ([#5910]({{ site.repository }}/issues/5910)) +- update plugin repo URL to reflect repo move ([#5916]({{ site.repository }}/issues/5916)) +- Update exclude array in configuration.md ([#5947]({{ site.repository }}/issues/5947)) +- Fixed path in "Improve this page" link in Tutorials section ([#5951]({{ site.repository }}/issues/5951)) +- Corrected permalink ([#5949]({{ site.repository }}/issues/5949)) +- Included more details about adding defaults to static files ([#5971]({{ site.repository }}/issues/5971)) +- Create buddyworks ([#5962]({{ site.repository }}/issues/5962)) +- added (buddyworks) to ci list ([#5965]({{ site.repository }}/issues/5965)) +- Add a tutorial on serving custom Error 404 page ([#5946]({{ site.repository }}/issues/5946)) +- add custom 404 to tutorial navigation ([#5978]({{ site.repository }}/issues/5978)) +- Add link to order of interpretation tutorial in Tutorials nav ([#5952]({{ site.repository }}/issues/5952)) +- Document Jekyll's Philosophy ([#5792]({{ site.repository }}/issues/5792)) +- Require Ruby > 2.1.0 ([#5983]({{ site.repository }}/issues/5983)) +- Fix broken link ([#5994]({{ site.repository }}/issues/5994)) +- Default options for script/proof ([#5995]({{ site.repository }}/issues/5995)) +- Mention Bash on Ubuntu on Windows ([#5960]({{ site.repository }}/issues/5960)) +- Document `--unpublished` flag introduced in 91e9ecf ([#5959]({{ site.repository }}/issues/5959)) +- Update upgrading.md to mention usage of `bundle update` ([#5604]({{ site.repository }}/issues/5604)) +- Fix missing quotation mark ([#6002]({{ site.repository }}/issues/6002)) +- New tutorial: Convert an HTML site to Jekyll ([#5881]({{ site.repository }}/issues/5881)) +- Revamp Permalink section ([#5912]({{ site.repository }}/issues/5912)) +- Fixup tutorial on creating theme from existing HTML templates ([#6006]({{ site.repository }}/issues/6006)) +- Standardise on "URLs" without apostrophe in docs ([#6018]({{ site.repository }}/issues/6018)) +- Added txtpen in tutorial ([#6021]({{ site.repository }}/issues/6021)) +- fix typo using past participle ([#6026]({{ site.repository }}/issues/6026)) +- changed formatting to fit the style of the documentation ([#6027]({{ site.repository }}/issues/6027)) +- doc fix typo word usage ([#6028]({{ site.repository }}/issues/6028)) +- corrected reference to layout in index.md ([#6032]({{ site.repository }}/issues/6032)) +- (Minor) Update MathJax CDN ([#6013]({{ site.repository }}/issues/6013)) +- Add MvvmCross to samples ([#6035]({{ site.repository }}/issues/6035)) +- Update travis-ci.md to correct procedure ([#6043]({{ site.repository }}/issues/6043)) +- fix sentence in documentation ([#6048]({{ site.repository }}/issues/6048)) +- rephrase a sentence in posts.md to be more direct ([#6049]({{ site.repository }}/issues/6049)) +- Compress Website Sass output ([#6009]({{ site.repository }}/issues/6009)) +- doc correct spelling error ([#6050]({{ site.repository }}/issues/6050)) +- adjusted date-format in sitemap ([#6053]({{ site.repository }}/issues/6053)) +- Typo fix (welcomed change -> welcome change). ([#6070]({{ site.repository }}/issues/6070)) +- Fixed documentation inconsistency ([#6068]({{ site.repository }}/issues/6068)) +- Add own plugin -> Jekyll Brand Social Wall ([#6064]({{ site.repository }}/issues/6064)) +- Added plugin jekyll-analytics ([#6042]({{ site.repository }}/issues/6042)) +- Use more precise language when explaining links ([#6078]({{ site.repository }}/issues/6078)) +- Update plugins.md ([#6088]({{ site.repository }}/issues/6088)) +- windows 10 tutorial ([#6100]({{ site.repository }}/issues/6100)) +- Explain how to override theme styles ([#6107]({{ site.repository }}/issues/6107)) +- updated Bash on Ubuntu on Windows link in tutorial ([#6111]({{ site.repository }}/issues/6111)) +- Fix wording in `_docs/templates.md` links section ([#6114]({{ site.repository }}/issues/6114)) +- Update windows.md ([#6115]({{ site.repository }}/issues/6115)) +- Added windows to docs.yml ([#6109]({{ site.repository }}/issues/6109)) +- Be more specific on what to upload ([#6119]({{ site.repository }}/issues/6119)) +- Remove Blank Newlines from "Jekyll on Windows" Page ([#6126]({{ site.repository }}/issues/6126)) +- Link the troubleshooting page in the quickstart page ([#6134]({{ site.repository }}/issues/6134)) +- add documentation about the &[#34]({{ site.repository }}/issues/34);pinned&[#34]({{ site.repository }}/issues/34); label ([#6147]({{ site.repository }}/issues/6147)) +- docs(JekyllOnWindows): Add a new Installation way ([#6141]({{ site.repository }}/issues/6141)) +- corrected windows.md ([#6149]({{ site.repository }}/issues/6149)) +- Refine documentation for Windows ([#6153]({{ site.repository }}/issues/6153)) + +### Development Fixes +{: #development-fixes-v3-5-0} + +- [Rubocop] add missing comma ([#5835]({{ site.repository }}/issues/5835)) +- Appease classifier-reborn ([#5934]({{ site.repository }}/issues/5934)) +- Allow releases & development on `*-stable` branches ([#5926]({{ site.repository }}/issues/5926)) +- Add script/backport-pr ([#5925]({{ site.repository }}/issues/5925)) +- Prefer .yaml over .toml ([#5966]({{ site.repository }}/issues/5966)) +- Fix Appveyor with DST-aware cucumber steps ([#5961]({{ site.repository }}/issues/5961)) +- Use Rubocop v0.47.1 till we're ready for v0.48 ([#5989]({{ site.repository }}/issues/5989)) +- Test against Ruby 2.4.0 ([#5687]({{ site.repository }}/issues/5687)) +- rubocop: lib/jekyll/renderer.rb complexity fixes ([#5052]({{ site.repository }}/issues/5052)) +- Use yajl-ruby 1.2.2 (now with 2.4 support) ([#6007]({{ site.repository }}/issues/6007)) +- Bump Rubocop to v0.48 ([#5997]({{ site.repository }}/issues/5997)) +- doc use example.com ([#6031]({{ site.repository }}/issues/6031)) +- fix typo ([#6040]({{ site.repository }}/issues/6040)) +- Fix CI ([#6044]({{ site.repository }}/issues/6044)) +- Remove `ruby RUBY_VERSION` from generated Gemfile ([#5803]({{ site.repository }}/issues/5803)) +- Test if hidden collections output a document with a future date ([#6103]({{ site.repository }}/issues/6103)) +- Add test for uri_escape on reserved characters ([#6086]({{ site.repository }}/issues/6086)) +- Allow you to specify the rouge version via an environment variable for testing ([#6138]({{ site.repository }}/issues/6138)) +- Bump Rubocop to 0.49.1 ([#6093]({{ site.repository }}/issues/6093)) +- Lock nokogiri to 1.7.x for Ruby 2.1 ([#6140]({{ site.repository }}/issues/6140)) + +### Site Enhancements +{: #site-enhancements-v3-5-0} + +- Corrected date for version 3.4.0 ([#5842]({{ site.repository }}/issues/5842)) +- Add the correct year to the 3.4.0 release date ([#5858]({{ site.repository }}/issues/5858)) +- Add documentation about order of interpretation ([#5834]({{ site.repository }}/issues/5834)) +- Documentation on how to build navigation ([#5698]({{ site.repository }}/issues/5698)) +- Navigation has been moved out from docs ([#5927]({{ site.repository }}/issues/5927)) +- Make links in sidebar for current page more prominent ([#5820]({{ site.repository }}/issues/5820)) +- Update normalize.css to v6.0.0 ([#6008]({{ site.repository }}/issues/6008)) +- Docs: rename `gems` to `plugins` ([#6082]({{ site.repository }}/issues/6082)) +- plugins -> gems ([#6110]({{ site.repository }}/issues/6110)) +- Document difference between cgi_escape and uri_escape [#5970]({{ site.repository }}/issues/5970) ([#6081]({{ site.repository }}/issues/6081)) + +### Bug Fixes +{: #bug-fixes-v3-5-0} + +- Exclude Gemfile by default ([#5860]({{ site.repository }}/issues/5860)) +- Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty ([#5878]({{ site.repository }}/issues/5878)) +- Allow abbreviated post dates ([#5920]({{ site.repository }}/issues/5920)) +- Remove dependency on include from default about.md ([#5903]({{ site.repository }}/issues/5903)) +- Allow colons in `uri_escape` filter ([#5957]({{ site.repository }}/issues/5957)) +- Re-surface missing public methods in `Jekyll::Document` ([#5975]({{ site.repository }}/issues/5975)) +- absolute_url should not mangle URL if called more than once ([#5789]({{ site.repository }}/issues/5789)) +- patch URLFilters to prevent `//` ([#6058]({{ site.repository }}/issues/6058)) +- add test to ensure variables work in `where_exp` condition ([#5315]({{ site.repository }}/issues/5315)) +- Read explicitly included dot-files in collections. ([#6092]({{ site.repository }}/issues/6092)) +- Default `baseurl` to `nil` instead of empty string ([#6137]({{ site.repository }}/issues/6137)) +- Filters#time helper: Duplicate time before calling #localtime. ([#5996]({{ site.repository }}/issues/5996)) + + +## 3.4.4 / 2016-06-17 +{: #v3-4-4} + +- Backport [#6137]({{ site.repository }}/issues/6137) for v3.4.x: Default `baseurl` to `nil` instead of empty string ([#6146]({{ site.repository }}/issues/6146)) + + ## 3.4.3 / 2017-03-21 {: #v3-4-3} diff --git a/docs/latest_version.txt b/docs/latest_version.txt index 6cb9d3dd0d6..1545d966571 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.4.3 +3.5.0 diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 23ea0c2cf7a..0af816ca2ca 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.4.4".freeze + VERSION = "3.5.0".freeze end From 5380b4fd8392a8ea7dc6f98adf087e3b8935579e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 18 Jun 2017 18:40:44 -0400 Subject: [PATCH 2221/4996] Release :gem: 3.5.0 From 0dcc7cb20e1440f4c40359bc936d868b65c330b7 Mon Sep 17 00:00:00 2001 From: "jaybe@jekyll" Date: Mon, 19 Jun 2017 06:52:58 -0500 Subject: [PATCH 2222/4996] Update reference to trouble with OS X/macOS (#6139) Merge pull request 6139 --- README.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.markdown b/README.markdown index 60f11c471fc..9718f24d52b 100644 --- a/README.markdown +++ b/README.markdown @@ -22,9 +22,9 @@ Jekyll is a simple, blog-aware, static site generator perfect for personal, proj Jekyll does what you tell it to do — no more, no less. It doesn't try to outsmart users by making bold assumptions, nor does it burden them with needless complexity and configuration. Put simply, Jekyll gets out of your way and allows you to concentrate on what truly matters: your content. -## Having trouble with OS X El Capitan? +## Having trouble with OS X/macOS? -See: https://jekyllrb.com/docs/troubleshooting/#jekyll-amp-mac-os-x-1011 +See: https://jekyllrb.com/docs/troubleshooting/ ## Getting Started From 056cebd16b0fb9c1e92ee5120a619df81d428d5b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 19 Jun 2017 07:52:59 -0400 Subject: [PATCH 2223/4996] Update history to reflect merge of #6139 [ci skip] --- History.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/History.markdown b/History.markdown index 13997d04e69..5d2727b1edd 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,9 @@ +## HEAD + +### Documentation + + * Update reference to trouble with OS X/macOS (#6139) + ## 3.5.0 / 2017-06-18 ### Minor Enhancements From 483951be7554ffbf34fa2a5842a4f9dd0ce2e002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20J=C3=A4schke?= Date: Mon, 19 Jun 2017 13:31:08 +0100 Subject: [PATCH 2224/4996] added BibSonomy plugin (#6143) Merge pull request 6143 --- docs/_docs/plugins.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 653d37a2c6f..1da8eb1a2c0 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -873,6 +873,9 @@ LESS.js files during generation. - [Jekyll Download Tag](https://github.com/mattg/jekyll-download-tag): A Liquid tag that acts like `include`, but for external resources. - [Jekyll Brand Social Wall](https://github.com/MediaComem/jekyll-brand-social-wall): A jekyll plugin to generate a social wall with your favorite social networks - [Jekyll If File Exists](https://github.com/k-funk/jekyll-if-file-exists): A Jekyll Plugin that checks if a file exists with an if/else block. +- [BibSonomy](https://github.com/rjoberon/bibsonomy-jekyll): Jekyll + plugin to generate publication lists from [BibSonomy](https://www.bibsonomy.org/). + #### Collections From 3a527bcecfba533bb0bf833cafb7d749c72bc1bc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 19 Jun 2017 08:31:09 -0400 Subject: [PATCH 2225/4996] Update history to reflect merge of #6143 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5d2727b1edd..59870b01b62 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Documentation * Update reference to trouble with OS X/macOS (#6139) + * added BibSonomy plugin (#6143) ## 3.5.0 / 2017-06-18 From 82809bbc6d118f5d0d25ae9348f9fab86636efb2 Mon Sep 17 00:00:00 2001 From: Fadhil Date: Mon, 19 Jun 2017 20:32:37 +0800 Subject: [PATCH 2226/4996] add `plugins` for multiple page pagination (#6055) Merge pull request 6055 --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 1da8eb1a2c0..f576e442622 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -754,6 +754,7 @@ LESS.js files during generation. - [AMP-Jekyll by Juuso Mikkonen](https://github.com/juusaw/amp-jekyll): Generate [Accelerated Mobile Pages](https://www.ampproject.org) of Jekyll posts. - [Jekyll Art Gallery plugin](https://github.com/alexivkin/Jekyll-Art-Gallery-Plugin): An advanced art/photo gallery generation plugin for creating galleries from a set of image folders. Supports image tagging, thumbnails, sorting, image rotation, post-processing (remove EXIF, add watermark), multiple collections and much more. - [jekyll-ga](https://github.com/developmentseed/jekyll-ga): A Jekyll plugin that downloads Google Analytics data and adds it to posts. Useful for making a site that lists "most popular" content. [Read the introduction](https://developmentseed.org/blog/google-analytics-jekyll-plugin/) post on the developmentSEED blog. +- [jekyll-multi-paginate](https://github.com/fadhilnapis/jekyll-multi-paginate): Simple Jekyll paginator for multiple page. Ease you to make pagination on multiple page especially like multiple language. #### Converters From ffbccb63bacc5654e4db11c6b2f482edfce2e565 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 19 Jun 2017 08:32:38 -0400 Subject: [PATCH 2227/4996] Update history to reflect merge of #6055 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 59870b01b62..85c0ef686d8 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Update reference to trouble with OS X/macOS (#6139) * added BibSonomy plugin (#6143) + * add plugins for multiple page pagination (#6055) ## 3.5.0 / 2017-06-18 From 3a52866cced3abe4c379c1c30e4385b618d2d2cf Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 19 Jun 2017 17:45:13 +0200 Subject: [PATCH 2228/4996] Update History.markdown (#6156) --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 85c0ef686d8..610f6ecc807 100644 --- a/History.markdown +++ b/History.markdown @@ -147,7 +147,7 @@ * Default `baseurl` to `nil` instead of empty string (#6137) * Filters#time helper: Duplicate time before calling #localtime. (#5996) -## 3.4.4 / 2016-06-17 +## 3.4.4 / 2017-06-17 * Backport #6137 for v3.4.x: Default `baseurl` to `nil` instead of empty string (#6146) From 0f0dab0239b3c9a8a7abc19c18bcb4b382e7c79a Mon Sep 17 00:00:00 2001 From: "James, please" Date: Wed, 21 Jun 2017 01:13:53 -0700 Subject: [PATCH 2229/4996] Update minimum Ruby version in installation.md (#6164) Merge pull request 6164 --- docs/_docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 5a8fc7a1286..659becc9603 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -14,7 +14,7 @@ Installing Jekyll should be straight-forward if all requirements are met. Before you start, make sure your system has the following: - GNU/Linux, Unix, or macOS -- [Ruby](https://www.ruby-lang.org/en/downloads/) version 2.0 or above, including all development +- [Ruby](https://www.ruby-lang.org/en/downloads/) version 2.1 or above, including all development headers - [RubyGems](https://rubygems.org/pages/download) - [GCC](https://gcc.gnu.org/install/) and [Make](https://www.gnu.org/software/make/) (in case your system doesn't have them installed, which you can check by running `gcc -v` and `make -v` in your system's command line interface) From e24fd073fe7acf1fba441c151ceb68c00ed97e5f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 21 Jun 2017 04:13:54 -0400 Subject: [PATCH 2230/4996] Update history to reflect merge of #6164 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 610f6ecc807..27df087f8e3 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,7 @@ * Update reference to trouble with OS X/macOS (#6139) * added BibSonomy plugin (#6143) * add plugins for multiple page pagination (#6055) + * Update minimum Ruby version in installation.md (#6164) ## 3.5.0 / 2017-06-18 From 285fe73b2e6f5b74875addb05577d609dc78452b Mon Sep 17 00:00:00 2001 From: Adam Voss Date: Wed, 21 Jun 2017 10:43:12 -0500 Subject: [PATCH 2231/4996] Add information about finding a collection in `site.collections` (#6165) Merge pull request 6165 --- docs/_docs/collections.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index fa82e096324..43ff533f28c 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -309,6 +309,8 @@ you specified in your `_config.yml` (if present) and the following information: you have a _posts directory or not. This is something to note when iterating through site.collections as you may need to filter it out.

      +

      You may wish to use filters to find your collection: + {{ site.collections | where: "label", "myCollection" | first }}

    From ca39b1525571ffc044bd3a8b7ba7159f63cd5d40 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 21 Jun 2017 11:43:13 -0400 Subject: [PATCH 2232/4996] Update history to reflect merge of #6165 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 27df087f8e3..c0887d26b5d 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,7 @@ * added BibSonomy plugin (#6143) * add plugins for multiple page pagination (#6055) * Update minimum Ruby version in installation.md (#6164) + * [docs] Add information about finding a collection in `site.collections` (#6165) ## 3.5.0 / 2017-06-18 From 7a853762467d410ca84e7570758ec19bcd0cb66f Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Wed, 21 Jun 2017 23:54:14 +0530 Subject: [PATCH 2233/4996] backward compatiblize URLFilters (#6163) Merge pull request 6163 --- lib/jekyll/filters/url_filters.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index 80ffa850aba..783dad4a481 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -11,6 +11,7 @@ module URLFilters def absolute_url(input) return if input.nil? return input if Addressable::URI.parse(input).absolute? + site = @context.registers[:site] return relative_url(input).to_s if site.config["url"].nil? Addressable::URI.parse(site.config["url"] + relative_url(input)).normalize.to_s end @@ -40,11 +41,8 @@ def strip_index(input) private - def site - @context.registers[:site] - end - def sanitized_baseurl + site = @context.registers[:site] site.config["baseurl"].to_s.chomp("/") end From 19a84584c99bfaaea5c4b33a78a485bf979d9eba Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 21 Jun 2017 14:24:16 -0400 Subject: [PATCH 2234/4996] Update history to reflect merge of #6163 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index c0887d26b5d..ebc10c8b87a 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,10 @@ * Update minimum Ruby version in installation.md (#6164) * [docs] Add information about finding a collection in `site.collections` (#6165) +### Bug Fixes + + * Backward compatiblize URLFilters module (#6163) + ## 3.5.0 / 2017-06-18 ### Minor Enhancements From f1410c7e239c0f2d1205e09968803b4b9db078b4 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 24 Jun 2017 18:31:58 +0200 Subject: [PATCH 2235/4996] run `jekyll doctor` to check the config (#6169) Merge pull request 6169 --- .github/ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 77602bc6ea2..b1d43598e2c 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -18,6 +18,7 @@ - [ ] I believe this to be a bug, not a question about using Jekyll. - [ ] I updated to the latest Jekyll (or) if on GitHub Pages to the latest `github-pages` +- [ ] I ran `jekyll doctor` to check my configuration - [ ] I read the CONTRIBUTION file at https://jekyllrb.com/docs/contributing/ - [ ] This is a feature request. From 374de56062eaacda135e4d28c79ebc83acf76bf3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 24 Jun 2017 12:31:59 -0400 Subject: [PATCH 2236/4996] Update history to reflect merge of #6169 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index ebc10c8b87a..9afe44cd787 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,10 @@ * Backward compatiblize URLFilters module (#6163) +### Development Fixes + + * Add jekyll doctor to GitHub Issue Template (#6169) + ## 3.5.0 / 2017-06-18 ### Minor Enhancements From 17c888dcab755f977f4b2940937f6260b645da75 Mon Sep 17 00:00:00 2001 From: Adam Voss Date: Sun, 25 Jun 2017 13:00:01 -0500 Subject: [PATCH 2237/4996] Add raw tags to prevent template rendering (#6179) Merge pull request 6179 --- docs/_docs/collections.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 43ff533f28c..6114e08ec9b 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -310,7 +310,7 @@ you specified in your `_config.yml` (if present) and the following information: when iterating through site.collections as you may need to filter it out.

    You may wish to use filters to find your collection: - {{ site.collections | where: "label", "myCollection" | first }}

    + {% raw %}{{ site.collections | where: "label", "myCollection" | first }}{% endraw %}

    From e836de3205888e6016e913a1b65d681000eb5eb7 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 25 Jun 2017 14:00:03 -0400 Subject: [PATCH 2238/4996] Update history to reflect merge of #6179 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9afe44cd787..fd2a7e73c6d 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * add plugins for multiple page pagination (#6055) * Update minimum Ruby version in installation.md (#6164) * [docs] Add information about finding a collection in `site.collections` (#6165) + * Add {%raw%} to Liquid example on site (#6179) ### Bug Fixes From 6aa8f741c9907482eb403f79502924dcbe547fc5 Mon Sep 17 00:00:00 2001 From: Doug Beney Date: Sun, 25 Jun 2017 18:39:05 -0400 Subject: [PATCH 2239/4996] Added improved Pug plugin - removed 404 Jade plugin (#6174) Merge pull request 6174 --- docs/_docs/plugins.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index f576e442622..d630b106cf6 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -758,10 +758,9 @@ LESS.js files during generation. #### Converters +- [Pug plugin by Doug Beney](https://github.com/DougBeney/jekyll-pug): Pug (previously Jade) converter for Jekyll. - [Textile converter](https://github.com/jekyll/jekyll-textile-converter): Convert `.textile` files into HTML. Also includes the `textilize` Liquid filter. - [Slim plugin](https://github.com/slim-template/jekyll-slim): Slim converter and includes for Jekyll with support for Liquid tags. -- [Jade plugin by John Papandriopoulos](https://github.com/snappylabs/jade-jekyll-plugin): Jade converter for Jekyll. -- [Pug plugin by Josh Waller](https://github.com/mdxprograms/pug-jekyll-plugin): Pug (previously Jade) converter for Jekyll. - [HAML plugin by Sam Z](https://gist.github.com/517556): HAML converter for Jekyll. - [HAML-Sass Converter by Adam Pearson](https://gist.github.com/481456): Simple HAML-Sass converter for Jekyll. [Fork](https://gist.github.com/528642) by Sam X. - [Sass SCSS Converter by Mark Wolfe](https://gist.github.com/960150): Sass converter which uses the new CSS compatible syntax, based Sam X’s fork above. From 605a14412db2f80c7b5f9198ee0879b358556098 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 25 Jun 2017 18:39:06 -0400 Subject: [PATCH 2240/4996] Update history to reflect merge of #6174 [ci skip] --- History.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/History.markdown b/History.markdown index fd2a7e73c6d..d61137ae9cf 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,7 @@ ## HEAD + * Added improved Pug plugin - removed 404 Jade plugin (#6174) + ### Documentation * Update reference to trouble with OS X/macOS (#6139) From 141b1afd509bec454db78c6c50f5dd2e2530dd01 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 26 Jun 2017 12:23:33 +0530 Subject: [PATCH 2241/4996] test with Ruby 2.4.1-1 on AppVeyor (#6176) Merge pull request 6176 --- appveyor.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 34f4d726b0d..b744534b89c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -16,13 +16,15 @@ install: environment: BUNDLE_WITHOUT: "benchmark:site:development" matrix: - - RUBY_FOLDER_VER: "23" + - RUBY_FOLDER_VER: "24" TEST_SUITE: "test" - - RUBY_FOLDER_VER: "23" + - RUBY_FOLDER_VER: "24" TEST_SUITE: "cucumber" - - RUBY_FOLDER_VER: "23" + - RUBY_FOLDER_VER: "24" TEST_SUITE: "default-site" - - RUBY_FOLDER_VER: "23-x64" + - RUBY_FOLDER_VER: "24-x64" + TEST_SUITE: "test" + - RUBY_FOLDER_VER: "23" TEST_SUITE: "test" - RUBY_FOLDER_VER: "22" TEST_SUITE: "test" From 00cca72c7bc90b9c5c21b69ff556b80471a63f58 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 26 Jun 2017 02:53:34 -0400 Subject: [PATCH 2242/4996] Update history to reflect merge of #6176 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d61137ae9cf..cf1cdf13ac6 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ ### Development Fixes * Add jekyll doctor to GitHub Issue Template (#6169) + * Test with Ruby 2.4.1-1 on AppVeyor (#6176) ## 3.5.0 / 2017-06-18 From a0cf39524619566596ab93b209cbdc3280d2b16c Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Tue, 27 Jun 2017 00:51:09 +0100 Subject: [PATCH 2243/4996] set minimum requirement for jekyll-feed (#6184) Merge pull request 6184 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 146100698ff..c8b4694f324 100644 --- a/Gemfile +++ b/Gemfile @@ -65,7 +65,7 @@ group :jekyll_optional_dependencies do gem "coderay", "~> 1.1.0" gem "jekyll-coffeescript" gem "jekyll-docs", :path => "../docs" if Dir.exist?("../docs") && ENV["JEKYLL_VERSION"] - gem "jekyll-feed" + gem "jekyll-feed", "~> 0.9" gem "jekyll-gist" gem "jekyll-paginate" gem "jekyll-redirect-from" From 4f4d42444ac73174d857ad0a630e23d4ba8f41be Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 26 Jun 2017 19:51:10 -0400 Subject: [PATCH 2244/4996] Update history to reflect merge of #6184 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cf1cdf13ac6..f9d91176ca1 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * Add jekyll doctor to GitHub Issue Template (#6169) * Test with Ruby 2.4.1-1 on AppVeyor (#6176) + * set minimum requirement for jekyll-feed (#6184) ## 3.5.0 / 2017-06-18 From f91b614793710409b2f3efc6e0e7487552e3ab09 Mon Sep 17 00:00:00 2001 From: Ben Balter <282759+benbalter@users.noreply.github.com> Date: Fri, 30 Jun 2017 21:51:55 -0400 Subject: [PATCH 2245/4996] Static files contain front matter default keys when to_liquid'd (#6162) Merge pull request 6162 --- lib/jekyll/static_file.rb | 11 ++--------- test/test_document.rb | 6 ++++++ test/test_static_file.rb | 22 ++++++++++++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index beea9ddf99c..29d71cbe8e7 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -1,6 +1,6 @@ module Jekyll class StaticFile - attr_reader :relative_path, :extname, :name + attr_reader :relative_path, :extname, :name, :data class << self # The cache of last modification times [path] -> mtime. @@ -28,10 +28,7 @@ def initialize(site, base, dir, name, collection = nil) @collection = collection @relative_path = File.join(*[@dir, @name].compact) @extname = File.extname(@name) - - data.default_proc = proc do |_, key| - site.frontmatter_defaults.find(relative_path, type, key) - end + @data = @site.frontmatter_defaults.all(relative_path, type) end # rubocop: enable ParameterLists @@ -103,10 +100,6 @@ def to_liquid @to_liquid ||= Drops::StaticFileDrop.new(self) end - def data - @data ||= {} - end - def basename File.basename(name, extname) end diff --git a/test/test_document.rb b/test/test_document.rb index 0c880a6b5b7..8726c83cd6a 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -132,6 +132,12 @@ def assert_equal_value(key, one, other) assert_equal "slide", @document.data["layout"] assert_equal({ "key"=>"myval" }, @document.data["nested"]) end + + should "return front matter defaults via to_liquid" do + hash = @document.to_liquid + assert hash.key? "nested" + assert_equal({ "key"=>"myval" }, hash["nested"]) + end end context "a document as part of a collection with overridden default values" do diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 1603420a8dd..49adc96b79f 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -109,6 +109,28 @@ def setup_static_file_with_defaults(base, dir, name, defaults) "`published: false`") end + should "respect front matter defaults" do + defaults = [{ + "scope" => { "path" => "" }, + "values" => { "front-matter" => "default" }, + },] + + static_file = setup_static_file_with_defaults "", "", "file.pdf", defaults + assert_equal "default", static_file.data["front-matter"] + end + + should "include front matter defaults in to_liquid" do + defaults = [{ + "scope" => { "path" => "" }, + "values" => { "front-matter" => "default" }, + },] + + static_file = setup_static_file_with_defaults "", "", "file.pdf", defaults + hash = static_file.to_liquid + assert hash.key? "front-matter" + assert_equal "default", hash["front-matter"] + end + should "know its last modification time" do assert_equal Time.new.to_i, @static_file.mtime end From 5c95201c9828b4aa4c7c293def3867c7d875ea25 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 30 Jun 2017 21:51:57 -0400 Subject: [PATCH 2246/4996] Update history to reflect merge of #6162 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f9d91176ca1..b7967a66051 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ ### Bug Fixes * Backward compatiblize URLFilters module (#6163) + * Static files contain front matter default keys when to_liquid'd (#6162) ### Development Fixes From b089e440168ff4945cde0b1bcf63f814c5b7e016 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 30 Jun 2017 21:54:33 -0400 Subject: [PATCH 2247/4996] Move Bug Fixes to the top of the current HEAD's history. --- History.markdown | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/History.markdown b/History.markdown index b7967a66051..13c5c478543 100644 --- a/History.markdown +++ b/History.markdown @@ -1,6 +1,9 @@ ## HEAD - * Added improved Pug plugin - removed 404 Jade plugin (#6174) +### Bug Fixes + + * Backward compatiblize URLFilters module (#6163) + * Static files contain front matter default keys when `to_liquid`'d (#6162) ### Documentation @@ -10,11 +13,7 @@ * Update minimum Ruby version in installation.md (#6164) * [docs] Add information about finding a collection in `site.collections` (#6165) * Add {%raw%} to Liquid example on site (#6179) - -### Bug Fixes - - * Backward compatiblize URLFilters module (#6163) - * Static files contain front matter default keys when to_liquid'd (#6162) + * Added improved Pug plugin - removed 404 Jade plugin (#6174) ### Development Fixes From 9f7815786b68f853dfabb33293f494e4222c5c1b Mon Sep 17 00:00:00 2001 From: Ben Balter <282759+benbalter@users.noreply.github.com> Date: Fri, 30 Jun 2017 21:58:25 -0400 Subject: [PATCH 2248/4996] Always normalize the result of the relative_url filter (#6185) Merge pull request 6185 --- lib/jekyll/filters/url_filters.rb | 4 ++-- test/test_filters.rb | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index 783dad4a481..53b4e253c4b 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -23,9 +23,9 @@ def absolute_url(input) # Returns a URL relative to the domain root as a String. def relative_url(input) return if input.nil? - return ensure_leading_slash(input.to_s) if sanitized_baseurl.nil? + parts = [sanitized_baseurl, input] Addressable::URI.parse( - ensure_leading_slash(sanitized_baseurl) + ensure_leading_slash(input.to_s) + parts.compact.map { |part| ensure_leading_slash(part.to_s) }.join ).normalize.to_s end diff --git a/test/test_filters.rb b/test/test_filters.rb index 91ac386a5db..bb4aa79795b 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -491,6 +491,15 @@ def select; end }) assert_equal "/", filter.relative_url(page_url) end + + should "not return the url by reference" do + filter = make_filter_mock({ :baseurl => nil }) + page = Page.new(filter.site, test_dir("fixtures"), "", "front_matter.erb") + assert_equal "/front_matter.erb", page.url + url = filter.relative_url(page.url) + url << "foo" + assert_equal "/front_matter.erb", page.url + end end context "strip_index filter" do From 17370b5992c1d8b05b98e4b2b78c14dc0e1875f3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 30 Jun 2017 21:58:27 -0400 Subject: [PATCH 2249/4996] Update history to reflect merge of #6185 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 13c5c478543..636bbd61d52 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,10 @@ * Test with Ruby 2.4.1-1 on AppVeyor (#6176) * set minimum requirement for jekyll-feed (#6184) +### fix + + * Always normalize the result of the relative_url filter (#6185) + ## 3.5.0 / 2017-06-18 ### Minor Enhancements From b0136fccfab51fd7885207fa79bc3dbf3f64c6f4 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 30 Jun 2017 21:59:02 -0400 Subject: [PATCH 2250/4996] Fix History entry for #6185 --- History.markdown | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/History.markdown b/History.markdown index 636bbd61d52..ad7d76fd494 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Backward compatiblize URLFilters module (#6163) * Static files contain front matter default keys when `to_liquid`'d (#6162) + * Always normalize the result of the `relative_url` filter (#6185) ### Documentation @@ -21,10 +22,6 @@ * Test with Ruby 2.4.1-1 on AppVeyor (#6176) * set minimum requirement for jekyll-feed (#6184) -### fix - - * Always normalize the result of the relative_url filter (#6185) - ## 3.5.0 / 2017-06-18 ### Minor Enhancements From 409a36e6c0b441dc30555bee7c7a0f85c72d0df7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 30 Jun 2017 22:18:50 -0400 Subject: [PATCH 2251/4996] Include v3.4.5 release notes in site and in History.markdown --- History.markdown | 4 ++++ docs/_docs/history.md | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index ad7d76fd494..7e3f89ff99c 100644 --- a/History.markdown +++ b/History.markdown @@ -163,6 +163,10 @@ * Default `baseurl` to `nil` instead of empty string (#6137) * Filters#time helper: Duplicate time before calling #localtime. (#5996) +## 3.4.5 / 2017-06-30 + + * Backport #6185 for v3.4.x: Always normalize the result of the `relative_url` filter (#6186) + ## 3.4.4 / 2017-06-17 * Backport #6137 for v3.4.x: Default `baseurl` to `nil` instead of empty string (#6146) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index de5dc4d822d..c2ba544a1e4 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -151,7 +151,13 @@ note: This file is autogenerated. Edit /History.markdown instead. - Filters#time helper: Duplicate time before calling #localtime. ([#5996]({{ site.repository }}/issues/5996)) -## 3.4.4 / 2016-06-17 +## 3.4.5 / 2017-06-30 +{: #v3-4-5} + +- Backport [#6185]({{ site.repository }}/issues/6185) for v3.4.x: Always normalize the result of the `relative_url` filter ([#6186]({{ site.repository }}/issues/6186)) + + +## 3.4.4 / 2017-06-17 {: #v3-4-4} - Backport [#6137]({{ site.repository }}/issues/6137) for v3.4.x: Default `baseurl` to `nil` instead of empty string ([#6146]({{ site.repository }}/issues/6146)) From a641568da885b43b711e10156a94d343ed9dbc59 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 1 Jul 2017 20:25:50 +0200 Subject: [PATCH 2252/4996] Warn for deprecation message (#6192) Merge pull request 6192 --- lib/jekyll/deprecator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/deprecator.rb b/lib/jekyll/deprecator.rb index 5fa0c0ac8ba..e5574bdf952 100644 --- a/lib/jekyll/deprecator.rb +++ b/lib/jekyll/deprecator.rb @@ -38,7 +38,7 @@ def arg_is_present?(args, deprecated_argument, message) end def deprecation_message(message) - Jekyll.logger.error "Deprecation:", message + Jekyll.logger.warn "Deprecation:", message end def defaults_deprecate_type(old, current) From e059a18ef0c5b041fa9b484d95ea975e985432cd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 1 Jul 2017 14:25:51 -0400 Subject: [PATCH 2253/4996] Update history to reflect merge of #6192 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 7e3f89ff99c..a160dc0c64d 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,10 @@ * Test with Ruby 2.4.1-1 on AppVeyor (#6176) * set minimum requirement for jekyll-feed (#6184) +### Minor Enhancements + + * Use Warn for deprecation messages (#6192) + ## 3.5.0 / 2017-06-18 ### Minor Enhancements From 2253b9dd8548648d74bdc588e07bfc4897f5f6de Mon Sep 17 00:00:00 2001 From: Kevin Plattret Date: Sat, 1 Jul 2017 22:55:35 +0200 Subject: [PATCH 2254/4996] Small correction in documentation for includes (#6193) Merge pull request 6193 --- docs/_docs/includes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/includes.md b/docs/_docs/includes.md index ae6409cd5ee..b7eb17cc4a2 100644 --- a/docs/_docs/includes.md +++ b/docs/_docs/includes.md @@ -151,7 +151,7 @@ Here's an example. In the `_data` folder, suppose you have a YAML file called `p In the `_includes` folder, assume you have a file called `spotlight.html` with this code: ```liquid -{% raw %}{% for person in {{ include.participants }} %} +{% raw %}{% for person in include.participants %} {% if person.login_age == "new" %} {{ person.name }} {% endif %} @@ -164,4 +164,4 @@ Now when you insert the `spotlight.html` include file, you can submit the YAML f {% raw %}{% include spotlight.html participants=site.data.profiles %}{% endraw %} ``` -In this instance, `site.data.profiles` gets inserted in place of {% raw %}`{{ include.participants }}`{% endraw %} in the include file, and the Liquid logic processes. The result will be `Jane Doe`. +In this instance, `site.data.profiles` gets inserted in place of {% raw %}`include.participants`{% endraw %} in the include file, and the Liquid logic processes. The result will be `Jane Doe`. From 74373baa550282a8630368e7b609ca9370f6d560 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 1 Jul 2017 16:55:36 -0400 Subject: [PATCH 2255/4996] Update history to reflect merge of #6193 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index a160dc0c64d..23506fe5ab2 100644 --- a/History.markdown +++ b/History.markdown @@ -26,6 +26,10 @@ * Use Warn for deprecation messages (#6192) +### Site Enhancements + + * Small correction in documentation for includes (#6193) + ## 3.5.0 / 2017-06-18 ### Minor Enhancements From 735411e27f076a20e812cb6ece2fb316185daf7f Mon Sep 17 00:00:00 2001 From: Joshua Byrd Date: Sat, 8 Jul 2017 19:57:55 +1000 Subject: [PATCH 2256/4996] Linking the link (#6210) Merge pull request 6210 --- docs/_docs/continuous-integration/buddyworks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/continuous-integration/buddyworks.md b/docs/_docs/continuous-integration/buddyworks.md index 1dea8be53db..8729c7c8d86 100644 --- a/docs/_docs/continuous-integration/buddyworks.md +++ b/docs/_docs/continuous-integration/buddyworks.md @@ -12,7 +12,7 @@ title: "BuddyWorks" ## 1. Getting started -1. Log in at https://buddy.works with your GitHub/Bitbucket account or email +1. Log in at [https://buddy.works](https://buddy.works) with your GitHub/Bitbucket account or email 2. Choose your Git provider and select or push your Jekyll Project 3. Create a new pipeline and set the trigger mode to 'On every push' 4. Add and configure the Jekyll action and save the pipeline From e946bbf331487cbe62d04104cd8a6ff16ea70d8c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 8 Jul 2017 05:57:56 -0400 Subject: [PATCH 2257/4996] Update history to reflect merge of #6210 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 23506fe5ab2..90fe8317647 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ * [docs] Add information about finding a collection in `site.collections` (#6165) * Add {%raw%} to Liquid example on site (#6179) * Added improved Pug plugin - removed 404 Jade plugin (#6174) + * Linking the link (#6210) ### Development Fixes From 355436f1ee694c697a2525a8e3eed6b47d2b74c0 Mon Sep 17 00:00:00 2001 From: Coby Chapple Date: Sun, 9 Jul 2017 17:55:09 +0100 Subject: [PATCH 2258/4996] tweak page margin, and adjust mobile nav accordingly (#6214) Merge pull request 6214 --- docs/_sass/_style.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 005781b6e12..7399c34ef66 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -22,6 +22,7 @@ body { -o-font-feature-settings: "kern" 1; font-feature-settings: "kern" 1; font-kerning: normal; + margin: 0; } .clear { @@ -101,6 +102,7 @@ nav { } .mobile-nav { + padding: 0 5px; ul { overflow: hidden; From fa2aa394d6eea2809fc48e26482d50bcce45a44b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 9 Jul 2017 12:55:10 -0400 Subject: [PATCH 2259/4996] Update history to reflect merge of #6214 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 90fe8317647..a623ceadd01 100644 --- a/History.markdown +++ b/History.markdown @@ -30,6 +30,7 @@ ### Site Enhancements * Small correction in documentation for includes (#6193) + * Fix docs site page margin (#6214) ## 3.5.0 / 2017-06-18 From 59a42230c7c7f9f5da8361a6eafec603f6117cca Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 10 Jul 2017 15:46:48 +0200 Subject: [PATCH 2260/4996] Avoid deprecation message (#6045) Merge pull request 6045 --- lib/site_template/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index 8cb35c70e85..5cea6d25d54 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -27,7 +27,7 @@ github_username: jekyll # Build settings markdown: kramdown theme: minima -gems: +plugins: - jekyll-feed # Exclude from processing. From c7d98cae2652b2df7ebd3c60b4f8c87950760e47 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 10 Jul 2017 09:46:49 -0400 Subject: [PATCH 2261/4996] Update history to reflect merge of #6045 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a623ceadd01..c5aae12b987 100644 --- a/History.markdown +++ b/History.markdown @@ -26,6 +26,7 @@ ### Minor Enhancements * Use Warn for deprecation messages (#6192) + * site template: Use plugins key instead of gems (#6045) ### Site Enhancements From 848bd4edcc5152814a80a77c48cdf18fbd6d7bf0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 17 Jul 2017 13:14:00 -0400 Subject: [PATCH 2262/4996] Release :gem: 3.5.1 --- History.markdown | 19 ++++------ docs/_docs/history.md | 37 +++++++++++++++++++ .../2017-07-17-jekyll-3-5-1-released.markdown | 19 ++++++++++ docs/latest_version.txt | 2 +- lib/jekyll/version.rb | 2 +- 5 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 docs/_posts/2017-07-17-jekyll-3-5-1-released.markdown diff --git a/History.markdown b/History.markdown index c5aae12b987..59613ea8ff0 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,9 @@ -## HEAD +## 3.5.1 / 2017-07-17 + +### Minor Enhancements + + * Use Warn for deprecation messages (#6192) + * site template: Use plugins key instead of gems (#6045) ### Bug Fixes @@ -16,6 +21,8 @@ * Add {%raw%} to Liquid example on site (#6179) * Added improved Pug plugin - removed 404 Jade plugin (#6174) * Linking the link (#6210) + * Small correction in documentation for includes (#6193) + * Fix docs site page margin (#6214) ### Development Fixes @@ -23,16 +30,6 @@ * Test with Ruby 2.4.1-1 on AppVeyor (#6176) * set minimum requirement for jekyll-feed (#6184) -### Minor Enhancements - - * Use Warn for deprecation messages (#6192) - * site template: Use plugins key instead of gems (#6045) - -### Site Enhancements - - * Small correction in documentation for includes (#6193) - * Fix docs site page margin (#6214) - ## 3.5.0 / 2017-06-18 ### Minor Enhancements diff --git a/docs/_docs/history.md b/docs/_docs/history.md index c2ba544a1e4..e5832bf0998 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,6 +4,43 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.5.1 / 2017-07-17 +{: #v3-5-1} + +### Minor Enhancements +{: #minor-enhancements-v3-5-1} + +- Use Warn for deprecation messages ([#6192]({{ site.repository }}/issues/6192)) +- site template: Use plugins key instead of gems ([#6045]({{ site.repository }}/issues/6045)) + +### Bug Fixes +{: #bug-fixes-v3-5-1} + +- Backward compatiblize URLFilters module ([#6163]({{ site.repository }}/issues/6163)) +- Static files contain front matter default keys when `to_liquid`'d ([#6162]({{ site.repository }}/issues/6162)) +- Always normalize the result of the `relative_url` filter ([#6185]({{ site.repository }}/issues/6185)) + +### Documentation + +- Update reference to trouble with OS X/macOS ([#6139]({{ site.repository }}/issues/6139)) +- added BibSonomy plugin ([#6143]({{ site.repository }}/issues/6143)) +- add plugins for multiple page pagination ([#6055]({{ site.repository }}/issues/6055)) +- Update minimum Ruby version in installation.md ([#6164]({{ site.repository }}/issues/6164)) +- [docs] Add information about finding a collection in `site.collections` ([#6165]({{ site.repository }}/issues/6165)) +- Add {%raw%} to Liquid example on site ([#6179]({{ site.repository }}/issues/6179)) +- Added improved Pug plugin - removed 404 Jade plugin ([#6174]({{ site.repository }}/issues/6174)) +- Linking the link ([#6210]({{ site.repository }}/issues/6210)) +- Small correction in documentation for includes ([#6193]({{ site.repository }}/issues/6193)) +- Fix docs site page margin ([#6214]({{ site.repository }}/issues/6214)) + +### Development Fixes +{: #development-fixes-v3-5-1} + +- Add jekyll doctor to GitHub Issue Template ([#6169]({{ site.repository }}/issues/6169)) +- Test with Ruby 2.4.1-1 on AppVeyor ([#6176]({{ site.repository }}/issues/6176)) +- set minimum requirement for jekyll-feed ([#6184]({{ site.repository }}/issues/6184)) + + ## 3.5.0 / 2017-06-18 {: #v3-5-0} diff --git a/docs/_posts/2017-07-17-jekyll-3-5-1-released.markdown b/docs/_posts/2017-07-17-jekyll-3-5-1-released.markdown new file mode 100644 index 00000000000..c7fef1bbfcb --- /dev/null +++ b/docs/_posts/2017-07-17-jekyll-3-5-1-released.markdown @@ -0,0 +1,19 @@ +--- +title: 'Jekyll 3.5.1 Released' +date: 2017-07-17 12:40:37 -0400 +author: parkr +version: 3.5.1 +categories: [release] +--- + +We've released a few bugfixes in the form of v3.5.1 today: + +- Some plugins stopped functioning properly due to a NoMethodError for `registers` on NilClass. That's been fixed. +- A bug in `relative_url` when `baseurl` is `nil` caused URL's to come out wrong. Squashed. +- Static files' liquid representations should now have all the keys you were expecting when serialized into JSON. + +We apologize for the breakages! We're working diligently to improve how we test our plugins with Jekyll core to prevent breakages in the future. + +More details in [the history](/docs/history/#v3-5-1). Many thanks to all the contributors to Jekyll v3.5.1: Adam Voss, ashmaroli, Ben Balter, Coby Chapple, Doug Beney, Fadhil, Florian Thomas, Frank Taillandier, James, jaybe, Joshua Byrd, Kevin Plattret, & Robert Jäschke. + +Happy Jekylling! diff --git a/docs/latest_version.txt b/docs/latest_version.txt index 1545d966571..d5c0c991428 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.5.0 +3.5.1 diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 0af816ca2ca..8a8b2b30c11 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,3 @@ module Jekyll - VERSION = "3.5.0".freeze + VERSION = "3.5.1".freeze end From f904a7201e7a9a52a085b2bfcfcab35b68abe80c Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Tue, 18 Jul 2017 12:25:54 +0530 Subject: [PATCH 2263/4996] strip unnecessary leading whitespace (#6228) Merge pull request 6228 --- lib/jekyll/commands/new.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index ce1d5e7fe11..8c5dd8f8344 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -81,7 +81,7 @@ def gemfile_contents # If you have any plugins, put them here! group :jekyll_plugins do - gem "jekyll-feed", "~> 0.6" + gem "jekyll-feed", "~> 0.6" end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem From 33cb629079aeb9d8849002a54cc1b847165fa5f4 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 Jul 2017 02:55:56 -0400 Subject: [PATCH 2264/4996] Update history to reflect merge of #6228 [ci skip] --- History.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/History.markdown b/History.markdown index 59613ea8ff0..b7c465ed525 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,9 @@ +## HEAD + +### Development Fixes + + * Strip unnecessary leading whitespace in template (#6228) + ## 3.5.1 / 2017-07-17 ### Minor Enhancements From 026f8280e0434be0b44e67b4d423b723c9306b5a Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Tue, 18 Jul 2017 12:59:33 +0530 Subject: [PATCH 2265/4996] Ignore final newline in folded YAML string (#6054) Merge pull request 6054 --- lib/site_template/_config.yml | 2 +- test/source/_config_folded.yml | 8 ++++++++ test/test_configuration.rb | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 test/source/_config_folded.yml diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml index 5cea6d25d54..f91333e5102 100644 --- a/lib/site_template/_config.yml +++ b/lib/site_template/_config.yml @@ -15,7 +15,7 @@ # in the templates via {{ site.myvariable }}. title: Your awesome title email: your-email@example.com -description: > # this means to ignore newlines until "baseurl:" +description: >- # this means to ignore newlines until "baseurl:" Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description. diff --git a/test/source/_config_folded.yml b/test/source/_config_folded.yml new file mode 100644 index 00000000000..9b0bfa4c2c5 --- /dev/null +++ b/test/source/_config_folded.yml @@ -0,0 +1,8 @@ +folded_string: > + This string of text will ignore + newlines till the next key. +foo: bar +clean_folded_string: >- + This string of text will ignore + newlines till the next key. +baz: foo diff --git a/test/test_configuration.rb b/test/test_configuration.rb index c9988d163bc..50156926202 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -494,4 +494,36 @@ class TestConfiguration < JekyllUnitTest }) end end + + context "folded YAML string" do + setup do + @tester = Configuration.new + end + + should "ignore newlines in that string entirely from a sample file" do + config = Jekyll.configuration( + @tester.read_config_file( + source_dir("_config_folded.yml") + ) + ) + assert_equal( + config["folded_string"], + "This string of text will ignore newlines till the next key.\n" + ) + assert_equal( + config["clean_folded_string"], + "This string of text will ignore newlines till the next key." + ) + end + + should "ignore newlines in that string entirely from the template file" do + config = Jekyll.configuration( + @tester.read_config_file( + File.expand_path("../lib/site_template/_config.yml", File.dirname(__FILE__)) + ) + ) + assert_includes config["description"], "an awesome description" + refute_includes config["description"], "\n" + end + end end From 2b28f9fd57f2624b1c618fc7699c773ecb8de8da Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 Jul 2017 03:29:34 -0400 Subject: [PATCH 2266/4996] Update history to reflect merge of #6054 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index b7c465ed525..5a832764383 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,10 @@ * Strip unnecessary leading whitespace in template (#6228) +### Minor Enhancements + + * Ignore final newline in folded YAML string (#6054) + ## 3.5.1 / 2017-07-17 ### Minor Enhancements From da65e947286542ea05a887e24979900947482122 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Tue, 18 Jul 2017 07:06:05 -0500 Subject: [PATCH 2267/4996] Add URL checks to Doctor (#5760) Merge pull request 5760 --- lib/jekyll/commands/doctor.rb | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 59004c96049..5c235dac132 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -1,3 +1,5 @@ +require "addressable/uri" + module Jekyll module Commands class Doctor < Command @@ -36,6 +38,7 @@ def healthy?(site) !deprecated_relative_permalinks(site), !conflicting_urls(site), !urls_only_differ_by_case(site), + proper_site_url?(site), ].all? end @@ -91,6 +94,15 @@ def urls_only_differ_by_case(site) urls_only_differ_by_case end + def proper_site_url?(site) + url = site.config["url"] + [ + url_exists?(url), + url_valid?(url), + url_absolute(url), + ].all? + end + private def collect_urls(urls, things, destination) things.each do |thing| @@ -110,6 +122,29 @@ def case_insensitive_urls(things, destination) (memo[dest.downcase] ||= []) << dest end end + + def url_exists?(url) + return true unless url.nil? || url.empty? + Jekyll.logger.warn "Warning:", "You didn't set an URL in the config file, "\ + "you may encounter problems with some plugins." + false + end + + def url_valid?(url) + Addressable::URI.parse(url) + true + rescue + Jekyll.logger.warn "Warning:", "The site URL does not seem to be valid, "\ + "check the value of `url` in your config file." + false + end + + def url_absolute(url) + return true if Addressable::URI.parse(url).absolute? + Jekyll.logger.warn "Warning:", "Your site URL does not seem to be absolute, "\ + "check the value of `url` in your config file." + false + end end end end From c2b240e9b5a79c59c250c51a36596d47b406c363 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 Jul 2017 08:06:07 -0400 Subject: [PATCH 2268/4996] Update history to reflect merge of #5760 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5a832764383..44f0a935073 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ ### Minor Enhancements * Ignore final newline in folded YAML string (#6054) + * Add URL checks to Doctor (#5760) ## 3.5.1 / 2017-07-17 From c0c1185c56a3ee6e10ef892036d9e0eee2cb3864 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Tue, 18 Jul 2017 17:41:23 +0530 Subject: [PATCH 2269/4996] deprecator.rb: fix typo for --serve command (#6229) Merge pull request 6229 --- lib/jekyll/deprecator.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/jekyll/deprecator.rb b/lib/jekyll/deprecator.rb index e5574bdf952..ca2b8b3f74a 100644 --- a/lib/jekyll/deprecator.rb +++ b/lib/jekyll/deprecator.rb @@ -5,7 +5,7 @@ module Deprecator def process(args) arg_is_present? args, "--server", "The --server command has been replaced by the \ 'serve' subcommand." - arg_is_present? args, "--serve", "The --server command has been replaced by the \ + arg_is_present? args, "--serve", "The --serve command has been replaced by the \ 'serve' subcommand." arg_is_present? args, "--no-server", "To build Jekyll without launching a server, \ use the 'build' subcommand." @@ -46,6 +46,5 @@ def defaults_deprecate_type(old, current) Jekyll.logger.warn "Defaults:", "Please update your front-matter defaults to use \ 'type: #{current}'." end - end end From 56546a28fda95098c44b31090050db0f415be574 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 Jul 2017 08:11:25 -0400 Subject: [PATCH 2270/4996] Update history to reflect merge of #6229 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 44f0a935073..74379b02988 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,10 @@ * Ignore final newline in folded YAML string (#6054) * Add URL checks to Doctor (#5760) +### Bug Fixes + + * deprecator.rb: fix typo for --serve command (#6229) + ## 3.5.1 / 2017-07-17 ### Minor Enhancements From a54906c78a9c14e960457553177c4325a2b903f8 Mon Sep 17 00:00:00 2001 From: Maciej Bembenista Date: Mon, 24 Jul 2017 11:55:06 +0200 Subject: [PATCH 2271/4996] Update custom-404-page.md - fix a typo (#6218) Merge pull request 6218 --- docs/_tutorials/custom-404-page.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_tutorials/custom-404-page.md b/docs/_tutorials/custom-404-page.md index 40bb3262752..2512618e2ef 100644 --- a/docs/_tutorials/custom-404-page.md +++ b/docs/_tutorials/custom-404-page.md @@ -53,7 +53,7 @@ More info on configuring Apache Error Pages can found in [official documentation The procedure is just as simple as configuring Apache servers, but slightly different. -Add the following to the ngnix configuration file, `nginx.conf`, which is usually located inside `/etc/nginx/` or `/etc/nginx/conf/`: +Add the following to the nginx configuration file, `nginx.conf`, which is usually located inside `/etc/nginx/` or `/etc/nginx/conf/`: ``` server { From 1a592c57575a8986ae8b106b9e4c3eaff16754e6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 24 Jul 2017 05:55:07 -0400 Subject: [PATCH 2272/4996] Update history to reflect merge of #6218 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 74379b02988..b4d87a5e9d8 100644 --- a/History.markdown +++ b/History.markdown @@ -13,6 +13,10 @@ * deprecator.rb: fix typo for --serve command (#6229) +### Documentation + + * Update custom-404-page.md - fix a typo (#6218) + ## 3.5.1 / 2017-07-17 ### Minor Enhancements From e25c4af59066169d0e10056866759911198087c6 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Mon, 24 Jul 2017 05:02:24 -0500 Subject: [PATCH 2273/4996] Users should be installing patch versions. (#6198) Merge pull request 6198 --- lib/jekyll/commands/new.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index 8c5dd8f8344..a3a850febbf 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -70,7 +70,7 @@ def gemfile_contents # # This will help ensure the proper Jekyll version is running. # Happy Jekylling! -gem "jekyll", "#{Jekyll::VERSION}" +gem "jekyll", "~> #{Jekyll::VERSION}" # This is the default theme for new Jekyll sites. You may change this to anything you like. gem "minima", "~> 2.0" From 66c39d3bf91d9a6fedc639be9095a532ea8b8cb3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 24 Jul 2017 06:02:25 -0400 Subject: [PATCH 2274/4996] Update history to reflect merge of #6198 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b4d87a5e9d8..bea49764f70 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Development Fixes * Strip unnecessary leading whitespace in template (#6228) + * Users should be installing patch versions. (#6198) ### Minor Enhancements From 00a1d70e8f7f1f47b5b1d3640632e9c4eab99ac0 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Tue, 25 Jul 2017 15:58:17 +0530 Subject: [PATCH 2275/4996] fix tests (#6240) Merge pull request 6240 --- test/test_new_command.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_new_command.rb b/test/test_new_command.rb index a02f1565770..6a448eec011 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -34,7 +34,7 @@ def site_template refute_exist @full_path capture_output { Jekyll::Commands::New.process(@args) } assert_exist gemfile - assert_match(%r!gem "jekyll", "#{Jekyll::VERSION}"!, File.read(gemfile)) + assert_match(%r!gem "jekyll", "~> #{Jekyll::VERSION}"!, File.read(gemfile)) assert_match(%r!gem "github-pages"!, File.read(gemfile)) end From 819491b99c5953453a025507279760bb91b00983 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Jul 2017 06:28:18 -0400 Subject: [PATCH 2276/4996] Update history to reflect merge of #6240 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bea49764f70..22566692e2f 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Strip unnecessary leading whitespace in template (#6228) * Users should be installing patch versions. (#6198) + * fix tests (#6240) ### Minor Enhancements From ec84bec6d60ce2a6d475054395fce2b1253dbff3 Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Tue, 25 Jul 2017 23:22:40 +0100 Subject: [PATCH 2277/4996] Fix serving files that clash with directories (#6231) Merge pull request 6231 --- lib/jekyll/commands/serve/servlet.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 3ae5cf32367..2e20ace81d5 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -22,7 +22,7 @@ def initialize(server, root, callbacks) def search_file(req, res, basename) # /file.* > /file/index.html > /file.html - super || super(req, res, "#{basename}.html") + super || super(req, res, ".html") || super(req, res, "#{basename}.html") end # rubocop:disable Style/MethodName From 897cdbb4276ae931e87f9198eb3e050209408921 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Jul 2017 18:22:41 -0400 Subject: [PATCH 2278/4996] Update history to reflect merge of #6231 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 22566692e2f..0dc2ac1528c 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,7 @@ * Ignore final newline in folded YAML string (#6054) * Add URL checks to Doctor (#5760) + * Fix serving files that clash with directories (#6222) (#6231) ### Bug Fixes From 188bc71713b84a9266597d863aff4315d68de8f2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 25 Jul 2017 18:23:02 -0400 Subject: [PATCH 2279/4996] Reader#read_directories: guard against an entry not being a directory (#6226) Merge pull request 6226 --- lib/jekyll/reader.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index cdd45ab0f74..903e36d3a48 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -39,6 +39,8 @@ def sort_files! def read_directories(dir = "") base = site.in_source_dir(dir) + return unless File.directory?(base) + dot = Dir.chdir(base) { filter_entries(Dir.entries("."), base) } dot_dirs = dot.select { |file| File.directory?(@site.in_source_dir(base, file)) } dot_files = (dot - dot_dirs) From 7b255baac2ba4acf64ae2a1e9bb4213fca44b12d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Jul 2017 18:23:04 -0400 Subject: [PATCH 2280/4996] Update history to reflect merge of #6226 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0dc2ac1528c..403f076fa5c 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ ### Bug Fixes * deprecator.rb: fix typo for --serve command (#6229) + * Reader#read_directories: guard against an entry not being a directory (#6226) ### Documentation From 93169f60c32ada3822db8f5e61ef886bb9bd1d9f Mon Sep 17 00:00:00 2001 From: Joshua Byrd Date: Wed, 26 Jul 2017 08:23:38 +1000 Subject: [PATCH 2281/4996] Adding DevKit helpers (#6225) Merge pull request 6225 --- docs/_docs/windows.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 6ebc33db065..9f21b6edf8b 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -212,5 +212,7 @@ As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the `--watc Add the following to the Gemfile for your site if you have issues with auto-regeneration on Windows alone: ```ruby -gem 'wdm', '~> 0.1.0' if Gem.win_platform? +gem 'wdm', '~> 0.1.1' if Gem.win_platform? ``` + +You may first have to download and install the [Ruby DevKit](https://rubyinstaller.org/downloads/) by following [the instructions here](https://github.com/oneclick/rubyinstaller/wiki/Development-Kit). From 4493f2a58b9cf271c1278f17edb0baa09598e0b0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Jul 2017 18:23:39 -0400 Subject: [PATCH 2282/4996] Update history to reflect merge of #6225 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 403f076fa5c..d9019a93097 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,10 @@ * Update custom-404-page.md - fix a typo (#6218) +### Site Enhancements + + * Adding DevKit helpers (#6225) + ## 3.5.1 / 2017-07-17 ### Minor Enhancements From 96724af03e947d3ea5bc9f403fa9a574dde1ec1b Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Wed, 26 Jul 2017 04:15:44 +0530 Subject: [PATCH 2283/4996] Bump supported Ruby version to >= 2.1.0 (#6220) Merge pull request 6220 --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 8fd62e81828..5ae9277f424 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -8,7 +8,7 @@ Gem::Specification.new do |s| s.specification_version = 2 if s.respond_to? :specification_version= s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.rubygems_version = "2.2.2" - s.required_ruby_version = ">= 2.0.0" + s.required_ruby_version = ">= 2.1.0" s.name = "jekyll" s.version = Jekyll::VERSION From 8a017b5a2a2373d125a2dd87da58b2bfd7384916 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Jul 2017 18:45:45 -0400 Subject: [PATCH 2284/4996] Update history to reflect merge of #6220 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d9019a93097..5bd903eed4c 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Ignore final newline in folded YAML string (#6054) * Add URL checks to Doctor (#5760) * Fix serving files that clash with directories (#6222) (#6231) + * Bump supported Ruby version to >= 2.1.0 (#6220) ### Bug Fixes From 8f1959bbc40ec430105ed6b74b850ff2b19e9dfd Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 26 Jul 2017 02:20:20 +0300 Subject: [PATCH 2285/4996] Define path with __dir__ (#6087) Merge pull request 6087 --- Gemfile | 4 ++-- Rakefile | 2 +- exe/jekyll | 2 +- jekyll.gemspec | 2 +- lib/jekyll.rb | 4 ++-- lib/jekyll/commands/new.rb | 2 +- lib/jekyll/commands/serve.rb | 2 +- script/console | 4 ++-- script/stackprof | 4 ++-- script/vendor-mimes | 2 +- test/helper.rb | 4 ++-- test/test_convertible.rb | 4 ++-- test/test_new_command.rb | 2 +- 13 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Gemfile b/Gemfile index c8b4694f324..0306c71afc1 100644 --- a/Gemfile +++ b/Gemfile @@ -27,8 +27,8 @@ group :test do gem "rspec" gem "rspec-mocks" gem "rubocop", "~> 0.49.1" - gem "test-dependency-theme", :path => File.expand_path("./test/fixtures/test-dependency-theme", File.dirname(__FILE__)) - gem "test-theme", :path => File.expand_path("./test/fixtures/test-theme", File.dirname(__FILE__)) + gem "test-dependency-theme", :path => File.expand_path("test/fixtures/test-dependency-theme", __dir__) + gem "test-theme", :path => File.expand_path("test/fixtures/test-theme", __dir__) gem "jruby-openssl" if RUBY_ENGINE == "jruby" end diff --git a/Rakefile b/Rakefile index 949e0fd8e76..c80324aba5d 100644 --- a/Rakefile +++ b/Rakefile @@ -4,7 +4,7 @@ require "rdoc" require "date" require "yaml" -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib")) +$LOAD_PATH.unshift File.expand_path("lib", __dir__) require "jekyll/version" Dir.glob("rake/**.rake").each { |f| import f } diff --git a/exe/jekyll b/exe/jekyll index f0f41c93e6f..baac099791a 100755 --- a/exe/jekyll +++ b/exe/jekyll @@ -1,7 +1,7 @@ #!/usr/bin/env ruby STDOUT.sync = true -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) +$LOAD_PATH.unshift File.expand_path("../lib", __dir__) require "jekyll" require "mercenary" diff --git a/jekyll.gemspec b/jekyll.gemspec index 5ae9277f424..5ec2e9a25f6 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -1,6 +1,6 @@ # coding: utf-8 -lib = File.expand_path("../lib", __FILE__) +lib = File.expand_path("lib", __dir__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require "jekyll/version" diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 25bbaa0a47e..5e5923c2bd1 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -1,4 +1,4 @@ -$LOAD_PATH.unshift File.dirname(__FILE__) # For use/testing when no gem is installed +$LOAD_PATH.unshift __dir__ # For use/testing when no gem is installed # Require all of the Ruby files in the given directory. # @@ -6,7 +6,7 @@ # # Returns nothing. def require_all(path) - glob = File.join(File.dirname(__FILE__), path, "*.rb") + glob = File.join(__dir__, path, "*.rb") Dir[glob].sort.each do |f| require f end diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index a3a850febbf..d1aeb5a0281 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -113,7 +113,7 @@ def create_sample_files(path) end def site_template - File.expand_path("../../site_template", File.dirname(__FILE__)) + File.expand_path("../../site_template", __dir__) end def scaffold_path diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 50a85fac9be..4bc9eaf0da8 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -234,7 +234,7 @@ def start_callback(detached) private def mime_types - file = File.expand_path("../mime.types", File.dirname(__FILE__)) + file = File.expand_path("../mime.types", __dir__) WEBrick::HTTPUtils.load_mime_types(file) end end diff --git a/script/console b/script/console index 34ad6e8a30d..38ca96a111c 100755 --- a/script/console +++ b/script/console @@ -1,10 +1,10 @@ #!/usr/bin/env ruby require 'pry' -$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) +$LOAD_PATH.unshift File.expand_path("../lib", __dir__) require 'jekyll' -TEST_DIR = File.expand_path(File.join(File.dirname(__FILE__), *%w{ .. test })) +TEST_DIR = File.expand_path("../test", __dir__) def fixture_site(overrides = {}) Jekyll::Site.new(site_configuration(overrides)) diff --git a/script/stackprof b/script/stackprof index e6e77f8d85f..12cbdd21138 100755 --- a/script/stackprof +++ b/script/stackprof @@ -3,10 +3,10 @@ require "bundler/setup" require "json" require "stackprof" -require File.expand_path("../../lib/jekyll", __FILE__) +require File.expand_path("../lib/jekyll", __dir__) MODE = ARGV.first || "cpu" -PROF_OUTPUT_FILE = File.expand_path("../../tmp/stackprof-#{MODE}-#{Time.now.strftime("%Y%m%d%H%M")}.dump", __FILE__) +PROF_OUTPUT_FILE = File.expand_path("../tmp/stackprof-#{MODE}-#{Time.now.strftime("%Y%m%d%H%M")}.dump", __dir__) puts "Stackprof Mode: #{MODE}" diff --git a/script/vendor-mimes b/script/vendor-mimes index ea77923253e..6ea9c377a64 100755 --- a/script/vendor-mimes +++ b/script/vendor-mimes @@ -5,7 +5,7 @@ require 'json' require 'open-uri' -config = File.expand_path "../lib/jekyll/mime.types", File.dirname(__FILE__) +config = File.expand_path "../lib/jekyll/mime.types", __dir__ # Create an array of vendored mimetype => [extensions] mimes = {} diff --git a/test/helper.rb b/test/helper.rb index 74f2682e36b..83beaad3c1c 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -13,7 +13,7 @@ def jruby? require "simplecov" SimpleCov.start else - require File.expand_path("../simplecov_custom_profile", __FILE__) + require File.expand_path("simplecov_custom_profile", __dir__) SimpleCov.start "gem" do add_filter "/vendor/gem" add_filter "/vendor/bundle" @@ -63,7 +63,7 @@ def refute_exist(filename, msg = nil) module DirectoryHelpers def root_dir(*subdirs) - File.join(File.dirname(File.dirname(__FILE__)), *subdirs) + File.expand_path(File.join("..", *subdirs), __dir__) end def dest_dir(*subdirs) diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 6e6defa6519..ef70307062f 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -6,11 +6,11 @@ class TestConvertible < JekyllUnitTest setup do @convertible = OpenStruct.new( "site" => Site.new(Jekyll.configuration( - "source" => File.expand_path("../fixtures", __FILE__) + "source" => File.expand_path("fixtures", __dir__) )) ) @convertible.extend Jekyll::Convertible - @base = File.expand_path("../fixtures", __FILE__) + @base = File.expand_path("fixtures", __dir__) end should "parse the front matter correctly" do diff --git a/test/test_new_command.rb b/test/test_new_command.rb index 6a448eec011..32db566d98b 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -9,7 +9,7 @@ def dir_contents(path) end def site_template - File.expand_path("../lib/site_template", File.dirname(__FILE__)) + File.expand_path("../lib/site_template", __dir__) end context "when args contains a path" do From 590dd6cf8090af943ca4d720d27a844cba8c0e5c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Jul 2017 19:20:21 -0400 Subject: [PATCH 2286/4996] Update history to reflect merge of #6087 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5bd903eed4c..da42f8044bc 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,7 @@ * Strip unnecessary leading whitespace in template (#6228) * Users should be installing patch versions. (#6198) * fix tests (#6240) + * Define path with __dir__ (#6087) ### Minor Enhancements From 82c219a2e790becebd152927fcdaa9d11730f994 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Thu, 27 Jul 2017 05:39:33 +0530 Subject: [PATCH 2287/4996] exit site.process sooner (#6239) Merge pull request 6239 --- lib/jekyll/site.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 6476027577b..0bc3f1d577c 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -73,13 +73,11 @@ def process render cleanup write - print_stats + print_stats if config["profile"] end def print_stats - if @config["profile"] - puts @liquid_renderer.stats_table - end + puts @liquid_renderer.stats_table end # Reset Site details. From 592daf4ce2fd305f5c3c6aefc4c83e08731f9492 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 26 Jul 2017 20:09:35 -0400 Subject: [PATCH 2288/4996] Update history to reflect merge of #6239 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index da42f8044bc..c8204ad70ad 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,7 @@ * Users should be installing patch versions. (#6198) * fix tests (#6240) * Define path with __dir__ (#6087) + * exit site.process sooner (#6239) ### Minor Enhancements From 143367c5ca801a152315ee2de6f4766c6ae1df55 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 28 Jul 2017 12:05:43 -0400 Subject: [PATCH 2289/4996] kramdown: symbolize keys in-place (#6247) Merge pull request 6247 --- .../converters/markdown/kramdown_parser.rb | 12 +++----- test/test_kramdown.rb | 28 +++++++++++++++++-- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index a7252f1a689..d1f93c63f09 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -43,13 +43,9 @@ def convert(content) private def make_accessible(hash = @config) - proc_ = proc { |hash_, key| hash_[key.to_s] if key.is_a?(Symbol) } - hash.default_proc = proc_ - - hash.each do |_, val| - make_accessible val if val.is_a?( - Hash - ) + hash.keys.each do |key| + hash[key.to_sym] = hash[key] + make_accessible(hash[key]) if hash[key].is_a?(Hash) end end @@ -86,7 +82,7 @@ def highlighter private def strip_coderay_prefix(hash) hash.each_with_object({}) do |(key, val), hsh| - cleaned_key = key.gsub(%r!\Acoderay_!, "") + cleaned_key = key.to_s.gsub(%r!\Acoderay_!, "") if key != cleaned_key Jekyll::Deprecator.deprecation_message( diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index d8f886a4c1a..6396d67201b 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -20,11 +20,33 @@ class TestKramdown < JekyllUnitTest }, }, } + @kramdown_config_keys = @config["kramdown"].keys + @syntax_highlighter_opts_config_keys = \ + @config["kramdown"]["syntax_highlighter_opts"].keys @config = Jekyll.configuration(@config) - @markdown = Converters::Markdown.new( - @config - ) + @markdown = Converters::Markdown.new(@config) + @markdown.setup + end + + should "fill symbolized keys into config for compatibility with kramdown" do + kramdown_config = @markdown.instance_variable_get(:@parser) + .instance_variable_get(:@config) + + @kramdown_config_keys.each do |key| + assert kramdown_config.key?(key.to_sym), + "Expected #{kramdown_config} to include key #{key.to_sym.inspect}" + end + + @syntax_highlighter_opts_config_keys.each do |key| + assert kramdown_config["syntax_highlighter_opts"].key?(key.to_sym), + "Expected #{kramdown_config["syntax_highlighter_opts"]} to include " \ + "key #{key.to_sym.inspect}" + end + + assert_equal kramdown_config["smart_quotes"], kramdown_config[:smart_quotes] + assert_equal kramdown_config["syntax_highlighter_opts"]["css"], + kramdown_config[:syntax_highlighter_opts][:css] end should "run Kramdown" do From f8d06f20aa187eddeb8b8f6ab874116294065dfe Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 28 Jul 2017 12:05:45 -0400 Subject: [PATCH 2290/4996] Update history to reflect merge of #6247 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index c8204ad70ad..16f58a61f45 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,10 @@ * Adding DevKit helpers (#6225) +### fix + + * kramdown: symbolize keys in-place (#6247) + ## 3.5.1 / 2017-07-17 ### Minor Enhancements From 12832af98ea74591394f4bb8d3edfc1cc03bc530 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 30 Jul 2017 20:32:25 +0200 Subject: [PATCH 2291/4996] docs: add missing backticks in History (#6255) Merge pull request 6255 --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 16f58a61f45..1d2be0f23d8 100644 --- a/History.markdown +++ b/History.markdown @@ -52,7 +52,7 @@ * add plugins for multiple page pagination (#6055) * Update minimum Ruby version in installation.md (#6164) * [docs] Add information about finding a collection in `site.collections` (#6165) - * Add {%raw%} to Liquid example on site (#6179) + * Add `{% raw %}` to Liquid example on site (#6179) * Added improved Pug plugin - removed 404 Jade plugin (#6174) * Linking the link (#6210) * Small correction in documentation for includes (#6193) From a6efa488836a31e35c6610167a4dcc3948b51afd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 30 Jul 2017 14:32:26 -0400 Subject: [PATCH 2292/4996] Update history to reflect merge of #6255 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1d2be0f23d8..6ff5006aaaa 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ ### Documentation * Update custom-404-page.md - fix a typo (#6218) + * Docs: fix links to issues in History.markdown (#6255) ### Site Enhancements From b35c0d860725a7e8e1f3a75101610d0085a92c5e Mon Sep 17 00:00:00 2001 From: Ben Balter <282759+benbalter@users.noreply.github.com> Date: Sun, 30 Jul 2017 15:12:42 -0400 Subject: [PATCH 2293/4996] Call to_s on site.url before attempting to concatenate strings (#6253) Merge pull request 6253 --- lib/jekyll/filters/url_filters.rb | 4 +++- test/test_filters.rb | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index 53b4e253c4b..6ededc956d1 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -13,7 +13,9 @@ def absolute_url(input) return input if Addressable::URI.parse(input).absolute? site = @context.registers[:site] return relative_url(input).to_s if site.config["url"].nil? - Addressable::URI.parse(site.config["url"] + relative_url(input)).normalize.to_s + Addressable::URI.parse( + site.config["url"].to_s + relative_url(input) + ).normalize.to_s end # Produces a URL relative to the domain root based on site.baseurl. diff --git a/test/test_filters.rb b/test/test_filters.rb index bb4aa79795b..e0eb2feee87 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -13,6 +13,16 @@ def initialize(opts = {}) end end + class Value + def initialize(value) + @value = value + end + + def to_s + @value.respond_to?(:call) ? @value.call : @value.to_s + end + end + def make_filter_mock(opts = {}) JekyllFilter.new(site_configuration(opts)).tap do |f| tz = f.site.config["timezone"] @@ -423,6 +433,12 @@ def select; end page_url = "http://example.com/" assert_equal "http://example.com/", @filter.absolute_url(page_url) end + + should "transform the input URL to a string" do + page_url = "/my-page.html" + filter = make_filter_mock({ "url" => Value.new(proc { "http://example.org" }) }) + assert_equal "http://example.org#{page_url}", filter.absolute_url(page_url) + end end context "relative_url filter" do @@ -500,6 +516,12 @@ def select; end url << "foo" assert_equal "/front_matter.erb", page.url end + + should "transform the input baseurl to a string" do + page_url = "/my-page.html" + filter = make_filter_mock({ "baseurl" => Value.new(proc { "/baseurl/" }) }) + assert_equal "/baseurl#{page_url}", filter.relative_url(page_url) + end end context "strip_index filter" do From 34967978c2e9005a410242c8d1aa84ac190cdefb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 30 Jul 2017 15:12:43 -0400 Subject: [PATCH 2294/4996] Update history to reflect merge of #6253 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6ff5006aaaa..96e36911d8d 100644 --- a/History.markdown +++ b/History.markdown @@ -32,6 +32,7 @@ ### fix * kramdown: symbolize keys in-place (#6247) + * Call to_s on site.url before attempting to concatenate strings (#6253) ## 3.5.1 / 2017-07-17 From 56436f46fe7a0c77a066695e54ca72373e248de0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 30 Jul 2017 19:20:21 -0400 Subject: [PATCH 2295/4996] Update History.markdown to unify Bug Fixes and fix --- History.markdown | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/History.markdown b/History.markdown index 96e36911d8d..9ce8ae06983 100644 --- a/History.markdown +++ b/History.markdown @@ -13,27 +13,24 @@ * Ignore final newline in folded YAML string (#6054) * Add URL checks to Doctor (#5760) * Fix serving files that clash with directories (#6222) (#6231) - * Bump supported Ruby version to >= 2.1.0 (#6220) + * Bump supported Ruby version to `>= 2.1.0` (#6220) ### Bug Fixes - * deprecator.rb: fix typo for --serve command (#6229) - * Reader#read_directories: guard against an entry not being a directory (#6226) + * `Deprecator`: fix typo for `--serve` command (#6229) + * `Reader#read_directories`: guard against an entry not being a directory (#6226) + * kramdown: symbolize keys in-place (#6247) + * Call to_s on site.url before attempting to concatenate strings (#6253) ### Documentation - * Update custom-404-page.md - fix a typo (#6218) + * Fix a typo in `custom-404-page.md` (#6218) * Docs: fix links to issues in History.markdown (#6255) ### Site Enhancements * Adding DevKit helpers (#6225) -### fix - - * kramdown: symbolize keys in-place (#6247) - * Call to_s on site.url before attempting to concatenate strings (#6253) - ## 3.5.1 / 2017-07-17 ### Minor Enhancements From eac51ba1896c9fa1c4e59e4c1a07ba6e73da884c Mon Sep 17 00:00:00 2001 From: Sid Verma Date: Thu, 3 Aug 2017 18:10:14 +0530 Subject: [PATCH 2296/4996] Update deprecated gems key to plugins. (#6262) Merge pull request 6262 --- docs/_docs/pagination.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/pagination.md b/docs/_docs/pagination.md index b05b6bb21b9..c60b47e0360 100644 --- a/docs/_docs/pagination.md +++ b/docs/_docs/pagination.md @@ -9,7 +9,7 @@ multiple pages. Jekyll offers a pagination plugin, so you can automatically generate the appropriate files and folders you need for paginated listings. For Jekyll 3, include the `jekyll-paginate` plugin in your Gemfile and in -your `_config.yml` under `gems`. For Jekyll 2, this is standard. +your `_config.yml` under `plugins`. For Jekyll 2, this is standard.
    Pagination only works within HTML files
    From f9f05e3f755b630041dad5ef460d790ff4e65820 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 3 Aug 2017 08:40:15 -0400 Subject: [PATCH 2297/4996] Update history to reflect merge of #6262 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9ce8ae06983..b7848fa8aca 100644 --- a/History.markdown +++ b/History.markdown @@ -26,6 +26,7 @@ * Fix a typo in `custom-404-page.md` (#6218) * Docs: fix links to issues in History.markdown (#6255) + * Update deprecated gems key to plugins. (#6262) ### Site Enhancements From 7cf5f51ca287aa5903eaec807f24c88ddfbd115a Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 3 Aug 2017 21:27:32 -0400 Subject: [PATCH 2298/4996] Enforce Style/FrozenStringLiteralComment. (#6265) Merge pull request 6265 --- .rubocop.yml | 4 ++++ Gemfile | 2 ++ Rakefile | 2 ++ exe/jekyll | 2 ++ features/step_definitions.rb | 2 ++ features/support/formatter.rb | 2 ++ features/support/helpers.rb | 5 ++++- jekyll.gemspec | 1 + lib/jekyll.rb | 7 +++++-- lib/jekyll/cleaner.rb | 2 ++ lib/jekyll/collection.rb | 2 ++ lib/jekyll/command.rb | 2 ++ lib/jekyll/commands/build.rb | 2 ++ lib/jekyll/commands/clean.rb | 2 ++ lib/jekyll/commands/doctor.rb | 2 ++ lib/jekyll/commands/help.rb | 2 ++ lib/jekyll/commands/new.rb | 2 ++ lib/jekyll/commands/new_theme.rb | 2 ++ lib/jekyll/commands/serve.rb | 2 ++ lib/jekyll/commands/serve/servlet.rb | 2 ++ lib/jekyll/configuration.rb | 1 + lib/jekyll/converter.rb | 2 ++ lib/jekyll/converters/identity.rb | 2 ++ lib/jekyll/converters/markdown.rb | 2 ++ lib/jekyll/converters/markdown/rdiscount_parser.rb | 2 ++ lib/jekyll/converters/markdown/redcarpet_parser.rb | 6 +++--- lib/jekyll/converters/smartypants.rb | 2 ++ lib/jekyll/convertible.rb | 1 + lib/jekyll/deprecator.rb | 2 ++ lib/jekyll/document.rb | 1 + lib/jekyll/drops/collection_drop.rb | 1 + lib/jekyll/drops/document_drop.rb | 1 + lib/jekyll/drops/drop.rb | 1 + lib/jekyll/drops/excerpt_drop.rb | 1 + lib/jekyll/drops/jekyll_drop.rb | 1 + lib/jekyll/drops/site_drop.rb | 1 + lib/jekyll/drops/static_file_drop.rb | 2 ++ lib/jekyll/drops/unified_payload_drop.rb | 1 + lib/jekyll/drops/url_drop.rb | 1 + lib/jekyll/entry_filter.rb | 2 ++ lib/jekyll/errors.rb | 2 ++ lib/jekyll/excerpt.rb | 4 +++- lib/jekyll/external.rb | 2 ++ lib/jekyll/filters.rb | 2 ++ lib/jekyll/filters/grouping_filters.rb | 2 ++ lib/jekyll/filters/url_filters.rb | 2 ++ lib/jekyll/frontmatter_defaults.rb | 2 ++ lib/jekyll/generator.rb | 2 ++ lib/jekyll/hooks.rb | 2 ++ lib/jekyll/layout.rb | 2 ++ lib/jekyll/liquid_extensions.rb | 2 ++ lib/jekyll/liquid_renderer.rb | 2 ++ lib/jekyll/liquid_renderer/file.rb | 2 ++ lib/jekyll/liquid_renderer/table.rb | 8 +++++--- lib/jekyll/log_adapter.rb | 2 ++ lib/jekyll/page.rb | 2 ++ lib/jekyll/plugin.rb | 2 ++ lib/jekyll/plugin_manager.rb | 2 ++ lib/jekyll/publisher.rb | 2 ++ lib/jekyll/reader.rb | 1 + lib/jekyll/readers/collection_reader.rb | 2 ++ lib/jekyll/readers/data_reader.rb | 2 ++ lib/jekyll/readers/layout_reader.rb | 2 ++ lib/jekyll/readers/page_reader.rb | 2 ++ lib/jekyll/readers/post_reader.rb | 2 ++ lib/jekyll/readers/static_file_reader.rb | 2 ++ lib/jekyll/readers/theme_assets_reader.rb | 2 ++ lib/jekyll/regenerator.rb | 2 ++ lib/jekyll/related_posts.rb | 2 ++ lib/jekyll/renderer.rb | 1 + lib/jekyll/site.rb | 1 + lib/jekyll/static_file.rb | 2 ++ lib/jekyll/stevenson.rb | 2 ++ lib/jekyll/tags/highlight.rb | 2 ++ lib/jekyll/tags/include.rb | 1 + lib/jekyll/tags/link.rb | 2 ++ lib/jekyll/tags/post_url.rb | 2 ++ lib/jekyll/theme.rb | 2 ++ lib/jekyll/theme_builder.rb | 2 ++ lib/jekyll/url.rb | 4 +++- lib/jekyll/utils.rb | 7 ++++++- lib/jekyll/utils/exec.rb | 2 ++ lib/jekyll/utils/platforms.rb | 2 ++ lib/jekyll/utils/win_tz.rb | 2 ++ lib/jekyll/version.rb | 2 ++ lib/theme_template/Gemfile | 2 ++ rake/docs.rake | 2 ++ rake/release.rake | 2 ++ rake/site.rake | 2 ++ .../test-dependency-theme/test-dependency-theme.gemspec | 2 ++ test/fixtures/test-theme/test-theme.gemspec | 2 ++ test/helper.rb | 2 ++ test/simplecov_custom_profile.rb | 2 ++ test/source/_plugins/dummy.rb | 2 ++ test/test_ansi.rb | 2 ++ test/test_cleaner.rb | 2 ++ test/test_coffeescript.rb | 2 ++ test/test_collections.rb | 2 ++ test/test_command.rb | 2 ++ test/test_commands_serve.rb | 2 ++ test/test_configuration.rb | 2 ++ test/test_convertible.rb | 2 ++ test/test_doctor_command.rb | 2 ++ test/test_document.rb | 2 ++ test/test_drop.rb | 2 ++ test/test_entry_filter.rb | 2 ++ test/test_excerpt.rb | 2 ++ test/test_excerpt_drop.rb | 2 ++ test/test_filters.rb | 1 + test/test_front_matter_defaults.rb | 2 ++ test/test_generated_site.rb | 2 ++ test/test_kramdown.rb | 1 + test/test_layout_reader.rb | 2 ++ test/test_liquid_extensions.rb | 2 ++ test/test_liquid_renderer.rb | 2 ++ test/test_log_adapter.rb | 2 ++ test/test_new_command.rb | 2 ++ test/test_page.rb | 2 ++ test/test_path_sanitization.rb | 2 ++ test/test_plugin_manager.rb | 2 ++ test/test_rdiscount.rb | 2 ++ test/test_redcarpet.rb | 2 ++ test/test_regenerator.rb | 2 ++ test/test_related_posts.rb | 2 ++ test/test_sass.rb | 2 ++ test/test_site.rb | 2 ++ test/test_site_drop.rb | 2 ++ test/test_static_file.rb | 2 ++ test/test_tags.rb | 1 + test/test_theme.rb | 2 ++ test/test_theme_assets_reader.rb | 2 ++ test/test_url.rb | 2 ++ test/test_utils.rb | 2 ++ 133 files changed, 264 insertions(+), 12 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index e5b26bccc9c..ea3aa1062fc 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -9,6 +9,7 @@ AllCops: - benchmark/**/* - script/**/* - vendor/**/* + - tmp/**/* Layout/AlignArray: Enabled: false Layout/AlignHash: @@ -99,6 +100,9 @@ Style/BracesAroundHashParameters: Enabled: false Style/ClassAndModuleChildren: Enabled: false +Style/FrozenStringLiteralComment: + Enabled: true + EnforcedStyle: always Style/Documentation: Enabled: false Exclude: diff --git a/Gemfile b/Gemfile index 0306c71afc1..0dcb47767d4 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + source "https://rubygems.org" gemspec :name => "jekyll" diff --git a/Rakefile b/Rakefile index c80324aba5d..a7d50088d93 100644 --- a/Rakefile +++ b/Rakefile @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "rubygems" require "rake" require "rdoc" diff --git a/exe/jekyll b/exe/jekyll index baac099791a..07e13717771 100755 --- a/exe/jekyll +++ b/exe/jekyll @@ -1,4 +1,6 @@ #!/usr/bin/env ruby +# frozen_string_literal: true + STDOUT.sync = true $LOAD_PATH.unshift File.expand_path("../lib", __dir__) diff --git a/features/step_definitions.rb b/features/step_definitions.rb index c22adb48667..29900491989 100644 --- a/features/step_definitions.rb +++ b/features/step_definitions.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + Before do FileUtils.rm_rf(Paths.test_dir) if Paths.test_dir.exist? FileUtils.mkdir_p(Paths.test_dir) unless Paths.test_dir.directory? diff --git a/features/support/formatter.rb b/features/support/formatter.rb index 79d1466480f..745c74ec905 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "fileutils" require "colorator" require "cucumber/formatter/console" diff --git a/features/support/helpers.rb b/features/support/helpers.rb index 118dd9cf925..36a726b4f00 100644 --- a/features/support/helpers.rb +++ b/features/support/helpers.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "fileutils" require "jekyll" require "time" @@ -107,7 +109,8 @@ def run_in_shell(*args) File.write(Paths.status_file, p.exitstatus) File.open(Paths.output_file, "wb") do |f| - f.puts "$ " << args.join(" ") + f.print "$ " + f.puts args.join(" ") f.puts output f.puts "EXIT STATUS: #{p.exitstatus}" end diff --git a/jekyll.gemspec b/jekyll.gemspec index 5ec2e9a25f6..87031a8000c 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -1,4 +1,5 @@ # coding: utf-8 +# frozen_string_literal: true lib = File.expand_path("lib", __dir__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 5e5923c2bd1..fb5db3d43e1 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + $LOAD_PATH.unshift __dir__ # For use/testing when no gem is installed # Require all of the Ruby files in the given directory. @@ -162,8 +164,9 @@ def sites def sanitized_path(base_directory, questionable_path) return base_directory if base_directory.eql?(questionable_path) - questionable_path.insert(0, "/") if questionable_path.start_with?("~") - clean_path = File.expand_path(questionable_path, "/") + clean_path = questionable_path.dup + clean_path.insert(0, "/") if clean_path.start_with?("~") + clean_path = File.expand_path(clean_path, "/") return clean_path if clean_path.eql?(base_directory) diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb index db8a9180f94..fee6418a99c 100644 --- a/lib/jekyll/cleaner.rb +++ b/lib/jekyll/cleaner.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "set" module Jekyll diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index f839915f599..ebafea38f97 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Collection attr_reader :site, :label, :metadata diff --git a/lib/jekyll/command.rb b/lib/jekyll/command.rb index f9f243dd9e6..7de98e76ea8 100644 --- a/lib/jekyll/command.rb +++ b/lib/jekyll/command.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Command class << self diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb index 3cea607cbd0..1bd176b8be4 100644 --- a/lib/jekyll/commands/build.rb +++ b/lib/jekyll/commands/build.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Commands class Build < Command diff --git a/lib/jekyll/commands/clean.rb b/lib/jekyll/commands/clean.rb index 3a44d59683e..1c3e40bf6c4 100644 --- a/lib/jekyll/commands/clean.rb +++ b/lib/jekyll/commands/clean.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Commands class Clean < Command diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 5c235dac132..1ef87e714d5 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "addressable/uri" module Jekyll diff --git a/lib/jekyll/commands/help.rb b/lib/jekyll/commands/help.rb index b4f136bf3e5..42a8017ae8a 100644 --- a/lib/jekyll/commands/help.rb +++ b/lib/jekyll/commands/help.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Commands class Help < Command diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index d1aeb5a0281..b1c8bb0bc4b 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "erb" module Jekyll diff --git a/lib/jekyll/commands/new_theme.rb b/lib/jekyll/commands/new_theme.rb index 65125d58d50..c55e68127d8 100644 --- a/lib/jekyll/commands/new_theme.rb +++ b/lib/jekyll/commands/new_theme.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "erb" class Jekyll::Commands::NewTheme < Jekyll::Command diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 4bc9eaf0da8..53973b66cb4 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Commands class Serve < Command diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 2e20ace81d5..b661940c30a 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "webrick" module Jekyll diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index ec8e2a22dc0..2931cba4500 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll class Configuration < Hash diff --git a/lib/jekyll/converter.rb b/lib/jekyll/converter.rb index b7fa0091cb3..3cb74de2123 100644 --- a/lib/jekyll/converter.rb +++ b/lib/jekyll/converter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Converter < Plugin # Public: Get or set the highlighter prefix. When an argument is specified, diff --git a/lib/jekyll/converters/identity.rb b/lib/jekyll/converters/identity.rb index 9574769d1a9..2296aff1966 100644 --- a/lib/jekyll/converters/identity.rb +++ b/lib/jekyll/converters/identity.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Converters class Identity < Converter diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index c718d539b7c..3e53992104d 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Converters class Markdown < Converter diff --git a/lib/jekyll/converters/markdown/rdiscount_parser.rb b/lib/jekyll/converters/markdown/rdiscount_parser.rb index f1679e796c4..654a3a6d0ed 100644 --- a/lib/jekyll/converters/markdown/rdiscount_parser.rb +++ b/lib/jekyll/converters/markdown/rdiscount_parser.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Converters class Markdown diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index aa170feb3b7..fae09621da2 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class Jekyll::Converters::Markdown::RedcarpetParser module CommonMethods def add_code_tags(code, lang) @@ -48,9 +50,7 @@ module WithRouge def block_code(code, lang) code = "
    #{super}
    " - output = "
    " - output << add_code_tags(code, lang) - output << "
    " + "
    #{add_code_tags(code, lang)}
    " end protected diff --git a/lib/jekyll/converters/smartypants.rb b/lib/jekyll/converters/smartypants.rb index d1bc81039a1..37fecb12172 100644 --- a/lib/jekyll/converters/smartypants.rb +++ b/lib/jekyll/converters/smartypants.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown def initialize(source, options) super diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 74125f09b1d..aea33fdcb86 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true require "set" diff --git a/lib/jekyll/deprecator.rb b/lib/jekyll/deprecator.rb index ca2b8b3f74a..327358c2d4f 100644 --- a/lib/jekyll/deprecator.rb +++ b/lib/jekyll/deprecator.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Deprecator extend self diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 8634082c4d9..b6493f3c075 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll class Document diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb index 5f5025b1f2d..2c9c01320ea 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll module Drops diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index ed851821eb1..7796980c7a4 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll module Drops diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 6227213e4dd..1ded11eb7d2 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll module Drops diff --git a/lib/jekyll/drops/excerpt_drop.rb b/lib/jekyll/drops/excerpt_drop.rb index 5d61aeb1b2d..06f8ae7d016 100644 --- a/lib/jekyll/drops/excerpt_drop.rb +++ b/lib/jekyll/drops/excerpt_drop.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll module Drops diff --git a/lib/jekyll/drops/jekyll_drop.rb b/lib/jekyll/drops/jekyll_drop.rb index e3d2eb38d52..1686da418f1 100644 --- a/lib/jekyll/drops/jekyll_drop.rb +++ b/lib/jekyll/drops/jekyll_drop.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll module Drops diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index 97b41806444..cb4a007eb15 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll module Drops diff --git a/lib/jekyll/drops/static_file_drop.rb b/lib/jekyll/drops/static_file_drop.rb index e0af2f09ed1..f855cf33629 100644 --- a/lib/jekyll/drops/static_file_drop.rb +++ b/lib/jekyll/drops/static_file_drop.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Drops class StaticFileDrop < Drop diff --git a/lib/jekyll/drops/unified_payload_drop.rb b/lib/jekyll/drops/unified_payload_drop.rb index b642bda2620..833443a46f9 100644 --- a/lib/jekyll/drops/unified_payload_drop.rb +++ b/lib/jekyll/drops/unified_payload_drop.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll module Drops diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb index 5c97190da59..e67d24d47b8 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll module Drops diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index f4425037afc..019133195d3 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class EntryFilter attr_reader :site diff --git a/lib/jekyll/errors.rb b/lib/jekyll/errors.rb index 95aa04b4ccd..8d659e8d285 100644 --- a/lib/jekyll/errors.rb +++ b/lib/jekyll/errors.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Errors FatalException = Class.new(::RuntimeError) diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index 61344e7964b..7adfec9861c 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Excerpt extend Forwardable @@ -117,7 +119,7 @@ def extract_excerpt(doc_content) if tail.empty? head else - "" << head << "\n\n" << tail.scan(%r!^ {0,3}\[[^\]]+\]:.+$!).join("\n") + head.to_s.dup << "\n\n" << tail.scan(%r!^ {0,3}\[[^\]]+\]:.+$!).join("\n") end end end diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index bdefc798ae8..0a65dfad058 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module External class << self diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index e15cf7c66dd..35ed4d9f63e 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "addressable/uri" require "json" require "date" diff --git a/lib/jekyll/filters/grouping_filters.rb b/lib/jekyll/filters/grouping_filters.rb index c1029256106..4086bbe9854 100644 --- a/lib/jekyll/filters/grouping_filters.rb +++ b/lib/jekyll/filters/grouping_filters.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Filters module GroupingFilters diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index 6ededc956d1..5bae1b1794e 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "addressable/uri" module Jekyll diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index 7cbfa358677..fc1bcc2d867 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll # This class handles custom defaults for YAML frontmatter settings. # These are set in _config.yml and apply both to internal use (e.g. layout) diff --git a/lib/jekyll/generator.rb b/lib/jekyll/generator.rb index bf7c0f19aba..649715f840c 100644 --- a/lib/jekyll/generator.rb +++ b/lib/jekyll/generator.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll Generator = Class.new(Plugin) end diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index 241dce3a7f1..8007edff59c 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Hooks DEFAULT_PRIORITY = 20 diff --git a/lib/jekyll/layout.rb b/lib/jekyll/layout.rb index 3a08ad0d3be..f62fec08be2 100644 --- a/lib/jekyll/layout.rb +++ b/lib/jekyll/layout.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Layout include Convertible diff --git a/lib/jekyll/liquid_extensions.rb b/lib/jekyll/liquid_extensions.rb index 5ba7dd8e79f..4551ac19bbd 100644 --- a/lib/jekyll/liquid_extensions.rb +++ b/lib/jekyll/liquid_extensions.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module LiquidExtensions diff --git a/lib/jekyll/liquid_renderer.rb b/lib/jekyll/liquid_renderer.rb index 919930ef8b0..2e15dbc6dcd 100644 --- a/lib/jekyll/liquid_renderer.rb +++ b/lib/jekyll/liquid_renderer.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "jekyll/liquid_renderer/file" require "jekyll/liquid_renderer/table" diff --git a/lib/jekyll/liquid_renderer/file.rb b/lib/jekyll/liquid_renderer/file.rb index eec8c7b52a8..574bbd31300 100644 --- a/lib/jekyll/liquid_renderer/file.rb +++ b/lib/jekyll/liquid_renderer/file.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class LiquidRenderer class File diff --git a/lib/jekyll/liquid_renderer/table.rb b/lib/jekyll/liquid_renderer/table.rb index aab7fdf7845..7aa2e49ee4e 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class LiquidRenderer::Table def initialize(stats) @@ -13,7 +15,7 @@ def to_s(n = 50) private def generate_table(data, widths) - str = "\n" + str = String.new("\n") table_head = data.shift str << generate_row(table_head, widths) @@ -28,7 +30,7 @@ def generate_table(data, widths) end def generate_table_head_border(row_data, widths) - str = "" + str = String.new("") row_data.each_index do |cell_index| str << "-" * widths[cell_index] @@ -40,7 +42,7 @@ def generate_table_head_border(row_data, widths) end def generate_row(row_data, widths) - str = "" + str = String.new("") row_data.each_with_index do |cell_data, cell_index| str << if cell_index.zero? diff --git a/lib/jekyll/log_adapter.rb b/lib/jekyll/log_adapter.rb index 965f3295702..ec33b4d90d8 100644 --- a/lib/jekyll/log_adapter.rb +++ b/lib/jekyll/log_adapter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class LogAdapter attr_reader :writer, :messages diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 02c6cfae9f1..3b3d9353879 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Page include Convertible diff --git a/lib/jekyll/plugin.rb b/lib/jekyll/plugin.rb index b6e5023d80e..2a9dbeed41b 100644 --- a/lib/jekyll/plugin.rb +++ b/lib/jekyll/plugin.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Plugin PRIORITIES = { diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index 979004d63b6..f53d187a337 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class PluginManager attr_reader :site diff --git a/lib/jekyll/publisher.rb b/lib/jekyll/publisher.rb index 0b67b8c6025..26fe4a3869b 100644 --- a/lib/jekyll/publisher.rb +++ b/lib/jekyll/publisher.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Publisher def initialize(site) diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 903e36d3a48..5804d1f963a 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true require "csv" diff --git a/lib/jekyll/readers/collection_reader.rb b/lib/jekyll/readers/collection_reader.rb index 062be42a4b4..7d605f421c4 100644 --- a/lib/jekyll/readers/collection_reader.rb +++ b/lib/jekyll/readers/collection_reader.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class CollectionReader SPECIAL_COLLECTIONS = %w(posts data).freeze diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index 63db7c6d920..e2671f2d3b4 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class DataReader attr_reader :site, :content diff --git a/lib/jekyll/readers/layout_reader.rb b/lib/jekyll/readers/layout_reader.rb index 985491c67a7..706dfed8c43 100644 --- a/lib/jekyll/readers/layout_reader.rb +++ b/lib/jekyll/readers/layout_reader.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class LayoutReader attr_reader :site diff --git a/lib/jekyll/readers/page_reader.rb b/lib/jekyll/readers/page_reader.rb index 507c609e507..62d7419efec 100644 --- a/lib/jekyll/readers/page_reader.rb +++ b/lib/jekyll/readers/page_reader.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class PageReader attr_reader :site, :dir, :unfiltered_content diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index 70688875da5..510192793b0 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class PostReader attr_reader :site, :unfiltered_content diff --git a/lib/jekyll/readers/static_file_reader.rb b/lib/jekyll/readers/static_file_reader.rb index 1d43d69c659..6bf07f5a0c3 100644 --- a/lib/jekyll/readers/static_file_reader.rb +++ b/lib/jekyll/readers/static_file_reader.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class StaticFileReader attr_reader :site, :dir, :unfiltered_content diff --git a/lib/jekyll/readers/theme_assets_reader.rb b/lib/jekyll/readers/theme_assets_reader.rb index 80a6547d8a7..2706690c5ce 100644 --- a/lib/jekyll/readers/theme_assets_reader.rb +++ b/lib/jekyll/readers/theme_assets_reader.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class ThemeAssetsReader attr_reader :site diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 09ff309a28d..91ce3003bdf 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Regenerator attr_reader :site, :metadata, :cache diff --git a/lib/jekyll/related_posts.rb b/lib/jekyll/related_posts.rb index 3526a73b76f..fcccdd80eeb 100644 --- a/lib/jekyll/related_posts.rb +++ b/lib/jekyll/related_posts.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class RelatedPosts class << self diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index b0f544e35e5..5a2d32a8d27 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll class Renderer diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 0bc3f1d577c..54155d0c8e2 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true require "csv" diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 29d71cbe8e7..55f0256c24f 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class StaticFile attr_reader :relative_path, :extname, :name, :data diff --git a/lib/jekyll/stevenson.rb b/lib/jekyll/stevenson.rb index bf20b22f752..bbec66171f6 100644 --- a/lib/jekyll/stevenson.rb +++ b/lib/jekyll/stevenson.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Stevenson < ::Logger def initialize diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 86b9171b1fb..7ea95b0b101 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Tags class HighlightBlock < Liquid::Block diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 08843047a2e..ef6c8f732ca 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true module Jekyll module Tags diff --git a/lib/jekyll/tags/link.rb b/lib/jekyll/tags/link.rb index a076c417252..77f4da9ca48 100644 --- a/lib/jekyll/tags/link.rb +++ b/lib/jekyll/tags/link.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Tags class Link < Liquid::Tag diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb index f7e52f42b57..9a1b8337c91 100644 --- a/lib/jekyll/tags/post_url.rb +++ b/lib/jekyll/tags/post_url.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Tags class PostComparer diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index 045c91aa0c8..031c61b1e7a 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Theme extend Forwardable diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index f1c97e37974..aca89dd655c 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class Jekyll::ThemeBuilder SCAFFOLD_DIRECTORIES = %w( assets _layouts _includes _sass diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb index 8f3047d30cf..f91578507da 100644 --- a/lib/jekyll/url.rb +++ b/lib/jekyll/url.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "addressable/uri" # Public: Methods that generate a URL for a resource such as a Post or a Page. @@ -93,7 +95,7 @@ def possible_keys(key) def generate_url_from_drop(template) template.gsub(%r!:([a-z_]+)!) do |match| - pool = possible_keys(match.sub(":".freeze, "".freeze)) + pool = possible_keys(match.sub(":", "")) winner = pool.find { |key| @placeholders.key?(key) } if winner.nil? diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 3f91a2b00fd..c9dcf2fd324 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -1,4 +1,6 @@ +# frozen_string_literal: true + module Jekyll module Utils extend self @@ -247,6 +249,8 @@ def slugify(string, mode: nil, cased: false) # # Returns the updated permalink template def add_permalink_suffix(template, permalink_style) + template = template.dup + case permalink_style when :pretty template << "/" @@ -256,6 +260,7 @@ def add_permalink_suffix(template, permalink_style) template << "/" if permalink_style.to_s.end_with?("/") template << ":output_ext" if permalink_style.to_s.end_with?(":output_ext") end + template end @@ -296,7 +301,7 @@ def safe_glob(dir, patterns, flags = 0) def merged_file_read_opts(site, opts) merged = (site ? site.file_read_opts : {}).merge(opts) if merged["encoding"] && !merged["encoding"].start_with?("bom|") - merged["encoding"].insert(0, "bom|") + merged["encoding"] = "bom|#{merged["encoding"]}" end merged end diff --git a/lib/jekyll/utils/exec.rb b/lib/jekyll/utils/exec.rb index 33403dbc50d..fee8b2d2e5b 100644 --- a/lib/jekyll/utils/exec.rb +++ b/lib/jekyll/utils/exec.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "open3" module Jekyll diff --git a/lib/jekyll/utils/platforms.rb b/lib/jekyll/utils/platforms.rb index f66ef795bbd..f4f3382a240 100644 --- a/lib/jekyll/utils/platforms.rb +++ b/lib/jekyll/utils/platforms.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Utils module Platforms diff --git a/lib/jekyll/utils/win_tz.rb b/lib/jekyll/utils/win_tz.rb index 06a10422274..322f5ac6230 100644 --- a/lib/jekyll/utils/win_tz.rb +++ b/lib/jekyll/utils/win_tz.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Utils module WinTZ diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 8a8b2b30c11..6a27620408a 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll VERSION = "3.5.1".freeze end diff --git a/lib/theme_template/Gemfile b/lib/theme_template/Gemfile index 3be9c3cd812..bb94df82938 100644 --- a/lib/theme_template/Gemfile +++ b/lib/theme_template/Gemfile @@ -1,2 +1,4 @@ +# frozen_string_literal: true + source "https://rubygems.org" gemspec diff --git a/rake/docs.rake b/rake/docs.rake index fcae4f20162..e64c6cfdccd 100644 --- a/rake/docs.rake +++ b/rake/docs.rake @@ -1,3 +1,5 @@ +# frozen_string_literal: true + ############################################################################# # # Packaging tasks for jekyll-docs diff --git a/rake/release.rake b/rake/release.rake index 9d9220a49a7..ce7bf41ca94 100644 --- a/rake/release.rake +++ b/rake/release.rake @@ -1,3 +1,5 @@ +# frozen_string_literal: true + ############################################################################# # # Packaging tasks diff --git a/rake/site.rake b/rake/site.rake index 00ffd228b44..94aa969ea22 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -1,3 +1,5 @@ +# frozen_string_literal: true + ############################################################################# # # Site tasks - https://jekyllrb.com diff --git a/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec b/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec index 5c260329d3b..ebc8a83c3a1 100644 --- a/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec +++ b/test/fixtures/test-dependency-theme/test-dependency-theme.gemspec @@ -1,3 +1,5 @@ +# frozen_string_literal: true + Gem::Specification.new do |s| s.name = "test-dependency-theme" s.version = "0.1.0" diff --git a/test/fixtures/test-theme/test-theme.gemspec b/test/fixtures/test-theme/test-theme.gemspec index 73e5deb2e94..970e1b8abdd 100644 --- a/test/fixtures/test-theme/test-theme.gemspec +++ b/test/fixtures/test-theme/test-theme.gemspec @@ -1,3 +1,5 @@ +# frozen_string_literal: true + Gem::Specification.new do |s| s.name = "test-theme" s.version = "0.1.0" diff --git a/test/helper.rb b/test/helper.rb index 83beaad3c1c..3f3227bab4f 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + $stdout.puts "# -------------------------------------------------------------" $stdout.puts "# SPECS AND TESTS ARE RUNNING WITH WARNINGS OFF." $stdout.puts "# SEE: https://github.com/Shopify/liquid/issues/730" diff --git a/test/simplecov_custom_profile.rb b/test/simplecov_custom_profile.rb index 0aaec88a58c..555acec3d7e 100644 --- a/test/simplecov_custom_profile.rb +++ b/test/simplecov_custom_profile.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "simplecov" SimpleCov.profiles.define "gem" do diff --git a/test/source/_plugins/dummy.rb b/test/source/_plugins/dummy.rb index fd11d0e1044..25eef88e21b 100644 --- a/test/source/_plugins/dummy.rb +++ b/test/source/_plugins/dummy.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll class Dummy < Generator priority :high diff --git a/test/test_ansi.rb b/test/test_ansi.rb index 8f18f56ec7b..9b4fd01668c 100644 --- a/test/test_ansi.rb +++ b/test/test_ansi.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestAnsi < JekyllUnitTest diff --git a/test/test_cleaner.rb b/test/test_cleaner.rb index d3072e54977..65442cedc0d 100644 --- a/test/test_cleaner.rb +++ b/test/test_cleaner.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestCleaner < JekyllUnitTest diff --git a/test/test_coffeescript.rb b/test/test_coffeescript.rb index 189ce05df3e..a60e0595430 100644 --- a/test/test_coffeescript.rb +++ b/test/test_coffeescript.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestCoffeeScript < JekyllUnitTest diff --git a/test/test_collections.rb b/test/test_collections.rb index cb122cd9e65..e4dbe951a25 100644 --- a/test/test_collections.rb +++ b/test/test_collections.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestCollections < JekyllUnitTest diff --git a/test/test_command.rb b/test/test_command.rb index 90767013b92..33e13798cc6 100644 --- a/test/test_command.rb +++ b/test/test_command.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestCommand < JekyllUnitTest diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index ef98bab4e2b..135e83e2dba 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "webrick" require "mercenary" require "helper" diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 50156926202..dddb61b8671 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" require "colorator" diff --git a/test/test_convertible.rb b/test/test_convertible.rb index ef70307062f..cc5be8785a7 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" require "ostruct" diff --git a/test/test_doctor_command.rb b/test/test_doctor_command.rb index 8861440255c..182878689cc 100644 --- a/test/test_doctor_command.rb +++ b/test/test_doctor_command.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" require "jekyll/commands/doctor" diff --git a/test/test_document.rb b/test/test_document.rb index 8726c83cd6a..42ba3c5748b 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestDocument < JekyllUnitTest diff --git a/test/test_drop.rb b/test/test_drop.rb index 80b0d0ff693..00d2116471d 100644 --- a/test/test_drop.rb +++ b/test/test_drop.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestDrop < JekyllUnitTest diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb index 7f32653c957..c9025092318 100644 --- a/test/test_entry_filter.rb +++ b/test/test_entry_filter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestEntryFilter < JekyllUnitTest diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb index e0960f69663..2bcf3ba8cac 100644 --- a/test/test_excerpt.rb +++ b/test/test_excerpt.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestExcerpt < JekyllUnitTest diff --git a/test/test_excerpt_drop.rb b/test/test_excerpt_drop.rb index 901b06a6f79..1eb6687266d 100644 --- a/test/test_excerpt_drop.rb +++ b/test/test_excerpt_drop.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestExcerptDrop < JekyllUnitTest diff --git a/test/test_filters.rb b/test/test_filters.rb index e0eb2feee87..cb95a6449fb 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -1,4 +1,5 @@ # coding: utf-8 +# frozen_string_literal: true require "helper" diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index d45ab6de9a5..9bf9629a9ed 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestFrontMatterDefaults < JekyllUnitTest diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb index 84345524d74..136f5fc9e68 100644 --- a/test/test_generated_site.rb +++ b/test/test_generated_site.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestGeneratedSite < JekyllUnitTest diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index 6396d67201b..3861416ff2e 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -1,4 +1,5 @@ # encoding: UTF-8 +# frozen_string_literal: true require "helper" diff --git a/test/test_layout_reader.rb b/test/test_layout_reader.rb index 1d32fa57892..96d2045a148 100644 --- a/test/test_layout_reader.rb +++ b/test/test_layout_reader.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestLayoutReader < JekyllUnitTest diff --git a/test/test_liquid_extensions.rb b/test/test_liquid_extensions.rb index a76f378623e..e281e10e5fd 100644 --- a/test/test_liquid_extensions.rb +++ b/test/test_liquid_extensions.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestLiquidExtensions < JekyllUnitTest diff --git a/test/test_liquid_renderer.rb b/test/test_liquid_renderer.rb index 6ba29299d67..32e980b8af9 100644 --- a/test/test_liquid_renderer.rb +++ b/test/test_liquid_renderer.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestLiquidRenderer < JekyllUnitTest diff --git a/test/test_log_adapter.rb b/test/test_log_adapter.rb index 7e0873ca33f..2bcd2f1d7c9 100644 --- a/test/test_log_adapter.rb +++ b/test/test_log_adapter.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestLogAdapter < JekyllUnitTest diff --git a/test/test_new_command.rb b/test/test_new_command.rb index 32db566d98b..c2b7def4001 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" require "jekyll/commands/new" diff --git a/test/test_page.rb b/test/test_page.rb index 431c57a63ca..ed4c2c31a9a 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestPage < JekyllUnitTest diff --git a/test/test_path_sanitization.rb b/test/test_path_sanitization.rb index 31a4b92ebff..184385fabd3 100644 --- a/test/test_path_sanitization.rb +++ b/test/test_path_sanitization.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestPathSanitization < JekyllUnitTest diff --git a/test/test_plugin_manager.rb b/test/test_plugin_manager.rb index 90f057641e7..213bcef6b12 100644 --- a/test/test_plugin_manager.rb +++ b/test/test_plugin_manager.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestPluginManager < JekyllUnitTest diff --git a/test/test_rdiscount.rb b/test/test_rdiscount.rb index 32289a64368..7116c29a238 100644 --- a/test/test_rdiscount.rb +++ b/test/test_rdiscount.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestRdiscount < JekyllUnitTest diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb index 4e979f4d2ee..f4208570931 100644 --- a/test/test_redcarpet.rb +++ b/test/test_redcarpet.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestRedcarpet < JekyllUnitTest diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index 9e1559d4bec..3a5d35a8aa8 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestRegenerator < JekyllUnitTest diff --git a/test/test_related_posts.rb b/test/test_related_posts.rb index 2d6165505e3..d6a8fe6f1f3 100644 --- a/test/test_related_posts.rb +++ b/test/test_related_posts.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestRelatedPosts < JekyllUnitTest diff --git a/test/test_sass.rb b/test/test_sass.rb index 3a9df0aeae3..15b04162f01 100644 --- a/test/test_sass.rb +++ b/test/test_sass.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestSass < JekyllUnitTest diff --git a/test/test_site.rb b/test/test_site.rb index d039cb8a924..adc69e33436 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestSite < JekyllUnitTest diff --git a/test/test_site_drop.rb b/test/test_site_drop.rb index b836c70d3eb..43c52d708a5 100644 --- a/test/test_site_drop.rb +++ b/test/test_site_drop.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestSiteDrop < JekyllUnitTest diff --git a/test/test_static_file.rb b/test/test_static_file.rb index 49adc96b79f..edfc9facf0e 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestStaticFile < JekyllUnitTest diff --git a/test/test_tags.rb b/test/test_tags.rb index 68fd40398a8..7a60ec9dc18 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -1,4 +1,5 @@ # coding: utf-8 +# frozen_string_literal: true require "helper" diff --git a/test/test_theme.rb b/test/test_theme.rb index 3d557dc8ca0..69628dde1ba 100644 --- a/test/test_theme.rb +++ b/test/test_theme.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestTheme < JekyllUnitTest diff --git a/test/test_theme_assets_reader.rb b/test/test_theme_assets_reader.rb index 8d792f735d9..358789f529a 100644 --- a/test/test_theme_assets_reader.rb +++ b/test/test_theme_assets_reader.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestThemeAssetsReader < JekyllUnitTest diff --git a/test/test_url.rb b/test/test_url.rb index 23ab9735861..859babd4574 100644 --- a/test/test_url.rb +++ b/test/test_url.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestURL < JekyllUnitTest diff --git a/test/test_utils.rb b/test/test_utils.rb index 5f5611ce55e..1b4d4813b66 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require "helper" class TestUtils < JekyllUnitTest From 73419cb374be1b8f45818a23116cf71db93549ce Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 3 Aug 2017 21:27:33 -0400 Subject: [PATCH 2299/4996] Update history to reflect merge of #6265 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b7848fa8aca..fe4aeb8df43 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,7 @@ * `Reader#read_directories`: guard against an entry not being a directory (#6226) * kramdown: symbolize keys in-place (#6247) * Call to_s on site.url before attempting to concatenate strings (#6253) + * Enforce Style/FrozenStringLiteralComment (#6265) ### Documentation From cc1cb8150a599448fbaa6e356c835e08e76789f3 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Fri, 4 Aug 2017 03:00:24 +0100 Subject: [PATCH 2300/4996] set `LiquidError#template_name` for errors in included file (#6206) Merge pull request 6206 --- features/rendering.feature | 13 +++++++++++-- lib/jekyll/liquid_renderer.rb | 3 --- lib/jekyll/tags/include.rb | 14 +++++++++++--- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/features/rendering.feature b/features/rendering.feature index ecb31094fbc..1d9f2aa949b 100644 --- a/features/rendering.feature +++ b/features/rendering.feature @@ -12,14 +12,23 @@ Feature: Rendering Then I should get a non-zero exit-status And I should see "Liquid Exception" in the build output - Scenario: When receiving bad Liquid in included file + Scenario: When receiving a liquid syntax error in included file Given I have a _includes directory And I have a "_includes/invalid.html" file that contains "{% INVALID %}" And I have a "index.html" page with layout "simple" that contains "{% include invalid.html %}" And I have a simple layout that contains "{{ content }}" When I run jekyll build Then I should get a non-zero exit-status - And I should see "Liquid Exception.*Unknown tag 'INVALID' in.*_includes/invalid\.html" in the build output + And I should see "Liquid Exception: Liquid syntax error \(.+/invalid\.html line 1\): Unknown tag 'INVALID' included in index\.html" in the build output + + Scenario: When receiving a generic liquid error in included file + Given I have a _includes directory + And I have a "_includes/invalid.html" file that contains "{{ site.title | prepend 'Prepended Text' }}" + And I have a "index.html" page with layout "simple" that contains "{% include invalid.html %}" + And I have a simple layout that contains "{{ content }}" + When I run jekyll build + Then I should get a non-zero exit-status + And I should see "Liquid Exception: Liquid error \(.+/_includes/invalid\.html line 1\): wrong number of arguments (\(given 1, expected 2\)|\(1 for 2\)) included in index\.html" in the build output Scenario: Render Liquid and place in layout Given I have a "index.html" page with layout "simple" that contains "Hi there, Jekyll {{ jekyll.environment }}!" diff --git a/lib/jekyll/liquid_renderer.rb b/lib/jekyll/liquid_renderer.rb index 2e15dbc6dcd..a79f06bd3c8 100644 --- a/lib/jekyll/liquid_renderer.rb +++ b/lib/jekyll/liquid_renderer.rb @@ -43,9 +43,6 @@ def stats_table(n = 50) end def self.format_error(e, path) - if e.is_a? Tags::IncludeTagError - return "#{e.message} in #{e.path}, included in #{path}" - end "#{e.message} in #{path}" end end diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index ef6c8f732ca..b2f6ffb40a2 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -136,7 +136,13 @@ def render(context) context.stack do context["include"] = parse_params(context) if @params - partial.render!(context) + begin + partial.render!(context) + rescue Liquid::Error => e + e.template_name = path + e.markup_context = "included " if e.markup_context.nil? + raise e + end end end @@ -161,8 +167,10 @@ def load_cached_partial(path, context) .file(path) begin cached_partial[path] = unparsed_file.parse(read_file(path, context)) - rescue Liquid::SyntaxError => ex - raise IncludeTagError.new(ex.message, path) + rescue Liquid::Error => e + e.template_name = path + e.markup_context = "included " if e.markup_context.nil? + raise e end end end From 828ee760c23f5f03399e2bb65d213ee04f3a4695 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 3 Aug 2017 22:00:25 -0400 Subject: [PATCH 2301/4996] Update history to reflect merge of #6206 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fe4aeb8df43..4b298be6e81 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ * Add URL checks to Doctor (#5760) * Fix serving files that clash with directories (#6222) (#6231) * Bump supported Ruby version to `>= 2.1.0` (#6220) + * set `LiquidError#template_name` for errors in included file (#6206) ### Bug Fixes From 922fa534011f27ee46cc656cc6da57d7bd0866c9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 3 Aug 2017 22:47:28 -0400 Subject: [PATCH 2302/4996] Update history in docs site based on recent updates to History.markdown --- docs/_docs/history.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index e5832bf0998..725321bddae 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -27,7 +27,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - add plugins for multiple page pagination ([#6055]({{ site.repository }}/issues/6055)) - Update minimum Ruby version in installation.md ([#6164]({{ site.repository }}/issues/6164)) - [docs] Add information about finding a collection in `site.collections` ([#6165]({{ site.repository }}/issues/6165)) -- Add {%raw%} to Liquid example on site ([#6179]({{ site.repository }}/issues/6179)) +- Add {% raw %}`{% raw %}`{% endraw %} to Liquid example on site ([#6179]({{ site.repository }}/issues/6179)) - Added improved Pug plugin - removed 404 Jade plugin ([#6174]({{ site.repository }}/issues/6174)) - Linking the link ([#6210]({{ site.repository }}/issues/6210)) - Small correction in documentation for includes ([#6193]({{ site.repository }}/issues/6193)) From 8cade08de01aa154f4bcd6b820dc644c955b47d0 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 4 Aug 2017 08:40:18 +0530 Subject: [PATCH 2303/4996] update theme-template README (#6257) Merge pull request 6257 --- lib/theme_template/README.md.erb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/theme_template/README.md.erb b/lib/theme_template/README.md.erb index 9eca48c78d1..ff8ad05fb28 100644 --- a/lib/theme_template/README.md.erb +++ b/lib/theme_template/README.md.erb @@ -1,9 +1,12 @@ # <%= theme_name %> -Welcome to your new Jekyll theme! In this directory, you'll find the files you need to be able to package up your theme into a gem. Put your layouts in `_layouts`, your includes in `_includes` and your sass in `_sass`. To experiment with this code, add some sample content and run `bundle exec jekyll serve` – this directory is setup just like a Jekyll site! +Welcome to your new Jekyll theme! In this directory, you'll find the files you need to be able to package up your theme into a gem. Put your layouts in `_layouts`, your includes in `_includes`, your sass files in `_sass` and any other assets in `assets`. + +To experiment with this code, add some sample content and run `bundle exec jekyll serve` – this directory is setup just like a Jekyll site! TODO: Delete this and the text above, and describe your gem + ## Installation Add this line to your Jekyll site's `Gemfile`: @@ -28,7 +31,7 @@ Or install it yourself as: ## Usage -TODO: Write usage instructions here. Describe your available layouts, includes, and/or sass. +TODO: Write usage instructions here. Describe your available layouts, includes, sass and/or assets. ## Contributing @@ -40,7 +43,8 @@ To set up your environment to develop this theme, run `bundle install`. Your theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal. -When your theme is released, only the files in `_layouts`, `_includes`, and `_sass` tracked with Git will be released. +When your theme is released, only the files in `_layouts`, `_includes`, `_sass` and `assets` tracked with Git will be bundled. +To add a custom directory to your theme-gem, please edit the regexp in `<%= theme_name %>.gemspec` accordingly. ## License From 305e293d46251cd6e12831290d7860680c43e07d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 3 Aug 2017 23:10:19 -0400 Subject: [PATCH 2304/4996] Update history to reflect merge of #6257 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4b298be6e81..9526da30eb8 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * kramdown: symbolize keys in-place (#6247) * Call to_s on site.url before attempting to concatenate strings (#6253) * Enforce Style/FrozenStringLiteralComment (#6265) + * Update theme-template README to note 'assets' directory (#6257) ### Documentation From d8dfc33b8b12651922c1d4d8fa2a610110e18a06 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 4 Aug 2017 15:53:26 -0400 Subject: [PATCH 2305/4996] Memoize the return value of Document#url (#6266) Merge pull request 6266 --- lib/jekyll/document.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index b6493f3c075..d42e544c62f 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -204,7 +204,7 @@ def permalink # # Returns the computed URL for the document. def url - @url = URL.new({ + @url ||= URL.new({ :template => url_template, :placeholders => url_placeholders, :permalink => permalink, From 5c2e75823a394d0bb38b9fb004404bb5b11f6c95 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 4 Aug 2017 15:53:27 -0400 Subject: [PATCH 2306/4996] Update history to reflect merge of #6266 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9526da30eb8..faaea140995 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * Call to_s on site.url before attempting to concatenate strings (#6253) * Enforce Style/FrozenStringLiteralComment (#6265) * Update theme-template README to note 'assets' directory (#6257) + * Memoize the return value of Document#url (#6266) ### Documentation From a99186fe0a36dfef004db80249b16c9bd57445f9 Mon Sep 17 00:00:00 2001 From: Kyle Zhao Date: Sat, 5 Aug 2017 11:01:40 -0400 Subject: [PATCH 2307/4996] delegate `StaticFile#to_json` to `StaticFile#to_liquid` for a more (#6273) Merge pull request 6273 --- lib/jekyll/static_file.rb | 4 ++++ test/test_static_file.rb | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 55f0256c24f..fd537107f56 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -2,8 +2,12 @@ module Jekyll class StaticFile + extend Forwardable + attr_reader :relative_path, :extname, :name, :data + def_delegator :to_liquid, :to_json, :to_json + class << self # The cache of last modification times [path] -> mtime. def mtimes diff --git a/test/test_static_file.rb b/test/test_static_file.rb index edfc9facf0e..f74d8c1a001 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -176,5 +176,9 @@ def setup_static_file_with_defaults(base, dir, name, defaults) } assert_equal expected, @static_file.to_liquid.to_h end + + should "jsonify its liquid drop instead of itself" do + assert_equal @static_file.to_liquid.to_json, @static_file.to_json + end end end From 6b1aa4ce014b2c0801faf77f8eafaa5ac9107581 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 5 Aug 2017 11:01:42 -0400 Subject: [PATCH 2308/4996] Update history to reflect merge of #6273 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index faaea140995..93afaf6897b 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Enforce Style/FrozenStringLiteralComment (#6265) * Update theme-template README to note 'assets' directory (#6257) * Memoize the return value of Document#url (#6266) + * delegate `StaticFile#to_json` to `StaticFile#to_liquid` (#6273) ### Documentation From 39631db0bd764e594e3443f23ead4a4e6148d7ab Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Sun, 6 Aug 2017 15:49:01 +0100 Subject: [PATCH 2309/4996] make flakey test more robust (#6277) Merge pull request 6277 --- test/test_static_file.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_static_file.rb b/test/test_static_file.rb index f74d8c1a001..e306d2a299e 100644 --- a/test/test_static_file.rb +++ b/test/test_static_file.rb @@ -134,7 +134,7 @@ def setup_static_file_with_defaults(base, dir, name, defaults) end should "know its last modification time" do - assert_equal Time.new.to_i, @static_file.mtime + assert_equal File.stat(@static_file.path).mtime.to_i, @static_file.mtime end should "only set modified time if not a symlink" do From adde25120cce8444b7a97657dbb3187954c3500c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 6 Aug 2017 10:49:02 -0400 Subject: [PATCH 2310/4996] Update history to reflect merge of #6277 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 93afaf6897b..597b6e17406 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * fix tests (#6240) * Define path with __dir__ (#6087) * exit site.process sooner (#6239) + * make flakey test more robust (#6277) ### Minor Enhancements From c8eee7ffcbf5c8067ebde43edbb311b78ba6e7d7 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 7 Aug 2017 21:43:33 +0530 Subject: [PATCH 2311/4996] Access custom config array throughout session (#6200) Merge pull request 6200 --- lib/jekyll/configuration.rb | 2 +- lib/jekyll/drops/site_drop.rb | 3 +++ test/test_configuration.rb | 28 +++++++++++++++++++++------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 2931cba4500..a9965d29f5b 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -156,7 +156,7 @@ def config_files(override) ) # Get configuration from /_config.yml or / - config_files = override.delete("config") + config_files = override["config"] if config_files.to_s.empty? default = %w(yml yaml).find(-> { "yml" }) do |ext| File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}")) diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index cb4a007eb15..20b0332a43c 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -38,6 +38,9 @@ def collections @site_collections ||= @obj.collections.values.sort_by(&:label).map(&:to_liquid) end + # return nil for `{{ site.config }}` even if --config was passed via CLI + def config; end + private def_delegator :@obj, :config, :fallback_data end diff --git a/test/test_configuration.rb b/test/test_configuration.rb index dddb61b8671..3dbd5ca1c4e 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -356,7 +356,10 @@ class TestConfiguration < JekyllUnitTest .and_return({ "baseurl" => "http://example.com" }) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") assert_equal \ - site_configuration({ "baseurl" => "http://example.com" }), + site_configuration({ + "baseurl" => "http://example.com", + "config" => @paths[:other], + }), Jekyll.configuration(test_config.merge({ "config" => @paths[:other] })) end @@ -368,7 +371,10 @@ class TestConfiguration < JekyllUnitTest .and_return({ "baseurl" => "http://example.com" }) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") assert_equal \ - site_configuration({ "baseurl" => "http://example.com" }), + site_configuration({ + "baseurl" => "http://example.com", + "config" => @paths[:other], + }), Jekyll.configuration(test_config.merge({ :config => @paths[:other] })) end @@ -376,15 +382,18 @@ class TestConfiguration < JekyllUnitTest allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") assert_equal \ - site_configuration, + site_configuration({ "config" => [@paths[:empty]] }), Jekyll.configuration(test_config.merge({ "config" => [@paths[:empty]] })) end should "successfully load a TOML file" do Jekyll.logger.log_level = :warn assert_equal \ - site_configuration({ "baseurl" => "/you-beautiful-blog-you", - "title" => "My magnificent site, wut", }), + site_configuration({ + "baseurl" => "/you-beautiful-blog-you", + "title" => "My magnificent site, wut", + "config" => [@paths[:toml]], + }), Jekyll.configuration(test_config.merge({ "config" => [@paths[:toml]] })) Jekyll.logger.log_level = :info end @@ -399,7 +408,9 @@ class TestConfiguration < JekyllUnitTest allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:toml]}") assert_equal( - site_configuration, + site_configuration({ + "config" => [@paths[:default], @paths[:other], @paths[:toml]], + }), Jekyll.configuration( test_config.merge( { "config" => [@paths[:default], @paths[:other], @paths[:toml]] } @@ -424,7 +435,10 @@ class TestConfiguration < JekyllUnitTest .to receive(:puts) .with("Configuration file: #{@paths[:other]}") assert_equal \ - site_configuration({ "baseurl" => "http://example.com" }), + site_configuration({ + "baseurl" => "http://example.com", + "config" => [@paths[:default], @paths[:other]], + }), Jekyll.configuration( test_config.merge({ "config" => [@paths[:default], @paths[:other]] }) ) From 3fab69e3c966076f3ccc92fd6abbc42a11867343 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 7 Aug 2017 12:13:35 -0400 Subject: [PATCH 2312/4996] Update history to reflect merge of #6200 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 597b6e17406..4605be9e948 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Fix serving files that clash with directories (#6222) (#6231) * Bump supported Ruby version to `>= 2.1.0` (#6220) * set `LiquidError#template_name` for errors in included file (#6206) + * Access custom config array throughout session (#6200) ### Bug Fixes From bd31986ad6073d8174549fc75820a003cbd46b25 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 8 Aug 2017 23:10:38 -0400 Subject: [PATCH 2313/4996] Fix Drop#key? so it can handle a nil argument (#6281) Merge pull request 6281 --- lib/jekyll/drops/drop.rb | 4 ++-- test/test_drop.rb | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 1ded11eb7d2..09623ef9ac0 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -72,7 +72,7 @@ def [](key) def []=(key, val) if respond_to?("#{key}=") public_send("#{key}=", val) - elsif respond_to? key + elsif respond_to?(key.to_s) if self.class.mutable? @mutations[key] = val else @@ -106,7 +106,7 @@ def key?(key) if self.class.mutable @mutations.key?(key) else - respond_to?(key) || fallback_data.key?(key) + !key.nil? && (respond_to?(key) || fallback_data.key?(key)) end end diff --git a/test/test_drop.rb b/test/test_drop.rb index 00d2116471d..eb23feb0f20 100644 --- a/test/test_drop.rb +++ b/test/test_drop.rb @@ -15,6 +15,10 @@ class TestDrop < JekyllUnitTest @drop = @document.to_liquid end + should "reject 'nil' key" do + refute @drop.key?(nil) + end + should "raise KeyError if key is not found and no default provided" do assert_raises KeyError do @drop.fetch("not_existing_key") From fbabb1eb26d78e8fc6ea11c0d938f00ad2e44a59 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 8 Aug 2017 23:10:39 -0400 Subject: [PATCH 2314/4996] Update history to reflect merge of #6281 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4605be9e948..fddedfbcebc 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,7 @@ * Update theme-template README to note 'assets' directory (#6257) * Memoize the return value of Document#url (#6266) * delegate `StaticFile#to_json` to `StaticFile#to_liquid` (#6273) + * Fix Drop#key? so it can handle a nil argument (#6281) ### Documentation From bc962fe7d837927789b540f29903b7809800063a Mon Sep 17 00:00:00 2001 From: lymaconsulting Date: Tue, 8 Aug 2017 23:25:04 -0400 Subject: [PATCH 2315/4996] Customizing url in collection elements clarified (#6264) Merge pull request 6264 --- docs/_docs/collections.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 6114e08ec9b..39bd99eb0d7 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -198,7 +198,13 @@ each of the following `permalink` configurations will produce the document struc

    :title

    -

    The document's lowercase title (as defined in its front matter), with every sequence of spaces and non-alphanumeric characters replaced by a hyphen. If the document does not define a title in its front matter, this is equivalent to name.

    +

    + The :title template variable will take the + slug front matter + variable value if any is present in the document; if none is + defined then :title will be equivalent to + :name, aka the slug generated from the filename. +

    From e39558f8370916b480471edfcc44f3a7625bf40e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 8 Aug 2017 23:25:06 -0400 Subject: [PATCH 2316/4996] Update history to reflect merge of #6264 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fddedfbcebc..88eb8742404 100644 --- a/History.markdown +++ b/History.markdown @@ -39,6 +39,7 @@ ### Site Enhancements * Adding DevKit helpers (#6225) + * Customizing url in collection elements clarified (#6264) ## 3.5.1 / 2017-07-17 From a4181459b915d654bfccb2279f24022cd84a696a Mon Sep 17 00:00:00 2001 From: Pedro Lamas Date: Thu, 10 Aug 2017 00:16:05 +0100 Subject: [PATCH 2317/4996] Fixes minor typo in post text (#6283) Merge pull request 6283 --- docs/_posts/2017-06-14-jekyll-3-5-0-released.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2017-06-14-jekyll-3-5-0-released.markdown b/docs/_posts/2017-06-14-jekyll-3-5-0-released.markdown index 54d1aed77df..28d21a4e869 100644 --- a/docs/_posts/2017-06-14-jekyll-3-5-0-released.markdown +++ b/docs/_posts/2017-06-14-jekyll-3-5-0-released.markdown @@ -9,7 +9,7 @@ categories: [release] Good news! Nearly 400 commits later, Jekyll 3.5.0 has been released into the wild. Some new shiny things you might want to test out: -- Jekyll now uses Liquid 4, the latest! It comes with whitespace control, new filters `concat` annd `compact`, loop performance improvements and [many fixes](https://github.com/Shopify/liquid/blob/master/History.md#400--2016-12-14--branch-4-0-stable) +- Jekyll now uses Liquid 4, the latest! It comes with whitespace control, new filters `concat` and `compact`, loop performance improvements and [many fixes](https://github.com/Shopify/liquid/blob/master/History.md#400--2016-12-14--branch-4-0-stable) - Themes can specify runtime dependencies (in their gemspecs) and we'll require those. This makes it easier for theme writers to use plugins. - Speaking of themes, we'll properly handle the discrepancy between a convertible file in the local site and a static file in the theme. Overriding a file locally now doesn't matter if it's convertible or static. - Pages, posts, and other documents can now access layout variables via `{% raw %}{{ layout }}{% endraw %}`. From 29b96f440815419ad3c4fbdc9749537903c5b291 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 9 Aug 2017 19:16:06 -0400 Subject: [PATCH 2318/4996] Update history to reflect merge of #6283 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 88eb8742404..ddcee9744e4 100644 --- a/History.markdown +++ b/History.markdown @@ -35,6 +35,7 @@ * Fix a typo in `custom-404-page.md` (#6218) * Docs: fix links to issues in History.markdown (#6255) * Update deprecated gems key to plugins. (#6262) + * Fixes minor typo in post text (#6283) ### Site Enhancements From 045226f160d7cfe8bc2c7bc6d4bbce660f3ddd2d Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 10 Aug 2017 11:14:52 -0400 Subject: [PATCH 2319/4996] Guard against type error in absolute url (#6280) Merge pull request 6280 --- lib/jekyll/filters/url_filters.rb | 4 ++-- test/test_filters.rb | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/filters/url_filters.rb b/lib/jekyll/filters/url_filters.rb index 5bae1b1794e..151c4e71a55 100644 --- a/lib/jekyll/filters/url_filters.rb +++ b/lib/jekyll/filters/url_filters.rb @@ -12,9 +12,9 @@ module URLFilters # Returns the absolute URL as a String. def absolute_url(input) return if input.nil? - return input if Addressable::URI.parse(input).absolute? + return input if Addressable::URI.parse(input.to_s).absolute? site = @context.registers[:site] - return relative_url(input).to_s if site.config["url"].nil? + return relative_url(input) if site.config["url"].nil? Addressable::URI.parse( site.config["url"].to_s + relative_url(input) ).normalize.to_s diff --git a/test/test_filters.rb b/test/test_filters.rb index cb95a6449fb..0499b73c2df 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -440,6 +440,10 @@ def select; end filter = make_filter_mock({ "url" => Value.new(proc { "http://example.org" }) }) assert_equal "http://example.org#{page_url}", filter.absolute_url(page_url) end + + should "not raise a TypeError when passed a hash" do + assert @filter.absolute_url({ "foo" => "bar" }) + end end context "relative_url filter" do From dfdefcf367599000e1841cb6c35eae33014fdc9e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Aug 2017 11:14:54 -0400 Subject: [PATCH 2320/4996] Update history to reflect merge of #6280 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ddcee9744e4..80ac17128b0 100644 --- a/History.markdown +++ b/History.markdown @@ -29,6 +29,7 @@ * Memoize the return value of Document#url (#6266) * delegate `StaticFile#to_json` to `StaticFile#to_liquid` (#6273) * Fix Drop#key? so it can handle a nil argument (#6281) + * Guard against type error in absolute url (#6280) ### Documentation From 3f0c77cfd5bde557ce0e89b6684d50a0ddd37dba Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Aug 2017 16:27:14 -0400 Subject: [PATCH 2321/4996] Add a quick test for DataReader (#6284) Merge pull request 6284 --- lib/jekyll/readers/data_reader.rb | 4 ++-- test/test_data_reader.rb | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 test/test_data_reader.rb diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb index e2671f2d3b4..445d548802b 100644 --- a/lib/jekyll/readers/data_reader.rb +++ b/lib/jekyll/readers/data_reader.rb @@ -70,8 +70,8 @@ def read_data_file(path) end def sanitize_filename(name) - name.gsub!(%r![^\w\s-]+|(?<=^|\b\s)\s+(?=$|\s?\b)!, "".freeze) - name.gsub(%r!\s+!, "_") + name.gsub(%r![^\w\s-]+|(?<=^|\b\s)\s+(?=$|\s?\b)!, "") + .gsub(%r!\s+!, "_") end end end diff --git a/test/test_data_reader.rb b/test/test_data_reader.rb new file mode 100644 index 00000000000..038ec679e3d --- /dev/null +++ b/test/test_data_reader.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "helper" + +class TestDataReader < JekyllUnitTest + context "#sanitize_filename" do + setup do + @reader = DataReader.new(fixture_site) + end + + should "remove evil characters" do + assert_equal "helpwhathaveIdone", @reader.sanitize_filename( + "help/what^&$^#*(!^%*!#haveId&&&&&&&&&one" + ) + end + end +end From 073d2f1e6a7519d91986ab3d5223ec93c94026d4 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Aug 2017 16:27:16 -0400 Subject: [PATCH 2322/4996] Update history to reflect merge of #6284 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 80ac17128b0..71f5e0daee3 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * Define path with __dir__ (#6087) * exit site.process sooner (#6239) * make flakey test more robust (#6277) + * Add a quick test for DataReader (#6284) ### Minor Enhancements From c059675bcc782622d63e10b303bfd105dee5689d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 10 Aug 2017 16:40:06 -0400 Subject: [PATCH 2323/4996] script/backport-pr: commit message no longer includes the # (#6289) Merge pull request 6289 --- script/backport-pr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/backport-pr b/script/backport-pr index 5ef6c4dec7a..7c74edea309 100755 --- a/script/backport-pr +++ b/script/backport-pr @@ -45,7 +45,7 @@ git clean -q -fdx git pull -q git checkout -q -f -B $prbranch -commit=`git log -1 --pretty=%H "--grep=Merge pull request #$pr" "--grep=Merge branch '.*$headref'" master` +commit=`git log -1 --pretty=%H "--grep=Merge pull request $pr" "--grep=Merge branch '.*$headref'" master` echo "Backporting:\n" From a761a7acbc1cfae35ef939df012caaa4642bb882 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 10 Aug 2017 16:40:08 -0400 Subject: [PATCH 2324/4996] Update history to reflect merge of #6289 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 71f5e0daee3..e17a670fb7c 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,7 @@ * exit site.process sooner (#6239) * make flakey test more robust (#6277) * Add a quick test for DataReader (#6284) + * script/backport-pr: commit message no longer includes the # (#6289) ### Minor Enhancements From d4443e43d6887cce12905891cd3b7df52a3262bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Jaenisch?= Date: Sat, 12 Aug 2017 21:18:51 +0200 Subject: [PATCH 2325/4996] Execute build command using bundle. (#6274) Merge pull request 6274 --- docs/_docs/deployment-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md index ebf8bf12732..3146b372e79 100644 --- a/docs/_docs/deployment-methods.md +++ b/docs/_docs/deployment-methods.md @@ -47,7 +47,7 @@ TMP_GIT_CLONE=$HOME/tmp/myrepo PUBLIC_WWW=/var/www/myrepo git clone $GIT_REPO $TMP_GIT_CLONE -jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW +bundle exec jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW rm -Rf $TMP_GIT_CLONE exit ``` From c810d761f7981bc3144c37c42098a9eaf760e7f1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 12 Aug 2017 15:18:52 -0400 Subject: [PATCH 2326/4996] Update history to reflect merge of #6274 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e17a670fb7c..a054598ad92 100644 --- a/History.markdown +++ b/History.markdown @@ -39,6 +39,7 @@ * Docs: fix links to issues in History.markdown (#6255) * Update deprecated gems key to plugins. (#6262) * Fixes minor typo in post text (#6283) + * Execute build command using bundle. (#6274) ### Site Enhancements From 722c49cd6feee44bead83c28d829b5003bb10c06 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 12 Aug 2017 16:08:10 -0400 Subject: [PATCH 2327/4996] script/backport-pr: cherry-pick the commit properly We used to do traditional merges but since we started doing squash merges, we don't want the -m1 flag for git-cherry-pick. --- script/backport-pr | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/script/backport-pr b/script/backport-pr index 7c74edea309..a2b2c33fea1 100755 --- a/script/backport-pr +++ b/script/backport-pr @@ -53,7 +53,9 @@ git log -1 $commit conflicts="" -git cherry-pick -x --allow-empty -m1 $commit &> /dev/null || { +# If we used regular merges, we'd use the `-m 1` flag for the cherry-pick +# command, but since we do squash-merges, we don't want this. +git cherry-pick -x --allow-empty $commit &> /dev/null || { unmerged=$(git ls-files --unmerged --stage | cut -f 2 -d$'\t' | uniq) conflicts="\n\nConflicting files:" for file in $unmerged; do From 48fafd9fc0bcc1d06ba6c3622478d31e6bad5ad6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 12 Aug 2017 16:28:34 -0400 Subject: [PATCH 2328/4996] Release :gem: 3.5.2 --- History.markdown | 11 +++++++++++ lib/jekyll/version.rb | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index a054598ad92..bcc9ceaac94 100644 --- a/History.markdown +++ b/History.markdown @@ -46,6 +46,17 @@ * Adding DevKit helpers (#6225) * Customizing url in collection elements clarified (#6264) +## 3.5.2 / 2017-08-12 + +### Bug Fixes + + * Backport #6281 for v3.5.x: Fix `Drop#key?` so it can handle a nil argument (#6288) + * Backport #6280 for v3.5.x: Guard against type error in `absolute_url` (#6287) + * Backport #6266 for v3.5.x: Memoize the return value of `Document#url` (#6301) + * Backport #6273 for v3.5.x: delegate `StaticFile#to_json` to `StaticFile#to_liquid` (#6302) + * Backport #6226 for v3.5.x: `Reader#read_directories`: guard against an entry not being a directory (#6304) + * Backport #6247 for v3.5.x: kramdown: symbolize keys in-place (#6303) + ## 3.5.1 / 2017-07-17 ### Minor Enhancements diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 6a27620408a..46b238124be 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Jekyll - VERSION = "3.5.1".freeze + VERSION = "3.5.2".freeze end From 97c0c6cc7735a97a482221f80e71c37bad40a863 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 12 Aug 2017 16:30:47 -0400 Subject: [PATCH 2329/4996] Update site for v3.5.2 --- docs/_docs/history.md | 14 ++++++++++++++ docs/latest_version.txt | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 725321bddae..d64d0b1c0e5 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,6 +4,20 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.5.2 / 2017-08-12 +{: #v3-5-2} + +### Bug Fixes +{: #bug-fixes-v3-5-2} + +- Backport [#6281]({{ site.repository }}/issues/6281) for v3.5.x: Fix `Drop#key?` so it can handle a nil argument ([#6288]({{ site.repository }}/issues/6288)) +- Backport [#6280]({{ site.repository }}/issues/6280) for v3.5.x: Guard against type error in `absolute_url` ([#6287]({{ site.repository }}/issues/6287)) +- Backport [#6266]({{ site.repository }}/issues/6266) for v3.5.x: Memoize the return value of `Document#url` ([#6301]({{ site.repository }}/issues/6301)) +- Backport [#6273]({{ site.repository }}/issues/6273) for v3.5.x: delegate `StaticFile#to_json` to `StaticFile#to_liquid` ([#6302]({{ site.repository }}/issues/6302)) +- Backport [#6226]({{ site.repository }}/issues/6226) for v3.5.x: `Reader#read_directories`: guard against an entry not being a directory ([#6304]({{ site.repository }}/issues/6304)) +- Backport [#6247]({{ site.repository }}/issues/6247) for v3.5.x: kramdown: symbolize keys in-place ([#6303]({{ site.repository }}/issues/6303)) + + ## 3.5.1 / 2017-07-17 {: #v3-5-1} diff --git a/docs/latest_version.txt b/docs/latest_version.txt index d5c0c991428..87ce492908a 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.5.1 +3.5.2 From 07d4c36652b7d4acb9851fb547de61ee281f0726 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 12 Aug 2017 16:36:29 -0400 Subject: [PATCH 2330/4996] Add release post for v3.5.2 --- .../2017-08-12-jekyll-3-5-2-released.markdown | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 docs/_posts/2017-08-12-jekyll-3-5-2-released.markdown diff --git a/docs/_posts/2017-08-12-jekyll-3-5-2-released.markdown b/docs/_posts/2017-08-12-jekyll-3-5-2-released.markdown new file mode 100644 index 00000000000..ecf91be573f --- /dev/null +++ b/docs/_posts/2017-08-12-jekyll-3-5-2-released.markdown @@ -0,0 +1,20 @@ +--- +title: 'Jekyll 3.5.2 Released' +date: 2017-08-12 16:31:40 -0400 +author: parkr +version: 3.5.2 +categories: [release] +--- + +3.5.2 is out with 6 great bug fixes, most notably one which should dramatically speed up generation of your site! In testing #6266, jekyllrb.com generation when from 18 seconds down to 8! Here is the full line-up of fixes: + + * Backport #6266 for v3.5.x: Memoize the return value of `Document#url` (#6301) + * Backport #6247 for v3.5.x: kramdown: symbolize keys in-place (#6303) + * Backport #6281 for v3.5.x: Fix `Drop#key?` so it can handle a nil argument (#6288) + * Backport #6280 for v3.5.x: Guard against type error in `absolute_url` (#6287) + * Backport #6273 for v3.5.x: delegate `StaticFile#to_json` to `StaticFile#to_liquid` (#6302) + * Backport #6226 for v3.5.x: `Reader#read_directories`: guard against an entry not being a directory (#6304 + +A [full history](/docs/history/#v3-5-2) is available for your perusal. As always, please file bugs if you encounter them! Opening a pull request with a failing test for your expected behaviour is the easiest way for us to address the issue since we have a reproducible example to test again. Short of that, please fill out our issue template to the best of your ability and we'll try to get to it quickly! + +Happy Jekylling! From 6b8de2a75794be30d9816cf44e914088fca9a31e Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 12 Aug 2017 16:42:53 -0400 Subject: [PATCH 2331/4996] 3.5.2: thank the contributors --- docs/_posts/2017-08-12-jekyll-3-5-2-released.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/_posts/2017-08-12-jekyll-3-5-2-released.markdown b/docs/_posts/2017-08-12-jekyll-3-5-2-released.markdown index ecf91be573f..0534e49eb92 100644 --- a/docs/_posts/2017-08-12-jekyll-3-5-2-released.markdown +++ b/docs/_posts/2017-08-12-jekyll-3-5-2-released.markdown @@ -17,4 +17,7 @@ categories: [release] A [full history](/docs/history/#v3-5-2) is available for your perusal. As always, please file bugs if you encounter them! Opening a pull request with a failing test for your expected behaviour is the easiest way for us to address the issue since we have a reproducible example to test again. Short of that, please fill out our issue template to the best of your ability and we'll try to get to it quickly! +Many thanks to our contributors without whom this release could not be +possible: Ben Balter & Kyle Zhao. + Happy Jekylling! From 4c15b9e5e4ed659fabbd16dc5c563f099e0d04a2 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 17 Aug 2017 11:16:18 -0400 Subject: [PATCH 2332/4996] [WIP] Add shim that works for both Rouge 1 and Rouge 2 (#5919) Merge pull request 5919 --- .travis.yml | 2 + Gemfile | 4 +- jekyll.gemspec | 5 +- .../converters/markdown/redcarpet_parser.rb | 2 +- lib/jekyll/tags/highlight.rb | 8 ++- lib/jekyll/utils.rb | 1 + lib/jekyll/utils/rouge.rb | 19 +++++ test/test_kramdown.rb | 10 ++- test/test_tags.rb | 69 +++++++++++++++++-- 9 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 lib/jekyll/utils/rouge.rb diff --git a/.travis.yml b/.travis.yml index 587ca6f36f1..00e21f93e19 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,8 @@ rvm: matrix: include: + - rvm: *ruby1 + env: TEST_SUITE=test ROUGE=1.11.1 - rvm: *ruby1 env: TEST_SUITE=fmt - rvm: *ruby1 diff --git a/Gemfile b/Gemfile index 0dcb47767d4..216c2626f19 100644 --- a/Gemfile +++ b/Gemfile @@ -5,6 +5,8 @@ gemspec :name => "jekyll" gem "rake", "~> 12.0" +gem "rouge", ENV["ROUGE"] if ENV["ROUGE"] + # Dependency of jekyll-mentions. RubyGems in Ruby 2.1 doesn't shield us from this. gem "activesupport", "~> 4.2", :groups => [:test_legacy, :site] if RUBY_VERSION < "2.2.2" @@ -71,7 +73,7 @@ group :jekyll_optional_dependencies do gem "jekyll-gist" gem "jekyll-paginate" gem "jekyll-redirect-from" - gem "kramdown", "~> 1.9" + gem "kramdown", "~> 1.14" gem "mime-types", "~> 3.0" gem "rdoc", "~> 5.0" gem "toml", "~> 0.1.0" diff --git a/jekyll.gemspec b/jekyll.gemspec index 87031a8000c..606d09daae4 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -35,10 +35,11 @@ Gem::Specification.new do |s| s.add_runtime_dependency("colorator", "~> 1.0") s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") s.add_runtime_dependency("jekyll-watch", "~> 1.1") - s.add_runtime_dependency("kramdown", "~> 1.3") + s.add_runtime_dependency("kramdown", "~> 1.14") s.add_runtime_dependency("liquid", "~> 4.0") s.add_runtime_dependency("mercenary", "~> 0.3.3") s.add_runtime_dependency("pathutil", "~> 0.9") - s.add_runtime_dependency("rouge", "~> #{ENV["ROUGE_VERSION"] || "1.7"}") + rouge_versions = ENV["ROUGE_VERSION"] ? ["~> #{ENV["ROUGE_VERSION"]}"] : [">= 1.7", "< 3"] + s.add_runtime_dependency("rouge", *rouge_versions) s.add_runtime_dependency("safe_yaml", "~> 1.0") end diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb index fae09621da2..35c6e5feef7 100644 --- a/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -55,7 +55,7 @@ def block_code(code, lang) protected def rouge_formatter(_lexer) - Rouge::Formatters::HTML.new(:wrap => false) + Jekyll::Utils::Rouge.html_formatter(:wrap => false) end end diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 7ea95b0b101..687f9b717b3 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -111,10 +111,12 @@ def render_pygments(code, is_safe) end def render_rouge(code) - Jekyll::External.require_with_graceful_fail("rouge") - formatter = Rouge::Formatters::HTML.new( + formatter = Jekyll::Utils::Rouge.html_formatter( :line_numbers => @highlight_options[:linenos], - :wrap => false + :wrap => false, + :css_class => "highlight", + :gutter_class => "gutter", + :code_class => "code" ) lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText formatter.format(lexer.lex(code)) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index c9dcf2fd324..70605a34c18 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -7,6 +7,7 @@ module Utils autoload :Ansi, "jekyll/utils/ansi" autoload :Exec, "jekyll/utils/exec" autoload :Platforms, "jekyll/utils/platforms" + autoload :Rouge, "jekyll/utils/rouge" autoload :WinTZ, "jekyll/utils/win_tz" # Constants for use in #slugify diff --git a/lib/jekyll/utils/rouge.rb b/lib/jekyll/utils/rouge.rb new file mode 100644 index 00000000000..a00a5f9e743 --- /dev/null +++ b/lib/jekyll/utils/rouge.rb @@ -0,0 +1,19 @@ +module Jekyll + module Utils + module Rouge + + def self.html_formatter(*args) + Jekyll::External.require_with_graceful_fail("rouge") + if old_api? + ::Rouge::Formatters::HTML.new(*args) + else + ::Rouge::Formatters::HTMLLegacy.new(*args) + end + end + + def self.old_api? + ::Rouge.version.to_s < "2" + end + end + end +end diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index 3861416ff2e..e1bf15a4b4e 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -17,7 +17,10 @@ class TestKramdown < JekyllUnitTest "syntax_highlighter" => "rouge", "syntax_highlighter_opts" => { - "bold_every" => 8, "css" => :class, + "bold_every" => 8, + "css" => :class, + "css_class" => "highlight", + "formatter" => Jekyll::Utils::Rouge.html_formatter.class, }, }, } @@ -82,8 +85,9 @@ class TestKramdown < JekyllUnitTest puts "Hello World" ~~~ MARKDOWN - - selector = "div.highlighter-rouge>pre.highlight>code" + div_highlight = "" + div_highlight = ">div.highlight" unless Utils::Rouge.old_api? + selector = "div.highlighter-rouge#{div_highlight}>pre.highlight>code" refute result.css(selector).empty? end diff --git a/test/test_tags.rb b/test/test_tags.rb index 7a60ec9dc18..8a7ed7d0e6e 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -319,7 +319,20 @@ def highlight_block_with_opts(options_string) ) end - should "render markdown with rouge with line numbers" do + should "render markdown with rouge 2 with line numbers" do + skip "Skipped because using an older version of Rouge" if Utils::Rouge.old_api? + assert_match( + %() + + %() + + %() + + %(
    ) + + %(
    1\n
    test
    ), + @result + ) + end + + should "render markdown with rouge 1 with line numbers" do + skip "Skipped because using a newer version of Rouge" unless Utils::Rouge.old_api? assert_match( %() + %(
    ) + @@ -331,6 +344,42 @@ def highlight_block_with_opts(options_string) end end + context "post content has raw tag" do + setup do + content = <<-CONTENT +--- +title: This is a test +--- + +```liquid +{% raw %} +{{ site.baseurl }}{% link _collection/name-of-document.md %} +{% endraw %} +``` +CONTENT + create_post(content) + end + + should "render markdown with rouge 1" do + skip "Skipped because using a newer version of Rouge" unless Utils::Rouge.old_api? + + assert_match( + %(
    ),
    +          @result
    +        )
    +      end
    +
    +      should "render markdown with rouge 2" do
    +        skip "Skipped because using an older version of Rouge" if Utils::Rouge.old_api?
    +
    +        assert_match(
    +          %(
    ) + + %(
    ),
    +          @result
    +        )
    +      end
    +    end
    +
         context "post content has highlight with file reference" do
           setup do
             fill_post("./jekyll.gemspec")
    @@ -418,13 +467,23 @@ def highlight_block_with_opts(options_string)
     EOS
           end
     
    -      should "should stop highlighting at boundary" do
    +      should "should stop highlighting at boundary with rouge 2" do
    +        skip "Skipped because using an older version of Rouge" if Utils::Rouge.old_api?
             expected = <<-EOS
    -

    This is not yet highlighted

    +

    This is not yet highlighted

    \n +
    1
    +
    test
    \n +

    This should not be highlighted, right?

    +EOS + assert_match(expected, @result) + end + should "should stop highlighting at boundary with rouge 1" do + skip "Skipped because using a newer version of Rouge" unless Utils::Rouge.old_api? + expected = <<-EOS +

    This is not yet highlighted

    \n
    1
    test
    -
    - +
    \n

    This should not be highlighted, right?

    EOS assert_match(expected, @result) From 21fa0d7755d26d2cbce864c11c67b68206580751 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 17 Aug 2017 11:16:20 -0400 Subject: [PATCH 2333/4996] Update history to reflect merge of #5919 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bcc9ceaac94..d13c06678d5 100644 --- a/History.markdown +++ b/History.markdown @@ -19,6 +19,7 @@ * Bump supported Ruby version to `>= 2.1.0` (#6220) * set `LiquidError#template_name` for errors in included file (#6206) * Access custom config array throughout session (#6200) + * [WIP] Add shim that works for both Rouge 1 and Rouge 2 (#5919) ### Bug Fixes From 8e9605a32cba6bc4be3ebcc68f14670807a1e642 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 17 Aug 2017 14:06:06 -0400 Subject: [PATCH 2334/4996] Update history note for #5919 --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index d13c06678d5..805219c7df4 100644 --- a/History.markdown +++ b/History.markdown @@ -19,7 +19,7 @@ * Bump supported Ruby version to `>= 2.1.0` (#6220) * set `LiquidError#template_name` for errors in included file (#6206) * Access custom config array throughout session (#6200) - * [WIP] Add shim that works for both Rouge 1 and Rouge 2 (#5919) + * Add support for Rouge 2, in addition to Rouge 1 (#5919) ### Bug Fixes From 62c822e834190b59c2f71dec04c1c3b9c6e7ce79 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 17 Aug 2017 22:19:53 -0400 Subject: [PATCH 2335/4996] Utils::Rouge: add missing frozen_string_literal comment. --- lib/jekyll/utils/rouge.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/jekyll/utils/rouge.rb b/lib/jekyll/utils/rouge.rb index a00a5f9e743..d1befa1a212 100644 --- a/lib/jekyll/utils/rouge.rb +++ b/lib/jekyll/utils/rouge.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Jekyll module Utils module Rouge From 9b6e85203a573be06148e5ce7efce6ea37c1ee88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Ku=C5=9B?= Date: Fri, 18 Aug 2017 17:09:07 +0200 Subject: [PATCH 2336/4996] name unification (#6317) Merge pull request 6317 --- docs/_docs/continuous-integration/buddyworks.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/_docs/continuous-integration/buddyworks.md b/docs/_docs/continuous-integration/buddyworks.md index 8729c7c8d86..5cce1f75487 100644 --- a/docs/_docs/continuous-integration/buddyworks.md +++ b/docs/_docs/continuous-integration/buddyworks.md @@ -1,10 +1,10 @@ --- -title: "BuddyWorks" +title: "Buddy" --- -[BuddyWorks][buddyworks-homepage] is a [Docker][docker-homepage]-based CI server that you can set up in 15-20 minutes to build, test, and deploy your Jekyll websites. It supports [GitHub][github-homepage], [Bitbucket][bitbucket-homepage], and [GitLab][gitlab-homepage] repositories, and can be installed on-premises or used in cloud. The following guide will show you how to set up a free environment to build and test your Jekyll project. +[Buddy][buddy-homepage] is a [Docker][docker-homepage]-based CI server that you can set up in 15-20 minutes to build, test, and deploy your Jekyll websites. It supports [GitHub][github-homepage], [Bitbucket][bitbucket-homepage], and [GitLab][gitlab-homepage] repositories, and can be installed on-premises or used in cloud. The following guide will show you how to set up a free environment to build and test your Jekyll project. -[buddyworks-homepage]: https://buddy.works +[buddy-homepage]: https://buddy.works [docker-homepage]: https://www.docker.com/ [github-homepage]: https://github.com [bitbucket-homepage]: https://bitbucket.org/ @@ -12,7 +12,7 @@ title: "BuddyWorks" ## 1. Getting started -1. Log in at [https://buddy.works](https://buddy.works) with your GitHub/Bitbucket account or email +1. Log in at [https://buddy.works][buddy-homepage] with your GitHub/Bitbucket account or email 2. Choose your Git provider and select or push your Jekyll Project 3. Create a new pipeline and set the trigger mode to 'On every push' 4. Add and configure the Jekyll action and save the pipeline @@ -45,7 +45,7 @@ If you prefer configuration as code over GUI, you can generate a `buddy.yml` tha ## 4. Setting up on-premises server -The self-hosted version of BuddyWorks can be installed on any type of server supporting Docker, including [Linux][bw-linux], [Mac][bw-mac], [AWS EC2][bw-aws-ec2], [DigitalOcean][bw-digitalocean], and [Microsoft Azure][bw-azure]. +The self-hosted version of Buddy can be installed on any type of server supporting Docker, including [Linux][bw-linux], [Mac][bw-mac], [AWS EC2][bw-aws-ec2], [DigitalOcean][bw-digitalocean], and [Microsoft Azure][bw-azure]. [bw-linux]: https://buddy.works/knowledge/standalone/installation-linux [bw-mac]: https://buddy.works/knowledge/standalone/installation-mac-osx @@ -55,8 +55,8 @@ The self-hosted version of BuddyWorks can be installed on any type of server sup ## 5. Questions? -This entire guide is open-source. Go ahead and [edit it][jekyll-docs-ci-buddyworks] if you want to expand it or have a fix or [ask for help][jekyll-help] if you run into trouble and need assistance. BuddyWorks also has an [online community][buddyworks-forum] for help. +This entire guide is open-source. Go ahead and [edit it][jekyll-docs-ci-buddy] if you want to expand it or have a fix or [ask for help][jekyll-help] if you run into trouble and need assistance. Buddy also has an [online community][buddy-forum] for help. -[jekyll-docs-ci-buddyworks]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/buddyworks.md +[jekyll-docs-ci-buddy]: https://github.com/jekyll/jekyll/edit/master/docs/_docs/continuous-integration/buddyworks.md [jekyll-help]: https://jekyllrb.com/help/ -[buddyworks-forum]: http://forum.buddy.works/ +[buddy-forum]: http://forum.buddy.works/ From 2ce17697d318a13fe6e6fdc28e22c1a6bfeba728 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 18 Aug 2017 11:09:08 -0400 Subject: [PATCH 2337/4996] Update history to reflect merge of #6317 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 805219c7df4..828b08bb935 100644 --- a/History.markdown +++ b/History.markdown @@ -41,6 +41,7 @@ * Update deprecated gems key to plugins. (#6262) * Fixes minor typo in post text (#6283) * Execute build command using bundle. (#6274) + * name unification - buddy details (#6317) ### Site Enhancements From db4ab43bdb12b242fcb1ad9c48b32870c8bc9371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Ku=C5=9B?= Date: Fri, 18 Aug 2017 17:09:34 +0200 Subject: [PATCH 2338/4996] name unification (#6318) Merge pull request 6318 --- docs/_docs/continuous-integration/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/continuous-integration/index.md b/docs/_docs/continuous-integration/index.md index a9a12267502..c0826fc54a6 100644 --- a/docs/_docs/continuous-integration/index.md +++ b/docs/_docs/continuous-integration/index.md @@ -7,4 +7,4 @@ Continuous Integration (CI) enables you to publish your Jekyll generated website * [Travis CI](travis-ci) * [CircleCI](circleci) -* [BuddyWorks](buddyworks) +* [Buddy](buddyworks) From 54c1e5515edee52d121122341b74d612be3d08ea Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 18 Aug 2017 11:09:36 -0400 Subject: [PATCH 2339/4996] Update history to reflect merge of #6318 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 828b08bb935..e11de9c77da 100644 --- a/History.markdown +++ b/History.markdown @@ -42,6 +42,7 @@ * Fixes minor typo in post text (#6283) * Execute build command using bundle. (#6274) * name unification - buddy details (#6317) + * name unification - application index (#6318) ### Site Enhancements From 22cc59905b2100d9f3358abbeeb45f54b44a2511 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 18 Aug 2017 11:38:32 -0400 Subject: [PATCH 2340/4996] Add CODEOWNERS file to help automate reviews. Documentation from GitHub: https://help.github.com/articles/about-codeowners/ jekyllbot does too much already -- I'd like to see GitHub help us keep organized. This is also an exercise in logically splitting up the codebase. The build team is pretty overloaded it looks like -- can we split anything out? --- CODEOWNERS | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000000..d3d2214518e --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,87 @@ +# The Jekyll project has 6 affinity teams, shown here: https://teams.jekyllrb.com/ +# They are as follows: +# +# 1. @jekyll/build +# 2. @jekyll/documentation +# 3. @jekyll/ecosystem +# 4. @jekyll/performance +# 5. @jekyll/stability +# 6. @jekyll/windows +# +# Each of these teams has a mission. Wherever possible, GitHub should +# automatically require review from these teams on the pieces of the +# repository they maintain. + +# @jekyll/documentation +/docs/ @jekyll/documentation + +# @jekyll/build +/exe/ @jekyll/build +/lib/jekyll.rb @jekyll/build +/lib/jekyll/cleaner.rb @jekyll/build +/lib/jekyll/collection.rb @jekyll/build +/lib/jekyll/command.rb @jekyll/build +/lib/jekyll/commands/ @jekyll/build +/lib/jekyll/converter.rb @jekyll/build +/lib/jekyll/converters/ @jekyll/build +/lib/jekyll/convertible.rb @jekyll/build +/lib/jekyll/document.rb @jekyll/build +/lib/jekyll/drops/ @jekyll/build +/lib/jekyll/entry_filter.rb @jekyll/build +/lib/jekyll/errors.rb @jekyll/build +/lib/jekyll/excerpt.rb @jekyll/build +/lib/jekyll/filters/ @jekyll/build +/lib/jekyll/filters.rb @jekyll/build +/lib/jekyll/layout.rb @jekyll/build +/lib/jekyll/liquid_extensions.rb @jekyll/build +/lib/jekyll/liquid_renderer/ @jekyll/build +/lib/jekyll/liquid_renderer.rb @jekyll/build +/lib/jekyll/log_adapter.rb @jekyll/build +/lib/jekyll/mime.types @jekyll/build +/lib/jekyll/page.rb @jekyll/build +/lib/jekyll/publisher.rb @jekyll/build +/lib/jekyll/reader.rb @jekyll/build +/lib/jekyll/readers/ @jekyll/build +/lib/jekyll/regenerator.rb @jekyll/build +/lib/jekyll/related_posts.rb @jekyll/build +/lib/jekyll/renderer.rb @jekyll/build +/lib/jekyll/site.rb @jekyll/build +/lib/jekyll/static_file.rb @jekyll/build +/lib/jekyll/stevenson.rb @jekyll/build +/lib/jekyll/tags/ @jekyll/build +/lib/jekyll/url.rb @jekyll/build +/lib/jekyll/utils/ @jekyll/build +/lib/jekyll/utils.rb @jekyll/build + +# @jekyll/ecosystem +/lib/jekyll/external.rb @jekyll/ecosystem +/lib/jekyll/generator.rb @jekyll/ecosystem +/lib/jekyll/hooks.rb @jekyll/ecosystem +/lib/jekyll/plugin.rb @jekyll/ecosystem +/lib/jekyll/plugin_manager.rb @jekyll/ecosystem +/lib/jekyll/theme.rb @jekyll/ecosystem +/lib/jekyll/theme_builder.rb @jekyll/ecosystem + +# @jekyll/stability +Gemfile @jekyll/stability +*.gemspec @jekyll/stability +.travis.yml @jekyll/stability +appveyor.yml @jekyll/stability +/lib/jekyll/configuration.rb @jekyll/stability +/lib/jekyll/deprecator.rb @jekyll/stability +/lib/jekyll/frontmatter_defaults.rb @jekyll/stability +/lib/site_template @jekyll/stability +/lib/theme_template @jekyll/stability +/features/ @jekyll/stability +/test/ @jekyll/stability + +# Special cases +.github/ @jekyll/affinity-team-captains +CODEOWNERS @jekyll/affinity-team-captains +CONDUCT.markdown @jekyll/affinity-team-captains +History.markdown @jekyll/affinity-team-captains +LICENSE @jekyll/affinity-team-captains # This file should never change. +README.markdown @jekyll/affinity-team-captains +/lib/jekyll/version.rb @jekyll/affinity-team-captains +/rake/ @jekyll/affinity-team-captains +/script/ @jekyll/affinity-team-captains From f232e1039af7a5d19ee7d15db043fd64f88eef4d Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 18 Aug 2017 18:18:34 +0200 Subject: [PATCH 2341/4996] move CODEOWNERS to .github --- CODEOWNERS => .github/CODEOWNERS | 1 - 1 file changed, 1 deletion(-) rename CODEOWNERS => .github/CODEOWNERS (98%) diff --git a/CODEOWNERS b/.github/CODEOWNERS similarity index 98% rename from CODEOWNERS rename to .github/CODEOWNERS index d3d2214518e..67a51c50667 100644 --- a/CODEOWNERS +++ b/.github/CODEOWNERS @@ -77,7 +77,6 @@ appveyor.yml @jekyll/stability # Special cases .github/ @jekyll/affinity-team-captains -CODEOWNERS @jekyll/affinity-team-captains CONDUCT.markdown @jekyll/affinity-team-captains History.markdown @jekyll/affinity-team-captains LICENSE @jekyll/affinity-team-captains # This file should never change. From f2860047b7e012e20f6dbce3ae43b0d9c4acf9b6 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 18 Aug 2017 18:20:24 +0200 Subject: [PATCH 2342/4996] /cc a team is now handled by CODEOWNERS --- .github/ISSUE_TEMPLATE.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index b1d43598e2c..fdba86159e2 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -10,9 +10,6 @@ a generic usage question, please consider asking your question at https://talk.jekyllrb.com where non-bug questions go. - Please make sure to mention an affinity team whose responsibilities - most closely align with your issue. - Thanks! --> @@ -79,5 +76,3 @@ The minimum should be personal information. Though we normally don't log anything like that so there should be no need to alter it. --> - -/cc include any Jekyll affinity teams here (see https://teams.jekyllrb.com/ for more info) From 08840946f3a142ec04d41618234db067092cfce9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 18 Aug 2017 12:42:58 -0400 Subject: [PATCH 2343/4996] Update history to reflect merge of #6320 [ci skip] --- History.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index e11de9c77da..189466ffa83 100644 --- a/History.markdown +++ b/History.markdown @@ -9,7 +9,8 @@ * exit site.process sooner (#6239) * make flakey test more robust (#6277) * Add a quick test for DataReader (#6284) - * script/backport-pr: commit message no longer includes the # (#6289) + * script/backport-pr: commit message no longer includes the `#` (#6289) + * Add Add CODEOWNERS file to help automate reviews. (#6320) ### Minor Enhancements From 232ec4679a808f0f3371e5326ff856a8a635334b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 18 Aug 2017 12:45:23 -0400 Subject: [PATCH 2344/4996] Allow `yield` to logger methods & bail early on no-op messages (#6315) Merge pull request 6315 --- lib/jekyll/log_adapter.rb | 64 ++++++++++++++++++++++++++++----------- test/helper.rb | 7 +++-- test/test_log_adapter.rb | 24 ++++++++++----- test/test_new_command.rb | 13 +++----- test/test_site.rb | 8 ++--- 5 files changed, 78 insertions(+), 38 deletions(-) diff --git a/lib/jekyll/log_adapter.rb b/lib/jekyll/log_adapter.rb index ec33b4d90d8..65b8f9deb7b 100644 --- a/lib/jekyll/log_adapter.rb +++ b/lib/jekyll/log_adapter.rb @@ -2,7 +2,7 @@ module Jekyll class LogAdapter - attr_reader :writer, :messages + attr_reader :writer, :messages, :level LOG_LEVELS = { :debug => ::Logger::DEBUG, @@ -30,6 +30,7 @@ def initialize(writer, level = :info) # Returns nothing def log_level=(level) writer.level = LOG_LEVELS.fetch(level) + @level = level end def adjust_verbosity(options = {}) @@ -48,8 +49,8 @@ def adjust_verbosity(options = {}) # message - the message detail # # Returns nothing - def debug(topic, message = nil) - writer.debug(message(topic, message)) + def debug(topic, message = nil, &block) + write(:debug, topic, message, &block) end # Public: Print a message @@ -58,8 +59,8 @@ def debug(topic, message = nil) # message - the message detail # # Returns nothing - def info(topic, message = nil) - writer.info(message(topic, message)) + def info(topic, message = nil, &block) + write(:info, topic, message, &block) end # Public: Print a message @@ -68,8 +69,8 @@ def info(topic, message = nil) # message - the message detail # # Returns nothing - def warn(topic, message = nil) - writer.warn(message(topic, message)) + def warn(topic, message = nil, &block) + write(:warn, topic, message, &block) end # Public: Print an error message @@ -78,8 +79,8 @@ def warn(topic, message = nil) # message - the message detail # # Returns nothing - def error(topic, message = nil) - writer.error(message(topic, message)) + def error(topic, message = nil, &block) + write(:error, topic, message, &block) end # Public: Print an error message and immediately abort the process @@ -88,8 +89,8 @@ def error(topic, message = nil) # message - the message detail (can be omitted) # # Returns nothing - def abort_with(topic, message = nil) - error(topic, message) + def abort_with(topic, message = nil, &block) + error(topic, message, &block) abort end @@ -99,19 +100,48 @@ def abort_with(topic, message = nil) # message - the message detail # # Returns the formatted message - def message(topic, message) - msg = formatted_topic(topic) + message.to_s.gsub(%r!\s+!, " ") - messages << msg - msg + def message(topic, message = nil) + raise ArgumentError, "block or message, not both" if block_given? && message + + message = yield if block_given? + message = message.to_s.gsub(%r!\s+!, " ") + topic = formatted_topic(topic, block_given?) + out = topic + message + messages << out + out end # Internal: Format the topic # # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # colon - # # Returns the formatted topic statement - def formatted_topic(topic) - "#{topic} ".rjust(20) + def formatted_topic(topic, colon = false) + "#{topic}#{colon ? ": " : " "}".rjust(20) + end + + # Internal: Check if the message should be written given the log level. + # + # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error + # + # Returns whether the message should be written. + def write_message?(level_of_message) + LOG_LEVELS.fetch(level) <= LOG_LEVELS.fetch(level_of_message) + end + + # Internal: Log a message. + # + # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error + # topic - the String topic or full message + # message - the String message (optional) + # block - a block containing the message (optional) + # + # Returns false if the message was not written, otherwise returns the value of calling + # the appropriate writer method, e.g. writer.info. + def write(level_of_message, topic, message = nil, &block) + return false unless write_message?(level_of_message) + writer.public_send(level_of_message, message(topic, message, &block)) end end end diff --git a/test/helper.rb b/test/helper.rb index 3f3227bab4f..672fedd2862 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -32,7 +32,7 @@ def jruby? require "rspec/mocks" require_relative "../lib/jekyll.rb" -Jekyll.logger = Logger.new(StringIO.new) +Jekyll.logger = Logger.new(StringIO.new, :error) unless jruby? require "rdiscount" @@ -168,12 +168,15 @@ def with_env(key, value) ENV[key] = old_value end - def capture_output + def capture_output(level = :debug) buffer = StringIO.new Jekyll.logger = Logger.new(buffer) + Jekyll.logger.log_level = level yield buffer.rewind buffer.string.to_s + ensure + Jekyll.logger = Logger.new(StringIO.new, :error) end alias_method :capture_stdout, :capture_output alias_method :capture_stderr, :capture_output diff --git a/test/test_log_adapter.rb b/test/test_log_adapter.rb index 2bcd2f1d7c9..b15dca5020b 100644 --- a/test/test_log_adapter.rb +++ b/test/test_log_adapter.rb @@ -53,7 +53,7 @@ def error(*); end should "call #debug on writer return true" do writer = LoggerDouble.new - logger = Jekyll::LogAdapter.new(writer) + logger = Jekyll::LogAdapter.new(writer, :debug) allow(writer).to receive(:debug).and_return(true) assert logger.adjust_verbosity end @@ -62,7 +62,7 @@ def error(*); end context "#debug" do should "call #debug on writer return true" do writer = LoggerDouble.new - logger = Jekyll::LogAdapter.new(writer) + logger = Jekyll::LogAdapter.new(writer, :debug) allow(writer).to receive(:debug) .with("topic ".rjust(20) + "log message").and_return(true) assert logger.debug("topic", "log message") @@ -72,7 +72,7 @@ def error(*); end context "#info" do should "call #info on writer return true" do writer = LoggerDouble.new - logger = Jekyll::LogAdapter.new(writer) + logger = Jekyll::LogAdapter.new(writer, :info) allow(writer).to receive(:info) .with("topic ".rjust(20) + "log message").and_return(true) assert logger.info("topic", "log message") @@ -82,7 +82,7 @@ def error(*); end context "#warn" do should "call #warn on writer return true" do writer = LoggerDouble.new - logger = Jekyll::LogAdapter.new(writer) + logger = Jekyll::LogAdapter.new(writer, :warn) allow(writer).to receive(:warn) .with("topic ".rjust(20) + "log message").and_return(true) assert logger.warn("topic", "log message") @@ -92,7 +92,7 @@ def error(*); end context "#error" do should "call #error on writer return true" do writer = LoggerDouble.new - logger = Jekyll::LogAdapter.new(writer) + logger = Jekyll::LogAdapter.new(writer, :error) allow(writer).to receive(:error) .with("topic ".rjust(20) + "log message").and_return(true) assert logger.error("topic", "log message") @@ -101,7 +101,7 @@ def error(*); end context "#abort_with" do should "call #error and abort" do - logger = Jekyll::LogAdapter.new(LoggerDouble.new) + logger = Jekyll::LogAdapter.new(LoggerDouble.new, :error) allow(logger).to receive(:error).with("topic", "log message").and_return(true) assert_raises(SystemExit) { logger.abort_with("topic", "log message") } end @@ -113,7 +113,7 @@ def error(*); end end should "store each log value in the array" do - logger = Jekyll::LogAdapter.new(LoggerDouble.new) + logger = Jekyll::LogAdapter.new(LoggerDouble.new, :debug) values = %w(one two three four) logger.debug(values[0]) logger.info(values[1]) @@ -122,4 +122,14 @@ def error(*); end assert_equal values.map { |value| "#{value} ".rjust(20) }, logger.messages end end + + context "#write_message?" do + should "return false up to the desired logging level" do + subject = Jekyll::LogAdapter.new(LoggerDouble.new, :warn) + refute subject.write_message?(:debug), "Should not print debug messages" + refute subject.write_message?(:info), "Should not print info messages" + assert subject.write_message?(:warn), "Should print warn messages" + assert subject.write_message?(:error), "Should print error messages" + end + end end diff --git a/test/test_new_command.rb b/test/test_new_command.rb index c2b7def4001..632ad3d57c6 100644 --- a/test/test_new_command.rb +++ b/test/test_new_command.rb @@ -22,7 +22,7 @@ def site_template end teardown do - FileUtils.rm_r @full_path + FileUtils.rm_r @full_path if File.directory?(@full_path) end should "create a new directory" do @@ -41,8 +41,7 @@ def site_template end should "display a success message" do - Jekyll::Commands::New.process(@args) - output = Jekyll.logger.messages + output = capture_output { Jekyll::Commands::New.process(@args) } success_message = "New jekyll site installed in #{@full_path.cyan}. " bundle_message = "Running bundle install in #{@full_path.cyan}... " assert_includes output, success_message @@ -88,8 +87,7 @@ def site_template should "create blank project" do blank_contents = %w(/_drafts /_layouts /_posts /index.html) - capture_output { Jekyll::Commands::New.process(@args, "--blank") } - output = Jekyll.logger.messages.last + output = capture_output { Jekyll::Commands::New.process(@args, "--blank") } bundle_message = "Running bundle install in #{@full_path.cyan}..." assert_same_elements blank_contents, dir_contents(@full_path) refute_includes output, bundle_message @@ -98,12 +96,11 @@ def site_template should "force created folder" do capture_output { Jekyll::Commands::New.process(@args) } output = capture_output { Jekyll::Commands::New.process(@args, "--force") } - assert_match(%r!New jekyll site installed in!, output) + assert_match %r!New jekyll site installed in!, output end should "skip bundle install when opted to" do - capture_output { Jekyll::Commands::New.process(@args, "--skip-bundle") } - output = Jekyll.logger.messages.last + output = capture_output { Jekyll::Commands::New.process(@args, "--skip-bundle") } bundle_message = "Bundle install skipped." assert_includes output, bundle_message end diff --git a/test/test_site.rb b/test/test_site.rb index adc69e33436..f50990e0511 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -562,13 +562,13 @@ def convert(*_args) end expected_msg = "Theme: value of 'theme' in config should be String " \ "to use gem-based themes, but got Hash\n" - assert output.end_with?(expected_msg), - "Expected #{output.inspect} to end with #{expected_msg.inspect}" + assert_includes output, expected_msg end should "set a theme if the config is a string" do - expect($stderr).not_to receive(:puts) - expect($stdout).not_to receive(:puts) + [:debug, :info, :warn, :error].each do |level| + expect(Jekyll.logger.writer).not_to receive(level) + end site = fixture_site({ "theme" => "test-theme" }) assert_instance_of Jekyll::Theme, site.theme assert_equal "test-theme", site.theme.name From 02767d612e1aec4833515aa4db3aab1082863405 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 18 Aug 2017 12:45:24 -0400 Subject: [PATCH 2345/4996] Update history to reflect merge of #6315 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 189466ffa83..1e938f5bab2 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,7 @@ * set `LiquidError#template_name` for errors in included file (#6206) * Access custom config array throughout session (#6200) * Add support for Rouge 2, in addition to Rouge 1 (#5919) + * Allow `yield` to logger methods & bail early on no-op messages (#6315) ### Bug Fixes From 2321370119203ef44fecab4246098fcce0517c42 Mon Sep 17 00:00:00 2001 From: Antonio Argote Date: Sat, 19 Aug 2017 00:46:54 +0800 Subject: [PATCH 2346/4996] trim plugins page, clarify intention of templates (#6311) Merge pull request 6311 --- docs/_docs/plugins.md | 30 ++++++++++++++++-------------- docs/_docs/resources.md | 8 ++++++++ docs/_docs/templates.md | 33 +++++++++------------------------ 3 files changed, 33 insertions(+), 38 deletions(-) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index d630b106cf6..ae55aa23d01 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -31,21 +31,26 @@ Jekyll generates your site. values of the gem names of the plugins you'd like to use. An example: - plugins: [jekyll-coffeescript, jekyll-watch, jekyll-assets] + plugins: + - jekyll-gist + - jekyll-coffeescript + - jekyll-assets + - another-jekyll-plugin # This will require each of these plugins automatically. - Then install your plugins using `gem install jekyll-coffeescript jekyll-watch jekyll-assets` + Then install your plugins using `gem install jekyll-gist jekyll-coffeescript jekyll-assets another-jekyll-plugin` 3. Add the relevant plugins to a Bundler group in your `Gemfile`. An example: group :jekyll_plugins do - gem "my-jekyll-plugin" + gem "jekyll-gist" + gem "jekyll-coffeescript" + gem "jekyll-assets" gem "another-jekyll-plugin" end - Now you need to install all plugins from your Bundler group by running single command `bundle install` - + Now you need to install all plugins from your Bundler group by running single command `bundle install`.
    @@ -59,7 +64,7 @@ values of the gem names of the plugins you'd like to use. An example:

    -In general, plugins you make will fall into one of five categories: +In general, plugins you make will fall broadly into one of five categories: 1. [Generators](#generators) 2. [Converters](#converters) @@ -67,6 +72,8 @@ In general, plugins you make will fall into one of five categories: 4. [Tags](#tags) 5. [Hooks](#hooks) +See the bottom of the page for a [list of available plugins](#available-plugins) + ## Generators You can create a generator when you need Jekyll to create additional content @@ -810,6 +817,9 @@ LESS.js files during generation. #### Tags +You can find a few useful plugins at the following locations: + +- [Jekyll-gist](https://github.com/jekyll/jekyll-gist): Use the `gist` tag to easily embed a GitHub Gist onto your site. This works with public or secret gists. - [Asset Path Tag](https://github.com/samrayner/jekyll-asset-path-plugin) by [Sam Rayner](http://www.samrayner.com/): Allows organisation of assets into subdirectories by outputting a path for a given file relative to the current post or page. - [Delicious Plugin by Christian Hellsten](https://github.com/christianhellsten/jekyll-plugins): Fetches and renders bookmarks from delicious.com. - [Ultraviolet Plugin by Steve Alex](https://gist.github.com/480380): Jekyll tag for the [Ultraviolet](https://github.com/grosser/ultraviolet) code highligher. @@ -930,14 +940,6 @@ LESS.js files during generation. - [jekyll-numbered-headings](https://github.com/muratayusuke/jekyll-numbered-headings): Adds ordered number to headings. - [jekyll-pre-commit](https://github.com/mpchadwick/jekyll-pre-commit): A framework for running checks against your posts using a git pre-commit hook before you publish them. -#### Editors - -- [sublime-jekyll](https://github.com/23maverick23/sublime-jekyll): A Sublime Text package for Jekyll static sites. This package should help creating Jekyll sites and posts easier by providing access to key template tags and filters, as well as common completions and a current date/datetime command (for dating posts). You can install this package manually via GitHub, or via [Package Control](https://packagecontrol.io/packages/Jekyll). -- [vim-jekyll](https://github.com/parkr/vim-jekyll): A vim plugin to generate - new posts and run `jekyll build` all without leaving vim. -- [markdown-writer](https://atom.io/packages/markdown-writer): An Atom package for Jekyll. It can create new posts/drafts, manage tags/categories, insert link/images and add many useful key mappings. -- [Wordpress2Jekyll](https://wordpress.org/plugins/wp2jekyll/): A Wordpress plugin that allows you to use Wordpress as your editor and (automatically) export content in to Jekyll. WordPress2Jekyll attempts to marry these two systems together in order to make a site that can be easily managed from all devices. -
    Jekyll Plugins Wanted

    diff --git a/docs/_docs/resources.md b/docs/_docs/resources.md index 0f90fae8f25..a8da04c5d24 100644 --- a/docs/_docs/resources.md +++ b/docs/_docs/resources.md @@ -5,6 +5,14 @@ permalink: /docs/resources/ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, extensions, examples, and other resources that can be very helpful. Below is a collection of links to some of the most popular Jekyll resources. +#### Editors + +- [sublime-jekyll](https://github.com/23maverick23/sublime-jekyll): A Sublime Text package for Jekyll static sites. This package should help creating Jekyll sites and posts easier by providing access to key template tags and filters, as well as common completions and a current date/datetime command (for dating posts). You can install this package manually via GitHub, or via [Package Control](https://packagecontrol.io/packages/Jekyll). +- [vim-jekyll](https://github.com/parkr/vim-jekyll): A vim plugin to generate + new posts and run `jekyll build` all without leaving vim. +- [markdown-writer](https://atom.io/packages/markdown-writer): An Atom package for Jekyll. It can create new posts/drafts, manage tags/categories, insert link/images and add many useful key mappings. +- [Wordpress2Jekyll](https://wordpress.org/plugins/wp2jekyll/): A Wordpress plugin that allows you to use Wordpress as your editor and (automatically) export content in to Jekyll. WordPress2Jekyll attempts to marry these two systems together in order to make a site that can be easily managed from all devices. + ### Useful Guides - [Jekyll Tips](http://jekyll.tips) is a set of resources created by [CloudCannon](https://cloudcannon.com) to help folks get up and running with Jekyll. They cover all skill levels, and even include some great video tutorials. diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 40a3e0327e9..c37b93b5b97 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -6,8 +6,9 @@ permalink: /docs/templates/ Jekyll uses the [Liquid](https://shopify.github.io/liquid/) templating language to process templates. All of the standard Liquid [tags](https://shopify.github.io/liquid/tags/control-flow/) and [filters](https://shopify.github.io/liquid/filters/abs/) are -supported. Jekyll even adds a few handy filters and tags of its own to make -common tasks easier. +supported. To make common tasks easier, Jekyll even adds a few handy filters +and tags of its own, all of which you can find on this page. Jekyll even lets +you come up with your own tags via plugins. ## Filters @@ -418,6 +419,11 @@ The default is `default`. They are as follows (with what they filter): ## Tags +* [Includes](#includes) +* [Code snippet highlighting](#code-snippet-highlighting) +* [Linking to pages, collections and posts (the new and improved way)](#links) +* [Linking to posts (the old way)](#linking-to-posts) + ### Includes If you have small page snippets that you want to include in multiple places on your site, save the snippets as *include files* and insert them where required, by using the `include` tag: @@ -488,27 +494,6 @@ site. If you use `linenos`, you might want to include an additional CSS class definition for the `.lineno` class in `syntax.css` to distinguish the line numbers from the highlighted code. -### Gist - -Use the `gist` tag to easily embed a GitHub Gist onto your site. This works -with public or secret gists: - -```liquid -{% raw %} -{% gist parkr/931c1c8d465a04042403 %} -{% endraw %} -``` - -You may also optionally specify the filename in the gist to display: - -```liquid -{% raw %} -{% gist parkr/931c1c8d465a04042403 jekyll-private-gist.markdown %} -{% endraw %} -``` - -To use the `gist` tag, you'll need to add the -[jekyll-gist](https://github.com/jekyll/jekyll-gist) gem to your project. ## Links @@ -546,7 +531,7 @@ For example, suppose you're creating a link in `page_a.md` (stored in `pages/fol If you're unsure of the path, add `{% raw %}{{ page.path }}{% endraw %}` to the page and it will display the path. -One major benefit of using the `link` tag is link validation. If the link doesn't exist, Jekyll won't build your site. This is a good thing, as it will alert you to a broken link so you can fix it (rather than allowing you to build and deploy a site with broken links). +One major benefit of using the `link` or `post_url` tag is link validation. If the link doesn't exist, Jekyll won't build your site. This is a good thing, as it will alert you to a broken link so you can fix it (rather than allowing you to build and deploy a site with broken links). Note you cannot add filters to `link` tags. For example, you cannot append a string using Liquid filters, such as `{% raw %}{% link mypage.html | append: "#section1" %} {% endraw %}`. To link to sections on a page, you will need to use regular HTML or Markdown linking techniques. From 22449496b834e39e87871e64b1cc20c4e4502cbc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 18 Aug 2017 12:46:56 -0400 Subject: [PATCH 2347/4996] Update history to reflect merge of #6311 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1e938f5bab2..6fb43a6019d 100644 --- a/History.markdown +++ b/History.markdown @@ -45,6 +45,7 @@ * Execute build command using bundle. (#6274) * name unification - buddy details (#6317) * name unification - application index (#6318) + * trim and relocate plugin info across docs (#6311) ### Site Enhancements From 72877a9b078a044279fa6caf4f4e71f26dd5c637 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 18 Aug 2017 19:20:37 +0200 Subject: [PATCH 2348/4996] update links (#6321) Merge pull request 6321 --- README.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.markdown b/README.markdown index 9718f24d52b..b38ed6fa6a4 100644 --- a/README.markdown +++ b/README.markdown @@ -22,7 +22,9 @@ Jekyll is a simple, blog-aware, static site generator perfect for personal, proj Jekyll does what you tell it to do — no more, no less. It doesn't try to outsmart users by making bold assumptions, nor does it burden them with needless complexity and configuration. Put simply, Jekyll gets out of your way and allows you to concentrate on what truly matters: your content. -## Having trouble with OS X/macOS? +See: https://jekyllrb.com/philosophy + +## Having trouble? See: https://jekyllrb.com/docs/troubleshooting/ @@ -43,7 +45,7 @@ conduct. Please adhere to this code of conduct in any interactions you have in the Jekyll community. It is strictly enforced on all official Jekyll repositories, websites, and resources. If you encounter someone violating -these terms, please let a maintainer ([@parkr](https://github.com/parkr), [@envygeeks](https://github.com/envygeeks), [@mattr-](https://github.com/mattr-), or [@alfredxing](https://github.com/alfredxing)) know and we will address it as soon as possible. +these terms, please let a [team captain](https://github.com/orgs/jekyll/teams/affinity-team-captains/members) know and we will address it as soon as possible. ## Diving In From d08256d1cec4218143de55ce5dfcb0c2deaffe3c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 18 Aug 2017 13:20:39 -0400 Subject: [PATCH 2349/4996] Update history to reflect merge of #6321 [ci skip] --- History.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/History.markdown b/History.markdown index 6fb43a6019d..2d72a30d9ac 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,7 @@ ## HEAD + * update Jekyll's README (#6321) + ### Development Fixes * Strip unnecessary leading whitespace in template (#6228) From ee23d065072a574a7eec70ea7f8b37278621eafe Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 19 Aug 2017 00:01:02 +0200 Subject: [PATCH 2350/4996] add SUPPORT file for GitHub (#6324) Merge pull request 6324 --- .github/CONTRIBUTING.markdown | 5 +---- .github/SUPPORT.md | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 .github/SUPPORT.md diff --git a/.github/CONTRIBUTING.markdown b/.github/CONTRIBUTING.markdown index 14442f6dc55..fe53b2f3682 100644 --- a/.github/CONTRIBUTING.markdown +++ b/.github/CONTRIBUTING.markdown @@ -4,10 +4,7 @@ Hi there! Interested in contributing to Jekyll? We'd love your help. Jekyll is a ## Where to get help or report a problem -* If you have a question about using Jekyll, start a discussion on [Jekyll Talk](https://talk.jekyllrb.com). -* If you think you've found a bug within a Jekyll plugin, open an issue in that plugin's repository. -* If you think you've found a bug within Jekyll itself, [open an issue](https://github.com/jekyll/jekyll/issues/new). -* More resources are listed on our [Help page](https://jekyllrb.com/help/). +See [the support guidelines](SUPPORT.md) ## Ways to contribute diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md new file mode 100644 index 00000000000..0939723dff8 --- /dev/null +++ b/.github/SUPPORT.md @@ -0,0 +1,20 @@ +# Jekyll Support + +## Getting Help + +**Jekyll's issue tracker is not a support forum.** + +If you're looking for support for Jekyll, there are a lot of options: + +* Read [Jekyll Documentation](https://jekyllrb.com/docs/home/) +* If you have a question about using Jekyll, start a discussion on [Jekyll Forum](https://talk.jekyllrb.com/) or [StackOverflow](https://stackoverflow.com/questions/tagged/jekyll) +* Chat with Jekyllers — Join [our Gitter channel](https://gitter.im/jekyll/jekyll) or [our IRC channel on Freenode](irc:irc.freenode.net/jekyll) + +There are a bunch of helpful community members on these services that should be willing to point you in the right direction. + +## Report a bug + +* If you think you've found a bug within a Jekyll plugin, open an issue in that plugin's repository — First [look for the plugin on rubygems](https://rubygems.org/) then click on the `Homepage` link to access the plugin repository. +* If you think you've found a bug within Jekyll itself, [open an issue](https://github.com/jekyll/jekyll/issues/new). + +Happy Jekyllin'! From 5cc2b6affc821996e043e6661de4f6dd390e9c08 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 18 Aug 2017 18:01:03 -0400 Subject: [PATCH 2351/4996] Update history to reflect merge of #6324 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2d72a30d9ac..2448112e2fe 100644 --- a/History.markdown +++ b/History.markdown @@ -1,6 +1,7 @@ ## HEAD * update Jekyll's README (#6321) + * add SUPPORT file for GitHub (#6324) ### Development Fixes From 1d3fa81d53178189c788af798ef37c5d6271fe22 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 19 Aug 2017 13:11:29 +0200 Subject: [PATCH 2352/4996] plugins is the new gems (#6326) Merge pull request 6326 --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index ab3d4bf3aa1..044cb386c95 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -46,7 +46,7 @@ twitter: logo: /img/logo-2x.png -gems: +plugins: - jekyll-avatar - jekyll-feed - jekyll-mentions From 851c36d8283730d9972b55a9804199edec979675 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 19 Aug 2017 07:11:30 -0400 Subject: [PATCH 2353/4996] Update history to reflect merge of #6326 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2448112e2fe..bd64aa87d59 100644 --- a/History.markdown +++ b/History.markdown @@ -2,6 +2,7 @@ * update Jekyll's README (#6321) * add SUPPORT file for GitHub (#6324) + * Plugins is the new gems (#6326) ### Development Fixes From df25873ed4724df3cb78ba98fa46465a6157ca4d Mon Sep 17 00:00:00 2001 From: David Zhang Date: Sat, 19 Aug 2017 19:19:59 +0800 Subject: [PATCH 2354/4996] Rename CODE_OF_CONDUCT to show in banner (#6325) Merge pull request 6325 --- .github/CODEOWNERS | 2 +- CONDUCT.markdown => CODE_OF_CONDUCT.markdown | 0 README.markdown | 2 +- rake/site.rake | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename CONDUCT.markdown => CODE_OF_CONDUCT.markdown (100%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 67a51c50667..a6f9434cb94 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -77,7 +77,7 @@ appveyor.yml @jekyll/stability # Special cases .github/ @jekyll/affinity-team-captains -CONDUCT.markdown @jekyll/affinity-team-captains +CODE_OF_CONDUCT.markdown @jekyll/affinity-team-captains History.markdown @jekyll/affinity-team-captains LICENSE @jekyll/affinity-team-captains # This file should never change. README.markdown @jekyll/affinity-team-captains diff --git a/CONDUCT.markdown b/CODE_OF_CONDUCT.markdown similarity index 100% rename from CONDUCT.markdown rename to CODE_OF_CONDUCT.markdown diff --git a/README.markdown b/README.markdown index b38ed6fa6a4..1350d019e0b 100644 --- a/README.markdown +++ b/README.markdown @@ -39,7 +39,7 @@ See: https://jekyllrb.com/docs/troubleshooting/ ## Code of Conduct In order to have a more open and welcoming community, Jekyll adheres to a -[code of conduct](CONDUCT.markdown) adapted from the Ruby on Rails code of +[code of conduct](CODE_OF_CONDUCT.markdown) adapted from the Ruby on Rails code of conduct. Please adhere to this code of conduct in any interactions you have in the diff --git a/rake/site.rake b/rake/site.rake index 94aa969ea22..15680b15afe 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -69,7 +69,7 @@ namespace :site do "redirect_from" => "/conduct/index.html", "editable" => false, } - siteify_file("CONDUCT.markdown", front_matter) + siteify_file("CODE_OF_CONDUCT.markdown", front_matter) end desc "Copy the contributing file" From 2989a9a81be6e374af08832cf1d7d2f24f73eac1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 19 Aug 2017 07:20:01 -0400 Subject: [PATCH 2355/4996] Update history to reflect merge of #6325 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bd64aa87d59..44c94640fb8 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ * update Jekyll's README (#6321) * add SUPPORT file for GitHub (#6324) * Plugins is the new gems (#6326) + * Rename CODE_OF_CONDUCT to show in banner (#6325) ### Development Fixes From f808593fbf1e7b5f28c7338cbbdbcee26e6b8b2a Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 19 Aug 2017 15:54:18 +0200 Subject: [PATCH 2356/4996] Fix History Some of the latest PRs weren't affected to the good category. My bad. Note to self: Space matters. :milky_way: --- History.markdown | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/History.markdown b/History.markdown index 44c94640fb8..4d1b3abde24 100644 --- a/History.markdown +++ b/History.markdown @@ -1,10 +1,5 @@ ## HEAD - * update Jekyll's README (#6321) - * add SUPPORT file for GitHub (#6324) - * Plugins is the new gems (#6326) - * Rename CODE_OF_CONDUCT to show in banner (#6325) - ### Development Fixes * Strip unnecessary leading whitespace in template (#6228) @@ -51,11 +46,15 @@ * name unification - buddy details (#6317) * name unification - application index (#6318) * trim and relocate plugin info across docs (#6311) - + * update Jekyll's README (#6321) + * add SUPPORT file for GitHub (#6324) + * Rename CODE_OF_CONDUCT to show in banner (#6325) + ### Site Enhancements * Adding DevKit helpers (#6225) * Customizing url in collection elements clarified (#6264) + * Plugins is the new gems (#6326) ## 3.5.2 / 2017-08-12 From 88f5af23b13d097b22de0edf710bd284a65e8a77 Mon Sep 17 00:00:00 2001 From: Antonio Argote Date: Wed, 23 Aug 2017 05:55:59 +0800 Subject: [PATCH 2357/4996] document application of page.id (#6329) Merge pull request 6329 --- docs/_docs/variables.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_docs/variables.md b/docs/_docs/variables.md index f32bddd6d9d..cec351968b5 100644 --- a/docs/_docs/variables.md +++ b/docs/_docs/variables.md @@ -265,8 +265,9 @@ following is a reference of the available data.

    page.id

    - An identifier unique to the Post (useful in RSS feeds). e.g. + An identifier unique to a document in a Collection or a Post (useful in RSS feeds). e.g. /2008/12/14/my-post + /my-collection/my-document

    From fe0c105ff066304f9b4698b977bf5fd049d2f96a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 22 Aug 2017 17:56:00 -0400 Subject: [PATCH 2358/4996] Update history to reflect merge of #6329 [ci skip] --- History.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 4d1b3abde24..87cbdcb9902 100644 --- a/History.markdown +++ b/History.markdown @@ -49,7 +49,8 @@ * update Jekyll's README (#6321) * add SUPPORT file for GitHub (#6324) * Rename CODE_OF_CONDUCT to show in banner (#6325) - + * Docs : illustrate page.id for a collection's document (#6329) + ### Site Enhancements * Adding DevKit helpers (#6225) From 709a3444de5aa0060b9ff936c3b3c543118c06ed Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 23 Aug 2017 12:56:09 -0400 Subject: [PATCH 2359/4996] Release :gem: 3.6.0.pre.beta1 --- lib/jekyll/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 46b238124be..3a69700216e 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Jekyll - VERSION = "3.5.2".freeze + VERSION = "3.6.0.pre.beta1".freeze end From 1a7bcb09f648b26bad6a39e89c8e564f4786b9f9 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 28 Aug 2017 21:00:44 +0200 Subject: [PATCH 2360/4996] Docs: post's date can be overriden in YAML front matter (#6334) Merge pull request 6334 --- docs/_docs/permalinks.md | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index f0e16770b36..42e68e85ff8 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -66,7 +66,10 @@ The following table lists the template variables available for permalinks. You c

    year

    -

    Year from the post's filename

    +

    + Year from the post's filename. May be overridden via the document’s + date YAML front matter +

    @@ -74,7 +77,10 @@ The following table lists the template variables available for permalinks. You c

    month

    -

    Month from the post's filename

    +

    + Month from the post's filename. May be overridden via the document’s + date YAML front matter +

    @@ -82,7 +88,10 @@ The following table lists the template variables available for permalinks. You c

    i_month

    -

    Month from the post's filename without leading zeros.

    +

    + Month without leading zeros from the post's filename. May be + overridden via the document’s date YAML front matter +

    @@ -90,7 +99,10 @@ The following table lists the template variables available for permalinks. You c

    day

    -

    Day from the post's filename

    +

    + Day from the post's filename. May be overridden via the document’s + date YAML front matter +

    @@ -98,7 +110,10 @@ The following table lists the template variables available for permalinks. You c

    i_day

    -

    Day from the post's filename without leading zeros.

    +

    + Day without leading zeros from the post's filename. May be overridden + via the document’s date YAML front matter +

    @@ -106,7 +121,10 @@ The following table lists the template variables available for permalinks. You c

    short_year

    -

    Year from the post's filename without the century.

    +

    + Year without the century from the post's filename. May be overridden + via the document’s date YAML front matter +

    @@ -115,7 +133,8 @@ The following table lists the template variables available for permalinks. You c

    - Hour of the day, 24-hour clock, zero-padded from the post's date front matter. (00..23) + Hour of the day, 24-hour clock, zero-padded from the post's + date front matter. (00..23)

    From 0aa55dbffb3aa3e15e57ff791aa9395335e9efb7 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 28 Aug 2017 15:00:46 -0400 Subject: [PATCH 2361/4996] Update history to reflect merge of #6334 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 87cbdcb9902..46d577c1bcc 100644 --- a/History.markdown +++ b/History.markdown @@ -50,6 +50,7 @@ * add SUPPORT file for GitHub (#6324) * Rename CODE_OF_CONDUCT to show in banner (#6325) * Docs : illustrate page.id for a collection's document (#6329) + * Docs: post's date can be overriden in YAML front matter (#6334) ### Site Enhancements From 06d16504ff6774388bc022ee986babde1caecc81 Mon Sep 17 00:00:00 2001 From: Natanael Arndt Date: Wed, 30 Aug 2017 14:48:15 +0200 Subject: [PATCH 2362/4996] Docs: `site.url` behavior on development and production environments (#6270) Merge pull request 6270 --- docs/_docs/variables.md | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/docs/_docs/variables.md b/docs/_docs/variables.md index cec351968b5..5bb44e6b276 100644 --- a/docs/_docs/variables.md +++ b/docs/_docs/variables.md @@ -185,17 +185,32 @@ following is a reference of the available data.

    + +

    site.url

    +

    + + Contains the url of your site as it is configured in the _config.yml. + For example, if you have url: http://mysite.com + in your configuration file, then it will be accessible in Liquid as + site.url. For the development environment there is + an exception, + if you are running jekyll serve in a development environment + site.url will be set to the value of host, + port, and SSL-related options. This defaults to + url: http://localhost:4000). + +

    +

    site.[CONFIGURATION_DATA]

    All the variables set via the command line and your _config.yml are available through the site - variable. For example, if you have url: http://mysite.com - in your configuration file, then in your Posts and Pages it will be - stored in site.url. Jekyll does not parse changes to - _config.yml in watch mode, you must restart - Jekyll to see changes to variables. + variable. For example, if you have foo: bar + in your configuration file, then it will be accessible in Liquid as site.foo. + Jekyll does not parse changes to _config.yml in + watch mode, you must restart Jekyll to see changes to variables.

    From e2b3ab85a030e1bf6f2853e330a2a44dd0070b8c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 30 Aug 2017 08:48:16 -0400 Subject: [PATCH 2363/4996] Update history to reflect merge of #6270 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 46d577c1bcc..3aaf6f12c11 100644 --- a/History.markdown +++ b/History.markdown @@ -51,6 +51,7 @@ * Rename CODE_OF_CONDUCT to show in banner (#6325) * Docs : illustrate page.id for a collection's document (#6329) * Docs: post's date can be overriden in YAML front matter (#6334) + * Docs: `site.url` behavior on development and production environments (#6270) ### Site Enhancements From 692ce4946036f98f9b7414d3b5b4313218bb6967 Mon Sep 17 00:00:00 2001 From: Natanael Arndt Date: Wed, 30 Aug 2017 15:20:38 +0200 Subject: [PATCH 2364/4996] Fix typo in site.url section of variables.md :-[ (#6337) Merge pull request 6337 --- docs/_docs/variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/variables.md b/docs/_docs/variables.md index 5bb44e6b276..0fac9e66152 100644 --- a/docs/_docs/variables.md +++ b/docs/_docs/variables.md @@ -197,7 +197,7 @@ following is a reference of the available data. if you are running jekyll serve in a development environment site.url will be set to the value of host, port, and SSL-related options. This defaults to - url: http://localhost:4000). + url: http://localhost:4000.

    From 6a2a33d09d614377e62eba804496ad37ab63f427 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 30 Aug 2017 09:20:40 -0400 Subject: [PATCH 2365/4996] Update history to reflect merge of #6337 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3aaf6f12c11..eb8293179b0 100644 --- a/History.markdown +++ b/History.markdown @@ -52,6 +52,7 @@ * Docs : illustrate page.id for a collection's document (#6329) * Docs: post's date can be overriden in YAML front matter (#6334) * Docs: `site.url` behavior on development and production environments (#6270) + * Fix typo in site.url section of variables.md :-[ (#6337) ### Site Enhancements From 53500a215a1bc5c6fdb31e3b94e4b7714f65996b Mon Sep 17 00:00:00 2001 From: Bradley Meck Date: Wed, 30 Aug 2017 13:17:18 -0500 Subject: [PATCH 2366/4996] Update mime-types. (#6336) Merge pull request 6336 --- lib/jekyll/mime.types | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/mime.types b/lib/jekyll/mime.types index 15828b91c4c..af68d359e11 100644 --- a/lib/jekyll/mime.types +++ b/lib/jekyll/mime.types @@ -14,7 +14,7 @@ application/cdmi-domain cdmid application/cdmi-object cdmio application/cdmi-queue cdmiq application/cu-seeme cu -application/dash+xml mdp +application/dash+xml mpd application/davmount+xml davmount application/docbook+xml dbk application/dssc+der dssc @@ -26,16 +26,18 @@ application/exi exi application/font-tdpfr pfr application/font-woff woff application/font-woff2 woff2 +application/geo+json geojson application/gml+xml gml application/gpx+xml gpx application/gxf gxf +application/gzip gz application/hyperstudio stk application/inkml+xml ink inkml application/ipfix ipfix application/java-archive jar war ear application/java-serialized-object ser application/java-vm class -application/javascript js +application/javascript js mjs application/json json map application/json5 json5 application/jsonml+json jsonml @@ -142,6 +144,7 @@ application/vnd.anser-web-funds-transfer-initiation fti application/vnd.antix.game-component atx application/vnd.apple.installer+xml mpkg application/vnd.apple.mpegurl m3u8 +application/vnd.apple.pkpass pkpass application/vnd.aristanetworks.swi swi application/vnd.astraea-software.iota iota application/vnd.audiograph aep @@ -220,6 +223,9 @@ application/vnd.geonext gxt application/vnd.geoplan g2w application/vnd.geospace g3w application/vnd.gmx gmx +application/vnd.google-apps.document gdoc +application/vnd.google-apps.presentation gslides +application/vnd.google-apps.spreadsheet gsheet application/vnd.google-earth.kml+xml kml application/vnd.google-earth.kmz kmz application/vnd.grafeq gqf gqs @@ -317,6 +323,7 @@ application/vnd.ms-htmlhelp chm application/vnd.ms-ims ims application/vnd.ms-lrm lrm application/vnd.ms-officetheme thmx +application/vnd.ms-outlook msg application/vnd.ms-pki.seccat cat application/vnd.ms-pki.stl stl application/vnd.ms-powerpoint ppt pps pot @@ -422,6 +429,7 @@ application/vnd.stardivision.writer sdw vo application/vnd.stardivision.writer-global sgl application/vnd.stepmania.package smzip application/vnd.stepmania.stepchart sm +application/vnd.sun.wadl+xml wadl application/vnd.sun.xml.calc sxc application/vnd.sun.xml.calc.template stc application/vnd.sun.xml.draw sxd @@ -481,6 +489,7 @@ application/wspolicy+xml wspoli application/x-7z-compressed 7z application/x-abiword abw application/x-ace-compressed ace +application/x-arj arj application/x-authorware-bin aab x32 u32 vox application/x-authorware-map aam application/x-authorware-seg aas @@ -582,6 +591,14 @@ application/x-tex-tfm tfm application/x-texinfo texinfo texi application/x-tgif obj application/x-ustar ustar +application/x-virtualbox-hdd hdd +application/x-virtualbox-ova ova +application/x-virtualbox-ovf ovf +application/x-virtualbox-vbox vbox +application/x-virtualbox-vbox-extpack vbox-extpack +application/x-virtualbox-vdi vdi +application/x-virtualbox-vhd vhd +application/x-virtualbox-vmdk vmdk application/x-wais-source src application/x-web-app-manifest+json webapp application/x-x509-ca-cert der crt pem @@ -594,7 +611,7 @@ application/xaml+xml xaml application/xcap-diff+xml xdf application/xenc+xml xenc application/xhtml+xml xhtml xht -application/xml xml xsl xsd +application/xml xml xsl xsd rng application/xml-dtd dtd application/xop+xml xop application/xproc+xml xpl @@ -604,11 +621,13 @@ application/xv+xml mxml x application/yang yang application/yin+xml yin application/zip zip +audio/3gpp 3gpp audio/adpcm adp audio/basic au snd audio/midi mid midi kar rmi -audio/mp4 mp4a m4a -audio/mpeg mpga mp2 mp2a mp3 m2a m3a +audio/mp3 mp3 +audio/mp4 m4a mp4a +audio/mpeg mpga mp2 mp2a m2a m3a audio/ogg oga ogg spx audio/s3m s3m audio/silk sil @@ -642,6 +661,7 @@ chemical/x-cmdf cmdf chemical/x-cml cml chemical/x-csml csml chemical/x-xyz xyz +image/apng apng image/bmp bmp image/cgm cgm image/g3fax g3 @@ -690,6 +710,8 @@ image/x-xbitmap xbm image/x-xpixmap xpm image/x-xwindowdump xwd message/rfc822 eml mime +model/gltf+json gltf +model/gltf-binary glb model/iges igs iges model/mesh msh mesh silo model/vnd.collada+xml dae @@ -712,12 +734,14 @@ text/html html h text/jade jade text/jsx jsx text/less less +text/markdown markdown md text/mathml mml text/n3 n3 text/plain txt text conf def list log in ini text/prs.lines.tag dsc text/richtext rtx text/sgml sgml sgm +text/slim slim slm text/stylus stylus styl text/tab-separated-values tsv text/troff t tr roff man me ms @@ -744,7 +768,7 @@ text/x-fortran f for text/x-handlebars-template hbs text/x-java-source java text/x-lua lua -text/x-markdown markdown md mkd +text/x-markdown mkd text/x-nfo nfo text/x-opml opml text/x-pascal p pas @@ -753,11 +777,12 @@ text/x-sass sass text/x-scss scss text/x-setext etx text/x-sfv sfv +text/x-suse-ymp ymp text/x-uuencode uu text/x-vcalendar vcs text/x-vcard vcf text/yaml yaml yml -video/3gpp 3gp 3gpp +video/3gpp 3gp video/3gpp2 3g2 video/h261 h261 video/h263 h263 From 68d0214c6c21bfd29b5e11fb1af2f4273bcd40d1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 30 Aug 2017 14:17:19 -0400 Subject: [PATCH 2367/4996] Update history to reflect merge of #6336 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index eb8293179b0..a831a55a522 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * Access custom config array throughout session (#6200) * Add support for Rouge 2, in addition to Rouge 1 (#5919) * Allow `yield` to logger methods & bail early on no-op messages (#6315) + * Update mime-types. (#6336) ### Bug Fixes From 94f377eed559fc1555de4116b1d003d8e24852dc Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 30 Aug 2017 21:30:57 +0200 Subject: [PATCH 2368/4996] use latest rubocop channel on codeclimate (#6333) Merge pull request 6333 --- .codeclimate.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.codeclimate.yml b/.codeclimate.yml index b3d26d655a1..f64d0bfabe0 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -3,6 +3,7 @@ engines: enabled: false rubocop: enabled: true + channel: rubocop-0-49 exclude_paths: - .codeclimate.yml From fb27b2e296219943f3c6b563b21a2443b1337de1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 30 Aug 2017 15:30:58 -0400 Subject: [PATCH 2369/4996] Update history to reflect merge of #6333 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a831a55a522..589396f956d 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Add a quick test for DataReader (#6284) * script/backport-pr: commit message no longer includes the `#` (#6289) * Add Add CODEOWNERS file to help automate reviews. (#6320) + * Fix builds on codeclimate (#6333) ### Minor Enhancements From cb58716310a2ecd46e572e942972680ead4a82d9 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 2 Sep 2017 00:36:25 +0200 Subject: [PATCH 2370/4996] Docs: updates (#6343) Merge pull request 6343 --- docs/_docs/deployment-methods.md | 44 +++++++++++++++++------------- docs/_docs/resources.md | 47 ++++++++++++++++++-------------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/docs/_docs/deployment-methods.md b/docs/_docs/deployment-methods.md index 3146b372e79..608b0661210 100644 --- a/docs/_docs/deployment-methods.md +++ b/docs/_docs/deployment-methods.md @@ -5,6 +5,31 @@ permalink: /docs/deployment-methods/ Sites built using Jekyll can be deployed in a large number of ways due to the static nature of the generated output. A few of the most common deployment techniques are described below. +
    +
    ProTip™: Use GitHub Pages for zero-hassle Jekyll hosting
    +

    GitHub Pages are powered by Jekyll behind the scenes, so if you’re looking for a zero-hassle, zero-cost solution, GitHub Pages are a great way to host your Jekyll-powered website for free.

    +
    + +## Netlify + +Netlify provides Global CDN, Continuous Deployment, one click HTTPS and [much more](https://www.netlify.com/features/), providing developers the most robust toolset available for modern web projects, without added complexity. Netlify supports custom plugins for Jekyll and has a free plan for open source projects. + +Read this [Jekyll step-by-step guide](https://www.netlify.com/blog/2015/10/28/a-step-by-step-guide-jekyll-3.0-on-netlify/) to setup your Jekyll site on Netlify. + +## Aerobatic + +[Aerobatic](https://www.aerobatic.com) has custom domains, global CDN distribution, basic auth, CORS proxying, and a growing list of plugins all included. + +Automating the deployment of a Jekyll site is simple. See our [Jekyll docs](https://www.aerobatic.com/docs/static-site-generators/#jekyll) for more details. Your built `_site` folder is deployed to our highly-available, globally distributed hosting service. + +## Kickster + +Use [Kickster](http://kickster.nielsenramon.com/) for easy (automated) deploys to GitHub Pages when using unsupported plugins on GitHub Pages. + +Kickster provides a basic Jekyll project setup packed with web best practises and useful optimization tools increasing your overall project quality. Kickster ships with automated and worry-free deployment scripts for GitHub Pages. + +Setting up Kickster is very easy, just install the gem and you are good to go. More documentation can here found [here](https://github.com/nielsenramon/kickster#kickster). If you do not want to use the gem or start a new project you can just copy paste the deployment scripts for [Travis CI](https://github.com/nielsenramon/kickster/tree/master/snippets/travis) or [Circle CI](https://github.com/nielsenramon/kickster#automated-deployment-with-circle-ci). + ## Web hosting providers (FTP) Just about any traditional web hosting provider will let you upload files to their servers over FTP. To upload a Jekyll site to a web host using FTP, simply run the `jekyll build` command and copy the contents of the generated `_site` folder to the root folder of your hosting account. This is most likely to be the `httpdocs` or `public_html` folder on most hosting providers. @@ -187,22 +212,3 @@ low-volume blogs as you only pay for what you use. If you'd like to deploy your site to an OpenShift gear, there's [a cartridge for that](https://github.com/openshift-quickstart/jekyll-openshift). - -
    -
    ProTip™: Use GitHub Pages for zero-hassle Jekyll hosting
    -

    GitHub Pages are powered by Jekyll behind the scenes, so if you’re looking for a zero-hassle, zero-cost solution, GitHub Pages are a great way to host your Jekyll-powered website for free.

    -
    - -## Kickster - -Use [Kickster](http://kickster.nielsenramon.com/) for easy (automated) deploys to GitHub Pages when using unsupported plugins on GitHub Pages. - -Kickster provides a basic Jekyll project setup packed with web best practises and useful optimization tools increasing your overall project quality. Kickster ships with automated and worry-free deployment scripts for GitHub Pages. - -Setting up Kickster is very easy, just install the gem and you are good to go. More documentation can here found [here](https://github.com/nielsenramon/kickster#kickster). If you do not want to use the gem or start a new project you can just copy paste the deployment scripts for [Travis CI](https://github.com/nielsenramon/kickster/tree/master/snippets/travis) or [Circle CI](https://github.com/nielsenramon/kickster#automated-deployment-with-circle-ci). - -## Aerobatic - -[Aerobatic](https://www.aerobatic.com) has custom domains, global CDN distribution, basic auth, CORS proxying, and a growing list of plugins all included. - -Automating the deployment of a Jekyll site is simple. See our [Jekyll docs](https://www.aerobatic.com/docs/static-site-generators/#jekyll) for more details. Your built `_site` folder is deployed to our highly-available, globally distributed hosting service. diff --git a/docs/_docs/resources.md b/docs/_docs/resources.md index a8da04c5d24..24a9ab49739 100644 --- a/docs/_docs/resources.md +++ b/docs/_docs/resources.md @@ -3,49 +3,56 @@ title: Resources permalink: /docs/resources/ --- -Jekyll’s growing use is producing a wide variety of tutorials, frameworks, extensions, examples, and other resources that can be very helpful. Below is a collection of links to some of the most popular Jekyll resources. +Jekyll's growing use is producing a wide variety of tutorials, frameworks, extensions, examples, and other resources that can be very helpful. Below is a collection of links to some of the most popular Jekyll resources. -#### Editors +## Editors -- [sublime-jekyll](https://github.com/23maverick23/sublime-jekyll): A Sublime Text package for Jekyll static sites. This package should help creating Jekyll sites and posts easier by providing access to key template tags and filters, as well as common completions and a current date/datetime command (for dating posts). You can install this package manually via GitHub, or via [Package Control](https://packagecontrol.io/packages/Jekyll). -- [vim-jekyll](https://github.com/parkr/vim-jekyll): A vim plugin to generate - new posts and run `jekyll build` all without leaving vim. +- [jekyll-atom](https://atom.io/packages/jekyll): A collection of snippets and tools for Jekyll in Atom - [markdown-writer](https://atom.io/packages/markdown-writer): An Atom package for Jekyll. It can create new posts/drafts, manage tags/categories, insert link/images and add many useful key mappings. +- [sublime-jekyll](https://github.com/23maverick23/sublime-jekyll): A Sublime Text package for Jekyll static sites. This package should help creating Jekyll sites and posts easier by providing access to key template tags and filters, as well as common completions and a current date/datetime command (for dating posts). You can install this package manually via GitHub, or via [Package Control](https://packagecontrol.io/packages/Jekyll). +- [vim-jekyll](https://github.com/parkr/vim-jekyll): A vim plugin to generate new posts and run `jekyll build` all without leaving vim. - [Wordpress2Jekyll](https://wordpress.org/plugins/wp2jekyll/): A Wordpress plugin that allows you to use Wordpress as your editor and (automatically) export content in to Jekyll. WordPress2Jekyll attempts to marry these two systems together in order to make a site that can be easily managed from all devices. -### Useful Guides +## Useful Guides - [Jekyll Tips](http://jekyll.tips) is a set of resources created by [CloudCannon](https://cloudcannon.com) to help folks get up and running with Jekyll. They cover all skill levels, and even include some great video tutorials. - [Jekyll Cheatsheet](http://jekyll.tips/jekyll-cheat-sheet/) is a single-page resource for Jekyll filters, variables, and the like. -- [“Creating and Hosting a Personal Site on GitHub”](http://jmcglone.com/guides/github-pages/) -- [‘Build A Blog With Jekyll And GitHub Pages’ on Smashing Magazine](https://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) +- ["Creating and Hosting a Personal Site on GitHub"](http://jmcglone.com/guides/github-pages/) +- ['Build A Blog With Jekyll And GitHub Pages' on Smashing Magazine](https://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) - Publishing to GitHub Pages? [Check out our documentation page for just that purpose](/docs/github-pages/). - [Blogging with Git, Emacs and Jekyll](https://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) - [Tips for working with GitHub Pages Integration](https://gist.github.com/jedschneider/2890453) -### Integrations +## Integrations - Use a saas service as a backend for forms (contact forms, hiring forms, etc.) - - [Formspree (also open source)](https://formspree.io/) + + - [Formspree (open source)](https://formspree.io/) - [FormKeep](https://formkeep.com/guides/contact-form-jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=contact-form-jekyll) - [Simple Form](https://getsimpleform.com/) - [Formingo](https://www.formingo.co/guides/jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=Jekyll%20Documentation) -- [Jekyll Bootstrap](http://jekyllbootstrap.com), 0 to Blog in 3 minutes. Provides detailed explanations, examples, and helper-code to make getting started with Jekyll easier. -- [Integrating Twitter with Jekyll](http://www.justkez.com/integrating-twitter-with-jekyll/) - > “Having migrated Justkez.com to be based on Jekyll, I was pondering how I might include my recent twitterings on the front page of the site. In the WordPress world, this would have been done via a plugin which may or may not have hung the loading of the page, might have employed caching, but would certainly have had some overheads. … Not in Jekyll.” -- [Staticman](https://staticman.net): Add user-generated content to a Jekyll site (free and open source) + - [Staticman](https://staticman.net): Add user-generated content to a Jekyll site (free and open source) + - [Snipcart](https://snipcart.com/blog/static-site-e-commerce-part-2-integrating-snipcart-with-jekyll): Add a shopping cart to a Jekyll site + - [Contentful](https://www.contentful.com/ecosystem/jekyll/): use Jekyll together with the API-driven Contentful CMS. + - [Algolia](https://blog.algolia.com/instant-search-blog-documentation-jekyll-plugin/): Add a powerful instant search to your Jekyll site -### Other commentary +## Other commentary -- [‘My Jekyll Fork’, by Mike West](https://mikewest.org/2009/11/my-jekyll-fork) +- [How I'm using Jekyll in 2016](https://mademistakes.com/articles/using-jekyll-2016/) - > “Jekyll is a well-architected throwback to a time before WordPress, when men were men, and HTML was static. I like the ideas it espouses, and have made a few improvements to it’s core. Here, I’ll point out some highlights of my fork in the hopes that they see usage beyond this site.” +- [Static Comments with Jekyll & Staticman](https://mademistakes.com/articles/improving-jekyll-static-comments/) + +- [Adding Ajax pagination to Jekyll](https://eduardoboucas.com/blog/2014/11/05/adding-ajax-pagination-to-jekyll.html) -- [‘About this Website’, by Carter Allen](http://cartera.me/2010/08/12/about-this-website/) +- ['My Jekyll Fork', by Mike West](https://mikewest.org/2009/11/my-jekyll-fork) - > “Jekyll is everything that I ever wanted in a blogging engine. Really. It isn’t perfect, but what’s excellent about it is that if there’s something wrong, I know exactly how it works and how to fix it. It runs on the your machine only, and is essentially an added”build" step between you and the browser. I coded this entire site in TextMate using standard HTML5 and CSS3, and then at the end I added just a few little variables to the markup. Presto-chango, my site is built and I am at peace with the world.” + > "Jekyll is a well-architected throwback to a time before WordPress, when men were men, and HTML was static. I like the ideas it espouses, and have made a few improvements to it's core. Here, I'll point out some highlights of my fork in the hopes that they see usage beyond this site." + +- ['About this Website', by Carter Allen](http://cartera.me/2010/08/12/about-this-website/) + + > "Jekyll is everything that I ever wanted in a blogging engine. Really. It isn't perfect, but what's excellent about it is that if there's something wrong, I know exactly how it works and how to fix it. It runs on the your machine only, and is essentially an added"build" step between you and the browser. I coded this entire site in TextMate using standard HTML5 and CSS3, and then at the end I added just a few little variables to the markup. Presto-chango, my site is built and I am at peace with the world." - [Generating a Tag Cloud in Jekyll](http://www.justkez.com/generating-a-tag-cloud-in-jekyll/) – A guide to implementing a tag cloud and per-tag content pages using Jekyll. + - A way to [extend Jekyll](https://github.com/rfelix/jekyll_ext) without forking and modifying the Jekyll gem codebase and some [portable Jekyll extensions](https://wiki.github.com/rfelix/jekyll_ext/extensions) that can be reused and shared. - [Using your Rails layouts in Jekyll](http://numbers.brighterplanet.com/2010/08/09/sharing-rails-views-with-jekyll) -- [Adding Ajax pagination to Jekyll](https://eduardoboucas.com/blog/2014/11/05/adding-ajax-pagination-to-jekyll.html) From 1a4f53de1478786151891fbfeaf4fda6eda2089e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 1 Sep 2017 18:36:26 -0400 Subject: [PATCH 2371/4996] Update history to reflect merge of #6343 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 589396f956d..50ba202e33d 100644 --- a/History.markdown +++ b/History.markdown @@ -55,6 +55,7 @@ * Docs: post's date can be overriden in YAML front matter (#6334) * Docs: `site.url` behavior on development and production environments (#6270) * Fix typo in site.url section of variables.md :-[ (#6337) + * Docs: updates (#6343) ### Site Enhancements From 6ce912e9573893babb6ca9b0e3aa1377f9804373 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 2 Sep 2017 10:38:07 -0400 Subject: [PATCH 2372/4996] Use a Schwartzian transform with custom sorting (#6342) Merge pull request 6342 --- benchmark/schwartzian_transform.rb | 115 +++++++++++++++++++++++++++++ lib/jekyll/filters.rb | 29 +++++--- 2 files changed, 133 insertions(+), 11 deletions(-) create mode 100644 benchmark/schwartzian_transform.rb diff --git a/benchmark/schwartzian_transform.rb b/benchmark/schwartzian_transform.rb new file mode 100644 index 00000000000..76c53e44e32 --- /dev/null +++ b/benchmark/schwartzian_transform.rb @@ -0,0 +1,115 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true +# +# The Ruby documentation for #sort_by describes what's called a Schwartzian transform: +# +# > A more efficient technique is to cache the sort keys (modification times in this case) +# > before the sort. Perl users often call this approach a Schwartzian transform, after +# > Randal Schwartz. We construct a temporary array, where each element is an array +# > containing our sort key along with the filename. We sort this array, and then extract +# > the filename from the result. +# > This is exactly what sort_by does internally. +# +# The well-documented efficiency of sort_by is a good reason to use it. However, when a property +# does not exist on an item being sorted, it can cause issues (no nil's allowed!) +# In Jekyll::Filters#sort_input, we extract the property in each iteration of #sort, +# which is quite inefficient! How inefficient? This benchmark will tell you just how, and how much +# it can be improved by using the Schwartzian transform. Thanks, Randall! + +require 'benchmark/ips' +require 'minitest' +require File.expand_path("../lib/jekyll", __dir__) + +def site + @site ||= Jekyll::Site.new( + Jekyll.configuration("source" => File.expand_path("../docs", __dir__)) + ).tap(&:reset).tap(&:read) +end + +def site_docs + site.collections["docs"].docs.dup +end + +def sort_by_property_directly(docs, meta_key) + docs.sort! do |apple, orange| + apple_property = apple[meta_key] + orange_property = orange[meta_key] + + if !apple_property.nil? && !orange_property.nil? + apple_property <=> orange_property + elsif !apple_property.nil? && orange_property.nil? + -1 + elsif apple_property.nil? && !orange_property.nil? + 1 + else + apple <=> orange + end + end +end + +def schwartzian_transform(docs, meta_key) + docs.collect! { |d| + [d[meta_key], d] + }.sort! { |apple, orange| + if !apple[0].nil? && !orange[0].nil? + apple.first <=> orange.first + elsif !apple[0].nil? && orange[0].nil? + -1 + elsif apple[0].nil? && !orange[0].nil? + 1 + else + apple[-1] <=> orange[-1] + end + }.collect! { |d| d[-1] } +end + +# Before we test efficiency, do they produce the same output? +class Correctness + include Minitest::Assertions + + require "pp" + define_method :mu_pp, &:pretty_inspect + + attr_accessor :assertions + + def initialize(docs, property) + @assertions = 0 + @docs = docs + @property = property + end + + def assert! + assert sort_by_property_directly(@docs, @property).is_a?(Array), "sort_by_property_directly must return an array" + assert schwartzian_transform(@docs, @property).is_a?(Array), "schwartzian_transform must return an array" + assert_equal sort_by_property_directly(@docs, @property), + schwartzian_transform(@docs, @property) + puts "Yeah, ok, correctness all checks out for property #{@property.inspect}" + end +end + +Correctness.new(site_docs, "redirect_from".freeze).assert! +Correctness.new(site_docs, "title".freeze).assert! + +# First, test with a property only a handful of documents have. +Benchmark.ips do |x| + x.config(time: 10, warmup: 5) + x.report('sort_by_property_directly with sparse property') do + sort_by_property_directly(site_docs, "redirect_from".freeze) + end + x.report('schwartzian_transform with sparse property') do + schwartzian_transform(site_docs, "redirect_from".freeze) + end + x.compare! +end + +# Next, test with a property they all have. +Benchmark.ips do |x| + x.config(time: 10, warmup: 5) + x.report('sort_by_property_directly with non-sparse property') do + sort_by_property_directly(site_docs, "title".freeze) + end + x.report('schwartzian_transform with non-sparse property') do + schwartzian_transform(site_docs, "title".freeze) + end + x.compare! +end diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 35ed4d9f63e..686995e195f 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -335,19 +335,26 @@ def inspect(input) end private + + # Sort the input Enumerable by the given property. + # If the property doesn't exist, return the sort order respective of + # which item doesn't have the property. + # We also utilize the Schwartzian transform to make this more efficient. def sort_input(input, property, order) - input.sort do |apple, orange| - apple_property = item_property(apple, property) - orange_property = item_property(orange, property) - - if !apple_property.nil? && orange_property.nil? - - order - elsif apple_property.nil? && !orange_property.nil? - + order - else - apple_property <=> orange_property + input.map { |item| [item_property(item, property), item] } + .sort! do |apple_info, orange_info| + apple_property = apple_info.first + orange_property = orange_info.first + + if !apple_property.nil? && orange_property.nil? + - order + elsif apple_property.nil? && !orange_property.nil? + + order + else + apple_property <=> orange_property + end end - end + .map!(&:last) end private From b6853bf9389261d25b410d86a41d2b8f06f63a41 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 2 Sep 2017 10:38:09 -0400 Subject: [PATCH 2373/4996] Update history to reflect merge of #6342 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 50ba202e33d..2517194e670 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * Add support for Rouge 2, in addition to Rouge 1 (#5919) * Allow `yield` to logger methods & bail early on no-op messages (#6315) * Update mime-types. (#6336) + * Use a Schwartzian transform with custom sorting (#6342) ### Bug Fixes From 579f9ee1dd657de8bf6bed0cc4620012a5bc74fe Mon Sep 17 00:00:00 2001 From: Ohad Schneider Date: Mon, 4 Sep 2017 23:54:28 +0300 Subject: [PATCH 2374/4996] Fix precedence docs (#6346) Merge pull request 6346 --- docs/_docs/configuration.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 057e4ee29f8..6d74fdbb50c 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -518,7 +518,7 @@ defaults: - scope: path: "" - type: "posts" + type: "pages" values: layout: "my-site" - @@ -530,7 +530,7 @@ defaults: author: "Mr. Hyde" ``` -With these defaults, all posts would use the `my-site` layout. Any html files that exist in the `projects/` folder will use the `project` layout, if it exists. Those files will also have the `page.author` [liquid variable](../variables/) set to `Mr. Hyde`. +With these defaults, all pages would use the `my-site` layout. Any html files that exist in the `projects/` folder will use the `project` layout, if it exists. Those files will also have the `page.author` [liquid variable](../variables/) set to `Mr. Hyde`. ```yaml collections: @@ -553,7 +553,7 @@ In this example, the `layout` is set to `default` inside the Jekyll will apply all of the configuration settings you specify in the `defaults` section of your `_config.yml` file. However, you can choose to override settings from other scope/values pair by specifying a more specific path for the scope. -You can see that in the second to last example above. First, we set the default layout to `my-site`. Then, using a more specific path, we set the default layout for files in the `projects/` path to `project`. This can be done with any value that you would set in the page or post front matter. +You can see that in the second to last example above. First, we set the default page layout to `my-site`. Then, using a more specific path, we set the default layout for pages in the `projects/` path to `project`. This can be done with any value that you would set in the page or post front matter. Finally, if you set defaults in the site configuration by adding a `defaults` section to your `_config.yml` file, you can override those settings in a post or page file. All you need to do is specify the settings in the post or page front matter. For example: From 22f2724a1f117a94cc16d18c499a93d5915ede4f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 4 Sep 2017 16:54:29 -0400 Subject: [PATCH 2375/4996] Update history to reflect merge of #6346 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2517194e670..c915515d246 100644 --- a/History.markdown +++ b/History.markdown @@ -57,6 +57,7 @@ * Docs: `site.url` behavior on development and production environments (#6270) * Fix typo in site.url section of variables.md :-[ (#6337) * Docs: updates (#6343) + * Fix precedence docs (#6346) ### Site Enhancements From 1637f29d6c37ebcc1149d11384cbac0a842ade99 Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Wed, 6 Sep 2017 12:52:34 -0400 Subject: [PATCH 2376/4996] Alias Drop#invoke_drop to Drop#[] (#6338) Merge pull request 6338 --- lib/jekyll/drops/drop.rb | 3 +- test/test_drop.rb | 76 +++++++++++++++++++++++++++++++--------- 2 files changed, 61 insertions(+), 18 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 09623ef9ac0..600e68a00e0 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -55,6 +55,7 @@ def [](key) fallback_data[key] end end + alias_method :invoke_drop, :[] # Set a field in the Drop. If mutable, sets in the mutations and # returns. If not mutable, checks first if it's trying to override a @@ -103,7 +104,7 @@ def content_methods # # Returns true if the given key is present def key?(key) - if self.class.mutable + if self.class.mutable? @mutations.key?(key) else !key.nil? && (respond_to?(key) || fallback_data.key?(key)) diff --git a/test/test_drop.rb b/test/test_drop.rb index eb23feb0f20..7bcd39714f1 100644 --- a/test/test_drop.rb +++ b/test/test_drop.rb @@ -2,6 +2,18 @@ require "helper" +class DropFixture < Jekyll::Drops::Drop + mutable true + + def foo + "bar" + end + + def fallback_data + @fallback_data ||= {} + end +end + class TestDrop < JekyllUnitTest context "a document drop" do setup do @@ -12,37 +24,67 @@ class TestDrop < JekyllUnitTest @document = @site.collections["methods"].docs.detect do |d| d.relative_path == "_methods/configuration.md" end - @drop = @document.to_liquid + @document_drop = @document.to_liquid + @drop = DropFixture.new({}) end should "reject 'nil' key" do refute @drop.key?(nil) end - should "raise KeyError if key is not found and no default provided" do - assert_raises KeyError do - @drop.fetch("not_existing_key") - end + should "return values for #[]" do + assert_equal "bar", @drop["foo"] end - should "fetch value without default" do - assert_equal "Jekyll.configuration", @drop.fetch("title") + should "return values for #invoke_drop" do + assert_equal "bar", @drop.invoke_drop("foo") end - should "fetch default if key is not found" do - assert_equal "default", @drop.fetch("not_existing_key", "default") - end + context "mutations" do + should "return mutations for #[]" do + @drop["foo"] = "baz" + assert_equal "baz", @drop["foo"] + end - should "fetch default boolean value correctly" do - assert_equal false, @drop.fetch("bar", false) + should "return mutations for #invoke_drop" do + @drop["foo"] = "baz" + assert_equal "baz", @drop.invoke_drop("foo") + end end - should "fetch default value from block if key is not found" do - assert_equal "default bar", @drop.fetch("bar") { |el| "default #{el}" } - end + context "fetch" do + should "raise KeyError if key is not found and no default provided" do + assert_raises KeyError do + @document_drop.fetch("not_existing_key") + end + end - should "fetch default value from block first if both argument and block given" do - assert_equal "baz", @drop.fetch("bar", "default") { "baz" } + should "fetch value without default" do + assert_equal "Jekyll.configuration", @document_drop.fetch("title") + end + + should "fetch default if key is not found" do + assert_equal "default", @document_drop.fetch("not_existing_key", "default") + end + + should "fetch default boolean value correctly" do + assert_equal false, @document_drop.fetch("bar", false) + end + + should "fetch default value from block if key is not found" do + assert_equal "default bar", @document_drop.fetch("bar") { |el| "default #{el}" } + end + + should "fetch default value from block first if both argument and block given" do + assert_equal "baz", @document_drop.fetch("bar", "default") { "baz" } + end + + should "not change mutability when fetching" do + assert @drop.class.mutable? + @drop["foo"] = "baz" + assert_equal "baz", @drop.fetch("foo") + assert @drop.class.mutable? + end end end end From 8b47fb1f7a85d518a21f5fcfd3b20df18c60bf7a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 6 Sep 2017 12:52:36 -0400 Subject: [PATCH 2377/4996] Update history to reflect merge of #6338 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c915515d246..0594a674a6b 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Allow `yield` to logger methods & bail early on no-op messages (#6315) * Update mime-types. (#6336) * Use a Schwartzian transform with custom sorting (#6342) + * Alias Drop#invoke_drop to Drop#[] (#6338) ### Bug Fixes From 2b6330b6862cbd3fbad663f4a92279b1ab12deeb Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 15 Sep 2017 20:27:50 +0530 Subject: [PATCH 2378/4996] bump rubies on Travis (#6366) Merge pull request 6366 --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 00e21f93e19..2cfe51b7697 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,11 +5,11 @@ language: ruby sudo: false rvm: - - &ruby1 2.4.1 - - &ruby2 2.3.4 - - &ruby3 2.2.7 + - &ruby1 2.4.2 + - &ruby2 2.3.5 + - &ruby3 2.2.8 - &ruby4 2.1.10 - - &jruby jruby-9.1.7.0 + - &jruby jruby-9.1.13.0 matrix: include: From e9f2d85767fed1beab07291faaa2dcdd532482eb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Sep 2017 10:57:51 -0400 Subject: [PATCH 2379/4996] Update history to reflect merge of #6366 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0594a674a6b..98866d258fd 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ * script/backport-pr: commit message no longer includes the `#` (#6289) * Add Add CODEOWNERS file to help automate reviews. (#6320) * Fix builds on codeclimate (#6333) + * Bump rubies on Travis (#6366) ### Minor Enhancements From e3ee9ba1132f9eaac272cdcf77fc1293a383bbb9 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Wed, 20 Sep 2017 20:04:36 +0100 Subject: [PATCH 2380/4996] add note to contributing docs about `script/console` (#6349) Merge pull request 6349 --- .github/CONTRIBUTING.markdown | 4 ++++ docs/_docs/contributing.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/.github/CONTRIBUTING.markdown b/.github/CONTRIBUTING.markdown index fe53b2f3682..14cbecc10e0 100644 --- a/.github/CONTRIBUTING.markdown +++ b/.github/CONTRIBUTING.markdown @@ -111,6 +111,10 @@ If your contribution changes any Jekyll behavior, make sure to update the docume * Don't bump the Gem version in your pull request (if you don't know what that means, you probably didn't). +* You can use the command `script/console` to start a REPL to explore the result of +Jekyll's methods. It also provides you with helpful methods to quickly create a +site or configuration. [Feel free to check it out!](https://github.com/jekyll/jekyll/blob/master/script/console) + ## Running tests locally ### Test Dependencies diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index b0b85e0f31c..391378f5e3a 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -118,6 +118,10 @@ If your contribution changes any Jekyll behavior, make sure to update the docume * Don't bump the Gem version in your pull request (if you don't know what that means, you probably didn't). +* You can use the command `script/console` to start a REPL to explore the result of +Jekyll's methods. It also provides you with helpful methods to quickly create a +site or configuration. [Feel free to check it out!](https://github.com/jekyll/jekyll/blob/master/script/console) + ## Running tests locally ### Test Dependencies From fa49c023358c3d587399b938e861f48d58e17ff4 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 20 Sep 2017 15:04:37 -0400 Subject: [PATCH 2381/4996] Update history to reflect merge of #6349 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 98866d258fd..6cc8a9cad1e 100644 --- a/History.markdown +++ b/History.markdown @@ -60,6 +60,7 @@ * Fix typo in site.url section of variables.md :-[ (#6337) * Docs: updates (#6343) * Fix precedence docs (#6346) + * add note to contributing docs about `script/console` (#6349) ### Site Enhancements From b802093f157457b7976af693c34e420227237888 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 20 Sep 2017 21:05:40 +0200 Subject: [PATCH 2382/4996] fix permalink example (#6375) Merge pull request 6375 --- docs/_docs/permalinks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index 42e68e85ff8..1a8afebac9b 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -322,7 +322,7 @@ The permalink setting in your configuration file specifies the permalink style u For example: -* A permalink style of `/:categories/:year/:month/:day/:title.html` for posts becomes `/:title.html` for pages and collections. +* A permalink style of `/:categories/:year/:month/:day/:title.:output_ext` for posts becomes `/:title.html` for pages and collections. * A permalink style of `pretty` (or `/:categories/:year/:month/:day/:title/`), which omits the file extension and contains a trailing slash, will update page and collection permalinks to also omit the file extension and contain a trailing slash: `/:title/`. * A permalink style of `date`, which contains a trailing file extension, will update page permalinks to also contain a trailing file extension: `/:title.html`. But no time or category information will be included. From 66e2d38d586d053f9733d59360d9b795712ad4ac Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 20 Sep 2017 15:05:42 -0400 Subject: [PATCH 2383/4996] Update history to reflect merge of #6375 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6cc8a9cad1e..4b1b49fe552 100644 --- a/History.markdown +++ b/History.markdown @@ -61,6 +61,7 @@ * Docs: updates (#6343) * Fix precedence docs (#6346) * add note to contributing docs about `script/console` (#6349) + * Docs: Fix permalink example (#6375) ### Site Enhancements From a5fd0c0b262be8fca4674f3f5f186e1d6a3f96be Mon Sep 17 00:00:00 2001 From: Ben Balter Date: Thu, 21 Sep 2017 15:57:24 -0400 Subject: [PATCH 2384/4996] Mutable drops should fallback to their own methods when a mutation isn't present (#6350) Merge pull request 6350 --- lib/jekyll/drops/drop.rb | 8 ++-- test/test_drop.rb | 79 +++++++++++++++++++++++++++------------- 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 600e68a00e0..1cc9c465ac4 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -104,11 +104,9 @@ def content_methods # # Returns true if the given key is present def key?(key) - if self.class.mutable? - @mutations.key?(key) - else - !key.nil? && (respond_to?(key) || fallback_data.key?(key)) - end + return false if key.nil? + return true if self.class.mutable? && @mutations.key?(key) + respond_to?(key) || fallback_data.key?(key) end # Generates a list of keys with user content as their values. diff --git a/test/test_drop.rb b/test/test_drop.rb index 7bcd39714f1..5c46d81dc77 100644 --- a/test/test_drop.rb +++ b/test/test_drop.rb @@ -10,12 +10,12 @@ def foo end def fallback_data - @fallback_data ||= {} + @fallback_data ||= { "baz" => "buzz" } end end class TestDrop < JekyllUnitTest - context "a document drop" do + context "Drops" do setup do @site = fixture_site({ "collections" => ["methods"], @@ -52,38 +52,67 @@ class TestDrop < JekyllUnitTest end end - context "fetch" do - should "raise KeyError if key is not found and no default provided" do - assert_raises KeyError do - @document_drop.fetch("not_existing_key") + context "a document drop" do + context "fetch" do + should "raise KeyError if key is not found and no default provided" do + assert_raises KeyError do + @document_drop.fetch("not_existing_key") + end end - end - should "fetch value without default" do - assert_equal "Jekyll.configuration", @document_drop.fetch("title") - end + should "fetch value without default" do + assert_equal "Jekyll.configuration", @document_drop.fetch("title") + end - should "fetch default if key is not found" do - assert_equal "default", @document_drop.fetch("not_existing_key", "default") - end + should "fetch default if key is not found" do + assert_equal "default", @document_drop.fetch("not_existing_key", "default") + end - should "fetch default boolean value correctly" do - assert_equal false, @document_drop.fetch("bar", false) - end + should "fetch default boolean value correctly" do + assert_equal false, @document_drop.fetch("bar", false) + end + + should "fetch default value from block if key is not found" do + assert_equal "default bar", @document_drop.fetch("bar") { |el| "default #{el}" } + end + + should "fetch default value from block first if both argument and block given" do + assert_equal "baz", @document_drop.fetch("bar", "default") { "baz" } + end - should "fetch default value from block if key is not found" do - assert_equal "default bar", @document_drop.fetch("bar") { |el| "default #{el}" } + should "not change mutability when fetching" do + assert @drop.class.mutable? + @drop["foo"] = "baz" + assert_equal "baz", @drop.fetch("foo") + assert @drop.class.mutable? + end end + end + + context "key?" do + context "a mutable drop" do + should "respond true for native methods" do + assert @drop.key? "foo" + end + + should "respond true for mutable keys" do + @drop["bar"] = "baz" + assert @drop.key? "bar" + end - should "fetch default value from block first if both argument and block given" do - assert_equal "baz", @document_drop.fetch("bar", "default") { "baz" } + should "return true for fallback data" do + assert @drop.key? "baz" + end end - should "not change mutability when fetching" do - assert @drop.class.mutable? - @drop["foo"] = "baz" - assert_equal "baz", @drop.fetch("foo") - assert @drop.class.mutable? + context "a document drop" do + should "respond true for native methods" do + assert @document_drop.key? "collection" + end + + should "return true for fallback data" do + assert @document_drop.key? "title" + end end end end From 97d4437179f087d2194ca77cdb88274eaf9c97c7 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 21 Sep 2017 15:57:26 -0400 Subject: [PATCH 2385/4996] Update history to reflect merge of #6350 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 4b1b49fe552..14bec6f78d6 100644 --- a/History.markdown +++ b/History.markdown @@ -40,6 +40,7 @@ * delegate `StaticFile#to_json` to `StaticFile#to_liquid` (#6273) * Fix Drop#key? so it can handle a nil argument (#6281) * Guard against type error in absolute url (#6280) + * Mutable drops should fallback to their own methods when a mutation isn't present (#6350) ### Documentation From 47bcbfb65431fcb2a1a45e84088d132075e10496 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Thu, 21 Sep 2017 21:30:23 +0100 Subject: [PATCH 2386/4996] skip adding binary files as posts (#6344) Merge pull request 6344 --- lib/jekyll/readers/post_reader.rb | 11 ++++++++--- test/test_site.rb | 30 +++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index 510192793b0..0663c658e42 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -36,10 +36,15 @@ def read_posts(dir) def read_publishable(dir, magic_dir, matcher) read_content(dir, magic_dir, matcher).tap { |docs| docs.each(&:read) } .select do |doc| - site.publisher.publish?(doc).tap do |will_publish| - if !will_publish && site.publisher.hidden_in_the_future?(doc) - Jekyll.logger.debug "Skipping:", "#{doc.relative_path} has a future date" + if doc.content.valid_encoding? + site.publisher.publish?(doc).tap do |will_publish| + if !will_publish && site.publisher.hidden_in_the_future?(doc) + Jekyll.logger.debug "Skipping:", "#{doc.relative_path} has a future date" + end end + else + Jekyll.logger.debug "Skipping:", "#{doc.relative_path} is no valid UTF-8" + false end end end diff --git a/test/test_site.rb b/test/test_site.rb index f50990e0511..81b20f7ad09 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -3,6 +3,22 @@ require "helper" class TestSite < JekyllUnitTest + def with_image_as_post + tmp_image_path = File.join(source_dir, "_posts", "2017-09-01-jekyll-sticker.jpg") + FileUtils.cp File.join(Dir.pwd, "docs", "img", "jekyll-sticker.jpg"), tmp_image_path + yield + ensure + FileUtils.rm tmp_image_path + end + + def read_posts + @site.posts.docs.concat(PostReader.new(@site).read_posts("")) + posts = Dir[source_dir("_posts", "**", "*")] + posts.delete_if do |post| + File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) + end + end + context "configuring sites" do should "have an array for plugins by default" do site = Site.new default_configuration @@ -227,14 +243,18 @@ def generate(site) end should "read posts" do - @site.posts.docs.concat(PostReader.new(@site).read_posts("")) - posts = Dir[source_dir("_posts", "**", "*")] - posts.delete_if do |post| - File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) - end + posts = read_posts assert_equal posts.size - @num_invalid_posts, @site.posts.size end + should "skip posts with invalid encoding" do + with_image_as_post do + posts = read_posts + num_invalid_posts = @num_invalid_posts + 1 + assert_equal posts.size - num_invalid_posts, @site.posts.size + end + end + should "read pages with YAML front matter" do abs_path = File.expand_path("about.html", @site.source) assert_equal true, Utils.has_yaml_header?(abs_path) From c9ac5fee94f440dcf4a7fd5c5d08ef562de9ad5c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 21 Sep 2017 16:30:25 -0400 Subject: [PATCH 2387/4996] Update history to reflect merge of #6344 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 14bec6f78d6..64f6c0722ee 100644 --- a/History.markdown +++ b/History.markdown @@ -41,6 +41,7 @@ * Fix Drop#key? so it can handle a nil argument (#6281) * Guard against type error in absolute url (#6280) * Mutable drops should fallback to their own methods when a mutation isn't present (#6350) + * skip adding binary files as posts (#6344) ### Documentation From ca3a56b37c7359964900d441582d8913adca8b74 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 21 Sep 2017 16:31:37 -0400 Subject: [PATCH 2388/4996] Fix typo in debug message. cc #6344 --- lib/jekyll/readers/post_reader.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index 0663c658e42..b0dc30326b5 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -43,7 +43,7 @@ def read_publishable(dir, magic_dir, matcher) end end else - Jekyll.logger.debug "Skipping:", "#{doc.relative_path} is no valid UTF-8" + Jekyll.logger.debug "Skipping:", "#{doc.relative_path} is not valid UTF-8" false end end From 211a59532981406457a42303c8a4a2d201dc3aa8 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 22 Sep 2017 02:06:26 +0530 Subject: [PATCH 2389/4996] Don't break if bundler is not installed (#6377) Merge pull request 6377 --- lib/jekyll/commands/new.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb index b1c8bb0bc4b..e784f24ac27 100644 --- a/lib/jekyll/commands/new.rb +++ b/lib/jekyll/commands/new.rb @@ -128,7 +128,12 @@ def scaffold_path def after_install(path, options = {}) unless options["blank"] || options["skip-bundle"] - bundle_install path + begin + require "bundler" + bundle_install path + rescue LoadError + Jekyll.logger.info "Could not load Bundler. Bundle install skipped." + end end Jekyll.logger.info "New jekyll site installed in #{path.cyan}." @@ -136,7 +141,6 @@ def after_install(path, options = {}) end def bundle_install(path) - Jekyll::External.require_with_graceful_fail "bundler" Jekyll.logger.info "Running bundle install in #{path.cyan}..." Dir.chdir(path) do process, output = Jekyll::Utils::Exec.run("bundle", "install") From 738fc558963faf3c37fc397715d01baf798922d5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 21 Sep 2017 16:36:28 -0400 Subject: [PATCH 2390/4996] Update history to reflect merge of #6377 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 64f6c0722ee..1bed8887ab6 100644 --- a/History.markdown +++ b/History.markdown @@ -42,6 +42,7 @@ * Guard against type error in absolute url (#6280) * Mutable drops should fallback to their own methods when a mutation isn't present (#6350) * skip adding binary files as posts (#6344) + * Don't break if bundler is not installed (#6377) ### Documentation From ec3a7b9078ef998259f7ef5c79ac4a02eada378f Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 21 Sep 2017 16:49:02 -0400 Subject: [PATCH 2391/4996] Add Jekyll 3.6.0 release post --- .../2017-09-21-jekyll-3-6-0-released.markdown | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 docs/_posts/2017-09-21-jekyll-3-6-0-released.markdown diff --git a/docs/_posts/2017-09-21-jekyll-3-6-0-released.markdown b/docs/_posts/2017-09-21-jekyll-3-6-0-released.markdown new file mode 100644 index 00000000000..0a468673694 --- /dev/null +++ b/docs/_posts/2017-09-21-jekyll-3-6-0-released.markdown @@ -0,0 +1,17 @@ +--- +title: 'Jekyll turns 3.6!' +date: 2017-09-21 16:38:20 -0400 +author: parkr +version: 3.6.0 +categories: [release] +--- + +Another much-anticipated release of Jekyll. This release comes with it Rouge 2 support, but note you can continue to use Rouge 1 if you'd prefer. We also now require Ruby 2.1.0 as 2.0.x is no longer supported by the Ruby team. + +Otherwise, it's a massive bug-fix release! A few bugs were found and squashed with our `Drop` implementation. We're using the Schwartzian transform to speed up our custom sorting (thanks, Perl community!). We now protect against images that are named like posts and we generally worked on guarding our code to enforce requirements, instead of assuming the input was as expected. + +Please let us know if you find any bugs! You can see [the full history here](/docs/history/#v3-6-0). + +Many thanks to our contributors who helped make this release possible: Aleksander Kuś, André Jaenisch, Antonio Argote, ashmaroli, Ben Balter, Bogdan, Bradley Meck, David Zhang, Florian Thomas, Frank Taillandier, Jordon Bedwell, Joshua Byrd, Kyle Zhao, lymaconsulting, Maciej Bembenista, Matt Sturgeon, Natanael Arndt, Ohad Schneider, Pat Hawks, Pedro Lamas, and Sid Verma. + +As always, Happy Jekylling! From 3feafed56c0f6e816500510ea7a83bfac962e188 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 21 Sep 2017 17:30:21 -0400 Subject: [PATCH 2392/4996] Release :gem: 3.6.0 --- History.markdown | 41 +++++++++--------- docs/_docs/code_of_conduct.md | 55 ++++++++++++++++++++++++ docs/_docs/contributing.md | 5 +-- docs/_docs/history.md | 81 +++++++++++++++++++++++++++++++++++ docs/latest_version.txt | 2 +- lib/jekyll/version.rb | 2 +- 6 files changed, 160 insertions(+), 26 deletions(-) create mode 100644 docs/_docs/code_of_conduct.md diff --git a/History.markdown b/History.markdown index 1bed8887ab6..537fcfeccf6 100644 --- a/History.markdown +++ b/History.markdown @@ -1,18 +1,4 @@ -## HEAD - -### Development Fixes - - * Strip unnecessary leading whitespace in template (#6228) - * Users should be installing patch versions. (#6198) - * fix tests (#6240) - * Define path with __dir__ (#6087) - * exit site.process sooner (#6239) - * make flakey test more robust (#6277) - * Add a quick test for DataReader (#6284) - * script/backport-pr: commit message no longer includes the `#` (#6289) - * Add Add CODEOWNERS file to help automate reviews. (#6320) - * Fix builds on codeclimate (#6333) - * Bump rubies on Travis (#6366) +## 3.6.0 / 2017-09-21 ### Minor Enhancements @@ -26,22 +12,22 @@ * Allow `yield` to logger methods & bail early on no-op messages (#6315) * Update mime-types. (#6336) * Use a Schwartzian transform with custom sorting (#6342) - * Alias Drop#invoke_drop to Drop#[] (#6338) + * Alias `Drop#invoke_drop` to `Drop#[]` (#6338) ### Bug Fixes * `Deprecator`: fix typo for `--serve` command (#6229) * `Reader#read_directories`: guard against an entry not being a directory (#6226) * kramdown: symbolize keys in-place (#6247) - * Call to_s on site.url before attempting to concatenate strings (#6253) + * Call `to_s` on site.url before attempting to concatenate strings (#6253) * Enforce Style/FrozenStringLiteralComment (#6265) * Update theme-template README to note 'assets' directory (#6257) - * Memoize the return value of Document#url (#6266) + * Memoize the return value of `Document#url` (#6266) * delegate `StaticFile#to_json` to `StaticFile#to_liquid` (#6273) - * Fix Drop#key? so it can handle a nil argument (#6281) + * Fix `Drop#key?` so it can handle a nil argument (#6281) * Guard against type error in absolute url (#6280) * Mutable drops should fallback to their own methods when a mutation isn't present (#6350) - * skip adding binary files as posts (#6344) + * Skip adding binary files as posts (#6344) * Don't break if bundler is not installed (#6377) ### Documentation @@ -72,6 +58,21 @@ * Customizing url in collection elements clarified (#6264) * Plugins is the new gems (#6326) +### Development Fixes + + * Strip unnecessary leading whitespace in template (#6228) + * Users should be installing patch versions. (#6198) + * Fix tests (#6240) + * Define path with `__dir__` (#6087) + * exit site.process sooner (#6239) + * make flakey test more robust (#6277) + * Add a quick test for DataReader (#6284) + * script/backport-pr: commit message no longer includes the `#` (#6289) + * Add Add CODEOWNERS file to help automate reviews. (#6320) + * Fix builds on codeclimate (#6333) + * Bump rubies on Travis (#6366) + + ## 3.5.2 / 2017-08-12 ### Bug Fixes diff --git a/docs/_docs/code_of_conduct.md b/docs/_docs/code_of_conduct.md new file mode 100644 index 00000000000..1cd0bdbc525 --- /dev/null +++ b/docs/_docs/code_of_conduct.md @@ -0,0 +1,55 @@ +--- +title: Code of Conduct +permalink: "/docs/code_of_conduct/" +note: This file is autogenerated. Edit /CODE_OF_CONDUCT.markdown instead. +redirect_from: "/conduct/index.html" +editable: false +--- + +As contributors and maintainers of this project, and in the interest of +fostering an open and welcoming community, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating +documentation, submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free +experience for everyone, regardless of level of experience, gender, gender +identity and expression, sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, such as physical or electronic + addresses, without explicit permission +* Other unethical or unprofessional conduct + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +By adopting this Code of Conduct, project maintainers commit themselves to +fairly and consistently applying these principles to every aspect of managing +this project. Project maintainers who do not follow or enforce the Code of +Conduct may be permanently removed from the project team. + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by opening an issue or contacting a project maintainer. All complaints +will be reviewed and investigated and will result in a response that is deemed +necessary and appropriate to the circumstances. Maintainers are obligated to +maintain confidentiality with regard to the reporter of an incident. + + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.3.0, available at +[http://contributor-covenant.org/version/1/3/0/][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/3/0/ diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index 391378f5e3a..b8a838a752a 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -8,10 +8,7 @@ Hi there! Interested in contributing to Jekyll? We'd love your help. Jekyll is a ## Where to get help or report a problem -* If you have a question about using Jekyll, start a discussion on [Jekyll Talk](https://talk.jekyllrb.com). -* If you think you've found a bug within a Jekyll plugin, open an issue in that plugin's repository. -* If you think you've found a bug within Jekyll itself, [open an issue](https://github.com/jekyll/jekyll/issues/new). -* More resources are listed on our [Help page](https://jekyllrb.com/help/). +See [the support guidelines](SUPPORT.md) ## Ways to contribute diff --git a/docs/_docs/history.md b/docs/_docs/history.md index d64d0b1c0e5..20b98b5c810 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,6 +4,87 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.6.0 / 2017-09-21 +{: #v3-6-0} + +### Minor Enhancements +{: #minor-enhancements-v3-6-0} + +- Ignore final newline in folded YAML string ([#6054]({{ site.repository }}/issues/6054)) +- Add URL checks to Doctor ([#5760]({{ site.repository }}/issues/5760)) +- Fix serving files that clash with directories ([#6222]({{ site.repository }}/issues/6222)) ([#6231]({{ site.repository }}/issues/6231)) +- Bump supported Ruby version to `>= 2.1.0` ([#6220]({{ site.repository }}/issues/6220)) +- set `LiquidError#template_name` for errors in included file ([#6206]({{ site.repository }}/issues/6206)) +- Access custom config array throughout session ([#6200]({{ site.repository }}/issues/6200)) +- Add support for Rouge 2, in addition to Rouge 1 ([#5919]({{ site.repository }}/issues/5919)) +- Allow `yield` to logger methods & bail early on no-op messages ([#6315]({{ site.repository }}/issues/6315)) +- Update mime-types. ([#6336]({{ site.repository }}/issues/6336)) +- Use a Schwartzian transform with custom sorting ([#6342]({{ site.repository }}/issues/6342)) +- Alias `Drop#invoke_drop` to `Drop#[]` ([#6338]({{ site.repository }}/issues/6338)) + +### Bug Fixes +{: #bug-fixes-v3-6-0} + +- `Deprecator`: fix typo for `--serve` command ([#6229]({{ site.repository }}/issues/6229)) +- `Reader#read_directories`: guard against an entry not being a directory ([#6226]({{ site.repository }}/issues/6226)) +- kramdown: symbolize keys in-place ([#6247]({{ site.repository }}/issues/6247)) +- Call `to_s` on site.url before attempting to concatenate strings ([#6253]({{ site.repository }}/issues/6253)) +- Enforce Style/FrozenStringLiteralComment ([#6265]({{ site.repository }}/issues/6265)) +- Update theme-template README to note &[#39]({{ site.repository }}/issues/39);assets&[#39]({{ site.repository }}/issues/39); directory ([#6257]({{ site.repository }}/issues/6257)) +- Memoize the return value of `Document#url` ([#6266]({{ site.repository }}/issues/6266)) +- delegate `StaticFile#to_json` to `StaticFile#to_liquid` ([#6273]({{ site.repository }}/issues/6273)) +- Fix `Drop#key?` so it can handle a nil argument ([#6281]({{ site.repository }}/issues/6281)) +- Guard against type error in absolute url ([#6280]({{ site.repository }}/issues/6280)) +- Mutable drops should fallback to their own methods when a mutation isn&[#39]({{ site.repository }}/issues/39);t present ([#6350]({{ site.repository }}/issues/6350)) +- Skip adding binary files as posts ([#6344]({{ site.repository }}/issues/6344)) +- Don&[#39]({{ site.repository }}/issues/39);t break if bundler is not installed ([#6377]({{ site.repository }}/issues/6377)) + +### Documentation + +- Fix a typo in `custom-404-page.md` ([#6218]({{ site.repository }}/issues/6218)) +- Docs: fix links to issues in History.markdown ([#6255]({{ site.repository }}/issues/6255)) +- Update deprecated gems key to plugins. ([#6262]({{ site.repository }}/issues/6262)) +- Fixes minor typo in post text ([#6283]({{ site.repository }}/issues/6283)) +- Execute build command using bundle. ([#6274]({{ site.repository }}/issues/6274)) +- name unification - buddy details ([#6317]({{ site.repository }}/issues/6317)) +- name unification - application index ([#6318]({{ site.repository }}/issues/6318)) +- trim and relocate plugin info across docs ([#6311]({{ site.repository }}/issues/6311)) +- update Jekyll&[#39]({{ site.repository }}/issues/39);s README ([#6321]({{ site.repository }}/issues/6321)) +- add SUPPORT file for GitHub ([#6324]({{ site.repository }}/issues/6324)) +- Rename CODE_OF_CONDUCT to show in banner ([#6325]({{ site.repository }}/issues/6325)) +- Docs : illustrate page.id for a collection&[#39]({{ site.repository }}/issues/39);s document ([#6329]({{ site.repository }}/issues/6329)) +- Docs: post&[#39]({{ site.repository }}/issues/39);s date can be overriden in YAML front matter ([#6334]({{ site.repository }}/issues/6334)) +- Docs: `site.url` behavior on development and production environments ([#6270]({{ site.repository }}/issues/6270)) +- Fix typo in site.url section of variables.md :-[ ([#6337]({{ site.repository }}/issues/6337)) +- Docs: updates ([#6343]({{ site.repository }}/issues/6343)) +- Fix precedence docs ([#6346]({{ site.repository }}/issues/6346)) +- add note to contributing docs about `script/console` ([#6349]({{ site.repository }}/issues/6349)) +- Docs: Fix permalink example ([#6375]({{ site.repository }}/issues/6375)) + +### Site Enhancements +{: #site-enhancements-v3-6-0} + +- Adding DevKit helpers ([#6225]({{ site.repository }}/issues/6225)) +- Customizing url in collection elements clarified ([#6264]({{ site.repository }}/issues/6264)) +- Plugins is the new gems ([#6326]({{ site.repository }}/issues/6326)) + +### Development Fixes +{: #development-fixes-v3-6-0} + +- Strip unnecessary leading whitespace in template ([#6228]({{ site.repository }}/issues/6228)) +- Users should be installing patch versions. ([#6198]({{ site.repository }}/issues/6198)) +- Fix tests ([#6240]({{ site.repository }}/issues/6240)) +- Define path with `__dir__` ([#6087]({{ site.repository }}/issues/6087)) +- exit site.process sooner ([#6239]({{ site.repository }}/issues/6239)) +- make flakey test more robust ([#6277]({{ site.repository }}/issues/6277)) +- Add a quick test for DataReader ([#6284]({{ site.repository }}/issues/6284)) +- script/backport-pr: commit message no longer includes the `#` ([#6289]({{ site.repository }}/issues/6289)) +- Add Add CODEOWNERS file to help automate reviews. ([#6320]({{ site.repository }}/issues/6320)) +- Fix builds on codeclimate ([#6333]({{ site.repository }}/issues/6333)) +- Bump rubies on Travis ([#6366]({{ site.repository }}/issues/6366)) + + + ## 3.5.2 / 2017-08-12 {: #v3-5-2} diff --git a/docs/latest_version.txt b/docs/latest_version.txt index 87ce492908a..40c341bdcdb 100644 --- a/docs/latest_version.txt +++ b/docs/latest_version.txt @@ -1 +1 @@ -3.5.2 +3.6.0 diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 3a69700216e..6e0c1cf6ca6 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Jekyll - VERSION = "3.6.0.pre.beta1".freeze + VERSION = "3.6.0".freeze end From 09b849938d04e3aa6005b7c95ecd2c2b9d2b299c Mon Sep 17 00:00:00 2001 From: Oliver Steele Date: Fri, 22 Sep 2017 02:54:38 -0400 Subject: [PATCH 2393/4996] Doc y_day in docs/permalinks (#6244) Merge pull request 6244 --- docs/_docs/permalinks.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index 1a8afebac9b..31515b6b4ea 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -116,6 +116,14 @@ The following table lists the template variables available for permalinks. You c

    + + +

    y_day

    + _ + +

    Day of the year from the post's filename, with leading zeros.

    + +

    short_year

    From dc4acbc66c0c309bb7fd50b7d4041c6920f59dad Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Sep 2017 02:54:39 -0400 Subject: [PATCH 2394/4996] Update history to reflect merge of #6244 [ci skip] --- History.markdown | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 537fcfeccf6..ee169f1fbe4 100644 --- a/History.markdown +++ b/History.markdown @@ -1,3 +1,9 @@ +## HEAD + +### Documentation + + * Doc y_day in docs/permalinks (#6244) + ## 3.6.0 / 2017-09-21 ### Minor Enhancements @@ -72,7 +78,6 @@ * Fix builds on codeclimate (#6333) * Bump rubies on Travis (#6366) - ## 3.5.2 / 2017-08-12 ### Bug Fixes From ab31983122a68933f4c2be140599957911b68095 Mon Sep 17 00:00:00 2001 From: i-give-up Date: Fri, 22 Sep 2017 14:55:19 +0800 Subject: [PATCH 2395/4996] Update frontmatter.md (#6371) Merge pull request 6371 --- docs/_docs/frontmatter.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/_docs/frontmatter.md b/docs/_docs/frontmatter.md index cf5aad13f14..b2b7699cdbe 100644 --- a/docs/_docs/frontmatter.md +++ b/docs/_docs/frontmatter.md @@ -65,9 +65,23 @@ front matter of a page or post. If set, this specifies the layout file to use. Use the layout file name without the file extension. Layout files must be placed in the - _layouts directory. + _layouts directory.

    +
      +
    • + Using null will produce a file without using a layout + file. However this is overridden if the file is a post/document and has a + layout defined in the + frontmatter defaults. +
    • +
    • + Starting from version 3.5.0, using none in a post/document will + produce a file without using a layout file regardless of frontmatter defaults. + Using none in a page, however, will cause Jekyll to attempt to + use a layout named "none". +
    • +
    From 7dccfcf2b5086c23ee84ee9bf72e836fd575a4fd Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Sep 2017 02:55:21 -0400 Subject: [PATCH 2396/4996] Update history to reflect merge of #6371 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ee169f1fbe4..3e3192ef688 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Documentation * Doc y_day in docs/permalinks (#6244) + * Update frontmatter.md (#6371) ## 3.6.0 / 2017-09-21 From 9d7f0c1f852c101f49ee70795044b7f96038db42 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 22 Sep 2017 13:08:05 +0530 Subject: [PATCH 2397/4996] elaborate on excluding items from processing (#6136) Merge pull request 6136 --- docs/_docs/troubleshooting.md | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/docs/_docs/troubleshooting.md b/docs/_docs/troubleshooting.md index 48163fdc5bb..2259e04d389 100644 --- a/docs/_docs/troubleshooting.md +++ b/docs/_docs/troubleshooting.md @@ -195,10 +195,37 @@ That is: defaults are overridden by options specified in `_config.yml`, and flags specified at the command-line will override all other settings specified elsewhere. -If you encounter an error in building the site, with the error message -"'0000-00-00-welcome-to-jekyll.markdown.erb' does not have a valid date in the -YAML front matter." try including the line `exclude: [vendor]` -in `_config.yml`. +**Note: From v3.3.0 onward, Jekyll does not process `node_modules` and certain subdirectories within `vendor`, by default. But, by having an `exclude:` array defined explicitly in the config file overrides this default setting, which results in some users to encounter an error in building the site, with the following error message:** + +``` + ERROR: YOUR SITE COULD NOT BE BUILT: + ------------------------------------ + Invalid date '<%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>': + Document 'vendor/bundle/gems/jekyll-3.4.3/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb' + does not have a valid date in the YAML front matter. +``` + +Simply adding `vendor/bundle` to the `exclude:` list will solve this problem but will lead to having other sub-directories under `/vendor/` (and also `/node_modules/`, if present) be processed to the destination folder `_site`. + + +The proper solution is to incorporate the default setting for `exclude:` rather than override it completely: + +For versions upto `v3.4.3`, the `exclude:` setting must look like following: + +```yaml +exclude: + - Gemfile + - Gemfile.lock + - node_modules + - vendor/bundle/ + - vendor/cache/ + - vendor/gems/ + - vendor/ruby/ + - any_additional_item # any user-specific listing goes at the end +``` + +From `v3.5` onward, `Gemfile` and `Gemfile.lock` are also excluded by default. So, in most cases there is no need to define another `exclude:` array in the config file. So an existing definition can either be modified as above, or removed completely, or simply commented out to enable easy edits in future. + ## Markup Problems From e083f93ed80ea45baa7a433e47dca4167cdc6fa1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Sep 2017 03:38:07 -0400 Subject: [PATCH 2398/4996] Update history to reflect merge of #6136 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3e3192ef688..4c466d7745f 100644 --- a/History.markdown +++ b/History.markdown @@ -4,6 +4,7 @@ * Doc y_day in docs/permalinks (#6244) * Update frontmatter.md (#6371) + * Elaborate on excluding items from processing (#6136) ## 3.6.0 / 2017-09-21 From 00bad8bfe50379ee608fcc35719991af3240f7ab Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 22 Sep 2017 18:36:32 +0530 Subject: [PATCH 2399/4996] Bump rubocop to use `v0.50.x` (#6368) Merge pull request 6368 --- .rubocop.yml | 14 +++++++++++--- Gemfile | 2 +- jekyll.gemspec | 1 - lib/jekyll.rb | 4 ++-- lib/jekyll/commands/doctor.rb | 2 +- lib/jekyll/commands/serve/servlet.rb | 2 +- lib/jekyll/configuration.rb | 1 - lib/jekyll/converters/markdown.rb | 4 ++-- lib/jekyll/converters/markdown/kramdown_parser.rb | 2 ++ lib/jekyll/convertible.rb | 1 - lib/jekyll/document.rb | 1 - lib/jekyll/drops/collection_drop.rb | 1 - lib/jekyll/drops/document_drop.rb | 1 - lib/jekyll/drops/drop.rb | 1 - lib/jekyll/drops/excerpt_drop.rb | 1 - lib/jekyll/drops/jekyll_drop.rb | 1 - lib/jekyll/drops/site_drop.rb | 1 - lib/jekyll/drops/unified_payload_drop.rb | 1 - lib/jekyll/drops/url_drop.rb | 1 - lib/jekyll/reader.rb | 3 +-- lib/jekyll/readers/collection_reader.rb | 2 +- lib/jekyll/renderer.rb | 1 - lib/jekyll/site.rb | 15 +++++++-------- lib/jekyll/tags/highlight.rb | 8 ++++---- lib/jekyll/tags/include.rb | 9 ++++----- lib/jekyll/tags/link.rb | 4 ++-- lib/jekyll/tags/post_url.rb | 8 ++++---- test/test_ansi.rb | 2 +- test/test_utils.rb | 1 + 29 files changed, 45 insertions(+), 50 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index ea3aa1062fc..8f961cf589f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -21,7 +21,7 @@ Layout/EmptyLinesAroundAccessModifier: Layout/EmptyLinesAroundModuleBody: Enabled: false Layout/EndOfLine: - EnforcedStyle: lf + EnforcedStyle: native Layout/ExtraSpacing: AllowForAlignment: true Layout/FirstParameterIndentation: @@ -44,10 +44,14 @@ Layout/SpaceInsideBrackets: Enabled: false Lint/EndAlignment: Severity: error +Lint/RescueWithoutErrorClass: + Enabled: false Lint/UnreachableCode: Severity: error Lint/UselessAccessModifier: Enabled: false +Lint/Void: + Enabled: false Metrics/AbcSize: Max: 21 Metrics/BlockLength: @@ -82,6 +86,10 @@ Metrics/ParameterLists: Max: 4 Metrics/PerceivedComplexity: Max: 8 +Naming/FileName: + Enabled: false +Naming/HeredocDelimiterNaming: + Enabled: false Security/MarshalLoad: Exclude: - !ruby/regexp /test\/.*.rb$/ @@ -109,8 +117,8 @@ Style/Documentation: - !ruby/regexp /features\/.*.rb$/ Style/DoubleNegation: Enabled: false -Style/FileName: - Enabled: false +Style/Encoding: + EnforcedStyle: when_needed Style/GuardClause: Enabled: false Style/HashSyntax: diff --git a/Gemfile b/Gemfile index 216c2626f19..c94d4ff3969 100644 --- a/Gemfile +++ b/Gemfile @@ -30,7 +30,7 @@ group :test do gem "nokogiri", RUBY_VERSION >= "2.2" ? "~> 1.7" : "~> 1.7.0" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.49.1" + gem "rubocop", "~> 0.50.0" gem "test-dependency-theme", :path => File.expand_path("test/fixtures/test-dependency-theme", __dir__) gem "test-theme", :path => File.expand_path("test/fixtures/test-theme", __dir__) diff --git a/jekyll.gemspec b/jekyll.gemspec index 606d09daae4..ddbb36e8854 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -1,4 +1,3 @@ -# coding: utf-8 # frozen_string_literal: true lib = File.expand_path("lib", __dir__) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index fb5db3d43e1..cdcab8bda5b 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -119,7 +119,7 @@ def configuration(override = {}) # timezone - the IANA Time Zone # # Returns nothing - # rubocop:disable Style/AccessorMethodName + # rubocop:disable Naming/AccessorMethodName def set_timezone(timezone) ENV["TZ"] = if Utils::Platforms.really_windows? Utils::WinTZ.calculate(timezone) @@ -127,7 +127,7 @@ def set_timezone(timezone) timezone end end - # rubocop:enable Style/AccessorMethodName + # rubocop:enable Naming/AccessorMethodName # Public: Fetch the logger instance for this Jekyll process. # diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb index 1ef87e714d5..c10ee5963ca 100644 --- a/lib/jekyll/commands/doctor.rb +++ b/lib/jekyll/commands/doctor.rb @@ -86,7 +86,7 @@ def fsnotify_buggy?(_site) def urls_only_differ_by_case(site) urls_only_differ_by_case = false urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest) - urls.each do |_case_insensitive_url, real_urls| + urls.each_value do |real_urls| next unless real_urls.uniq.size > 1 urls_only_differ_by_case = true Jekyll.logger.warn "Warning:", "The following URLs only differ" \ diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index b661940c30a..2e41b697524 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -27,7 +27,7 @@ def search_file(req, res, basename) super || super(req, res, ".html") || super(req, res, "#{basename}.html") end - # rubocop:disable Style/MethodName + # rubocop:disable Naming/MethodName def do_GET(req, res) rtn = super validate_and_ensure_charset(req, res) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index a9965d29f5b..7fbe15cf9df 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 3e53992104d..857b6ecf73e 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -27,7 +27,7 @@ def setup # Rubocop does not allow reader methods to have names starting with `get_` # To ensure compatibility, this check has been disabled on this method # - # rubocop:disable Style/AccessorMethodName + # rubocop:disable Naming/AccessorMethodName def get_processor case @config["markdown"].downcase when "redcarpet" then return RedcarpetParser.new(@config) @@ -37,7 +37,7 @@ def get_processor custom_processor end end - # rubocop:enable Style/AccessorMethodName + # rubocop:enable Naming/AccessorMethodName # Public: Provides you with a list of processors, the ones we # support internally and the ones that you have provided to us (if you diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index d1f93c63f09..a9650cc7939 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -42,12 +42,14 @@ def convert(content) end private + # rubocop:disable Performance/HashEachMethods def make_accessible(hash = @config) hash.keys.each do |key| hash[key.to_sym] = hash[key] make_accessible(hash[key]) if hash[key].is_a?(Hash) end end + # rubocop:enable Performance/HashEachMethods # config[kramdown][syntax_higlighter] > # config[kramdown][enable_coderay] > diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index aea33fdcb86..6b20548292e 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true require "set" diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index d42e544c62f..0877ca12421 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/drops/collection_drop.rb b/lib/jekyll/drops/collection_drop.rb index 2c9c01320ea..e1d7da95978 100644 --- a/lib/jekyll/drops/collection_drop.rb +++ b/lib/jekyll/drops/collection_drop.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/drops/document_drop.rb b/lib/jekyll/drops/document_drop.rb index 7796980c7a4..727997810f3 100644 --- a/lib/jekyll/drops/document_drop.rb +++ b/lib/jekyll/drops/document_drop.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 1cc9c465ac4..92978af1962 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/drops/excerpt_drop.rb b/lib/jekyll/drops/excerpt_drop.rb index 06f8ae7d016..0362d9304ee 100644 --- a/lib/jekyll/drops/excerpt_drop.rb +++ b/lib/jekyll/drops/excerpt_drop.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/drops/jekyll_drop.rb b/lib/jekyll/drops/jekyll_drop.rb index 1686da418f1..8a56b9ee76d 100644 --- a/lib/jekyll/drops/jekyll_drop.rb +++ b/lib/jekyll/drops/jekyll_drop.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index 20b0332a43c..632f81ce118 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/drops/unified_payload_drop.rb b/lib/jekyll/drops/unified_payload_drop.rb index 833443a46f9..52647f98bf6 100644 --- a/lib/jekyll/drops/unified_payload_drop.rb +++ b/lib/jekyll/drops/unified_payload_drop.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb index e67d24d47b8..0571558bf4e 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 5804d1f963a..7b5c3b158ea 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true require "csv" @@ -25,7 +24,7 @@ def read # Sorts posts, pages, and static files. def sort_files! - site.collections.values.each { |c| c.docs.sort! } + site.collections.each_value { |c| c.docs.sort! } site.pages.sort_by!(&:name) site.static_files.sort_by!(&:relative_path) end diff --git a/lib/jekyll/readers/collection_reader.rb b/lib/jekyll/readers/collection_reader.rb index 7d605f421c4..77c700976f7 100644 --- a/lib/jekyll/readers/collection_reader.rb +++ b/lib/jekyll/readers/collection_reader.rb @@ -14,7 +14,7 @@ def initialize(site) # # Returns nothing. def read - site.collections.each do |_, collection| + site.collections.each_value do |collection| collection.read unless SPECIAL_COLLECTIONS.include?(collection.label) end end diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 5a2d32a8d27..3a6fdebd24d 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true module Jekyll diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 54155d0c8e2..a771477d176 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # frozen_string_literal: true require "csv" @@ -85,11 +84,11 @@ def print_stats # # Returns nothing def reset - if config["time"] - self.time = Utils.parse_date(config["time"].to_s, "Invalid time in _config.yml.") - else - self.time = Time.now - end + self.time = if config["time"] + Utils.parse_date(config["time"].to_s, "Invalid time in _config.yml.") + else + Time.now + end self.layouts = {} self.pages = [] self.static_files = [] @@ -238,7 +237,7 @@ def post_attr_hash(post_attr) posts.docs.each do |p| p.data[post_attr].each { |t| hash[t] << p } if p.data[post_attr] end - hash.values.each { |posts| posts.sort!.reverse! } + hash.each_value { |posts| posts.sort!.reverse! } hash end @@ -449,7 +448,7 @@ def configure_file_read_opts private def render_docs(payload) - collections.each do |_, collection| + collections.each_value do |collection| collection.docs.each do |document| if regenerator.regenerate?(document) document.output = Jekyll::Renderer.new(self, document, payload).run diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 687f9b717b3..683e3b2b456 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -18,13 +18,13 @@ def initialize(tag_name, markup, tokens) @lang = Regexp.last_match(1).downcase @highlight_options = parse_options(Regexp.last_match(2)) else - raise SyntaxError, <<-eos + raise SyntaxError, <<-MSG Syntax Error in tag 'highlight' while parsing the following markup: #{markup} Valid syntax: highlight [linenos] -eos +MSG end end @@ -95,14 +95,14 @@ def render_pygments(code, is_safe) ) if highlighted_code.nil? - Jekyll.logger.error < e - raise Jekyll::Errors::PostURLError, <<-eos + raise Jekyll::Errors::PostURLError, <<-MSG Could not parse name of post "#{@orig_post}" in tag 'post_url'. Make sure the post exists and the name is correct. #{e.class}: #{e.message} -eos +MSG end end @@ -90,11 +90,11 @@ def render(context) return p.url end - raise Jekyll::Errors::PostURLError, <<-eos + raise Jekyll::Errors::PostURLError, <<-MSG Could not find post "#{@orig_post}" in tag 'post_url'. Make sure the post exists and the name is correct. -eos +MSG end end end diff --git a/test/test_ansi.rb b/test/test_ansi.rb index 9b4fd01668c..e780e0dd521 100644 --- a/test/test_ansi.rb +++ b/test/test_ansi.rb @@ -8,7 +8,7 @@ class TestAnsi < JekyllUnitTest @subject = Jekyll::Utils::Ansi end - Jekyll::Utils::Ansi::COLORS.each do |color, _val| + Jekyll::Utils::Ansi::COLORS.each_key do |color| should "respond_to? #{color}" do assert @subject.respond_to?(color) end diff --git a/test/test_utils.rb b/test/test_utils.rb index 1b4d4813b66..638aa16d275 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -1,3 +1,4 @@ +# encoding: utf-8 # frozen_string_literal: true require "helper" From c84aef0619a99df26f92db710ec2c6e882b8fafe Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Sep 2017 09:06:34 -0400 Subject: [PATCH 2400/4996] Update history to reflect merge of #6368 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 4c466d7745f..575cb0b6a24 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,10 @@ * Update frontmatter.md (#6371) * Elaborate on excluding items from processing (#6136) +### Development Fixes + + * Bump rubocop to use `v0.50.x` (#6368) + ## 3.6.0 / 2017-09-21 ### Minor Enhancements From 4359df8e65a2adb1c83ea018015b23663fcb6437 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 22 Sep 2017 15:11:23 +0200 Subject: [PATCH 2401/4996] Docs: Style lists in tables (#6379) Merge pull request 6379 --- docs/_sass/_style.scss | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 7399c34ef66..666e044b83f 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -813,7 +813,12 @@ tbody td { background-image: linear-gradient(to bottom, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1affffff', endColorstr='#00ffffff',GradientType=0 ); - p { + ul { + padding-left: 1em; + } + + p, + ul { font-size: 16px; code { font-size: 14px; } From d9770bb2837d4c933998ebdcb80aab0fe15fbef8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Sep 2017 09:11:25 -0400 Subject: [PATCH 2402/4996] Update history to reflect merge of #6379 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 575cb0b6a24..54a81fe14be 100644 --- a/History.markdown +++ b/History.markdown @@ -5,6 +5,7 @@ * Doc y_day in docs/permalinks (#6244) * Update frontmatter.md (#6371) * Elaborate on excluding items from processing (#6136) + * Docs: Style lists in tables (#6379) ### Development Fixes From 76014aee2aac900dd2ce7aca3123a158ead033c6 Mon Sep 17 00:00:00 2001 From: Jan Piotrowski Date: Fri, 22 Sep 2017 15:51:58 +0200 Subject: [PATCH 2403/4996] Docs: remove duplicate "available" (#6380) Merge pull request 6380 --- docs/_docs/permalinks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index 31515b6b4ea..eb534f2d21b 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -354,7 +354,7 @@ As with posts, if you use a permalink style that omits the `.html` file extensio By default, collections follow a similar structure in the `_site` folder as pages, except that the path is prefaced by the collection name. For example: `collectionname/mypage.html`. For permalink settings that omit the file extension, the path would be `collection_name/mypage/index.html`. -Collections have their own way of setting permalinks. Additionally, collections have unique template variables available available (such as `path` and `output_ext`). See the [Configuring permalinks for collections](../collections/#permalinks) in Collections for more information. +Collections have their own way of setting permalinks. Additionally, collections have unique template variables available (such as `path` and `output_ext`). See the [Configuring permalinks for collections](../collections/#permalinks) in Collections for more information. ## Flattening pages in \_site on build From 023775e4eba5e942053bbb54e862cf6038d11a72 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 22 Sep 2017 09:51:59 -0400 Subject: [PATCH 2404/4996] Update history to reflect merge of #6380 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 54a81fe14be..1938d0e88f9 100644 --- a/History.markdown +++ b/History.markdown @@ -6,6 +6,7 @@ * Update frontmatter.md (#6371) * Elaborate on excluding items from processing (#6136) * Docs: Style lists in tables (#6379) + * Docs: remove duplicate "available" (#6380) ### Development Fixes From e5403396b7db1264cc68b8a34d9275f1a1a8cec6 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Sun, 24 Sep 2017 01:33:40 +0530 Subject: [PATCH 2405/4996] Disable default layouts for Pages with a `layout: none` declaration (#6182) Merge pull request 6182 --- features/rendering.feature | 12 ++++++++---- lib/jekyll/convertible.rb | 10 ++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/features/rendering.feature b/features/rendering.feature index 1d9f2aa949b..e6b80d9e2a6 100644 --- a/features/rendering.feature +++ b/features/rendering.feature @@ -49,7 +49,7 @@ Feature: Rendering And I should not see "Ahoy, indeed!" in "_site/index.css" And I should not see "Ahoy, indeed!" in "_site/index.js" - Scenario: Ignore defaults and don't place documents with layout set to 'none' + Scenario: Ignore defaults and don't place pages and documents with layout set to 'none' Given I have a "index.md" page with layout "none" that contains "Hi there, {{ site.author }}!" And I have a _trials directory And I have a "_trials/no-layout.md" page with layout "none" that contains "Hi there, {{ site.author }}!" @@ -67,9 +67,11 @@ Feature: Rendering And I should not see "Welcome!" in "_site/trials/no-layout.html" And I should not see "Check this out!" in "_site/trials/no-layout.html" But I should see "Check this out!" in "_site/trials/test.html" - And I should see "Welcome!" in "_site/index.html" + And I should see "Hi there, John Doe!" in "_site/index.html" + And I should not see "Welcome!" in "_site/index.html" + And I should not see "Build Warning:" in the build output - Scenario: Don't place documents with layout set to 'none' + Scenario: Don't place pages and documents with layout set to 'none' Given I have a "index.md" page with layout "none" that contains "Hi there, {{ site.author }}!" And I have a _trials directory And I have a "_trials/no-layout.md" page with layout "none" that contains "Hi there, {{ site.author }}!" @@ -84,8 +86,10 @@ Feature: Rendering Then I should get a zero exit status And the _site directory should exist And I should not see "Welcome!" in "_site/trials/no-layout.html" + And I should not see "Welcome!" in "_site/index.html" But I should see "Check this out!" in "_site/trials/test.html" - And I should see "Welcome!" in "_site/index.html" + And I should see "Hi there, John Doe!" in "_site/index.html" + And I should not see "Build Warning:" in the build output Scenario: Render liquid in Sass Given I have an "index.scss" page that contains ".foo-bar { color:{{site.color}}; }" diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 6b20548292e..45a83c4f827 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -172,9 +172,10 @@ def render_with_liquid? # Determine whether the file should be placed into layouts. # - # Returns false if the document is an asset file. + # Returns false if the document is an asset file or if the front matter + # specifies `layout: none` def place_in_layout? - !asset_file? + !(asset_file? || no_layout?) end # Checks if the layout specified in the document actually exists @@ -244,8 +245,13 @@ def [](property) end private + def _renderer @_renderer ||= Jekyll::Renderer.new(site, self) end + + def no_layout? + data["layout"] == "none" + end end end From 9113e0aa050bae814320dcd99639ea6038f3dccc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 23 Sep 2017 16:03:42 -0400 Subject: [PATCH 2406/4996] Update history to reflect merge of #6182 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 1938d0e88f9..3b13957c664 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,10 @@ * Bump rubocop to use `v0.50.x` (#6368) +### Minor Enhancements + + * Disable default layouts for Pages with a `layout: none` declaration (#6182) + ## 3.6.0 / 2017-09-21 ### Minor Enhancements From 5f8ba181f05c13078df48a32303d1bd5b67d0dcc Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 23 Sep 2017 22:11:17 +0200 Subject: [PATCH 2407/4996] bump Rouge (#6381) Merge pull request 6381 --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index ddbb36e8854..74bcd8e3cf7 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -38,7 +38,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("liquid", "~> 4.0") s.add_runtime_dependency("mercenary", "~> 0.3.3") s.add_runtime_dependency("pathutil", "~> 0.9") - rouge_versions = ENV["ROUGE_VERSION"] ? ["~> #{ENV["ROUGE_VERSION"]}"] : [">= 1.7", "< 3"] + rouge_versions = ENV["ROUGE_VERSION"] ? ["~> #{ENV["ROUGE_VERSION"]}"] : [">= 1.7", "< 4"] s.add_runtime_dependency("rouge", *rouge_versions) s.add_runtime_dependency("safe_yaml", "~> 1.0") end From 6f3d7a0034c21b0deb794928a79014a0c3a333e9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 23 Sep 2017 16:11:19 -0400 Subject: [PATCH 2408/4996] Update history to reflect merge of #6381 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3b13957c664..f66625fcda9 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ ### Minor Enhancements * Disable default layouts for Pages with a `layout: none` declaration (#6182) + * Upgrade to Rouge 3 (#6381) ## 3.6.0 / 2017-09-21 From 0331fb41ade8bf1df63fa05bc4bb71a07baf10c3 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 24 Sep 2017 11:50:55 -0400 Subject: [PATCH 2409/4996] Allow the user to set collections_dir to put all collections under one subdirectory (#6331) Merge pull request 6331 --- docs/_docs/collections.md | 25 ++++++++++++++++++------- docs/_docs/configuration.md | 13 +++++++------ lib/jekyll/collection.rb | 8 ++++++-- lib/jekyll/configuration.rb | 1 + 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 39bd99eb0d7..f0fed8abd52 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -46,6 +46,17 @@ defaults: layout: page ``` +**New**: You can optionally specify a directory if you want to store all your collections +in the same place: + +```yaml +collections: + collections_dir: my_collections +``` + +Then Jekyll will look in `my_collections/_books` for the `books` collection, and +in `my_collections/_recipes` for the `recipes` collection. + ### Step 2: Add your content {#step2} Create a corresponding folder (e.g. `/_my_collection`) and add @@ -111,7 +122,7 @@ _my_collection/ each of the following `permalink` configurations will produce the document structure shown below it. -* **Default** +* **Default** Same as `permalink: /:collection/:path`. ``` @@ -121,7 +132,7 @@ each of the following `permalink` configurations will produce the document struc │   └── some_doc.html ... ``` -* `permalink: pretty` +* `permalink: pretty` Same as `permalink: /:collection/:path/`. ``` @@ -225,7 +236,7 @@ each of the following `permalink` configurations will produce the document struc Each collection is accessible as a field on the `site` variable. For example, if you want to access the `albums` collection found in `_albums`, you'd use -`site.albums`. +`site.albums`. Each collection is itself an array of documents (e.g., `site.albums` is an array of documents, much like `site.pages` and `site.posts`). See the table below for how to access attributes of those documents. @@ -310,10 +321,10 @@ you specified in your `_config.yml` (if present) and the following information:
    A Hard-Coded Collection
    -

    In addition to any collections you create yourself, the - posts collection is hard-coded into Jekyll. It exists whether - you have a _posts directory or not. This is something to note - when iterating through site.collections as you may need to +

    In addition to any collections you create yourself, the + posts collection is hard-coded into Jekyll. It exists whether + you have a _posts directory or not. This is something to note + when iterating through site.collections as you may need to filter it out.

    You may wish to use filters to find your collection: {% raw %}{{ site.collections | where: "label", "myCollection" | first }}{% endraw %}

    diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 6d74fdbb50c..0d9c8f72e9d 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -602,12 +602,13 @@ file or on the command-line. ```yaml # Where things are -source: . -destination: ./_site -plugins_dir: _plugins -layouts_dir: _layouts -data_dir: _data -includes_dir: _includes +source: . +destination: ./_site +collections_dir: . +plugins_dir: _plugins +layouts_dir: _layouts +data_dir: _data +includes_dir: _includes collections: posts: output: true diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index ebafea38f97..4a3a70f6018 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -100,7 +100,9 @@ def filtered_entries # Returns a String containing the directory name where the collection # is stored on the filesystem. def relative_directory - @relative_directory ||= "_#{label}" + @relative_directory ||= Pathname.new(directory).relative_path_from( + Pathname.new(site.source) + ).to_s end # The full path to the directory containing the collection. @@ -108,7 +110,9 @@ def relative_directory # Returns a String containing th directory name where the collection # is stored on the filesystem. def directory - @directory ||= site.in_source_dir(relative_directory) + @directory ||= site.in_source_dir( + File.join(site.config["collections_dir"], "_#{label}") + ) end # The full path to the directory containing the collection, with diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 7fbe15cf9df..5c502d6816e 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -8,6 +8,7 @@ class Configuration < Hash # Where things are "source" => Dir.pwd, "destination" => File.join(Dir.pwd, "_site"), + "collections_dir" => "", "plugins_dir" => "_plugins", "layouts_dir" => "_layouts", "data_dir" => "_data", From a9b95e58c6614a2c22a92b68dad5f2ace87a421f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 24 Sep 2017 11:50:56 -0400 Subject: [PATCH 2410/4996] Update history to reflect merge of #6331 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f66625fcda9..17fcc6f3960 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Disable default layouts for Pages with a `layout: none` declaration (#6182) * Upgrade to Rouge 3 (#6381) + * Allow the user to set collections_dir to put all collections under one subdirectory (#6331) ## 3.6.0 / 2017-09-21 From e4b456a2ee2faeb849d56a02476502b596daf1b2 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 25 Sep 2017 16:41:58 +0200 Subject: [PATCH 2411/4996] Docs: GitHub Pages instructions (#6384) Merge pull request 6384 --- docs/_docs/github-pages.md | 144 ++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 82 deletions(-) diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 2d519f68e00..5e03201caa8 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -4,103 +4,82 @@ permalink: /docs/github-pages/ --- [GitHub Pages](https://pages.github.com) are public web pages for users, -organizations, and repositories, that are freely hosted on GitHub's -`github.io` domain or on a custom domain name of your choice. GitHub Pages are -powered by Jekyll behind the scenes, so in addition to supporting regular HTML -content, they’re also a great way to host your Jekyll-powered website for free. +organizations, and repositories, that are freely hosted on GitHub's `github.io` +domain or on a custom domain name of your choice. GitHub Pages are powered by +Jekyll behind the scenes, so they're a great way to host your Jekyll-powered +website for free. + +Your site is automatically generated by GitHub Pages when you push your source +files. Note that GitHub Pages works equally well for regular HTML content, +simply because Jekyll treats files without YAML front matter as static assets. +So if you only need to push generated HTML, you're good to go without any +further setup. Never built a website with GitHub Pages before? [See this marvelous guide by -Jonathan McGlone to get you up and running](http://jmcglone.com/guides/github-pages/). -This guide will teach you what you need to know about Git, GitHub, and Jekyll to create your very own website on GitHub Pages. +Jonathan McGlone](http://jmcglone.com/guides/github-pages/) to get you up and +running. This guide will teach you what you need to know about Git, GitHub, and +Jekyll to create your very own website on GitHub Pages. + +## The github-pages gem + +Our friends at GitHub have provided the +[github-pages](https://github.com/github/pages-gem) gem which is used to manage +[Jekyll and its dependencies on GitHub Pages](https://pages.github.com/versions/). +Using it in your projects means that when you deploy your site to GitHub Pages, +you will not be caught by unexpected differences between various versions of the +gems. + +Note that GitHub Pages runs in `safe` mode and only allows [a set of whitelisted +plugins](https://help.github.com/articles/configuring-jekyll-plugins/#default-plugins). + +To use the currently-deployed version of the gem in your project, add the +following to your `Gemfile`: + +```ruby +source "https://rubygems.org" + +gem "github-pages", group: :jekyll_plugins +``` + +Be sure to run `bundle update` often. + +
    +
    GitHub Pages Documentation, Help, and Support
    +

    + For more information about what you can do with GitHub Pages, as well as for + troubleshooting guides, you should check out + GitHub’s Pages Help section. + If all else fails, you should contact GitHub Support. +

    +
    ### Project Page URL Structure Sometimes it's nice to preview your Jekyll site before you push your `gh-pages` branch to GitHub. However, the subdirectory-like URL structure GitHub uses for -Project Pages complicates the proper resolution of URLs. In order to assure your site builds properly, use `site.github.url` in your URLs. +Project Pages complicates the proper resolution of URLs. In order to assure your +site builds properly, use the handy [URL filters](../templates/#filters): ```html {% raw %} - - - -[{{ page.title }}]("{{ page.url | prepend: site.github.url }}") + + + +[{{ page.title }}]("{{ page.url | relative_url }}") {% endraw %} ``` This way you can preview your site locally from the site root on localhost, -but when GitHub generates your pages from the gh-pages branch all the URLs +but when GitHub generates your pages from the `gh-pages` branch all the URLs will resolve properly. ## Deploying Jekyll to GitHub Pages GitHub Pages work by looking at certain branches of repositories on GitHub. -There are two basic types available: user/organization pages and project pages. +There are two basic types available: [user/organization and project pages](https://help.github.com/articles/user-organization-and-project-pages/). The way to deploy these two types of sites are nearly identical, except for a few minor details. -
    -
    -
    - -##### Use the `github-pages` gem - -Our friends at GitHub have provided the -[github-pages](https://github.com/github/pages-gem) -gem which is used to manage Jekyll and its dependencies on -GitHub Pages. Using it in your projects means that when you deploy -your site to GitHub Pages, you will not be caught by unexpected -differences between various versions of the gems. To use the -currently-deployed version of the gem in your project, add the -following to your `Gemfile`: - -
    -
    -
    - -```ruby -source 'https://rubygems.org' - -require 'json' -require 'open-uri' -versions = JSON.parse(open('https://pages.github.com/versions.json').read) - -gem 'github-pages', versions['github-pages'] -``` -
    - -This will ensure that when you run `bundle install`, you -have the correct version of the `github-pages` gem. - -If that fails, simplify it: - -
    -
    -
    - -```ruby -source 'https://rubygems.org' - -gem 'github-pages' -``` -
    - -And be sure to run `bundle update` often. - -If you like to install `pages-gem` on Windows you can find instructions by Jens Willmer on -[how to install github-pages gem on Windows (x64)](https://jwillmer.de/blog/tutorial/how-to-install-jekyll-and-pages-gem-on-windows-10-x46#github-pages-and-plugins). -
    - -
    -
    Installing github-pages gem on Windows
    -

    - While Windows is not officially supported, it is possible - to install github-pages gem on Windows. - Special instructions can be found on our - Windows-specific docs page. -

    -
    - ### User and Organization Pages User and organization pages live in a special GitHub repository dedicated to @@ -140,7 +119,7 @@ Please refer to GitHub official documentation on to see more detailed examples.
    -
    Source Files Must be in the Root Directory
    +
    Source files must be in the root directory

    GitHub Pages overrides the “Site Source” @@ -149,12 +128,13 @@ to see more detailed examples.

    -
    -
    GitHub Pages Documentation, Help, and Support
    +
    +
    Installing the github-pages gem on Windows
    +

    - For more information about what you can do with GitHub Pages, as well as for - troubleshooting guides, you should check out - GitHub’s Pages Help section. - If all else fails, you should contact GitHub Support. + While Windows is not officially supported, it is possible + to install the github-pages gem on Windows. + Special instructions can be found on our + Windows-specific docs page.

    From cfec06cdba69b8eaf728d4a4c52fb91fe8267adb Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 25 Sep 2017 10:41:59 -0400 Subject: [PATCH 2412/4996] Update history to reflect merge of #6384 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 17fcc6f3960..a27dceb0fbd 100644 --- a/History.markdown +++ b/History.markdown @@ -7,6 +7,7 @@ * Elaborate on excluding items from processing (#6136) * Docs: Style lists in tables (#6379) * Docs: remove duplicate "available" (#6380) + * Docs: GitHub Pages instructions (#6384) ### Development Fixes From eadad9eb7ea0a764802a81175a02c1c0487e4d80 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Wed, 27 Sep 2017 14:48:13 +0530 Subject: [PATCH 2413/4996] improve documentation for theme-gem installation (#6387) Merge pull request 6387 --- docs/_docs/themes.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index c79ce54c4e1..2682a9a3f5c 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -125,9 +125,19 @@ To install a gem-based theme: 1. Add the theme to your site's `Gemfile`: - ```sh + ```ruby + # ./Gemfile + gem "jekyll-theme-awesome" ``` + Or if you've started with the `jekyll new` command, replace `gem "minima", "~> 2.0"` with your theme-gem: + + ```diff + # ./Gemfile + + - gem "minima", "~> 2.0" + + gem "jekyll-theme-awesome" + ``` 2. Install the theme: From 528c03c22f748e0cc5e516ea79c9fef4bb8e6df4 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 27 Sep 2017 05:18:14 -0400 Subject: [PATCH 2414/4996] Update history to reflect merge of #6387 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a27dceb0fbd..44c8c4ff5fe 100644 --- a/History.markdown +++ b/History.markdown @@ -8,6 +8,7 @@ * Docs: Style lists in tables (#6379) * Docs: remove duplicate "available" (#6380) * Docs: GitHub Pages instructions (#6384) + * Improve documentation for theme-gem installation (#6387) ### Development Fixes From 7d36527dfc59b244121a664cc63c88bca4365e0e Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Wed, 27 Sep 2017 14:49:52 +0530 Subject: [PATCH 2415/4996] fix diff syntax-highlighting (#6388) Merge pull request 6388 --- docs/_sass/_pygments.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_sass/_pygments.scss b/docs/_sass/_pygments.scss index 2858bcd2fb7..8b2633044c8 100644 --- a/docs/_sass/_pygments.scss +++ b/docs/_sass/_pygments.scss @@ -13,11 +13,11 @@ .cp { color: #cd5c5c} /* Comment.Preproc */ .c1 { color: #87ceeb} /* Comment.Single */ .cs { color: #87ceeb} /* Comment.Special */ - .gd { color: #0000c0; font-weight: bold; background-color: #008080 } /* Generic.Deleted */ + .gd { color: #ce342c} /* Generic.Deleted */ .ge { color: #c000c0; text-decoration: underline} /* Generic.Emph */ .gr { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Error */ .gh { color: #cd5c5c} /* Generic.Heading */ - .gi { color: #ffffff; background-color: #0000c0 } /* Generic.Inserted */ + .gi { color: #27b42c} /* Generic.Inserted */ span.go { color: #add8e6; font-weight: bold; background-color: #4d4d4d } /* Generic.Output, qualified with span to prevent applying this style to the Go language, see #1153. */ .gp { color: #ffffff} /* Generic.Prompt */ .gs { color: #ffffff} /* Generic.Strong */ From 5df6e3f8651e02879aca6c67edf35e5bf8081851 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 27 Sep 2017 05:19:54 -0400 Subject: [PATCH 2416/4996] Update history to reflect merge of #6388 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 44c8c4ff5fe..75ab92c91ff 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,7 @@ * Docs: remove duplicate "available" (#6380) * Docs: GitHub Pages instructions (#6384) * Improve documentation for theme-gem installation (#6387) + * Fix diff syntax-highlighting (#6388) ### Development Fixes From 7333baf06d2be9775fd6bd3d815bffcd3b69a67b Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 29 Sep 2017 09:39:19 +0200 Subject: [PATCH 2417/4996] Upgrade to Cucumber 3.0 (#6395) Merge pull request 6395 --- Gemfile | 2 +- features/support/formatter.rb | 31 ++++++++++++++++++++----------- script/cucumber | 2 +- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/Gemfile b/Gemfile index c94d4ff3969..8ff6d132570 100644 --- a/Gemfile +++ b/Gemfile @@ -23,7 +23,7 @@ end group :test do gem "codeclimate-test-reporter", "~> 1.0.5" - gem "cucumber", "~> 2.1" + gem "cucumber", "~> 3.0" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" # nokogiri v1.8 does not work with ruby 2.1 and below diff --git a/features/support/formatter.rb b/features/support/formatter.rb index 745c74ec905..091353ac920 100644 --- a/features/support/formatter.rb +++ b/features/support/formatter.rb @@ -59,7 +59,7 @@ def before_feature(_feature) # def feature_element_timing_key(feature_element) - "\"#{feature_element.name.to_s.sub("Scenario: ", "")}\" (#{feature_element.location})" + "\"#{feature_element.name}\" (#{feature_element.location})" end # @@ -173,16 +173,8 @@ def after_test_step(test_step, result) # - private - def print_feature_element_name(keyword, name, source_line, _indent) - @io.puts - - names = name.empty? ? [name] : name.each_line.to_a - line = " #{keyword}: #{names[0]}" - - @io.print(source_line) if @options[:source] - @io.print(line) - @io.print " " + def print_feature_element_name(feature_element) + @io.print "\n#{feature_element.location} Scenario: #{feature_element.name} " @io.flush end @@ -214,3 +206,20 @@ def print_summary(features) end end end + +AfterConfiguration do |config| + f = Jekyll::Cucumber::Formatter.new(nil, $stdout, {}) + + config.on_event :test_case_started do |event| + f.print_feature_element_name(event.test_case) + f.before_feature_element(event.test_case) + end + + config.on_event :test_case_finished do |event| + f.after_feature_element(event.test_case) + end + + config.on_event :test_run_finished do + f.print_worst_offenders + end +end diff --git a/script/cucumber b/script/cucumber index 0f0ef0f7da1..8a419d61941 100755 --- a/script/cucumber +++ b/script/cucumber @@ -1,4 +1,4 @@ #!/usr/bin/env bash time ruby -S bundle exec cucumber \ - -f Jekyll::Cucumber::Formatter "$@" + --format progress "$@" From 816d59129ddad0b6034166611645f32c94535591 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 29 Sep 2017 03:39:20 -0400 Subject: [PATCH 2418/4996] Update history to reflect merge of #6395 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 75ab92c91ff..6c062f9c3bd 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ ### Development Fixes * Bump rubocop to use `v0.50.x` (#6368) + * Upgrade to Cucumber 3.0 (#6395) ### Minor Enhancements From 7b1c5dfcceb3e11b721c0d07681f53939a66c1db Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 29 Sep 2017 14:41:39 +0200 Subject: [PATCH 2419/4996] Docs: Update instructions (#6396) Merge pull request 6396 --- docs/_docs/installation.md | 9 +++++++++ docs/_docs/upgrading.md | 22 +++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 659becc9603..09620027154 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -128,8 +128,17 @@ $ gem search jekyll --remote and you'll search for just the name `jekyll`, and in brackets will be latest version. Another way to check if you have the latest version is to run the command `gem outdated`. This will provide a list of all the gems on your system that need to be updated. If you aren't running the latest version, run this command: +```sh +$ bundle update jekyll +``` + +Alternatively, if you don't have Bundler installed run: + ```sh $ gem update jekyll ``` +Please refer to our [upgrading section](../upgrading/) for major updates +detailed instructions. + Now that you’ve got everything up-to-date and installed, let’s get to work! diff --git a/docs/_docs/upgrading.md b/docs/_docs/upgrading.md index e59187a496d..3029c0724e9 100644 --- a/docs/_docs/upgrading.md +++ b/docs/_docs/upgrading.md @@ -4,10 +4,26 @@ title: Upgrading permalink: /docs/upgrading/ --- -Upgrading from an older version of Jekyll? Upgrading to a new major version of Jekyll (e.g. from v2.x to v3.x) may cause some headaches. Take the following guides to aid your upgrade: +Upgrading from an older version of Jekyll? Upgrading to a new major version of +Jekyll (e.g. from v2.x to v3.x) may cause some headaches. Take the following +guides to aid your upgrade: - [From 0.x to 1.x and 2.x](/docs/upgrading/0-to-2/) - [From 2.x to 3.x](/docs/upgrading/2-to-3/) -If you are making a minor update (for example from 3.3.1 to the latest version at the time 3.3.2) run 'bundle update jekyll' when in your site directory. -If you would like to update all your gems, run 'bundle update' when in your site directory. +## Minor updates + +
    +
    Stay Up to Date
    +

    We recommend you update Jekyll as often as possible to benefit from + the latest bug fixes. +

    +
    + +If you followed our setup recommendations and installed [Bundler](http://bundler.io/), run `bundle update jekyll` or simply `bundle update` and all your gems will +update to the latest versions. + +If you don't have Bundler installed, run `gem update jekyll`. + +The procedure is similar [if you use the `github-pages` +gem](https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/#keeping-your-site-up-to-date-with-the-github-pages-gem). From f8762bd5d5a628bec74391a84fb2e3b6683444c6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 29 Sep 2017 08:41:41 -0400 Subject: [PATCH 2420/4996] Update history to reflect merge of #6396 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 6c062f9c3bd..41074f14635 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,10 @@ * Upgrade to Rouge 3 (#6381) * Allow the user to set collections_dir to put all collections under one subdirectory (#6331) +### Site Enhancements + + * Docs: Update instructions (#6396) + ## 3.6.0 / 2017-09-21 ### Minor Enhancements From 76c52f43f7419677a62c5ad5bdcaed650ba1d5ac Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Sat, 30 Sep 2017 04:42:36 +0530 Subject: [PATCH 2421/4996] add special styling for code-blocks run in shell (#6389) Merge pull request 6389 --- docs/_sass/_style.scss | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 666e044b83f..152b630eec2 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -682,15 +682,15 @@ h5 > code, .highlight { margin: 1em 0; - padding: 10px 0; width: 100%; overflow: auto; } +pre.highlight { padding: 10px 0.5em; } + .highlighter-rouge .highlight { @extend .highlight; margin: 0; - padding: 10px 0.5em; } /* HTML Elements */ @@ -1058,3 +1058,23 @@ code.output { background: #454545; } } + +.language-sh { + &:before { + display: table; + padding: 5px 8px; + width: 100%; + color: #272727; + text-shadow: none; + font-size: 14px; + line-height: 1.25; + font-weight: 700; + content: "TERMINAL"; + background: #7a7a7a; + border: 1px solid #333; + @include border-radius(5px 5px 0 0); + } + .highlight { + @include border-radius(0 0 5px 5px); + } +} From 4c0f26c8a1deaab81d9d981da2e28f54d633ff16 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 29 Sep 2017 19:12:37 -0400 Subject: [PATCH 2422/4996] Update history to reflect merge of #6389 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 41074f14635..a1be9c9b447 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ ### Site Enhancements * Docs: Update instructions (#6396) + * Add special styling for code-blocks run in shell (#6389) ## 3.6.0 / 2017-09-21 From b77cc3f070adf9e2c311f33c630d56b02d337436 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 2 Oct 2017 12:27:54 +0530 Subject: [PATCH 2423/4996] fix code-block highlighting in docs (#6398) Merge pull request 6398 --- docs/_docs/installation.md | 22 +++++++++--------- docs/_docs/pages.md | 2 +- docs/_docs/permalinks.md | 2 +- docs/_docs/plugins.md | 46 ++++++++++++++++++++------------------ docs/_docs/posts.md | 4 ++-- docs/_docs/quickstart.md | 8 +++---- docs/_docs/themes.md | 4 ++-- 7 files changed, 45 insertions(+), 43 deletions(-) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 09620027154..62377b698bd 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -49,7 +49,7 @@ The best way to install Jekyll is via simply run the following command to install Jekyll: ```sh -$ gem install jekyll +gem install jekyll ``` All of Jekyll’s gem dependencies are automatically installed by the above @@ -86,11 +86,11 @@ more involved. This gives you the advantage of having the latest and greatest, but may be unstable. ```sh -$ git clone git://github.com/jekyll/jekyll.git -$ cd jekyll -$ script/bootstrap -$ bundle exec rake build -$ ls pkg/*.gem | head -n 1 | xargs gem install -l +git clone git://github.com/jekyll/jekyll.git +cd jekyll +script/bootstrap +bundle exec rake build +ls pkg/*.gem | head -n 1 | xargs gem install -l ``` ## Optional Extras @@ -116,26 +116,26 @@ Check out [the extras page](../extras/) for more information. Before you start developing with Jekyll, you may want to check that you're up to date with the latest version. To find your version of Jekyll, run one of these commands: ```sh -$ jekyll --version -$ gem list jekyll +jekyll --version +gem list jekyll ``` You can also use [RubyGems](https://rubygems.org/gems/jekyll) to find the current versioning of any gem. But you can also use the `gem` command line tool: ```sh -$ gem search jekyll --remote +gem search jekyll --remote ``` and you'll search for just the name `jekyll`, and in brackets will be latest version. Another way to check if you have the latest version is to run the command `gem outdated`. This will provide a list of all the gems on your system that need to be updated. If you aren't running the latest version, run this command: ```sh -$ bundle update jekyll +bundle update jekyll ``` Alternatively, if you don't have Bundler installed run: ```sh -$ gem update jekyll +gem update jekyll ``` Please refer to our [upgrading section](../upgrading/) for major updates diff --git a/docs/_docs/pages.md b/docs/_docs/pages.md index 398d1987d1b..8852bc32b8e 100644 --- a/docs/_docs/pages.md +++ b/docs/_docs/pages.md @@ -60,7 +60,7 @@ If you have a lot of pages, you can organize those pages into subfolders. The sa If you have pages organized into subfolders in your source folder and want to flatten them in the root folder on build, you must add the [permalink]({% link _docs/permalinks.md %}) property directly in your page's front matter like this: -``` +```yaml --- title: My page permalink: mypageurl.html diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index eb534f2d21b..8b4576eef49 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -360,7 +360,7 @@ Collections have their own way of setting permalinks. Additionally, collections If you want to flatten your pages (pull them out of subfolders) in the `_site` directory when your site builds (similar to posts), add the `permalink` property to the front matter of each page, with no path specified: -``` +```yaml --- title: My page permalink: mypageurl.html diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index ae55aa23d01..101c90906a7 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -25,32 +25,36 @@ having to modify the Jekyll source itself. You have 3 options for installing plugins: 1. In your site source root, make a `_plugins` directory. Place your plugins -here. Any file ending in `*.rb` inside this directory will be loaded before -Jekyll generates your site. -2. In your `_config.yml` file, add a new array with the key `plugins` and the -values of the gem names of the plugins you'd like to use. An example: + here. Any file ending in `*.rb` inside this directory will be loaded before + Jekyll generates your site. +2. In your `_config.yml` file, add a new array with the key `plugins` and the + values of the gem names of the plugins you'd like to use. An example: - plugins: - - jekyll-gist - - jekyll-coffeescript - - jekyll-assets - - another-jekyll-plugin - # This will require each of these plugins automatically. + ```yaml + # This will require each of these plugins automatically. + plugins: + - jekyll-gist + - jekyll-coffeescript + - jekyll-assets + - another-jekyll-plugin + ``` - Then install your plugins using `gem install jekyll-gist jekyll-coffeescript jekyll-assets another-jekyll-plugin` + Then install your plugins using `gem install jekyll-gist jekyll-coffeescript jekyll-assets another-jekyll-plugin` 3. Add the relevant plugins to a Bundler group in your `Gemfile`. An - example: - - group :jekyll_plugins do - gem "jekyll-gist" - gem "jekyll-coffeescript" - gem "jekyll-assets" - gem "another-jekyll-plugin" - end + example: + + ```ruby + group :jekyll_plugins do + gem "jekyll-gist" + gem "jekyll-coffeescript" + gem "jekyll-assets" + gem "another-jekyll-plugin" + end + ``` - Now you need to install all plugins from your Bundler group by running single command `bundle install`. + Now you need to install all plugins from your Bundler group by running single command `bundle install`.
    @@ -117,7 +121,6 @@ This is a more complex generator that generates new pages: ```ruby module Jekyll - class CategoryPage < Page def initialize(site, base, dir, category) @site = site @@ -146,7 +149,6 @@ module Jekyll end end end - end ``` diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index e3a749d5a5e..76c84d3746d 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -26,7 +26,7 @@ To create a new post, all you need to do is create a file in the `_posts` directory. How you name files in this folder is important. Jekyll requires blog post files to be named according to the following format: -```sh +``` YEAR-MONTH-DAY-title.MARKUP ``` @@ -34,7 +34,7 @@ Where `YEAR` is a four-digit number, `MONTH` and `DAY` are both two-digit numbers, and `MARKUP` is the file extension representing the format used in the file. For example, the following are examples of valid post filenames: -```sh +``` 2011-12-31-new-years-eve-is-awesome.md 2012-09-12-how-to-write-a-blog.md ``` diff --git a/docs/_docs/quickstart.md b/docs/_docs/quickstart.md index 08d2fd5f620..024e9839cff 100644 --- a/docs/_docs/quickstart.md +++ b/docs/_docs/quickstart.md @@ -8,16 +8,16 @@ If you already have a full [Ruby](https://www.ruby-lang.org/en/downloads/) devel ```sh # Install Jekyll and Bundler gems through RubyGems -~ $ gem install jekyll bundler +gem install jekyll bundler # Create a new Jekyll site at ./myblog -~ $ jekyll new myblog +jekyll new myblog # Change into your new directory -~ $ cd myblog +cd myblog # Build the site on the preview server -~/myblog $ bundle exec jekyll serve +bundle exec jekyll serve # Now browse to http://localhost:4000 ``` diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index 2682a9a3f5c..ac4d3830c29 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -47,7 +47,7 @@ To locate a theme's files on your computer: 2. Open the theme's directory in Finder or Explorer: - ```shell + ```sh # On MacOS open $(bundle show minima) # On Windows @@ -147,7 +147,7 @@ To install a gem-based theme: 3. Add the following to your site's `_config.yml` to activate the theme: - ```sh + ```yaml theme: jekyll-theme-awesome ``` From b11ad8ea774e1249ee1f78264ac4aa9ea46f8db2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 2 Oct 2017 02:57:56 -0400 Subject: [PATCH 2424/4996] Update history to reflect merge of #6398 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a1be9c9b447..c996eae6c34 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,7 @@ * Docs: GitHub Pages instructions (#6384) * Improve documentation for theme-gem installation (#6387) * Fix diff syntax-highlighting (#6388) + * Fix code-block highlighting in docs (#6398) ### Development Fixes From 77bb9267ac2ae30998f7975564477f48f42fb8f1 Mon Sep 17 00:00:00 2001 From: Kenton Hansen Date: Mon, 2 Oct 2017 08:47:05 -0500 Subject: [PATCH 2425/4996] Docs: Filtering Posts with categories, tags, or other variables (#6399) Merge pull request 6399 --- docs/_docs/posts.md | 47 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index 76c84d3746d..0dd7f110891 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -78,7 +78,7 @@ digital assets along with your text content. While the syntax for linking to these resources differs between Markdown and Textile, the problem of working out where to store these files in your site is something everyone will face. -There are a number of ways to include digital assets in Jekyll. +There are a number of ways to include digital assets in Jekyll. One common solution is to create a folder in the root of the project directory called something like `assets` or `downloads`, into which any images, downloads or other resources are placed. Then, from within any post, they can be linked @@ -155,6 +155,51 @@ you wish to access the currently-rendering page/posts's variables (the variables of the post/page that has the `for` loop in it), use the `page` variable instead. +## Displaying post categories or tags + +Hey, that's pretty neat, but what about showing just some of your posts that are +related to each other? For that you can use any of the [variables definable in +Front Matter](https://jekyllrb.com/docs/frontmatter/). In the "typical post" +section you can see how to define categories. Simply add the categories to your +Front Matter as a [yaml +list](https://en.wikipedia.org/wiki/YAML#Basic_components). + +Now that your posts have a category or multiple categories, you can make a page +or a template displaying just the posts in those categories you specify. Here's +a basic example of how to create a list of posts from a specific category. + +First, in the `_layouts` directory create a new file called `category.html` - in +that file put (at least) the following: +```html +--- +layout: page +--- +{% for post in site.categories[page.category] %} + + {{ post.title }} + +
    +{% endfor %} +``` + +Next, in the root directory of your Jekyll install, create a new directory +called `category` and then create a file for each category you want to list. For +example, if you have a category `blog` then create a file in the new directory +called `blog.html` with at least + +```text +--- +layout: category +title: Blog +category: blog +--- +``` + +In this case, the listing pages will be accessible at `{baseurl}/category/blog.html` + +While this example is done with categories, you can easily extend your lists to +filter by tags or any other variable created with extensions. + ## Post excerpts Each post automatically takes the first block of text, from the beginning of From ac575a0c50bda8c32134848afa69bacf0cad1244 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 2 Oct 2017 09:47:07 -0400 Subject: [PATCH 2426/4996] Update history to reflect merge of #6399 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c996eae6c34..960c48868c1 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Improve documentation for theme-gem installation (#6387) * Fix diff syntax-highlighting (#6388) * Fix code-block highlighting in docs (#6398) + * Docs: Filtering Posts with categories, tags, or other variables (#6399) ### Development Fixes From fe5fb5beb72e82f3ee38226a1ba1d1210e4b213b Mon Sep 17 00:00:00 2001 From: Kenton Hansen Date: Mon, 2 Oct 2017 09:32:47 -0500 Subject: [PATCH 2427/4996] Fixes formatting on pre-formatted text. (#6405) Merge pull request 6405 --- docs/_docs/posts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index 0dd7f110891..2079c9db262 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -170,7 +170,7 @@ a basic example of how to create a list of posts from a specific category. First, in the `_layouts` directory create a new file called `category.html` - in that file put (at least) the following: -```html +``` --- layout: page --- From ac3e6b384f80c4726f0eac19a6f1a73ee7376d62 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 2 Oct 2017 10:32:48 -0400 Subject: [PATCH 2428/4996] Update history to reflect merge of #6405 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 960c48868c1..cacf0032049 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ * Fix diff syntax-highlighting (#6388) * Fix code-block highlighting in docs (#6398) * Docs: Filtering Posts with categories, tags, or other variables (#6399) + * Fixes formatting on pre-formatted text. (#6405) ### Development Fixes From 85aebe9b9041b8dec2a1c3072d86af2091463e7e Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 3 Oct 2017 09:52:13 +0200 Subject: [PATCH 2429/4996] Docs: updates (#6407) Merge pull request 6407 --- .github/CONTRIBUTING.markdown | 16 +++- docs/_config.yml | 1 - docs/_docs/collections.md | 2 +- docs/_docs/continuous-integration/circleci.md | 4 +- .../_docs/continuous-integration/travis-ci.md | 2 +- docs/_docs/contributing.md | 16 +++- docs/_docs/datafiles.md | 13 ++- docs/_docs/frontmatter.md | 12 +-- docs/_docs/github-pages.md | 4 +- docs/_docs/includes.md | 59 +++++++++---- docs/_docs/index.md | 2 +- docs/_docs/pagination.md | 18 ++-- docs/_docs/plugins.md | 4 +- docs/_docs/posts.md | 82 +++++++++++-------- docs/_docs/static_files.md | 12 +-- docs/_docs/templates.md | 32 ++++---- docs/_docs/themes.md | 8 +- docs/_docs/troubleshooting.md | 4 +- docs/_docs/upgrading/0-to-2.md | 2 +- docs/_docs/upgrading/2-to-3.md | 13 +-- docs/_docs/usage.md | 29 +++---- docs/_docs/windows.md | 38 ++++----- .../2014-12-22-jekyll-2-5-3-released.markdown | 2 +- docs/_sass/_pygments.scss | 12 +-- .../convert-existing-site-to-jekyll.md | 2 +- docs/_tutorials/custom-404-page.md | 11 +-- docs/_tutorials/navigation.md | 55 +++++++++---- docs/_tutorials/orderofinterpretation.md | 48 +++++++---- docs/community/index.md | 6 +- 29 files changed, 299 insertions(+), 210 deletions(-) diff --git a/.github/CONTRIBUTING.markdown b/.github/CONTRIBUTING.markdown index 14cbecc10e0..91d18e7f65b 100644 --- a/.github/CONTRIBUTING.markdown +++ b/.github/CONTRIBUTING.markdown @@ -121,19 +121,27 @@ site or configuration. [Feel free to check it out!](https://github.com/jekyll/je To run the test suite and build the gem you'll need to install Jekyll's dependencies by running the following command: -
    $ script/bootstrap
    +```sh +script/bootstrap +``` Before you make any changes, run the tests and make sure that they pass (to confirm your environment is configured properly): -
    $ script/cibuild
    +```sh +script/cibuild +``` If you are only updating a file in `test/`, you can use the command: -
    $ script/test test/blah_test.rb
    +```sh +script/test test/blah_test.rb +``` If you are only updating a `.feature` file, you can use the command: -
    $ script/cucumber features/blah.feature
    +```sh +script/cucumber features/blah.feature +``` Both `script/test` and `script/cucumber` can be run without arguments to run its entire respective suite. diff --git a/docs/_config.yml b/docs/_config.yml index 044cb386c95..130ed1a327a 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -8,7 +8,6 @@ google_analytics_id: UA-50755011-1 google_site_verification: onQcXpAvtHBrUI5LlroHNE_FP0b2qvFyPq7VZw36iEY repository: https://github.com/jekyll/jekyll -help_url: https://github.com/jekyll/jekyll-help timezone: America/Los_Angeles diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index f0fed8abd52..3d42bd88342 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -454,7 +454,7 @@ works: Every album in the collection could be listed on a single page with a template: -```html +```liquid {% raw %} {% for album in site.albums %}

    {{ album.title }}

    diff --git a/docs/_docs/continuous-integration/circleci.md b/docs/_docs/continuous-integration/circleci.md index fede484a2d1..4dd2905383e 100644 --- a/docs/_docs/continuous-integration/circleci.md +++ b/docs/_docs/continuous-integration/circleci.md @@ -40,7 +40,7 @@ CircleCI detects when `Gemfile` is present is will automatically run `bundle ins The most basic test that can be run is simply seeing if `jekyll build` actually works. This is a blocker, a dependency if you will, for other tests you might run on the generate site. So we'll run Jekyll, via Bundler, in the `dependencies` phase. -``` +```yaml dependencies: post: - bundle exec jekyll build @@ -63,7 +63,7 @@ test: When you put it all together, here's an example of what that `circle.yml` file could look like: -``` +```yaml machine: environment: NOKOGIRI_USE_SYSTEM_LIBRARIES: true # speeds up installation of html-proofer diff --git a/docs/_docs/continuous-integration/travis-ci.md b/docs/_docs/continuous-integration/travis-ci.md index 91323958024..cbff5267e2e 100644 --- a/docs/_docs/continuous-integration/travis-ci.md +++ b/docs/_docs/continuous-integration/travis-ci.md @@ -49,7 +49,7 @@ Some options can be specified via command-line switches. Check out the For example to avoid testing external sites, use this command: ```sh -$ bundle exec htmlproofer ./_site --disable-external +bundle exec htmlproofer ./_site --disable-external ``` ### The HTML Proofer Library diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index b8a838a752a..5cf0398c63c 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -125,19 +125,27 @@ site or configuration. [Feel free to check it out!](https://github.com/jekyll/je To run the test suite and build the gem you'll need to install Jekyll's dependencies by running the following command: -
    $ script/bootstrap
    +```sh +script/bootstrap +``` Before you make any changes, run the tests and make sure that they pass (to confirm your environment is configured properly): -
    $ script/cibuild
    +```sh +script/cibuild +``` If you are only updating a file in `test/`, you can use the command: -
    $ script/test test/blah_test.rb
    +```sh +script/test test/blah_test.rb +``` If you are only updating a `.feature` file, you can use the command: -
    $ script/cucumber features/blah.feature
    +```sh +script/cucumber features/blah.feature +``` Both `script/test` and `script/cucumber` can be run without arguments to run its entire respective suite. diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index 671a32060b9..f59715198c1 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -56,8 +56,8 @@ determines the variable name). You can now render the list of members in a template: -```html {% raw %} +```liquid
      {% for member in site.data.members %}
    • @@ -67,8 +67,8 @@ You can now render the list of members in a template:
    • {% endfor %}
    -{% endraw %} ``` +{% endraw %} {: .note .info } If your Jekyll site has a lot of pages, such as with documentation websites, see the detailed examples in [how to build robust navigation for your site]({% link _tutorials/navigation.md %}). @@ -106,8 +106,8 @@ members: The organizations can then be accessed via `site.data.orgs`, followed by the file name: -```html {% raw %} +```liquid
      {% for org_hash in site.data.orgs %} {% assign org = org_hash[1] %} @@ -119,8 +119,8 @@ file name: {% endfor %}
    -{% endraw %} ``` +{% endraw %} ## Example: Accessing a specific author @@ -136,8 +136,8 @@ dave: The author can then be specified as a page variable in a post's frontmatter: -```html {% raw %} +```liquid --- title: sample post author: dave @@ -149,8 +149,7 @@ author: dave title="{{ author.name }}"> {{ author.name }} - -{% endraw %} ``` +{% endraw %} For information on how to build robust navigation for your site (especially if you have a documentation website or another type of Jekyll site with a lot of pages to organize), see [Navigation](/tutorials/navigation). diff --git a/docs/_docs/frontmatter.md b/docs/_docs/frontmatter.md index b2b7699cdbe..761c8bb5089 100644 --- a/docs/_docs/frontmatter.md +++ b/docs/_docs/frontmatter.md @@ -65,13 +65,13 @@ front matter of a page or post. If set, this specifies the layout file to use. Use the layout file name without the file extension. Layout files must be placed in the - _layouts directory. + _layouts directory.

    +
    +
    Pagination for categories, tags and collections
    +

    + The more recent jekyll-paginate-v2 plugin supports more features. See the pagination examples in the repository. + This plugin is not supported by GitHub Pages. +

    +
    + ## Liquid Attributes Available The pagination plugin exposes the `paginator` liquid object with the following @@ -145,8 +153,8 @@ the `paginator` variable that will now be available to you. You’ll probably want to do this in one of the main pages of your site. Here’s one example of a simple way of rendering paginated Posts in a HTML file: -```html {% raw %} +```liquid --- layout: default title: My Blog @@ -177,8 +185,8 @@ title: My Blog Next {% endif %}
    -{% endraw %} ``` +{% endraw %}
    Beware the page one edge-case
    @@ -192,8 +200,8 @@ title: My Blog The following HTML snippet should handle page one, and render a list of each page with links to all but the current page. -```html {% raw %} +```liquid {% if paginator.total_pages > 1 %} {% endif %} -{% endraw %} ``` +{% endraw %} diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 101c90906a7..284c3cb9c0e 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -387,11 +387,11 @@ Liquid::Template.register_tag('render_time', Jekyll::RenderTimeTag) In the example above, we can place the following tag anywhere in one of our pages: -```ruby {% raw %} +```ruby

    {% render_time page rendered at: %}

    -{% endraw %} ``` +{% endraw %} And we would get something like this on the page: diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index 2079c9db262..854fb665335 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -80,53 +80,52 @@ out where to store these files in your site is something everyone will face. There are a number of ways to include digital assets in Jekyll. One common solution is to create a folder in the root of the project directory -called something like `assets` or `downloads`, into which any images, downloads +called something like `assets`, into which any images, files or other resources are placed. Then, from within any post, they can be linked to using the site’s root as the path for the asset to include. Again, this will depend on the way your site’s (sub)domain and path are configured, but here are -some examples (in Markdown) of how you could do this using the `site.url` -variable in a post. +some examples in Markdown of how you could do this using the `absolute_url` +filter in a post. Including an image asset in a post: -```text +{% raw %} +```markdown ... which is shown in the screenshot below: -![My helpful screenshot]({% raw %}{{ site.url }}{% endraw %}/assets/screenshot.jpg) +![My helpful screenshot]({{ "/assets/screenshot.jpg" | absolute_url }}) ``` +{% endraw %} Linking to a PDF for readers to download: -```text -... you can [get the PDF]({% raw %}{{ site.url }}{% endraw %}/assets/mydoc.pdf) directly. +{% raw %} +```markdown +... you can [get the PDF]({{ "/assets/mydoc.pdf" | absolute_url }}) directly. ``` +{% endraw %} + +
    -
    -
    ProTip™: Link using just the site root URL
    -

    - You can skip the {% raw %}{{ site.url }}{% endraw %} variable - if you know your site will only ever be displayed at the - root URL of your domain. In this case you can reference assets directly with - just /path/file.jpg. -

    ## A typical post Jekyll can handle many different iterations of the idea you might associate with a "post," however a standard blog style post, including a Title, Layout, Publishing Date, and Categories might look like this: -``` +```markdown --- layout: post title: "Welcome to Jekyll!" date: 2015-11-17 16:16:01 -0600 categories: jekyll update --- + You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `bundle exec jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. - ``` -Everything in between the first and second `---` are part of the YAML Front Matter, and everything after the second `---` will be rendered with Markdown and show up as "Content." + +Everything in between the first and second `---` are part of the YAML Front Matter, and everything after the second `---` will be rendered with Markdown and show up as "Content". ## Displaying an index of posts @@ -136,15 +135,17 @@ you have a list of posts somewhere. Creating an index of posts on another page language](https://docs.shopify.com/themes/liquid/basics) and its tags. Here’s a basic example of how to create a list of links to your blog posts: +{% raw %} ```html ``` +{% endraw %} Of course, you have full control over how (and where) you display your posts, and how you structure your site. You should read more about [how templates @@ -170,24 +171,27 @@ a basic example of how to create a list of posts from a specific category. First, in the `_layouts` directory create a new file called `category.html` - in that file put (at least) the following: -``` + +{% raw %} +```liquid --- layout: page --- + {% for post in site.categories[page.category] %} - + {{ post.title }} -
    {% endfor %} ``` +{% endraw %} Next, in the root directory of your Jekyll install, create a new directory called `category` and then create a file for each category you want to list. For example, if you have a category `blog` then create a file in the new directory called `blog.html` with at least -```text +```yaml --- layout: category title: Blog @@ -208,31 +212,35 @@ Take the above example of an index of posts. Perhaps you want to include a little hint about the post's content by adding the first paragraph of each of your posts: -```html +{% raw %} +```liquid ``` +{% endraw %} Because Jekyll grabs the first paragraph you will not need to wrap the excerpt in `p` tags, which is already done for you. These tags can be removed with the following if you'd prefer: -```html -{% raw %}{{ post.excerpt | remove: '

    ' | remove: '

    ' }}{% endraw %} +{% raw %} +```liquid +{{ post.excerpt | remove: '

    ' | remove: '

    ' }} ``` +{% endraw %} If you don't like the automatically-generated post excerpt, it can be explicitly overridden by adding an `excerpt` value to your post's YAML Front Matter. Alternatively, you can choose to define a custom `excerpt_separator` in the post's YAML front matter: -```text +```yaml --- excerpt_separator: --- @@ -259,8 +267,9 @@ Jekyll also has built-in support for syntax highlighting of code snippets using either Pygments or Rouge, and including a code snippet in any post is easy. Just use the dedicated Liquid tag as follows: -```text -{% raw %}{% highlight ruby %}{% endraw %} +{% raw %} +```liquid +{% highlight ruby %} def show @widget = Widget(params[:id]) respond_to do |format| @@ -268,8 +277,9 @@ def show format.json { render json: @widget } end end -{% raw %}{% endhighlight %}{% endraw %} +{% endhighlight %} ``` +{% endraw %} And the output will look like this: diff --git a/docs/_docs/static_files.md b/docs/_docs/static_files.md index a4dda58892d..7b712c13505 100644 --- a/docs/_docs/static_files.md +++ b/docs/_docs/static_files.md @@ -66,13 +66,13 @@ following metadata:
    -Note that in the above table, `file` can be anything. It's simply an arbitrarily set variable used in your own logic (such as in a for loop). It isn't a global site or page variable. +Note that in the above table, `file` can be anything. It's simply an arbitrarily set variable used in your own logic (such as in a for loop). It isn't a global site or page variable. ## Add front matter to static files -Although you can't directly add front matter values to static files, you can set front matter values through the [defaults property](../configuration/#front-matter-defaults) in your configuration file. When Jekyll builds the site, it will use the front matter values you set. +Although you can't directly add front matter values to static files, you can set front matter values through the [defaults property](../configuration/#front-matter-defaults) in your configuration file. When Jekyll builds the site, it will use the front matter values you set. -Here's an example: +Here's an example: In your `_config.yml` file, add the following values to the `defaults` property: @@ -88,11 +88,13 @@ This assumes that your Jekyll site has a folder path of `assets/img` where you Suppose you want to list all your image assets as contained in `assets/img`. You could use this for loop to look in the `static_files` object and get all static files that have this front matter property: +{% raw %} ```liquid -{% raw %}{% assign image_files = site.static_files | where: "image", true %} +{% assign image_files = site.static_files | where: "image", true %} {% for myimage in image_files %} {{ myimage.path }} -{% endfor %}{% endraw %} +{% endfor %} ``` +{% endraw %} When you build your site, the output will list the path to each file that meets this front matter condition. diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index c37b93b5b97..c36f09107a0 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -428,9 +428,11 @@ The default is `default`. They are as follows (with what they filter): If you have small page snippets that you want to include in multiple places on your site, save the snippets as *include files* and insert them where required, by using the `include` tag: +{% raw %} ```liquid -{% raw %}{% include footer.html %}{% endraw %} +{% include footer.html %} ``` +{% endraw %} Jekyll expects all *include files* to be placed in an `_includes` directory at the root of your source directory. In the above example, this will embed the contents of `_includes/footer.html` into the calling file. @@ -451,15 +453,15 @@ languages](http://pygments.org/languages/) To render a code block with syntax highlighting, surround your code as follows: -```liquid {% raw %} +```liquid {% highlight ruby %} def foo puts 'foo' end {% endhighlight %} -{% endraw %} ``` +{% endraw %} The argument to the `highlight` tag (`ruby` in the example above) is the language identifier. To find the appropriate identifier to use for the language @@ -474,15 +476,15 @@ Including the `linenos` argument will force the highlighted code to include line numbers. For instance, the following code block would include line numbers next to each line: -```liquid {% raw %} +```liquid {% highlight ruby linenos %} def foo puts 'foo' end {% endhighlight %} -{% endraw %} ``` +{% endraw %} #### Stylesheets for syntax highlighting @@ -503,25 +505,25 @@ To link to a post, a page, collection item, or file, the `link` tag will generat You must include the file's original extension when using the `link` tag. Here are some examples: -```liquid {% raw %} +```liquid {{ site.baseurl }}{% link _collection/name-of-document.md %} {{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %} {{ site.baseurl }}{% link news/index.html %} {{ site.baseurl }}{% link /assets/files/doc.pdf %} -{% endraw %} ``` +{% endraw %} You can also use the `link` tag to create a link in Markdown as follows: -```liquid {% raw %} +```liquid [Link to a document]({{ site.baseurl }}{% link _collection/name-of-document.md %}) [Link to a post]({{ site.baseurl }}{% link _posts/2016-07-26-name-of-post.md %}) [Link to a page]({{ site.baseurl }}{% link news/index.html %}) [Link to a file]({{ site.baseurl }}{% link /assets/files/doc.pdf %}) -{% endraw %} ``` +{% endraw %} (Including `{% raw %}{{ site.baseurl }}{% endraw %}` is optional — it depends on whether you want to preface the page URL with the `baseurl` value.) @@ -539,26 +541,26 @@ Note you cannot add filters to `link` tags. For example, you cannot append a str If you want to include a link to a post on your site, the `post_url` tag will generate the correct permalink URL for the post you specify. -```liquid {% raw %} +```liquid {{ site.baseurl }}{% post_url 2010-07-21-name-of-post %} -{% endraw %} ``` +{% endraw %} If you organize your posts in subdirectories, you need to include subdirectory path to the post: -```liquid {% raw %} +```liquid {{ site.baseurl }}{% post_url /subdir/2010-07-21-name-of-post %} -{% endraw %} ``` +{% endraw %} There is no need to include the file extension when using the `post_url` tag. You can also use this tag to create a link to a post in Markdown as follows: -```liquid {% raw %} +```liquid [Name of Link]({{ site.baseurl }}{% post_url 2010-07-21-name-of-post %}) -{% endraw %} ``` +{% endraw %} diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index ac4d3830c29..6907ffb0c00 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -88,7 +88,7 @@ With a clear understanding of the theme's files, you can now override any theme Let's say, for a second example, you want to override Minima's footer. In your Jekyll site, create an `_includes` folder and add a file in it called `footer.html`. Jekyll will now use your site's `footer.html` file instead of the `footer.html` file from the Minima theme gem. -To modify any stylesheet you must take the extra step of also copying the main sass file (`_sass/minima.scss` in the Minima theme) into the `_sass` directory in your site's source. +To modify any stylesheet you must take the extra step of also copying the main sass file (`_sass/minima.scss` in the Minima theme) into the `_sass` directory in your site's source. Jekyll will look first to your site's content before looking to the theme's defaults for any requested file in the following folders: @@ -218,13 +218,15 @@ _sass Your theme's styles can be included in the user's stylesheet using the `@import` directive. +{% raw %} ```css -{% raw %}@import "{{ site.theme }}";{% endraw %} +@import "{{ site.theme }}"; ``` +{% endraw %} ### Theme-gem dependencies -From `v3.5`, Jekyll will automatically require all whitelisted `runtime_dependencies` of your theme-gem even if they're not explicitly included under the `gems` array in the site's config file. (NOTE: whitelisting is only required when building or serving with the `--safe` option.) +From `v3.5`, Jekyll will automatically require all whitelisted `runtime_dependencies` of your theme-gem even if they're not explicitly included under the `plugins` array in the site's config file. (Note: whitelisting is only required when building or serving with the `--safe` option.) With this, the end-user need not keep track of the plugins required to be included in their config file for their theme-gem to work as intended. diff --git a/docs/_docs/troubleshooting.md b/docs/_docs/troubleshooting.md index 2259e04d389..d57cfacfa0a 100644 --- a/docs/_docs/troubleshooting.md +++ b/docs/_docs/troubleshooting.md @@ -65,7 +65,7 @@ sudo emerge -av dev-ruby/rubygems On Windows, you may need to install [RubyInstaller DevKit](https://wiki.github.com/oneclick/rubyinstaller/development-kit). -On Android (with Termux) you can install all requirements by running: +On Android (with Termux) you can install all requirements by running: ```sh apt update && apt install libffi-dev clang ruby-dev make @@ -261,7 +261,7 @@ The issue is caused by trying to copy a non-existing symlink.
    Please report issues you encounter!

    - If you come across a bug, please create an issue + If you come across a bug, please create an issue on GitHub describing the problem and any work-arounds you find so we can document it here for others.

    diff --git a/docs/_docs/upgrading/0-to-2.md b/docs/_docs/upgrading/0-to-2.md index 5f9d2320b80..31548339335 100644 --- a/docs/_docs/upgrading/0-to-2.md +++ b/docs/_docs/upgrading/0-to-2.md @@ -9,7 +9,7 @@ and 2.0 that you'll want to know about. Before we dive in, go ahead and fetch the latest version of Jekyll: ```sh -$ gem update jekyll +gem update jekyll ```
    diff --git a/docs/_docs/upgrading/2-to-3.md b/docs/_docs/upgrading/2-to-3.md index 2b1b13573c6..c12a1a91f41 100644 --- a/docs/_docs/upgrading/2-to-3.md +++ b/docs/_docs/upgrading/2-to-3.md @@ -3,20 +3,21 @@ title: Upgrading from 2.x to 3.x permalink: /docs/upgrading/2-to-3/ --- -Upgrading from an older version of Jekyll? A few things have changed in 3.0 +Upgrading from an older version of Jekyll? A few things have changed in Jekyll 3 that you'll want to know about. Before we dive in, go ahead and fetch the latest version of Jekyll: ```sh -$ gem update jekyll +gem update jekyll ``` -Please note: Jekyll 3.2 requires Ruby version >= 2.1 +Since v3.2 Jekyll requires Ruby version >= 2.1 +{: .note .warning }
    -
    Diving in
    -

    Want to get a new Jekyll site up and running quickly? Simply +

    Diving in
    +

    Want to get a new Jekyll site up and running quickly? Simply run jekyll new SITENAME to create a new folder with a bare bones Jekyll site.

    @@ -68,7 +69,7 @@ generate when running `jekyll build` or `jekyll serve`.
    Future Posts on GitHub Pages

    An exception to the above rule are GitHub Pages sites, where the --future flag remains enabled - by default to maintain historical consistency for those sites. + by default to maintain historical consistency for those sites.

    diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index f4123aed3fd..dc273b29e90 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -7,22 +7,22 @@ The Jekyll gem makes a `jekyll` executable available to you in your Terminal window. You can use this command in a number of ways: ```sh -$ jekyll build +jekyll build # => The current folder will be generated into ./_site -$ jekyll build --destination +jekyll build --destination # => The current folder will be generated into -$ jekyll build --source --destination +jekyll build --source --destination # => The folder will be generated into -$ jekyll build --watch +jekyll build --watch # => The current folder will be generated into ./_site, # watched for changes, and regenerated automatically. ```
    -
    Changes to _config.yml are not included during automatic regeneration.
    +
    Changes to _config.yml are not included during automatic regeneration.

    The _config.yml master configuration file contains global configurations and variable definitions that are read once at execution time. Changes made to _config.yml @@ -52,25 +52,22 @@ Jekyll also comes with a built-in development server that will allow you to preview what the generated site will look like in your browser locally. ```sh -$ jekyll serve +jekyll serve # => A development server will run at http://localhost:4000/ # Auto-regeneration: enabled. Use `--no-watch` to disable. -$ jekyll serve --detach +jekyll serve --detach # => Same as `jekyll serve` but will detach from the current terminal. # If you need to kill the server, you can `kill -9 1234` where "1234" is the PID. # If you cannot find the PID, then do, `ps aux | grep jekyll` and kill the instance. ``` - -

    -
    Be aware of default behavior
    -

    - As of version 2.4, the serve command will watch for changes automatically. To disable this, you can use jekyll serve --no-watch, which preserves the old behavior. -

    +
    +
    Livereload
    +

    If you want to enable Livereload, you can enable the jekyll-livereload plugin in a development config file.

    ```sh -$ jekyll serve --no-watch +jekyll serve --no-watch # => Same as `jekyll serve` but will not watch for changes. ``` @@ -89,8 +86,8 @@ destination: _deploy Then the following two commands will be equivalent: ```sh -$ jekyll build -$ jekyll build --source _source --destination _deploy +jekyll build +jekyll build --source _source --destination _deploy ``` For more about the possible configuration options, see the diff --git a/docs/_docs/windows.md b/docs/_docs/windows.md index 9f21b6edf8b..d1a30b2752f 100644 --- a/docs/_docs/windows.md +++ b/docs/_docs/windows.md @@ -17,17 +17,17 @@ If you are using Windows 10 Anniversary Update, the easiest way to run Jekyll is First let's make sure all our packages / repositories are up to date. Open a new Command Prompt instance, and type the following: -``` +```sh bash ``` Your Command Prompt instance should now be a Bash instance. Now we must update our repo lists and packages. -``` +```sh sudo apt-get update -y && sudo apt-get upgrade -y ``` Now we can install Ruby. To do this we will use a repository from [BrightBox](https://www.brightbox.com/docs/ruby/ubuntu/), which hosts optimized versions of Ruby for Ubuntu. -``` +```sh sudo apt-add-repository ppa:brightbox/ruby-ng sudo apt-get update sudo apt-get install ruby2.3 ruby2.3-dev build-essential @@ -35,19 +35,19 @@ sudo apt-get install ruby2.3 ruby2.3-dev build-essential Next let's update our Ruby gems: -``` +```sh sudo gem update ``` Now all that is left to do is install Jekyll. -``` +```sh sudo gem install jekyll bundler ``` Check if Jekyll installed properly by running: -``` +```sh jekyll -v ``` @@ -55,7 +55,7 @@ jekyll -v To start a new project named `my_blog`, just run: -``` +```sh jekyll new my_blog ``` @@ -122,14 +122,14 @@ This gem is also needed in the github-pages and to get it running on Windows x64 **Note:** In the current [pre release][nokogiriFails] it works out of the box with Windows x64 but this version is not referenced in the github-pages. -`choco install libxml2 -Source "https://www.nuget.org/api/v2/"`{:.language-ruby} +```sh +choco install libxml2 -Source "https://www.nuget.org/api/v2/" -`choco install libxslt -Source "https://www.nuget.org/api/v2/"`{:.language-ruby} +choco install libxslt -Source "https://www.nuget.org/api/v2/" -`choco install libiconv -Source "https://www.nuget.org/api/v2/"`{:.language-ruby} +choco install libiconv -Source "https://www.nuget.org/api/v2/ -```ruby - gem install nokogiri --^ +gem install nokogiri --^ --with-xml2-include=C:\Chocolatey\lib\libxml2.2.7.8.7\build\native\include^ --with-xml2-lib=C:\Chocolatey\lib\libxml2.redist.2.7.8.7\build\native\bin\v110\x64\Release\dynamic\cdecl^ --with-iconv-include=C:\Chocolatey\lib\libiconv.1.14.0.11\build\native\include^ @@ -138,7 +138,7 @@ This gem is also needed in the github-pages and to get it running on Windows x64 --with-xslt-lib=C:\Chocolatey\lib\libxslt.redist.1.1.28.0\build\native\bin\v110\x64\Release\dynamic ``` -#### Install github-pages +#### Install github-pages * Open command prompt and install [Bundler][]: `gem install bundler` * Create a file called `Gemfile` without any extension in your root directory of your blog @@ -165,14 +165,10 @@ In the future the installation process of the github-pages should be as simple a [Bundler]: http://bundler.io/ "Ruby Dependencie Manager" [nokogiriReleases]: https://github.com/sparklemotion/nokogiri/releases "Nokogiri Releases" ---- - For a more conventional way of installing Jekyll you can follow this [complete guide to install Jekyll 3 on Windows by Sverrir Sigmundarson][windows-installjekyll3]. Optionally you can use [Autoinstall Jekyll for Windows][fastjekyll-autoinstall]. ---- - [windows-installjekyll3]: https://labs.sverrirs.com/jekyll/ [fastjekyll-autoinstall]: https://github.com/KeJunMao/fastjekyll#autoinstall-jekyll-for-windows @@ -185,11 +181,11 @@ Jekyll. This is especially relevant when you're running Jekyll on Windows. Additionally, you might need to change the code page of the console window to UTF-8 in case you get a "Liquid Exception: Incompatible character encoding" error during the site generation process. It can be done with the following command: ```sh -$ chcp 65001 +chcp 65001 ``` -## Time-Zone Management +## Time-Zone Management Since Windows doesn't have a native source of zoneinfo data, the Ruby Interpreter would not understand IANA Timezones and hence using them had the `TZ` environment variable default to UTC/GMT 00:00. Though Windows users could alternatively define their blog's timezone by setting the key to use POSIX format of defining timezones, it wasn't as user-friendly when it came to having the clock altered to changing DST-rules. @@ -205,9 +201,9 @@ gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] [IANA-database]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones -## Auto Regeneration +## Auto Regeneration -As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the `--watch` switch is specified during a build or serve. While `listen` has built-in support for UNIX systems, it may require an extra gem for compatibility with Windows. +Jekyll uses the `listen` gem to watch for changes when the `--watch` switch is specified during a build or serve. While `listen` has built-in support for UNIX systems, it may require an extra gem for compatibility with Windows. Add the following to the Gemfile for your site if you have issues with auto-regeneration on Windows alone: diff --git a/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown b/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown index 491007cdd1d..d2c9b13d3a6 100644 --- a/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown +++ b/docs/_posts/2014-12-22-jekyll-2-5-3-released.markdown @@ -10,7 +10,7 @@ Happy Holidays, everyone. Jekyll v2.5.3 is a quick patch release, containing some minor fixes. See the [full history](/docs/history/) for more info. If you notice any problems, -please [let us know]({{ site.help_url }}). +please [let us know]({{ site.repository }}). This release also marks the start of Jekyll 3 development. I wrote about it over on my personal blog: [Jekyll 3 — The Road Ahead](https://byparker.com/blog/2014/jekyll-3-the-road-ahead/). diff --git a/docs/_sass/_pygments.scss b/docs/_sass/_pygments.scss index 8b2633044c8..4b45bf60521 100644 --- a/docs/_sass/_pygments.scss +++ b/docs/_sass/_pygments.scss @@ -8,7 +8,7 @@ .n { color: #ffffff} /* Name */ .o { color: #ffffff} /* Operator */ .x { color: #ffffff} /* Other */ - .p { color: #ffffff} /* Punctuation */ + .p { color: #98b9ef} /* Punctuation */ .cm { color: #87ceeb} /* Comment.Multiline */ .cp { color: #cd5c5c} /* Comment.Preproc */ .c1 { color: #87ceeb} /* Comment.Single */ @@ -45,7 +45,7 @@ .nx { color: #ffffff} /* Name.Other */ .py { color: #ffffff} /* Name.Property */ .nt { color: #f0e68c} /* Name.Tag */ - .nv { color: #98fb98} /* Name.Variable */ + .nv { color: #88d472} /* Name.Variable */ .ow { color: #ffffff} /* Operator.Word */ .w { color: #ffffff} /* Text.Whitespace */ .mf { color: #ffffff} /* Literal.Number.Float */ @@ -69,10 +69,6 @@ .vi { color: #98fb98} /* Name.Variable.Instance */ .il { color: #ffffff} /* Literal.Number.Integer.Long */ .bash .nv { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; + user-select: none; } -} \ No newline at end of file +} diff --git a/docs/_tutorials/convert-existing-site-to-jekyll.md b/docs/_tutorials/convert-existing-site-to-jekyll.md index 2a6db34d323..379edc2e02d 100644 --- a/docs/_tutorials/convert-existing-site-to-jekyll.md +++ b/docs/_tutorials/convert-existing-site-to-jekyll.md @@ -306,7 +306,7 @@ At minimum, a layout should contain `{% raw %}{{ content }}{% endraw %}`, which ### For loops -By the way, let's pause here to look at the `for` loop logic a little more closely. [For loops in Liquid](https://help.shopify.com/themes/liquid/tags/iteration-tags#for) are one of the most commonly used Liquid tags. *For loops* let you iterate through content in your Jekyll site and build out a result. The `for` loop also has [certain properties available](https://help.shopify.com/themes/liquid/objects/for-loops) (like first or last iteration) based on the loop's position in the loop as well. +By the way, let's pause here to look at the `for` loop logic a little more closely. [For loops in Liquid](https://shopify.github.io/liquid/tags/iteration/) are one of the most commonly used Liquid tags. *For loops* let you iterate through content in your Jekyll site and build out a result. The `for` loop also has [certain properties available](https://help.shopify.com/themes/liquid/objects/for-loops) (like first or last iteration) based on the loop's position in the loop as well. We've only scratched the surface of what you can do with `for` loops in retrieving posts. For example, if you wanted to display posts from a specific category, you could do so by adding a `categories` property to your post's front matter and then look in those categories. Further, you could limit the number of results by adding a `limit` property. Here's an example: diff --git a/docs/_tutorials/custom-404-page.md b/docs/_tutorials/custom-404-page.md index 2512618e2ef..244982d2708 100644 --- a/docs/_tutorials/custom-404-page.md +++ b/docs/_tutorials/custom-404-page.md @@ -15,7 +15,7 @@ Simply add a `404.md` or `404.html` at the root of your site's source directory If you plan to organize your files under subdirectories, the error page should have the following Front Matter Data, set: `permalink: /404.html`. This is to ensure that the compiled `404.html` resides at the root of your processed site, where it'll be picked by the server. -``` +```markdown --- # example 404.md @@ -34,19 +34,19 @@ Apache Web Servers load a configuration file named [`.htaccess`](http://www.htac Simply add the following to your `.htaccess` file. -``` +```apache ErrorDocument 404 /404.html ``` With an `.htaccess` file, you have the freedom to place your error page within a subdirectory. -``` +```apache ErrorDocument 404 /error_pages/404.html ``` Where the path is relative to your site's domain. -More info on configuring Apache Error Pages can found in [official documentation](https://httpd.apache.org/docs/current/mod/core.html#errordocument). +More info on configuring Apache Error Pages can found in [official documentation](https://httpd.apache.org/docs/current/mod/core.html#errordocument). ## Hosting on Nginx server @@ -55,7 +55,7 @@ The procedure is just as simple as configuring Apache servers, but slightly diff Add the following to the nginx configuration file, `nginx.conf`, which is usually located inside `/etc/nginx/` or `/etc/nginx/conf/`: -``` +```nginx server { error_page 404 /404.html; location /404.html { @@ -63,4 +63,5 @@ server { } } ``` + The `location` directive prevents users from directly browsing the 404.html page. diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index 94d79d0e8ed..45fdb9878b4 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -91,12 +91,14 @@ Suppose you wanted to sort the list by the `title`. To do this, convert the refe **Liquid** +{% raw %} ```liquid -{% raw %}{% assign doclist = site.data.samplelist.docs | sort: 'title' %} +{% assign doclist = site.data.samplelist.docs | sort: 'title' %} {% for item in doclist %}
  • {{ item.title }}
  • -{% endfor %}{% endraw %} +{% endfor %} ``` +{% endraw %} **Result** @@ -110,9 +112,11 @@ The items now appear in alphabetical order. The `sort` property in the Liquid fi See the [Liquid array filter](https://help.shopify.com/themes/liquid/filters/array-filters) for more filter options. Note that you can't simply use this syntax: +{% raw %} ```liquid -{% raw %}{% for item in site.data.samplelist.docs | sort: "title" %}{% endfor %}{% endraw %} +{% for item in site.data.samplelist.docs | sort: "title" %}{% endfor %} ``` +{% endraw %} You have to convert `site.data.samplelist.docs` to a variable first using either `assign` or `capture` tags. @@ -152,16 +156,18 @@ toc: **Liquid** +{% raw %} ```liquid -{% raw %}{% for item in site.data.samplelist.toc %} +{% for item in site.data.samplelist.toc %}

    {{ item.title }}

    - {% endfor %}{% endraw %} + {% endfor %} ``` +{% endraw %} **Result**
    @@ -242,8 +248,9 @@ toc2: **Liquid** +{% raw %} ```liquid -{% raw %}
    +
    {% if site.data.samplelist.toc2[0] %} {% for item in site.data.samplelist.toc2 %}

    {{ item.title }}

    @@ -263,8 +270,9 @@ toc2: {% endif %} {% endfor %} {% endif %} -
    {% endraw %} +
    ``` +{% endraw %} **Result** @@ -327,13 +335,16 @@ sidebar: toc **Liquid** +{% raw %} ```liquid -{% raw %}
      +
        {% for item in site.data.samplelist[page.sidebar] %}
      • {{ item.title }}
      • {% endfor %} -
      {% endraw %} +
    ``` +{% endraw %} + **Result**
    @@ -361,13 +372,15 @@ In addition to inserting items from the YAML data file into your list, you also ``` **Liquid** +{% raw %} ```liquid -{% raw %}{% for item in site.data.samplelist.docs %} +{% for item in site.data.samplelist.docs %}
  • {{ item.title }}
  • -{% endfor %}{% endraw %} +{% endfor %} ``` +{% endraw %} **Result** @@ -412,15 +425,17 @@ docs2: **Liquid** +{% raw %} ```liquid -{% raw %}
      +
        {% for item in site.data.samplelist.docs2 %} {% if item.version == 1 %}
      • {{ item.title }}
      • {% endif %} {% endfor %} -
      {% endraw %} +
    ``` +{% endraw %} **Result** @@ -491,16 +506,18 @@ Note that even though `category` is used in the doc front matter, `category` is If you wanted to simply get all docs in the collection for a specific category, you could use a `for` loop with an `if` condition to check for a specific category: +{% raw %} ```liquid -{% raw %}

    Getting Started

    +

    Getting Started

      {% for doc in site.docs %} {% if doc.category == "getting-started" %}
    • {{ doc.title }}
    • {% endif %} {% endfor %} -
    {% endraw %} + ``` +{% endraw %} The result would be as follows: @@ -523,8 +540,9 @@ Here's the code for getting lists of pages grouped under their corresponding cat **Liquid** +{% raw %} ```liquid -{% raw %}{% assign mydocs = site.docs | group_by: 'category' %} +{% assign mydocs = site.docs | group_by: 'category' %} {% for cat in mydocs %}

    {{ cat.name | capitalize }}

      @@ -533,8 +551,9 @@ Here's the code for getting lists of pages grouped under their corresponding cat
    • {{ item.title }}
    • {% endfor %}
    -{% endfor %}{% endraw %} +{% endfor %} ``` +{% endraw %} **Result** @@ -574,6 +593,6 @@ After getting the category name, we assign the variable `items` for the docs and The `for item in items` loop looks through each `item` and gets the `title` and `url` to form the list item link. -For more details on the `group_by` filter, see [Jekyll's Templates documentation](https://jekyllrb.com/docs/templates/) as well as [this Siteleaf tutorial](https://www.siteleaf.com/blog/advanced-liquid-group-by/). For more details on the `sort` filter, see [sort](https://help.shopify.com/themes/liquid/filters/array-filters#sort) in Liquid's documentation. +For more details on the `group_by` filter, see [Jekyll's Templates documentation](https://jekyllrb.com/docs/templates/) as well as [this Siteleaf tutorial](https://www.siteleaf.com/blog/advanced-liquid-group-by/). For more details on the `sort` filter, see [sort](https://shopify.github.io/liquid/filters/sort/) in Liquid's documentation. Whether you use properties in your doc's front matter to retrieve your pages or a YAML data file, in both cases you can programmatically build a more robust navigation for your site. diff --git a/docs/_tutorials/orderofinterpretation.md b/docs/_tutorials/orderofinterpretation.md index 8cf9da557b0..b0ea0ec7f0d 100644 --- a/docs/_tutorials/orderofinterpretation.md +++ b/docs/_tutorials/orderofinterpretation.md @@ -37,15 +37,19 @@ The following scenarios highlight potential problems you might encounter. These In your layout file (`_layouts/default.html`), suppose you have a variable assigned: +{% raw %} +```liquid +{% assign myvar = "joe" %} ``` -{% raw %}{% assign myvar = "joe" %}{% endraw %} -``` +{% endraw %} On a page that uses the layout, you reference that variable: +{% raw %} +```liquid +{{ myvar }} ``` -{% raw %}{{ myvar }}{% endraw %} -``` +{% endraw %} The variable won't render because the page's order of interpretation is to render Liquid first and later process the Layout. When the Liquid rendering happens, the variable assignment isn't available. @@ -63,9 +67,11 @@ This is a list: You include the file into an HTML file as follows: +{% raw %} ```liquid -{% raw %}{% include mycontent.md %}{% endraw %} +{% include mycontent.md %} ``` +{% endraw %} The Markdown is not processed because first the Liquid (`include` tag) gets processed, inserting `mycontent.md` into the HTML file. *Then* the Markdown would get processed. @@ -75,11 +81,13 @@ To make the code work, use HTML formatting in includes that are inserted into HT Note that `highlight` tags don't require Markdown to process. Suppose your include contains the following: +{% raw %} ```liquid -{% raw %}{% highlight javascript %} +{% highlight javascript %} console.log('alert'); -{% endhighlight %}{% endraw %} +{% endhighlight %} ``` +{% endraw %} The `highlight` tag *is* Liquid. (Liquid passes the content to Rouge or Pygments for syntax highlighting.) As a result, this code will actually convert to HTML with syntax highlighting. Jekyll does not need the Markdown filter to process `highlight` tags. @@ -87,8 +95,9 @@ The `highlight` tag *is* Liquid. (Liquid passes the content to Rouge or Pygments Suppose you try to mix Liquid's `assign` tag with JavaScript, like this: +{% raw %} ```javascript -{% raw %} +

    @@ -97,15 +106,17 @@ Suppose you try to mix Liquid's `assign` tag with JavaScript, like this: function someFunction() { document.getElementById("intro").innerHTML = someContent; } -{% endraw %} + ``` +{% endraw %} This won't work because the `assign` tag is only available during the Liquid rendering phase of the site. In this JavaScript example, the script executes when a user clicks a button ("Click me") on the HTML page. At that time, the Liquid logic is no longer available, so the `assign` tag wouldn't return anything. However, you can use Jekyll's site variables or Liquid to *populate* a script that is executed at a later time. For example, suppose you have the following property in your front matter: `someContent: "This is some content"`. You could do this: +{% raw %} ```js -{% raw %} +

    @@ -114,8 +125,9 @@ However, you can use Jekyll's site variables or Liquid to *populate* a script th function someFunction() { document.getElementById("intro").innerHTML = "{{ page.someContent }}"; } -{% endraw %} + ``` +{% endraw %} When Jekyll builds the site, this `someContent` property populates the script's values, converting `{% raw %}{{ page.someContent }}{% endraw %}` to `"This is some content"`. @@ -127,17 +139,21 @@ There's one more detail to remember: Liquid does not render when embedded in YAM For example, suppose you have a `highlight` tag in your `_data/mydata.yml` file: -``` -{% raw %}myvalue: > +{% raw %} +```liquid +myvalue: > {% highlight javascript %} console.log('alert'); - {% endhighlight %}{% endraw %} + {% endhighlight %} ``` +{% endraw %} On a page, you try to insert the value: +{% raw %} +```liquid +{{ site.data.mydata.myvalue }} ``` -{% raw %}{{ site.data.mydata.myvalue }}{% endraw %} -``` +{% endraw %} This would render only as a string rather than a code sample with syntax highlighting. To make the code render, consider using an include instead. diff --git a/docs/community/index.md b/docs/community/index.md index 3df84c37590..fb3c8e408f6 100644 --- a/docs/community/index.md +++ b/docs/community/index.md @@ -4,9 +4,11 @@ title: Community permalink: /community/ --- +## Jekyllconf + [JekyllConf](http://jekyllconf.com) is a free, online conference for all things Jekyll hosted by [CloudCannon](http://cloudcannon.com). Each year members of the Jekyll community speak about interesting use cases, tricks they've learned, or meta Jekyll topics. -## Featured +### Featured {% assign random = site.time | date: "%s%N" | modulo: site.data.jekyllconf-talks.size %} {% assign featured = site.data.jekyllconf-talks[random] %} @@ -17,7 +19,7 @@ permalink: /community/ {% assign talks = site.data.jekyllconf-talks | group_by: 'year' %} {% for year in talks reversed %} -## {{ year.name }} +### {{ year.name }} {% for talk in year.items %} * [{{ talk.topic }}](https://youtu.be/{{ talk.youtube_id }}) - [{{ talk.speaker }}](https://twitter.com/{{ talk.twitter_handle }}) {% endfor %} From a20d13d6b5fa6167f8a87f5a7aecbe20214e6c15 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 3 Oct 2017 03:52:14 -0400 Subject: [PATCH 2430/4996] Update history to reflect merge of #6407 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index cacf0032049..ff9792e2459 100644 --- a/History.markdown +++ b/History.markdown @@ -13,6 +13,7 @@ * Fix code-block highlighting in docs (#6398) * Docs: Filtering Posts with categories, tags, or other variables (#6399) * Fixes formatting on pre-formatted text. (#6405) + * Docs: updates (#6407) ### Development Fixes From 6c6c8b071ca6f5b624c0d8a73d4d60900c61105d Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Tue, 3 Oct 2017 13:26:42 +0530 Subject: [PATCH 2431/4996] Fix docs for the new `collections_dir` feature (#6408) Merge pull request 6408 --- docs/_docs/collections.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 3d42bd88342..c29a83d5b57 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -46,12 +46,18 @@ defaults: layout: page ``` -**New**: You can optionally specify a directory if you want to store all your collections +**From `v3.7.0`**: You can optionally specify a directory if you want to store all your collections in the same place: ```yaml +collections_dir: my_collections collections: - collections_dir: my_collections + books: + foo: bar + output: true + recipes: + foo: baz + output: true ``` Then Jekyll will look in `my_collections/_books` for the `books` collection, and From 50de153c697c3eec6c335dacb99cedd74dd633ff Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 3 Oct 2017 03:56:43 -0400 Subject: [PATCH 2432/4996] Update history to reflect merge of #6408 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ff9792e2459..e0b6a9d6bbe 100644 --- a/History.markdown +++ b/History.markdown @@ -14,6 +14,7 @@ * Docs: Filtering Posts with categories, tags, or other variables (#6399) * Fixes formatting on pre-formatted text. (#6405) * Docs: updates (#6407) + * Docs: Fix `collections_dir` example (#6408) ### Development Fixes From f38cf2efdbf68b23cb0a622886d10694335ebef0 Mon Sep 17 00:00:00 2001 From: Kewin Dousse Date: Wed, 4 Oct 2017 13:18:50 +0200 Subject: [PATCH 2433/4996] Renaming duplicate of "Scenario 6" to "Scenario 7" (#6411) Merge pull request 6411 --- docs/_tutorials/navigation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index 45fdb9878b4..455128d031f 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -401,7 +401,7 @@ In this case, assume `Deployment` is the current page. To make sure the `item.url` (stored in the YAML file) matches the `page.url`, it can be helpful to print the `{% raw %}{{ page.url }}{% endraw %}` to the page. -## Scenario 6: Including items conditionally +## Scenario 7: Including items conditionally You might want to include items conditionally in your list. For example, maybe you have multiple site outputs and only want to include the sidebar item for certain outputs. You can add properties in each list item and then use those properties to conditionally include the content. @@ -448,7 +448,7 @@ docs2: The `Deployment` page is excluded because its `version` is `2`. -## Scenario 7: Retrieving items based on front matter properties +## Scenario 8: Retrieving items based on front matter properties If you don't want to store your navigation items in a YAML file in your `_data` folder, you can use `for` loops to look through the YAML front matter of each page or collection and get the content based on properties in the front matter. From 7fb10e12bfa7517d0f78bfdc967ab0afef8794a5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 4 Oct 2017 07:18:52 -0400 Subject: [PATCH 2434/4996] Update history to reflect merge of #6411 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e0b6a9d6bbe..5173fdd7847 100644 --- a/History.markdown +++ b/History.markdown @@ -15,6 +15,7 @@ * Fixes formatting on pre-formatted text. (#6405) * Docs: updates (#6407) * Docs: Fix `collections_dir` example (#6408) + * Docs: Renaming duplicate of "Scenario 6" to "Scenario 7" (#6411) ### Development Fixes From 1d29f505c0dedffe0ef2915e640537f63a315d65 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 4 Oct 2017 17:36:37 +0200 Subject: [PATCH 2435/4996] Mark collection_dir as unreleased (#6412) Merge pull request 6412 --- docs/_docs/collections.md | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index c29a83d5b57..a15cd71ab65 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -46,22 +46,14 @@ defaults: layout: page ``` -**From `v3.7.0`**: You can optionally specify a directory if you want to store all your collections -in the same place: +
    +
    Gather your collections
    -```yaml -collections_dir: my_collections -collections: - books: - foo: bar - output: true - recipes: - foo: baz - output: true -``` +

    From v3.7.0 you can optionally specify a directory to store all your collections in the same place with collections_dir: my_collections

    -Then Jekyll will look in `my_collections/_books` for the `books` collection, and -in `my_collections/_recipes` for the `recipes` collection. +

    Then Jekyll will look in my_collections/_books for the books collection, and + in my_collections/_recipes for the recipes collection.

    +
    ### Step 2: Add your content {#step2} From 4a2ab9247c63ae05962f9b502eb22e3d9b7fec83 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 4 Oct 2017 11:36:38 -0400 Subject: [PATCH 2436/4996] Update history to reflect merge of #6412 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5173fdd7847..22dd37ba764 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Docs: updates (#6407) * Docs: Fix `collections_dir` example (#6408) * Docs: Renaming duplicate of "Scenario 6" to "Scenario 7" (#6411) + * Docs: Mark `collection_dir` as unreleased (#6412) ### Development Fixes From d48412401ae1fef5259d562312797cf7376c9538 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Sat, 7 Oct 2017 18:54:32 -0500 Subject: [PATCH 2437/4996] Provide a better default hash for tracking liquid stats (#6417) Merge pull request 6417 --- lib/jekyll/liquid_renderer.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/liquid_renderer.rb b/lib/jekyll/liquid_renderer.rb index a79f06bd3c8..547fa4c7f3d 100644 --- a/lib/jekyll/liquid_renderer.rb +++ b/lib/jekyll/liquid_renderer.rb @@ -22,19 +22,16 @@ def file(filename) ) LiquidRenderer::File.new(self, filename).tap do - @stats[filename] ||= {} - @stats[filename][:count] ||= 0 + @stats[filename] ||= new_profile_hash @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 @@ -45,5 +42,10 @@ def stats_table(n = 50) def self.format_error(e, path) "#{e.message} in #{path}" end + + private + def new_profile_hash + Hash.new { |hash, key| hash[key] = 0 } + end end end From a7a7373281661ce7ae3b3c77b656114433a55a00 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 7 Oct 2017 19:54:34 -0400 Subject: [PATCH 2438/4996] Update history to reflect merge of #6417 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 22dd37ba764..66be80bef2a 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * Bump rubocop to use `v0.50.x` (#6368) * Upgrade to Cucumber 3.0 (#6395) + * Provide a better default hash for tracking liquid stats (#6417) ### Minor Enhancements From ffc29618a176eba87d649b0e73ce6391c5f962dc Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 8 Oct 2017 15:50:09 +0200 Subject: [PATCH 2439/4996] Link to Support (#6415) Merge pull request 6415 --- .github/CONTRIBUTING.markdown | 2 +- .github/{SUPPORT.md => SUPPORT.markdown} | 0 docs/_docs/contributing.md | 2 +- docs/_docs/history.md | 1 - docs/_docs/support.md | 24 ++++++++++++++++++++++++ rake/site.rake | 7 ++++++- 6 files changed, 32 insertions(+), 4 deletions(-) rename .github/{SUPPORT.md => SUPPORT.markdown} (100%) create mode 100644 docs/_docs/support.md diff --git a/.github/CONTRIBUTING.markdown b/.github/CONTRIBUTING.markdown index 91d18e7f65b..f1c19732b09 100644 --- a/.github/CONTRIBUTING.markdown +++ b/.github/CONTRIBUTING.markdown @@ -4,7 +4,7 @@ Hi there! Interested in contributing to Jekyll? We'd love your help. Jekyll is a ## Where to get help or report a problem -See [the support guidelines](SUPPORT.md) +See [the support guidelines](https://jekyllrb.com/docs/support/) ## Ways to contribute diff --git a/.github/SUPPORT.md b/.github/SUPPORT.markdown similarity index 100% rename from .github/SUPPORT.md rename to .github/SUPPORT.markdown diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index 5cf0398c63c..f1c643d3f71 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -8,7 +8,7 @@ Hi there! Interested in contributing to Jekyll? We'd love your help. Jekyll is a ## Where to get help or report a problem -See [the support guidelines](SUPPORT.md) +See [the support guidelines](https://jekyllrb.com/docs/support/) ## Ways to contribute diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 20b98b5c810..9c4e9def971 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -84,7 +84,6 @@ note: This file is autogenerated. Edit /History.markdown instead. - Bump rubies on Travis ([#6366]({{ site.repository }}/issues/6366)) - ## 3.5.2 / 2017-08-12 {: #v3-5-2} diff --git a/docs/_docs/support.md b/docs/_docs/support.md new file mode 100644 index 00000000000..d22331879e1 --- /dev/null +++ b/docs/_docs/support.md @@ -0,0 +1,24 @@ +--- +title: Support +permalink: "/docs/support/" +note: This file is autogenerated. Edit /.github/SUPPORT.markdown instead. +--- + +## Getting Help + +**Jekyll's issue tracker is not a support forum.** + +If you're looking for support for Jekyll, there are a lot of options: + +* Read [Jekyll Documentation](https://jekyllrb.com/docs/home/) +* If you have a question about using Jekyll, start a discussion on [Jekyll Forum](https://talk.jekyllrb.com/) or [StackOverflow](https://stackoverflow.com/questions/tagged/jekyll) +* Chat with Jekyllers — Join [our Gitter channel](https://gitter.im/jekyll/jekyll) or [our IRC channel on Freenode](irc:irc.freenode.net/jekyll) + +There are a bunch of helpful community members on these services that should be willing to point you in the right direction. + +## Report a bug + +* If you think you've found a bug within a Jekyll plugin, open an issue in that plugin's repository — First [look for the plugin on rubygems](https://rubygems.org/) then click on the `Homepage` link to access the plugin repository. +* If you think you've found a bug within Jekyll itself, [open an issue](https://github.com/jekyll/jekyll/issues/new). + +Happy Jekyllin'! diff --git a/rake/site.rake b/rake/site.rake index 15680b15afe..10d48c52651 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -7,7 +7,7 @@ ############################################################################# namespace :site do - task :generated_pages => [:history, :version_file, :conduct, :contributing] + task :generated_pages => [:history, :version_file, :conduct, :contributing, :support] desc "Generate and view the site locally" task :preview => :generated_pages do @@ -77,6 +77,11 @@ namespace :site do siteify_file(".github/CONTRIBUTING.markdown", "title" => "Contributing") end + desc "Copy the support file" + task :support do + siteify_file(".github/SUPPORT.markdown", "title" => "Support") + end + desc "Write the site latest_version.txt file" task :version_file do File.open("#{docs_folder}/latest_version.txt", "wb") { |f| f.puts(version) } unless version =~ %r!(beta|rc|alpha)!i From 79194b5ad03235ce1cd5705d1d9ceff14bfbdd8b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 8 Oct 2017 09:50:10 -0400 Subject: [PATCH 2440/4996] Update history to reflect merge of #6415 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 66be80bef2a..a142f8da155 100644 --- a/History.markdown +++ b/History.markdown @@ -17,6 +17,7 @@ * Docs: Fix `collections_dir` example (#6408) * Docs: Renaming duplicate of "Scenario 6" to "Scenario 7" (#6411) * Docs: Mark `collection_dir` as unreleased (#6412) + * Docs: Fix link to SUPPORT (#6415) ### Development Fixes From 1a2625443dfe62c1eb6706974bb089fa1b86eb52 Mon Sep 17 00:00:00 2001 From: Giraffe Academy Date: Sun, 8 Oct 2017 07:41:10 -0700 Subject: [PATCH 2441/4996] docs: Added new tutorial to tutorials section on docs (#6406) Merge pull request 6406 --- docs/_data/tutorials.yml | 1 + docs/_tutorials/video-walkthroughs.md | 35 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 docs/_tutorials/video-walkthroughs.md diff --git a/docs/_data/tutorials.yml b/docs/_data/tutorials.yml index a394345bbd4..3c2a9a66bda 100644 --- a/docs/_data/tutorials.yml +++ b/docs/_data/tutorials.yml @@ -1,6 +1,7 @@ - title: Tutorials tutorials: - home + - video-walkthroughs - navigation - orderofinterpretation - custom-404-page diff --git a/docs/_tutorials/video-walkthroughs.md b/docs/_tutorials/video-walkthroughs.md new file mode 100644 index 00000000000..c673434aab3 --- /dev/null +++ b/docs/_tutorials/video-walkthroughs.md @@ -0,0 +1,35 @@ +--- +layout: tutorials +permalink: /tutorials/video-walkthroughs/ +title: Video Walkthroughs +--- + +[Giraffe Academy](https://www.youtube.com/c/GiraffeAcademy) has a series of videos that will walk you through the basics of using Jekyll. In this series you'll learn everything from installing Jekyll on your computer and setting up your first site, to using more complex features like variables, layouts and conditionals. + +
    + +
    + +## List of Lessons + +1. [Introduction to Jekyll (see above)](https://www.youtube.com/watch?v=T1itpPvFWHI&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=1) +2. [Mac Installation](https://www.youtube.com/watch?v=WhrU9m82Wm8&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=2) +3. [Windows Installation](https://www.youtube.com/watch?v=LfP7Y9Ja6Qc&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=3) +4. [Creating a Site](https://www.youtube.com/watch?v=pxua_1vyFck&index=4&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB) +5. [Front Matter](https://www.youtube.com/watch?v=ZtEbGztktvc&index=5&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB) +6. [Writing Posts](https://www.youtube.com/watch?v=gsYqPL9EFwQ&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=6) +7. [Working With Drafts](https://www.youtube.com/watch?v=X8jXkW3k2Jg&index=7&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB) +8. [Creating Pages](https://www.youtube.com/watch?v=1na-IWfv08M&index=8&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB) +9. [Permalinks](https://www.youtube.com/watch?v=938jDG_YPdc&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=9) +10. [Front Matter Defaults](https://www.youtube.com/watch?v=CLCaJJ1zUHU&index=10&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB) +11. [Themes](https://www.youtube.com/watch?v=NoRS2D-cyko&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=11) +12. [Layouts](https://www.youtube.com/watch?v=bDQsGdCWv4I&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=12) +13. [Variables](https://www.youtube.com/watch?v=nLJBF2KiOZw&index=13&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB) +14. [Includes](https://www.youtube.com/watch?v=HfcJeRby2a8&index=14&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB) +15. [Looping Through Posts](https://www.youtube.com/watch?v=6N1X5XffuUA&index=15&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB) +16. [Conditionals](https://www.youtube.com/watch?v=iNZBEki_x6o&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=16) +17. [Data Files](https://www.youtube.com/watch?v=M6b0KmLB-pM&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=17) +18. [Static Files](https://www.youtube.com/watch?v=knWjmVlVpso&index=18&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB) +19. [Hosting on Github Pages](https://www.youtube.com/watch?v=fqFjuX4VZmU&list=PLLAZ4kZ9dFpOPV5C5Ay0pHaa0RJFhcmcB&index=19) + + From 2606e01d5b56d9d6600c643d9f5f7e398e6ebf6b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 8 Oct 2017 10:41:12 -0400 Subject: [PATCH 2442/4996] Update history to reflect merge of #6406 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a142f8da155..76d6b5db31d 100644 --- a/History.markdown +++ b/History.markdown @@ -18,6 +18,7 @@ * Docs: Renaming duplicate of "Scenario 6" to "Scenario 7" (#6411) * Docs: Mark `collection_dir` as unreleased (#6412) * Docs: Fix link to SUPPORT (#6415) + * Docs: Added new tutorial to tutorials section on docs (#6406) ### Development Fixes From a78b518f830a45769fc762ad59ba82c1d4c98f9b Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Mon, 9 Oct 2017 13:52:19 +0300 Subject: [PATCH 2443/4996] Scope path glob (#6268) Merge pull request 6268 --- docs/_docs/configuration.md | 15 +++++++++++++++ lib/jekyll/frontmatter_defaults.rb | 21 ++++++++++++++++++--- test/test_front_matter_defaults.rb | 24 ++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 0d9c8f72e9d..cd0f20583f2 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -549,6 +549,21 @@ defaults: In this example, the `layout` is set to `default` inside the [collection](../collections/) with the name `my_collection`. +It is also possible to use glob patterns when matching defaults. For example, it is possible to set specific layout for each `special-page.html` in any subfolder of `section` folder. + +```yaml +collections: + my_collection: + output: true + +defaults: + - + scope: + path: "section/*/special-page.html" + values: + layout: "specific-layout" +``` + ### Precedence Jekyll will apply all of the configuration settings you specify in the `defaults` section of your `_config.yml` file. However, you can choose to override settings from other scope/values pair by specifying a more specific path for the scope. diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index fc1bcc2d867..f6b89f6bb60 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -100,12 +100,27 @@ def applies?(scope, path, type) def applies_path?(scope, path) return true if !scope.key?("path") || scope["path"].empty? - scope_path = Pathname.new(scope["path"]) - Pathname.new(sanitize_path(path)).ascend do |ascended_path| - if ascended_path.to_s == scope_path.to_s + sanitized_path = Pathname.new(sanitize_path(path)) + + site_path = Pathname.new(@site.source) + rel_scope_path = Pathname.new(scope["path"]) + abs_scope_path = File.join(@site.source, rel_scope_path) + Dir.glob(abs_scope_path).each do |scope_path| + scope_path = Pathname.new(scope_path).relative_path_from site_path + return true if path_is_subpath?(sanitized_path, scope_path) + end + + path_is_subpath?(sanitized_path, rel_scope_path) + end + + def path_is_subpath?(path, parent_path) + path.ascend do |ascended_path| + if ascended_path.to_s == parent_path.to_s return true end end + + false end # Determines whether the scope applies to type. diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb index 9bf9629a9ed..b1773ba0ecb 100644 --- a/test/test_front_matter_defaults.rb +++ b/test/test_front_matter_defaults.rb @@ -27,6 +27,30 @@ class TestFrontMatterDefaults < JekyllUnitTest end end + context "A site with full front matter defaults (glob)" do + setup do + @site = fixture_site({ + "defaults" => [{ + "scope" => { + "path" => "contacts/*.html", + "type" => "page", + }, + "values" => { + "key" => "val", + }, + },], + }) + @site.process + @affected = @site.pages.find { |page| page.relative_path == "contacts/bar.html" } + @not_affected = @site.pages.find { |page| page.relative_path == "about.html" } + end + + should "affect only the specified path and type" do + assert_equal @affected.data["key"], "val" + assert_nil @not_affected.data["key"] + end + end + context "A site with front matter type pages and an extension" do setup do @site = fixture_site({ From b13a6161edf8805e7b15a59a74964ded879941a8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 9 Oct 2017 06:52:20 -0400 Subject: [PATCH 2444/4996] Update history to reflect merge of #6268 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 76d6b5db31d..ecfc913fc72 100644 --- a/History.markdown +++ b/History.markdown @@ -31,6 +31,7 @@ * Disable default layouts for Pages with a `layout: none` declaration (#6182) * Upgrade to Rouge 3 (#6381) * Allow the user to set collections_dir to put all collections under one subdirectory (#6331) + * Scope path glob (#6268) ### Site Enhancements From 2b9bb2306ac3560f6c70ad1df9128411d8cd461a Mon Sep 17 00:00:00 2001 From: Goulven Champenois Date: Mon, 9 Oct 2017 15:15:55 +0200 Subject: [PATCH 2445/4996] Fix list appearance by adding missing `ol` tag (#6421) Merge pull request 6421 --- docs/_tutorials/navigation.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index 455128d031f..8fc6fe5dd58 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -94,18 +94,22 @@ Suppose you wanted to sort the list by the `title`. To do this, convert the refe {% raw %} ```liquid {% assign doclist = site.data.samplelist.docs | sort: 'title' %} +
      {% for item in doclist %}
    1. {{ item.title }}
    2. {% endfor %} +
    ``` {% endraw %} **Result** The items now appear in alphabetical order. The `sort` property in the Liquid filter applies to the `title`, which is an actual property in the list. If `title` weren't a property, we would need to sort by another property. @@ -427,7 +431,7 @@ docs2: {% raw %} ```liquid -
    diff --git a/docs/_includes/search/input.html b/docs/_includes/search/input.html new file mode 100644 index 00000000000..729f5cabdfd --- /dev/null +++ b/docs/_includes/search/input.html @@ -0,0 +1 @@ + diff --git a/docs/_includes/search/script.html b/docs/_includes/search/script.html new file mode 100644 index 00000000000..f770c63aeaf --- /dev/null +++ b/docs/_includes/search/script.html @@ -0,0 +1,9 @@ + + diff --git a/docs/_includes/top.html b/docs/_includes/top.html index 155ffbcacaf..b67648d9d82 100644 --- a/docs/_includes/top.html +++ b/docs/_includes/top.html @@ -7,6 +7,7 @@ {% feed_meta %} + {% seo %} diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 77ebd5f7d82..8e9574adc63 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -8,6 +8,6 @@ {% include footer.html %} {% include anchor_links.html %} {% include analytics.html %} - + {% include search/script.html %} diff --git a/docs/_sass/_docsearch.scss b/docs/_sass/_docsearch.scss new file mode 100644 index 00000000000..bebe3125bf8 --- /dev/null +++ b/docs/_sass/_docsearch.scss @@ -0,0 +1,50 @@ +.searchbox { + .searchbox__input { + padding: 5px 5px 5px 29px; + border: none; + border-radius: 5px; + color: #444; + + &::-webkit-input-placeholder { + color: #aaa; + } + + &:-ms-input-placeholder { + color: #aaa; + } + + &::placeholder { + color: #aaa; + } + } +} + +.algolia-autocomplete { + .ds-dropdown-menu { + font-size: 1rem; + text-shadow: none; + + .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content { + background-color: rgba(221, 221, 221, 0.5); + } + } + + .algolia-docsearch-suggestion--category-header { + background-color: #444; + color: #ddd; + padding: 0.35em; + } + + .algolia-docsearch-suggestion--subcategory-column { + color: #444; + } + + .algolia-docsearch-suggestion--highlight { + background-color: #fc0; + color: #222; + } + + .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { + box-shadow: inset 0 -2px 0 0 #fc0; + } +} diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 38276c8f461..fe84083a372 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -62,6 +62,7 @@ nav { padding: 0; margin: 0; white-space: nowrap; + display: inline-block; } li { display: inline-block; } diff --git a/docs/css/screen.scss b/docs/css/screen.scss index 2eff7f89df7..4bc6bec3330 100644 --- a/docs/css/screen.scss +++ b/docs/css/screen.scss @@ -7,3 +7,4 @@ @import "pygments"; @import "font-awesome"; @import "style"; +@import "docsearch"; From 1a398c48b8d22f54083f9c220fa1808fd4808789 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 15 Nov 2017 10:19:40 -0500 Subject: [PATCH 2568/4996] Update history to reflect merge of #6557 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1e421c38023..595e02585f5 100644 --- a/History.markdown +++ b/History.markdown @@ -79,6 +79,7 @@ * (#6519) Optimize images * (#6544) Site: Back to original main navigation * (#6545) Style mobile-docs select element + * Site: Search with DocSearch by @Algolia (#6557) ### Bug Fixes From dd5685bb781b667c911794bc1f837f8c4e6c9eb6 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Thu, 16 Nov 2017 00:55:16 +0530 Subject: [PATCH 2569/4996] Bump JRuby version in Travis config (#6561) Merge pull request 6561 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2cfe51b7697..1da8963ace7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ rvm: - &ruby2 2.3.5 - &ruby3 2.2.8 - &ruby4 2.1.10 - - &jruby jruby-9.1.13.0 + - &jruby jruby-9.1.14.0 matrix: include: From f421aa4070b5fc15822fdeabbe8ce11c50f02336 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 15 Nov 2017 14:25:18 -0500 Subject: [PATCH 2570/4996] Update history to reflect merge of #6561 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 595e02585f5..ca4f2e6dc43 100644 --- a/History.markdown +++ b/History.markdown @@ -52,6 +52,7 @@ * Use double-quotes around gem name (#6535) * Dependencies: upgrade to toml 0.2.0 (#6541) * Lock to cucumber 3.0.1 on Ruby 2.1 (#6546) + * Bump JRuby version in Travis config (#6561) ### Minor Enhancements From d63792b4e7240d4dad83e92628252602a92cba5f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 15 Nov 2017 21:28:25 +0100 Subject: [PATCH 2571/4996] Site: Display search only on large resolutions --- docs/_sass/_style.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index fe84083a372..8ade52e6f75 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -172,6 +172,10 @@ h6:hover .header-link { } } +@media (max-width: 950px) { + .searchbox { display: none;} +} + /* Footer */ footer { From 04f4e891f0fef3d8ae363cb988dfa11303ce6874 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 16 Nov 2017 22:20:38 +0100 Subject: [PATCH 2572/4996] Reformat --- History.markdown | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/History.markdown b/History.markdown index ca4f2e6dc43..c92be8607c0 100644 --- a/History.markdown +++ b/History.markdown @@ -71,16 +71,16 @@ ### Site Enhancements - * (#6389) Add special styling for code-blocks run in shell - * (#6447) Add post about diversity - * (#6457) Update list of files excluded from Docs site - * (#6460) Update site History - * (#6476) Add default twitter card image - * (#6491) Update normalize.css to v7.0.0 - * (#6519) Optimize images - * (#6544) Site: Back to original main navigation - * (#6545) Style mobile-docs select element - * Site: Search with DocSearch by @Algolia (#6557) + * Add special styling for code-blocks run in shell (#6389) + * Add post about diversity (#6447) + * Update list of files excluded from Docs site (#6457) + * Update site History (#6460) + * Add default twitter card image (#6476) + * Update normalize.css to v7.0.0 (#6491) + * Optimize images (#6519) + * Back to original main navigation (#6544) + * Styles: mobile-docs select element (#6545) + * Search with DocSearch by @Algolia (#6557) ### Bug Fixes From 2c646a304cb2901acb6f53396523bf9ac24f6d36 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 17 Nov 2017 16:36:11 -0500 Subject: [PATCH 2573/4996] Avoid block parser warning in SmartyPants (#6565) Merge pull request 6565 --- lib/jekyll/converters/smartypants.rb | 7 ++++++- test/test_filters.rb | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/converters/smartypants.rb b/lib/jekyll/converters/smartypants.rb index 16161e1dca6..6d7c994bf50 100644 --- a/lib/jekyll/converters/smartypants.rb +++ b/lib/jekyll/converters/smartypants.rb @@ -3,9 +3,14 @@ class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown def initialize(source, options) super - @block_parsers = [:block_html] + @block_parsers = [:block_html, :content] @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :span_html] end + + def parse_content + add_text @src.scan(%r!\A.*\n!) + end + define_parser(:content, %r!\A!) end module Jekyll diff --git a/test/test_filters.rb b/test/test_filters.rb index a56df6da309..afedf7467bc 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -100,6 +100,10 @@ def select; end assert_equal "“", @filter.smartify("“") end + should "convert multiple lines" do + assert_equal "…\n…", @filter.smartify("...\n...") + end + should "allow raw HTML passthrough" do assert_equal( "Span HTML is not escaped", @@ -123,6 +127,12 @@ def select; end @filter.smartify(404) ) end + + should "not output any warnings" do + assert_empty( + capture_output { @filter.smartify("Test") } + ) + end end should "sassify with simple string" do From 73675070f59d5c1a17af96634649764b1e4c77c6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 17 Nov 2017 16:36:12 -0500 Subject: [PATCH 2574/4996] Update history to reflect merge of #6565 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c92be8607c0..e7f21d83f51 100644 --- a/History.markdown +++ b/History.markdown @@ -85,6 +85,7 @@ ### Bug Fixes * Raise when theme root directory is not available (#6455) + * Avoid block parser warning in SmartyPants (#6565) ## 3.6.2 / 2017-10-21 From b59078ed264e3f11b5cc3b7ae38a7a5f5711c194 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 20 Nov 2017 00:30:38 +0530 Subject: [PATCH 2575/4996] Site header redesign (#6567) Merge pull request 6567 --- docs/_includes/header.html | 26 +++++++++---- docs/_includes/mobile-nav-items.html | 17 ++++++++ docs/_includes/primary-nav-items.html | 3 -- docs/_sass/_docsearch.scss | 18 +++++++-- docs/_sass/_style.scss | 56 ++++++++++++++++++++------- 5 files changed, 91 insertions(+), 29 deletions(-) create mode 100644 docs/_includes/mobile-nav-items.html diff --git a/docs/_includes/header.html b/docs/_includes/header.html index cca35e89fa7..7cdcb970bc0 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -1,19 +1,31 @@
    -
    -
    diff --git a/docs/_includes/mobile-nav-items.html b/docs/_includes/mobile-nav-items.html new file mode 100644 index 00000000000..12fe4016e76 --- /dev/null +++ b/docs/_includes/mobile-nav-items.html @@ -0,0 +1,17 @@ + diff --git a/docs/_includes/primary-nav-items.html b/docs/_includes/primary-nav-items.html index 12fe4016e76..7609bd7e906 100644 --- a/docs/_includes/primary-nav-items.html +++ b/docs/_includes/primary-nav-items.html @@ -11,7 +11,4 @@
  • Help
  • -
  • - GitHub -
  • diff --git a/docs/_sass/_docsearch.scss b/docs/_sass/_docsearch.scss index bebe3125bf8..e984edea90e 100644 --- a/docs/_sass/_docsearch.scss +++ b/docs/_sass/_docsearch.scss @@ -1,24 +1,34 @@ .searchbox { + padding-top: 1px; .searchbox__input { - padding: 5px 5px 5px 29px; + padding: 6px 5px 5px 29px; + font-size: 0.75em; border: none; border-radius: 5px; - color: #444; + color: #555; + background-color: #333 !important; + box-shadow: 0 0 1px 0 #555; &::-webkit-input-placeholder { color: #aaa; } - &:-ms-input-placeholder { color: #aaa; } - &::placeholder { color: #aaa; } + + &:focus, &:active { + color: #eaeaea; + background-color: #252525 !important; + } } } +.searchbox__submit svg { fill: #fc0 } +.searchbox__reset svg { fill: #999 } + .algolia-autocomplete { .ds-dropdown-menu { font-size: 1rem; diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 8ade52e6f75..52e6e8e3008 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -14,7 +14,6 @@ body { font: 300 21px Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #ddd; background-color: #333; - border-top: 5px solid #fc0; @include box-shadow(inset 0 3px 30px rgba(0,0,0,.3)); text-shadow: 0 1px 3px rgba(0,0,0,.5); -webkit-font-feature-settings: "kern" 1; @@ -50,13 +49,28 @@ footer { /* Header */ header { + padding: 15px; + background: darken(#333, 3%); h1, nav { display: inline-block; } + .flexbox { + display: flex; + height: 50px; + + & > * { margin: auto } + } + + .logo { + display: block; + img { margin-top: -7px } + } + + .search .svg-icons { display: none } } -nav { +nav, .meta { ul { padding: 0; @@ -68,16 +82,20 @@ nav { li { display: inline-block; } } -.main-nav { - margin-top: 52px; +.meta ul { + margin-left: 10px; + + li { vertical-align: middle; } +} + +.main-nav, .meta { li { - margin-right: 10px; a { @include border-radius(5px); font-weight: 900; - font-size: 14px; + font-size: 0.75em; padding: 0.5em 1em; text-shadow: none; text-transform: uppercase; @@ -101,7 +119,6 @@ nav { } } } - .mobile-nav { padding: 0 5px; @@ -118,9 +135,9 @@ nav { color: #fc0; text-align: center; text-transform: uppercase; - font-size: 14px; + font-size: 0.625em; font-weight: 900; - padding: 5px; + padding: 10px 5px; @include border-radius(5px); } @@ -160,20 +177,29 @@ h6:hover .header-link { opacity: 1; } -@media (max-width: 768px) { - .main-nav ul { - text-align: right; +@media (max-width: 568px) { + header { padding-bottom: 0 } +} +@media (max-width: 580px) { + header { + .flexbox { height: auto } + .logo img { margin-top: 0 } } } +@media (max-width: 699px) { + .searchbox { display: none } +} +@media (max-width: 768px) { + .main-nav ul { text-align: right } +} @media (max-width: 830px) { .main-nav { .show-on-mobiles { display: inline; } .hide-on-mobiles { display: none; } } } - -@media (max-width: 950px) { - .searchbox { display: none;} +@media (max-width: 890px) { + .meta { display: none; } } /* Footer */ From 5d71314e1668249635ca3599f0bd2e5ac999ed38 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 19 Nov 2017 14:00:39 -0500 Subject: [PATCH 2576/4996] Update history to reflect merge of #6567 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e7f21d83f51..b71e88bc429 100644 --- a/History.markdown +++ b/History.markdown @@ -81,6 +81,7 @@ * Back to original main navigation (#6544) * Styles: mobile-docs select element (#6545) * Search with DocSearch by @Algolia (#6557) + * Site header redesign (#6567) ### Bug Fixes From e88b81318c52bcd7a76769ad41797b7e8a1cb6ca Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 20 Nov 2017 18:36:47 +0530 Subject: [PATCH 2577/4996] move logo above navigation on small screens (#6570) Merge pull request 6570 --- docs/_includes/header.html | 6 +++--- docs/_sass/_style.scss | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/_includes/header.html b/docs/_includes/header.html index 7cdcb970bc0..b289550d2d8 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -1,7 +1,4 @@
    -

    @@ -28,4 +25,7 @@

    +
    diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 52e6e8e3008..fb185972394 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -177,9 +177,6 @@ h6:hover .header-link { opacity: 1; } -@media (max-width: 568px) { - header { padding-bottom: 0 } -} @media (max-width: 580px) { header { .flexbox { height: auto } From 28f64fb2b3aba2211b7e0aac79a39ef4e271719e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 20 Nov 2017 08:06:48 -0500 Subject: [PATCH 2578/4996] Update history to reflect merge of #6570 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b71e88bc429..94da8dcd180 100644 --- a/History.markdown +++ b/History.markdown @@ -82,6 +82,7 @@ * Styles: mobile-docs select element (#6545) * Search with DocSearch by @Algolia (#6557) * Site header redesign (#6567) + * Move logo above site navigation on small screens (#6570) ### Bug Fixes From c2586bbae7c0d7b447fecd59bda9243abe0215e5 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Wed, 22 Nov 2017 00:58:08 +0530 Subject: [PATCH 2579/4996] fail gracefully if "sass" gem cannot be loaded (#6573) Merge pull request 6573 --- lib/jekyll/theme.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index cf9829ea322..edd041eea5c 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -38,7 +38,7 @@ def assets_path def configure_sass return unless sass_path - require "sass" + Jekyll::External.require_with_graceful_fail "sass" Sass.load_paths << sass_path end From f6cf8b934a31a13c84b478d02d3c1eec62538182 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 21 Nov 2017 14:28:10 -0500 Subject: [PATCH 2580/4996] Update history to reflect merge of #6573 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 94da8dcd180..85ca98c6371 100644 --- a/History.markdown +++ b/History.markdown @@ -88,6 +88,7 @@ * Raise when theme root directory is not available (#6455) * Avoid block parser warning in SmartyPants (#6565) + * Fail gracefully if "sass" gem cannot be loaded (#6573) ## 3.6.2 / 2017-10-21 From 1c469eb53a90ae22e36560a500f97ff3d6a5317c Mon Sep 17 00:00:00 2001 From: Jonathan Hooper Date: Wed, 22 Nov 2017 08:37:18 -0600 Subject: [PATCH 2581/4996] Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828) Merge pull request 5828 --- lib/jekyll/convertible.rb | 2 +- lib/jekyll/document.rb | 4 ++-- test/test_convertible.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 1236d9d1662..d3749a1ad1d 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -46,7 +46,7 @@ def read_yaml(base, name, opts = {}) self.content = $POSTMATCH self.data = SafeYAML.load(Regexp.last_match(1)) end - rescue SyntaxError => e + rescue Psych::SyntaxError => e Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" raise e if self.site.config["strict_front_matter"] rescue StandardError => e diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 5bb255666ea..1eb8418605e 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -266,7 +266,7 @@ def read(opts = {}) merge_defaults read_content(opts) read_post_data - rescue SyntaxError, StandardError, Errors::FatalException => e + rescue StandardError => e handle_read_error(e) end end @@ -463,7 +463,7 @@ def read_post_data private def handle_read_error(error) - if error.is_a? SyntaxError + if error.is_a? Psych::SyntaxError Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{error.message}" else Jekyll.logger.error "Error:", "could not read file #{path}: #{error.message}" diff --git a/test/test_convertible.rb b/test/test_convertible.rb index f05cb4fb2c7..5b73e252815 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -31,7 +31,7 @@ class TestConvertible < JekyllUnitTest ret = @convertible.read_yaml(@base, name) assert_equal({}, ret) end - assert_match(%r!YAML Exception|syntax error|Error reading file!, out) + assert_match(%r!YAML Exception!, out) assert_match(%r!#{File.join(@base, name)}!, out) end From cebcff14120f8365feaf4bbabfa5ebd50b5704c6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 22 Nov 2017 09:37:20 -0500 Subject: [PATCH 2582/4996] Update history to reflect merge of #5828 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 85ca98c6371..ba659ed6be6 100644 --- a/History.markdown +++ b/History.markdown @@ -53,6 +53,7 @@ * Dependencies: upgrade to toml 0.2.0 (#6541) * Lock to cucumber 3.0.1 on Ruby 2.1 (#6546) * Bump JRuby version in Travis config (#6561) + * Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828) ### Minor Enhancements From 46b2501df6b7e3e2f101bdb7c4d3d4701f7fd785 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Nov 2017 03:43:37 -0500 Subject: [PATCH 2583/4996] Docs: Include version badge for latest features (#6574) Merge pull request 6574 --- docs/_docs/collections.md | 6 +++--- docs/_docs/configuration.md | 2 +- docs/_docs/templates.md | 2 +- docs/_includes/docs_version_badge.html | 1 + docs/_sass/_style.scss | 24 ++++++++++++++++++++++++ 5 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 docs/_includes/docs_version_badge.html diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 0b59b7db6d1..30ea5592c65 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -46,10 +46,10 @@ defaults: layout: page ``` -
    diff --git a/docs/_includes/news_contents_mobile.html b/docs/_includes/news_contents_mobile.html index 8f8ba563947..3f8c18f785e 100644 --- a/docs/_includes/news_contents_mobile.html +++ b/docs/_includes/news_contents_mobile.html @@ -3,9 +3,9 @@ - {% for post in site.posts %} + {% for post in site.posts -%} - {% endfor %} + {% endfor -%}
    -
    Gather your collections
    +
    +
    Gather your collections {%- include docs_version_badge.html version="3.7.0" -%}
    -

    From v3.7.0 you can optionally specify a directory to store all your collections in the same place with collections_dir: my_collections

    +

    You can optionally specify a directory to store all your collections in the same place with collections_dir: my_collections

    Then Jekyll will look in my_collections/_books for the books collection, and in my_collections/_recipes for the recipes collection.

    diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index cd0f20583f2..4a3c0fe7a27 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -549,7 +549,7 @@ defaults: In this example, the `layout` is set to `default` inside the [collection](../collections/) with the name `my_collection`. -It is also possible to use glob patterns when matching defaults. For example, it is possible to set specific layout for each `special-page.html` in any subfolder of `section` folder. +It is also possible to use glob patterns when matching defaults. For example, it is possible to set specific layout for each `special-page.html` in any subfolder of `section` folder. {%- include docs_version_badge.html version="3.7.0" -%} ```yaml collections: diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 81eb5b2a696..390410aaf92 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -429,7 +429,7 @@ The default is `default`. They are as follows (with what they filter): - `default`: spaces and non-alphanumeric characters - `pretty`: spaces and non-alphanumeric characters except for `._~!$&'()+,;=@` - `ascii`: spaces, non-alphanumeric, and non-ASCII characters -- `latin`: like `default`, except Latin characters are first transliterated (e.g. `àèïòü` to `aeiou`) +- `latin`: like `default`, except Latin characters are first transliterated (e.g. `àèïòü` to `aeiou`) {%- include docs_version_badge.html version="3.7.0" -%} ## Tags diff --git a/docs/_includes/docs_version_badge.html b/docs/_includes/docs_version_badge.html new file mode 100644 index 00000000000..3c358109ffe --- /dev/null +++ b/docs/_includes/docs_version_badge.html @@ -0,0 +1 @@ +{{ include.version }} diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index fb185972394..11d89adf3a8 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -1030,6 +1030,30 @@ code.output { text-shadow: 0 1px 0 rgba(255,255,255,.25); } +/* Version badge */ + +.version-badge { + margin-left: .25em; + padding: 0.2em; + font-size: .75em; + font-weight: 400; + background-color: #fc0; + color: #222; + text-shadow: none; + vertical-align: middle; + border-radius: 3.75px; +} + +.note { + .version-badge { + font-size: 0.9rem; + padding: 0.1em 0.2em; + background-color: rgba(0,0,0,0.2); + color: #fff; + box-shadow: inset 0 1px 10px rgba(0,0,0,0.3),0 1px 0 rgba(255,255,255,0.1),0 -1px 0 rgba(0,0,0,0.5); + } +} + /* Responsive tables */ @media (max-width: 768px) { From c7c31e014cc4b263aec62cfb38185d0580d3724e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Nov 2017 03:43:39 -0500 Subject: [PATCH 2584/4996] Update history to reflect merge of #6574 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ba659ed6be6..b9fb48435e1 100644 --- a/History.markdown +++ b/History.markdown @@ -84,6 +84,7 @@ * Search with DocSearch by @Algolia (#6557) * Site header redesign (#6567) * Move logo above site navigation on small screens (#6570) + * Docs: Include version badge for latest features (#6574) ### Bug Fixes From 368fa1f72305eae3c9c70e59cfb6d4b4f8bb563f Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Fri, 24 Nov 2017 08:49:13 +0000 Subject: [PATCH 2585/4996] return correct file in dir if dir has same name as file (#6569) Merge pull request 6569 --- lib/jekyll/commands/serve/servlet.rb | 6 +++- test/fixtures/webrick/bar.html | 1 + test/fixtures/webrick/bar/baz.html | 1 + test/helper.rb | 54 ++++++++++++++++++++++++++++ test/test_commands_serve_servlet.rb | 38 ++++++++++++++++++++ 5 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/webrick/bar.html create mode 100644 test/fixtures/webrick/bar/baz.html create mode 100644 test/test_commands_serve_servlet.rb diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 2e41b697524..70b6d66df34 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -18,13 +18,17 @@ def initialize(server, root, callbacks) super end + def search_index_file(req, res) + super || search_file(req, res, ".html") + end + # Add the ability to tap file.html the same way that Nginx does on our # Docker images (or on GitHub Pages.) The difference is that we might end # up with a different preference on which comes first. def search_file(req, res, basename) # /file.* > /file/index.html > /file.html - super || super(req, res, ".html") || super(req, res, "#{basename}.html") + super || super(req, res, "#{basename}.html") end # rubocop:disable Naming/MethodName diff --git a/test/fixtures/webrick/bar.html b/test/fixtures/webrick/bar.html new file mode 100644 index 00000000000..76870bf2f38 --- /dev/null +++ b/test/fixtures/webrick/bar.html @@ -0,0 +1 @@ +Content of bar.html diff --git a/test/fixtures/webrick/bar/baz.html b/test/fixtures/webrick/bar/baz.html new file mode 100644 index 00000000000..794d5f2202d --- /dev/null +++ b/test/fixtures/webrick/bar/baz.html @@ -0,0 +1 @@ +Content of baz.html diff --git a/test/helper.rb b/test/helper.rb index 672fedd2862..aa94be13e61 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -44,6 +44,8 @@ def jruby? include Jekyll +require "jekyll/commands/serve/servlet" + # Report with color. Minitest::Reporters.use! [ Minitest::Reporters::DefaultReporter.new( @@ -194,3 +196,55 @@ def skip_if_windows(msg = nil) end end end + +class FakeLogger + def <<(str); end +end + +module TestWEBrick + + module_function + + def mount_server(&block) + server = WEBrick::HTTPServer.new(config) + + begin + server.mount("/", Jekyll::Commands::Serve::Servlet, document_root, + document_root_options) + + server.start + addr = server.listeners[0].addr + block.yield([server, addr[3], addr[1]]) + rescue StandardError => e + raise e + ensure + server.shutdown + sleep 0.1 until server.status == :Stop + end + end + + def config + logger = FakeLogger.new + { + :BindAddress => "127.0.0.1", :Port => 0, + :ShutdownSocketWithoutClose => true, + :ServerType => Thread, + :Logger => WEBrick::Log.new(logger), + :AccessLog => [[logger, ""]], + :JekyllOptions => {}, + } + end + + def document_root + "#{File.dirname(__FILE__)}/fixtures/webrick" + end + + def document_root_options + WEBrick::Config::FileHandler.merge({ + :FancyIndexing => true, + :NondisclosureName => [ + ".ht*", "~*", + ], + }) + end +end diff --git a/test/test_commands_serve_servlet.rb b/test/test_commands_serve_servlet.rb new file mode 100644 index 00000000000..1f84cbbbe64 --- /dev/null +++ b/test/test_commands_serve_servlet.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require "webrick" +require "helper" +require "net/http" + +class TestCommandsServeServlet < JekyllUnitTest + def get(path) + TestWEBrick.mount_server do |_server, addr, port| + http = Net::HTTP.new(addr, port) + req = Net::HTTP::Get.new(path) + + http.request(req) { |response| yield(response) } + end + end + + context "with a directory and file with the same name" do + should "find that file" do + get("/bar/") do |response| + assert_equal("200", response.code) + assert_equal("Content of bar.html", response.body.strip) + end + end + + should "find file in directory" do + get("/bar/baz") do |response| + assert_equal("200", response.code) + assert_equal("Content of baz.html", response.body.strip) + end + end + + should "return 404 for non-existing files" do + get("/bar/missing") do |response| + assert_equal("404", response.code) + end + end + end +end From bd3c395cfcca50e18d930c1a1135ef917b079751 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Nov 2017 03:49:15 -0500 Subject: [PATCH 2586/4996] Update history to reflect merge of #6569 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b9fb48435e1..94d3c9ecf35 100644 --- a/History.markdown +++ b/History.markdown @@ -91,6 +91,7 @@ * Raise when theme root directory is not available (#6455) * Avoid block parser warning in SmartyPants (#6565) * Fail gracefully if "sass" gem cannot be loaded (#6573) + * return correct file in dir if dir has same name as file (#6569) ## 3.6.2 / 2017-10-21 From 01806bcec49ba0202fe73173acdb487bc13c4018 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 24 Nov 2017 17:49:08 +0530 Subject: [PATCH 2587/4996] use version-badge on an existing feature intro (#6575) Merge pull request 6575 --- docs/_docs/themes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index 6907ffb0c00..b5423a6b56c 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -224,9 +224,9 @@ Your theme's styles can be included in the user's stylesheet using the `@import` ``` {% endraw %} -### Theme-gem dependencies +### Theme-gem dependencies {%- include docs_version_badge.html version="3.5.0" -%} -From `v3.5`, Jekyll will automatically require all whitelisted `runtime_dependencies` of your theme-gem even if they're not explicitly included under the `plugins` array in the site's config file. (Note: whitelisting is only required when building or serving with the `--safe` option.) +Jekyll will automatically require all whitelisted `runtime_dependencies` of your theme-gem even if they're not explicitly included under the `plugins` array in the site's config file. (Note: whitelisting is only required when building or serving with the `--safe` option.) With this, the end-user need not keep track of the plugins required to be included in their config file for their theme-gem to work as intended. From 110b4734876eae19b9de7b7f4acdd7adf3b5e10c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Nov 2017 07:19:10 -0500 Subject: [PATCH 2588/4996] Update history to reflect merge of #6575 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 94d3c9ecf35..d878b8d1fdc 100644 --- a/History.markdown +++ b/History.markdown @@ -85,6 +85,7 @@ * Site header redesign (#6567) * Move logo above site navigation on small screens (#6570) * Docs: Include version badge for latest features (#6574) + * Use version-badge on an existing feature intro (#6575) ### Bug Fixes From 0b4f657039b4e56820ee9e9eb3e4dc493b4e3f1f Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 27 Nov 2017 01:06:41 +0530 Subject: [PATCH 2589/4996] drop forwarding to private methods (#6577) Merge pull request 6577 --- lib/jekyll/theme_builder.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index aca89dd655c..9b43e0a3714 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -21,6 +21,14 @@ def create! initialize_git_repo end + def user_name + @user_name ||= `git config user.name`.chomp + end + + def user_email + @user_email ||= `git config user.email`.chomp + end + private def root @@ -85,14 +93,6 @@ def initialize_git_repo write_file(".gitignore", template("gitignore")) end - def user_name - @user_name ||= `git config user.name`.chomp - end - - def user_email - @user_email ||= `git config user.email`.chomp - end - class ERBRenderer extend Forwardable From fce3cbfd8194ae9c3cb576cbb2ea6c0f25748250 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 26 Nov 2017 14:36:43 -0500 Subject: [PATCH 2590/4996] Update history to reflect merge of #6577 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d878b8d1fdc..f05f90020c6 100644 --- a/History.markdown +++ b/History.markdown @@ -54,6 +54,7 @@ * Lock to cucumber 3.0.1 on Ruby 2.1 (#6546) * Bump JRuby version in Travis config (#6561) * Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828) + * Drop forwarding to private methods by exposing those methods as public (#6577) ### Minor Enhancements From c14b8b5864386a09028fa04bbea674a3c3263b73 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 29 Nov 2017 03:17:08 -0500 Subject: [PATCH 2591/4996] Upgrade pygments to v1.x (#5937) Merge pull request 5937 --- Gemfile | 2 +- lib/jekyll/tags/highlight.rb | 4 ++-- test/test_redcarpet.rb | 13 +++++++------ test/test_tags.rb | 23 ++++++++++++++--------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Gemfile b/Gemfile index 2ba32da780c..8590544ed3a 100644 --- a/Gemfile +++ b/Gemfile @@ -81,7 +81,7 @@ group :jekyll_optional_dependencies do platform :ruby, :mswin, :mingw, :x64_mingw do gem "classifier-reborn", "~> 2.1.0" gem "liquid-c", "~> 3.0" - gem "pygments.rb", "~> 0.6.0" + gem "pygments.rb", "~> 1.0" gem "rdiscount", "~> 2.0" gem "redcarpet", "~> 3.2", ">= 3.2.3" gem "yajl-ruby", "~> 1.2" diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 683e3b2b456..256342c3fe6 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -86,7 +86,7 @@ def parse_options(input) end def render_pygments(code, is_safe) - Jekyll::External.require_with_graceful_fail("pygments") + Jekyll::External.require_with_graceful_fail("pygments") unless defined?(Pygments) highlighted_code = Pygments.highlight( code, @@ -118,7 +118,7 @@ def render_rouge(code) :gutter_class => "gutter", :code_class => "code" ) - lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText + lexer = ::Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText formatter.format(lexer.lex(code)) end diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb index f4208570931..29d787ae62f 100644 --- a/test/test_redcarpet.rb +++ b/test/test_redcarpet.rb @@ -46,16 +46,17 @@ class TestRedcarpet < JekyllUnitTest end should "render fenced code blocks with syntax highlighting" do - assert_equal "
    puts "Hello world"\n
    ", - @markdown.convert( - <<-EOS + assert_equal \ + "
    puts "Hello world"\n
    ", + @markdown.convert( + <<-EOS ```ruby puts "Hello world" ``` EOS - ).strip + ).strip end end diff --git a/test/test_tags.rb b/test/test_tags.rb index 43d83464362..a76f0df138a 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -185,7 +185,8 @@ def highlight_block_with_opts(options_string) should "render markdown with pygments" do assert_match( - %(
    test
    ), + %(
    ) +
    +          %(test
    ), @result ) end @@ -193,7 +194,7 @@ def highlight_block_with_opts(options_string) should "render markdown with pygments with line numbers" do assert_match( %(
    ) +
    -          %(1 test
    ), + %(1 test
    ), @result ) end @@ -206,7 +207,7 @@ def highlight_block_with_opts(options_string) should "not embed the file" do assert_match( - %(
    ) +
    +          %(
    ) +
               %(./jekyll.gemspec
    ), @result ) @@ -220,7 +221,8 @@ def highlight_block_with_opts(options_string) should "render markdown with pygments line handling" do assert_match( - %(
    Æ
    ), + %(
    ) +
    +          %(Æ
    ), @result ) end @@ -240,7 +242,8 @@ def highlight_block_with_opts(options_string) should "only strip the preceding newlines" do assert_match( - %(
         [,1] [,2]),
    +          %(
    ) +
    +          %(     [,1] [,2]),
               @result
             )
           end
    @@ -265,8 +268,8 @@ def highlight_block_with_opts(options_string)
     
           should "only strip the newlines which precede and succeed the entire block" do
             assert_match(
    -          "
    " \
    -          "     [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE
    ", + %(
    ) +
    +          %(     [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE
    ), @result ) end @@ -280,7 +283,8 @@ def highlight_block_with_opts(options_string) should "only strip the preceding newlines" do assert_match( - %(
         [,1] [,2]),
    +          %(
    ) +
    +          %(     [,1] [,2]),
               @result
             )
           end
    @@ -298,7 +302,8 @@ def highlight_block_with_opts(options_string)
     
           should "only strip the preceding newlines" do
             assert_match(
    -          %(
         [,1] [,2]),
    +          %(
    ) +
    +          %(     [,1] [,2]),
               @result
             )
           end
    
    From b77593ce74c67cdb06c1f7eae4ee17b0db381510 Mon Sep 17 00:00:00 2001
    From: jekyllbot 
    Date: Wed, 29 Nov 2017 03:17:09 -0500
    Subject: [PATCH 2592/4996] Update history to reflect merge of #5937 [ci skip]
    
    ---
     History.markdown | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/History.markdown b/History.markdown
    index f05f90020c6..06d286eb9eb 100644
    --- a/History.markdown
    +++ b/History.markdown
    @@ -55,6 +55,7 @@
       * Bump JRuby version in Travis config (#6561)
       * Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828)
       * Drop forwarding to private methods by exposing those methods as public (#6577)
    +  * Upgrade pygments to v1.x (#5937)
     
     ### Minor Enhancements
     
    
    From a13740839acc536f2629840dc7acb5a3127a1f99 Mon Sep 17 00:00:00 2001
    From: jekyllbot 
    Date: Wed, 29 Nov 2017 03:37:07 -0500
    Subject: [PATCH 2593/4996] Bump yajl-ruby (#6582)
    
    Merge pull request 6582
    ---
     Gemfile | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/Gemfile b/Gemfile
    index 8590544ed3a..68bc28c24a5 100644
    --- a/Gemfile
    +++ b/Gemfile
    @@ -84,7 +84,7 @@ group :jekyll_optional_dependencies do
         gem "pygments.rb", "~> 1.0"
         gem "rdiscount", "~> 2.0"
         gem "redcarpet", "~> 3.2", ">= 3.2.3"
    -    gem "yajl-ruby", "~> 1.2"
    +    gem "yajl-ruby", "~> 1.3.1"
       end
     
       # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
    
    From 64c87c92533bb42b4d8f7fb83d977c11861f3473 Mon Sep 17 00:00:00 2001
    From: jekyllbot 
    Date: Wed, 29 Nov 2017 03:37:08 -0500
    Subject: [PATCH 2594/4996] Update history to reflect merge of #6582 [ci skip]
    
    ---
     History.markdown | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/History.markdown b/History.markdown
    index 06d286eb9eb..49bfec78dda 100644
    --- a/History.markdown
    +++ b/History.markdown
    @@ -56,6 +56,7 @@
       * Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828)
       * Drop forwarding to private methods by exposing those methods as public (#6577)
       * Upgrade pygments to v1.x (#5937)
    +  * Bump yajl-ruby (#6582)
     
     ### Minor Enhancements
     
    
    From da0df228cd14d745a46fbd0f910c06a4fd488d96 Mon Sep 17 00:00:00 2001
    From: ashmaroli 
    Date: Wed, 29 Nov 2017 19:26:46 +0530
    Subject: [PATCH 2595/4996] cleanup test_redcarpet.rb (#6584)
    
    Merge pull request 6584
    ---
     test/test_redcarpet.rb | 57 ++++++++++++++++++------------------------
     1 file changed, 25 insertions(+), 32 deletions(-)
    
    diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb
    index 29d787ae62f..51da49c58e4 100644
    --- a/test/test_redcarpet.rb
    +++ b/test/test_redcarpet.rb
    @@ -19,6 +19,13 @@ class TestRedcarpet < JekyllUnitTest
           }
     
           @markdown = Converters::Markdown.new @config
    +
    +      @sample = Jekyll::Utils.strip_heredoc(<<-EOS
    +        ```ruby
    +        puts "Hello world"
    +        ```
    +      EOS
    +                                           )
         end
     
         should "pass redcarpet options" do
    @@ -35,7 +42,7 @@ class TestRedcarpet < JekyllUnitTest
     
         should "pass redcarpet render options" do
           assert_equal "

    bad code not here: i am bad

    ", - @markdown.convert("**bad code not here**: ").strip + @markdown.convert("**bad code not here**: ").strip end context "with pygments enabled" do @@ -46,17 +53,12 @@ class TestRedcarpet < JekyllUnitTest end should "render fenced code blocks with syntax highlighting" do - assert_equal \ - "
    puts "Hello world"\n
    ", - @markdown.convert( - <<-EOS -```ruby -puts "Hello world" -``` -EOS - ).strip + assert_equal( + %(
    puts "Hello world"\n
    ), + @markdown.convert(@sample).strip + ) end end @@ -66,16 +68,12 @@ class TestRedcarpet < JekyllUnitTest end should "render fenced code blocks with syntax highlighting" do - assert_equal "
    puts \"Hello world\"\n
    ", - @markdown.convert( - <<-EOS -```ruby -puts "Hello world" -``` - EOS - ).strip + assert_equal( + %(
    puts "Hello world"\n
    ), + @markdown.convert(@sample).strip + ) end end @@ -85,16 +83,11 @@ class TestRedcarpet < JekyllUnitTest end should "render fenced code blocks without syntax highlighting" do - assert_equal "
    puts "Hello world"\n
    "\ - "
    ", - @markdown.convert( - <<-EOS -```ruby -puts "Hello world" -``` - EOS - ).strip + assert_equal( + %(
    puts "Hello world"\n
    ), + @markdown.convert(@sample).strip + ) end end end From f7b45c44403d18e6b21cb78abe74cd19e538ad97 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 29 Nov 2017 08:56:47 -0500 Subject: [PATCH 2596/4996] Update history to reflect merge of #6584 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 49bfec78dda..75ca663c772 100644 --- a/History.markdown +++ b/History.markdown @@ -57,6 +57,7 @@ * Drop forwarding to private methods by exposing those methods as public (#6577) * Upgrade pygments to v1.x (#5937) * Bump yajl-ruby (#6582) + * Cleanup test_redcarpet.rb (#6584) ### Minor Enhancements From 38342006a361041029c46547a74972c85a30fd41 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Thu, 30 Nov 2017 23:46:35 +0530 Subject: [PATCH 2597/4996] Add PageWithoutAFile class from jekyll plugins (#6556) Merge pull request 6556 --- lib/jekyll.rb | 1 + lib/jekyll/page_without_a_file.rb | 18 ++++ test/fixtures/physical.html | 6 ++ test/test_page_without_a_file.rb | 159 ++++++++++++++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 lib/jekyll/page_without_a_file.rb create mode 100644 test/fixtures/physical.html create mode 100644 test/test_page_without_a_file.rb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 733796cc2af..c909c3d13e4 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -61,6 +61,7 @@ module Jekyll autoload :ThemeAssetsReader, "jekyll/readers/theme_assets_reader" autoload :LogAdapter, "jekyll/log_adapter" autoload :Page, "jekyll/page" + autoload :PageWithoutAFile, "jekyll/page_without_a_file" autoload :PluginManager, "jekyll/plugin_manager" autoload :Publisher, "jekyll/publisher" autoload :Reader, "jekyll/reader" diff --git a/lib/jekyll/page_without_a_file.rb b/lib/jekyll/page_without_a_file.rb new file mode 100644 index 00000000000..2d30af51116 --- /dev/null +++ b/lib/jekyll/page_without_a_file.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Jekyll + # A Jekyll::Page subclass to handle processing files without reading it to + # determine the page-data and page-content based on Front Matter delimiters. + # + # The class instance is basically just a bare-bones entity with just + # attributes "dir", "name", "path", "url" defined on it. + class PageWithoutAFile < Page + def read_yaml(*) + @data ||= {} + end + + def inspect + "#" + end + end +end diff --git a/test/fixtures/physical.html b/test/fixtures/physical.html new file mode 100644 index 00000000000..8913980af32 --- /dev/null +++ b/test/fixtures/physical.html @@ -0,0 +1,6 @@ +--- +title: Physical file +permalink: /physical/ +--- + +A physical file entity diff --git a/test/test_page_without_a_file.rb b/test/test_page_without_a_file.rb new file mode 100644 index 00000000000..b1fa9c04c9a --- /dev/null +++ b/test/test_page_without_a_file.rb @@ -0,0 +1,159 @@ +# frozen_string_literal: true + +require "helper" + +class TestPageWithoutAFile < JekyllUnitTest + def setup_page(*args, base: source_dir, klass: PageWithoutAFile) + dir, file = args + if file.nil? + file = dir + dir = "" + end + klass.new(@site, base, dir, file) + end + + def render_and_write + @site.render + @site.cleanup + @site.write + end + + context "A PageWithoutAFile" do + setup do + clear_dest + @site = Site.new(Jekyll.configuration({ + "source" => source_dir, + "destination" => dest_dir, + "skip_config_files" => true, + })) + end + + context "with default site configuration" do + setup do + @page = setup_page("properties.html") + end + + should "not have page-content and page-data defined within it" do + assert_equal "pages", @page.type.to_s + assert_nil @page.content + assert_empty @page.data + end + + should "have basic attributes defined in it" do + regular_page = setup_page("properties.html", :klass => Page) + basic_attrs = %w(dir name path url) + attrs = { + "content" => "All the properties.\n", + "dir" => "/", + "excerpt" => nil, + "foo" => "bar", + "layout" => "default", + "name" => "properties.html", + "path" => "properties.html", + "permalink" => "/properties/", + "published" => nil, + "title" => "Properties Page", + "url" => "/properties.html", + } + attrs.each do |prop, value| + # assert the props being accessible in a Jekyll::Page instance + assert_equal "All the properties.\n", regular_page["content"] + assert_equal "properties.html", regular_page["name"] + + # assert differences with Jekyll::PageWithoutAFile instance + if basic_attrs.include?(prop) + assert_equal @page[prop], value, "For :" + else + assert_nil @page[prop] + end + end + end + end + + context "with site-wide permalink configuration" do + setup do + @site.permalink_style = :title + end + + should "generate page url accordingly" do + page = setup_page("properties.html") + assert_equal "/properties", page.url + end + end + + context "with default front matter configuration" do + setup do + @site.config["defaults"] = [ + { + "scope" => { + "path" => "", + "type" => "pages", + }, + "values" => { + "layout" => "default", + "author" => "John Doe", + }, + }, + ] + + @page = setup_page("info.md") + end + + should "respect front matter defaults" do + assert_nil @page.data["title"] + assert_equal "John Doe", @page.data["author"] + assert_equal "default", @page.data["layout"] + end + end + + context "with a path outside site.source" do + should "not access its contents" do + base = "../../../" + page = setup_page("pwd", :base => base) + + assert_equal "pwd", page.path + assert_nil page.content + end + end + + context "while processing" do + setup do + clear_dest + @site.config["title"] = "Test Site" + @page = setup_page("physical.html", :base => test_dir("fixtures")) + end + + should "recieve content provided to it" do + assert_nil @page.content + + @page.content = "{{ site.title }}" + assert_equal "{{ site.title }}", @page.content + end + + should "not be processed and written to disk at destination" do + @page.content = "Lorem ipsum dolor sit amet" + @page.data["permalink"] = "/virtual-about/" + + render_and_write + + refute_exist dest_dir("physical") + refute_exist dest_dir("virtual-about") + refute File.exist?(dest_dir("virtual-about", "index.html")) + end + + should "be processed and written to destination when passed as "\ + "an entry in 'site.pages' array" do + @page.content = "{{ site.title }}" + @page.data["permalink"] = "/virtual-about/" + + @site.pages << @page + render_and_write + + refute_exist dest_dir("physical") + assert_exist dest_dir("virtual-about") + assert File.exist?(dest_dir("virtual-about", "index.html")) + assert_equal "Test Site", File.read(dest_dir("virtual-about", "index.html")) + end + end + end +end From 5a10887f86e2425b882800868ded8e05a82b7a0d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 30 Nov 2017 12:16:37 -0600 Subject: [PATCH 2598/4996] Update history to reflect merge of #6556 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 75ca663c772..fcd419fb053 100644 --- a/History.markdown +++ b/History.markdown @@ -58,6 +58,7 @@ * Upgrade pygments to v1.x (#5937) * Bump yajl-ruby (#6582) * Cleanup test_redcarpet.rb (#6584) + * Add PageWithoutAFile class from jekyll plugins (#6556) ### Minor Enhancements From a37bde52b3d1acf5e3a50385f2c492d10f2871d1 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 01:51:07 +0100 Subject: [PATCH 2599/4996] Dependency: Bump jekyll-watch to 2.0 (#6589) Merge pull request 6589 --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 98fd53824f4..90ad0ceb846 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -34,7 +34,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("colorator", "~> 1.0") s.add_runtime_dependency("i18n", "~> 0.7") s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") - s.add_runtime_dependency("jekyll-watch", "~> 1.1") + s.add_runtime_dependency("jekyll-watch", "~> 2.0") s.add_runtime_dependency("kramdown", "~> 1.14") s.add_runtime_dependency("liquid", "~> 4.0") s.add_runtime_dependency("mercenary", "~> 0.3.3") From 4c97f5ef222465916c499f5d7a1bace9d1a40650 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 2 Dec 2017 18:51:09 -0600 Subject: [PATCH 2600/4996] Update history to reflect merge of #6589 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fcd419fb053..54bd43db93d 100644 --- a/History.markdown +++ b/History.markdown @@ -74,6 +74,7 @@ * Add latin mode to slugify (#6509) * Log Kramdown warnings if log level is WARN (#6522) * Add json extension to list of directory indices (#6550) + * Dependency: Bump jekyll-watch to 2.0 (#6589) ### Site Enhancements From 2ea970d2b5ae8a5ea5739b9f41e68de52127d055 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 19:38:34 +0100 Subject: [PATCH 2601/4996] Docs: Avoid Kramdown warnings --- docs/_docs/history.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 85e493616af..a7308287028 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -153,7 +153,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - added BibSonomy plugin ([#6143]({{ site.repository }}/issues/6143)) - add plugins for multiple page pagination ([#6055]({{ site.repository }}/issues/6055)) - Update minimum Ruby version in installation.md ([#6164]({{ site.repository }}/issues/6164)) -- [docs] Add information about finding a collection in `site.collections` ([#6165]({{ site.repository }}/issues/6165)) +- Add information about finding a collection in `site.collections` ([#6165]({{ site.repository }}/issues/6165)) - Add {% raw %}`{% raw %}`{% endraw %} to Liquid example on site ([#6179]({{ site.repository }}/issues/6179)) - Added improved Pug plugin - removed 404 Jade plugin ([#6174]({{ site.repository }}/issues/6174)) - Linking the link ([#6210]({{ site.repository }}/issues/6210)) @@ -263,7 +263,7 @@ note: This file is autogenerated. Edit /History.markdown instead. ### Development Fixes {: #development-fixes-v3-5-0} -- [Rubocop] add missing comma ([#5835]({{ site.repository }}/issues/5835)) +- Rubocop: add missing comma ([#5835]({{ site.repository }}/issues/5835)) - Appease classifier-reborn ([#5934]({{ site.repository }}/issues/5934)) - Allow releases & development on `*-stable` branches ([#5926]({{ site.repository }}/issues/5926)) - Add script/backport-pr ([#5925]({{ site.repository }}/issues/5925)) @@ -302,7 +302,7 @@ note: This file is autogenerated. Edit /History.markdown instead. {: #bug-fixes-v3-5-0} - Exclude Gemfile by default ([#5860]({{ site.repository }}/issues/5860)) -- Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty ([#5878]({{ site.repository }}/issues/5878)) +- Convertible#validate_permalink!: ensure the return value of `data["permalink"]` is a string before asking if it is empty ([#5878]({{ site.repository }}/issues/5878)) - Allow abbreviated post dates ([#5920]({{ site.repository }}/issues/5920)) - Remove dependency on include from default about.md ([#5903]({{ site.repository }}/issues/5903)) - Allow colons in `uri_escape` filter ([#5957]({{ site.repository }}/issues/5957)) @@ -378,7 +378,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Switch to `https` when possible. ([#5611]({{ site.repository }}/issues/5611)) - Update `_font-awesome.scss` to move .woff file before .ttf ([#5614]({{ site.repository }}/issues/5614)) - Update documentation on updating FontAwesome Iconset ([#5655]({{ site.repository }}/issues/5655)) -- [site] Use defaults for docs and news-items ([#5744]({{ site.repository }}/issues/5744)) +- Use defaults for docs and news-items ([#5744]({{ site.repository }}/issues/5744)) - Sort gems in `docs/_config.yml` ([#5746]({{ site.repository }}/issues/5746)) - Add missing class ([#5791]({{ site.repository }}/issues/5791)) - Improve template docs ([#5694]({{ site.repository }}/issues/5694)) @@ -440,7 +440,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Update quickstart.md ([#5758]({{ site.repository }}/issues/5758)) - Correct minor typo ([#5764]({{ site.repository }}/issues/5764)) - Fix a markdown link to look properly on the web ([#5769]({{ site.repository }}/issues/5769)) -- [docs] Info about the help command usage ([#5312]({{ site.repository }}/issues/5312)) +- Info about the help command usage ([#5312]({{ site.repository }}/issues/5312)) - Add missing merge labels for jekyllbot ([#5753]({{ site.repository }}/issues/5753)) - Fix broken links in documentation ([#5736]({{ site.repository }}/issues/5736)) - Docs: add `match_regex` and `replace_regex` filters ([#5799]({{ site.repository }}/issues/5799)) @@ -583,10 +583,10 @@ note: This file is autogenerated. Edit /History.markdown instead. - Site: exclude README.md and .gitignore ([#5304]({{ site.repository }}/issues/5304)) - Add link to Staticman ([#5224]({{ site.repository }}/issues/5224)) - Update url for OpenShift ([#5320]({{ site.repository }}/issues/5320)) -- [docs] add help for missing static_file e.g. on heroku ([#5334]({{ site.repository }}/issues/5334)) +- Add help for missing static_file e.g. on heroku ([#5334]({{ site.repository }}/issues/5334)) - Add a line about updating theme-gems in the docs ([#5318]({{ site.repository }}/issues/5318)) - Explain how to copy a theme's files ([#5335]({{ site.repository }}/issues/5335)) -- [docs] .md as default extension in examples ([#5316]({{ site.repository }}/issues/5316)) +- .md as default extension in examples ([#5316]({{ site.repository }}/issues/5316)) - Fix small typo in docs ([#5347]({{ site.repository }}/issues/5347)) - Add missing period to sentence in first paragraph. ([#5372]({{ site.repository }}/issues/5372)) - added jekyll-spotify plugin ([#5369]({{ site.repository }}/issues/5369)) @@ -595,7 +595,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Add documentation for `relative_url` and `absolute_url` ([#5405]({{ site.repository }}/issues/5405)) - Bugfix on logo in JSON-LD ([#5421]({{ site.repository }}/issues/5421)) - Fix Travis.ci documentation ([#5413]({{ site.repository }}/issues/5413)) -- [docs] Update documentation regarding `bundle install` after `jekyll new` ([#5428]({{ site.repository }}/issues/5428)) +- Update documentation regarding `bundle install` after `jekyll new` ([#5428]({{ site.repository }}/issues/5428)) - Replace classic box-sizing reset with inheritance reset ([#5411]({{ site.repository }}/issues/5411)) - Update Wikipedia YAML list link ([#5452]({{ site.repository }}/issues/5452)) - Add Jekyll 3.3 release post ([#5442]({{ site.repository }}/issues/5442)) @@ -929,7 +929,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Fix broken links to the Code of Conduct ([#4436]({{ site.repository }}/issues/4436)) - Upgrade notes: mention trailing slash in permalink; fixes [#4440]({{ site.repository }}/issues/4440) ([#4455]({{ site.repository }}/issues/4455)) - Add hooks to the plugin categories toc ([#4463]({{ site.repository }}/issues/4463)) -- [add note] Jekyll 3 requires newer version of Ruby. ([#4461]({{ site.repository }}/issues/4461)) +- Jekyll 3 requires newer version of Ruby. ([#4461]({{ site.repository }}/issues/4461)) - Fix typo in upgrading docs ([#4473]({{ site.repository }}/issues/4473)) - Add note about upgrading documentation on jekyllrb.com/help/ ([#4484]({{ site.repository }}/issues/4484)) - Update Rake link ([#4496]({{ site.repository }}/issues/4496)) @@ -1005,7 +1005,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Fix deep_merge_hashes! handling of drops and hashes ([#4359]({{ site.repository }}/issues/4359)) - Page should respect output extension of its permalink ([#4373]({{ site.repository }}/issues/4373)) - Disable auto-regeneration when running server detached ([#4376]({{ site.repository }}/issues/4376)) -- Drop#[]: only use public_send for keys in the content_methods array ([#4388]({{ site.repository }}/issues/4388)) +- Drop#: only use public_send for keys in the content_methods array ([#4388]({{ site.repository }}/issues/4388)) - Extract title from filename successfully when no date. ([#4195]({{ site.repository }}/issues/4195)) ### Development Fixes From 0186bdb38445044e555f8c2b9be6f7e48694c781 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 19:39:02 +0100 Subject: [PATCH 2602/4996] Docs: Build for production --- docs/_docs/usage.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index dc273b29e90..d4dffa01099 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -21,6 +21,13 @@ jekyll build --watch # watched for changes, and regenerated automatically. ``` +Default URL is set to `http://localhost:4000` in development environment. {% include docs_version_badge.html version="3.3.0" %} + +If you want to build for your production environment: + + - Set your production URL in `_config.yml` e.g. `url: https://example.com`. + - Run `JEKYLL_ENV=production bundle exec jekyll build`. +
    Changes to _config.yml are not included during automatic regeneration.

    From a58629f97dba80b6ececb29ebfeb64d81f0057b0 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 19:40:10 +0100 Subject: [PATCH 2603/4996] Dev: Run preview in incremental mode --- rake/site.rake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rake/site.rake b/rake/site.rake index 10d48c52651..d260e4472be 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -27,6 +27,8 @@ namespace :site do options = { "source" => File.expand_path(docs_folder), "destination" => File.expand_path("#{docs_folder}/_site"), + "incremental" => true, + "profile" => true, "watch" => true, "serving" => true, } From 9ec9273ed9f04a666e6bc434baa2790321675c8f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 19:52:37 +0100 Subject: [PATCH 2604/4996] Docs: Add title and anchor --- docs/_docs/usage.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index d4dffa01099..a4201c1e1d3 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -21,7 +21,9 @@ jekyll build --watch # watched for changes, and regenerated automatically. ``` -Default URL is set to `http://localhost:4000` in development environment. {% include docs_version_badge.html version="3.3.0" %} +## Override default development settings + +Default URL is set to `http://localhost:4000` in development environment. {% include docs_version_badge.html version="3.3.0" %} If you want to build for your production environment: From 8e2c240fa66e1cf0ab1729da48e4891b13c928ee Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 4 Dec 2017 13:03:39 +0530 Subject: [PATCH 2605/4996] use a shorter topic label for readability Jekyll's logger like the first parameter to be of 20 chars or lesser --- lib/jekyll/collection.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 4a3a70f6018..51c2f98ff3f 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -210,7 +210,7 @@ def read_document(full_path) if site.publisher.publish?(doc) || !write? docs << doc else - Jekyll.logger.debug "Skipped From Publishing:", doc.relative_path + Jekyll.logger.debug "Skipped Publishing:", doc.relative_path end end From 9d68b1b134a50ee2ba670920b32b0f72f7af88f7 Mon Sep 17 00:00:00 2001 From: Alex Wood Date: Wed, 6 Dec 2017 16:33:51 -0500 Subject: [PATCH 2606/4996] Add LiveReload functionality to Jekyll. (#5142) Merge pull request 5142 --- Gemfile | 1 + jekyll.gemspec | 1 + lib/jekyll/commands/serve.rb | 179 ++- .../commands/serve/live_reload_reactor.rb | 153 +++ .../serve/livereload_assets/livereload.js | 1183 +++++++++++++++++ lib/jekyll/commands/serve/servlet.rb | 137 ++ lib/jekyll/commands/serve/websockets.rb | 80 ++ lib/jekyll/utils.rb | 1 + lib/jekyll/utils/thread_event.rb | 35 + test/test_commands_serve.rb | 125 ++ 10 files changed, 1875 insertions(+), 20 deletions(-) create mode 100644 lib/jekyll/commands/serve/live_reload_reactor.rb create mode 100644 lib/jekyll/commands/serve/livereload_assets/livereload.js create mode 100644 lib/jekyll/commands/serve/websockets.rb create mode 100644 lib/jekyll/utils/thread_event.rb diff --git a/Gemfile b/Gemfile index 68bc28c24a5..f7000acb61a 100644 --- a/Gemfile +++ b/Gemfile @@ -24,6 +24,7 @@ end group :test do gem "codeclimate-test-reporter", "~> 1.0.5" gem "cucumber", RUBY_VERSION >= "2.2" ? "~> 3.0" : "3.0.1" + gem "httpclient" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" # nokogiri v1.8 does not work with ruby 2.1 and below diff --git a/jekyll.gemspec b/jekyll.gemspec index 90ad0ceb846..b434881cace 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -32,6 +32,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("addressable", "~> 2.4") s.add_runtime_dependency("colorator", "~> 1.0") + s.add_runtime_dependency("em-websocket", "~> 0.5") s.add_runtime_dependency("i18n", "~> 0.7") s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") s.add_runtime_dependency("jekyll-watch", "~> 2.0") diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 9861d2c68d7..50438b5f7d5 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -1,20 +1,43 @@ # frozen_string_literal: true +require "thread" + module Jekyll module Commands class Serve < Command + # Similar to the pattern in Utils::ThreadEvent except we are maintaining the + # state of @running instead of just signaling an event. We have to maintain this + # state since Serve is just called via class methods instead of an instance + # being created each time. + @mutex = Mutex.new + @run_cond = ConditionVariable.new + @running = false + class << self COMMAND_OPTIONS = { - "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], - "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], - "open_url" => ["-o", "--open-url", "Launch your site in a browser"], - "detach" => ["-B", "--detach", "Run the server in the background"], - "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], - "port" => ["-P", "--port [PORT]", "Port to listen on"], - "show_dir_listing" => ["--show-dir-listing", + "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], + "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], + "open_url" => ["-o", "--open-url", "Launch your site in a browser"], + "detach" => ["-B", "--detach", + "Run the server in the background",], + "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], + "port" => ["-P", "--port [PORT]", "Port to listen on"], + "show_dir_listing" => ["--show-dir-listing", "Show a directory listing instead of loading your index file.",], - "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", + "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", "Skips the initial site build which occurs before the server is started.",], + "livereload" => ["-l", "--livereload", + "Use LiveReload to automatically refresh browsers",], + "livereload_ignore" => ["--livereload-ignore ignore GLOB1[,GLOB2[,...]]", + Array, + "Files for LiveReload to ignore. Remember to quote the values so your shell "\ + "won't expand them",], + "livereload_min_delay" => ["--livereload-min-delay [SECONDS]", + "Minimum reload delay",], + "livereload_max_delay" => ["--livereload-max-delay [SECONDS]", + "Maximum reload delay",], + "livereload_port" => ["--livereload-port [PORT]", Integer, + "Port for LiveReload to listen on",], }.freeze DIRECTORY_INDEX = %w( @@ -26,7 +49,11 @@ class << self index.json ).freeze - # + LIVERELOAD_PORT = 35_729 + LIVERELOAD_DIR = File.join(__dir__, "serve", "livereload_assets") + + attr_reader :mutex, :run_cond, :running + alias_method :running?, :running def init_with_program(prog) prog.command(:serve) do |cmd| @@ -41,20 +68,34 @@ def init_with_program(prog) end cmd.action do |_, opts| + opts["livereload_port"] ||= LIVERELOAD_PORT opts["serving"] = true opts["watch" ] = true unless opts.key?("watch") - config = configuration_from_options(opts) - if Jekyll.env == "development" - config["url"] = default_url(config) - end - [Build, Serve].each { |klass| klass.process(config) } + start(opts) end end end # + def start(opts) + # Set the reactor to nil so any old reactor will be GCed. + # We can't unregister a hook so in testing when Serve.start is + # called multiple times we don't want to inadvertently keep using + # a reactor created by a previous test when our test might not + @reload_reactor = nil + + register_reload_hooks(opts) if opts["livereload"] + config = configuration_from_options(opts) + if Jekyll.env == "development" + config["url"] = default_url(config) + end + [Build, Serve].each { |klass| klass.process(config) } + end + + # + def process(opts) opts = configuration_from_options(opts) destination = opts["destination"] @@ -63,6 +104,76 @@ def process(opts) start_up_webrick(opts, destination) end + def shutdown + @server.shutdown if running? + end + + # Perform logical validation of CLI options + + private + def validate_options(opts) + if opts["livereload"] + if opts["detach"] + Jekyll.logger.warn "Warning:", + "--detach and --livereload are mutually exclusive. Choosing --livereload" + opts["detach"] = false + end + if opts["ssl_cert"] || opts["ssl_key"] + # This is not technically true. LiveReload works fine over SSL, but + # EventMachine's SSL support in Windows requires building the gem's + # native extensions against OpenSSL and that proved to be a process + # so tedious that expecting users to do it is a non-starter. + Jekyll.logger.abort_with "Error:", "LiveReload does not support SSL" + end + unless opts["watch"] + # Using livereload logically implies you want to watch the files + opts["watch"] = true + end + elsif %w(livereload_min_delay + livereload_max_delay + livereload_ignore + livereload_port).any? { |o| opts[o] } + Jekyll.logger.abort_with "--livereload-min-delay, "\ + "--livereload-max-delay, --livereload-ignore, and "\ + "--livereload-port require the --livereload option." + end + end + + # + + private + # rubocop:disable Metrics/AbcSize + def register_reload_hooks(opts) + require_relative "serve/live_reload_reactor" + @reload_reactor = LiveReloadReactor.new + + Jekyll::Hooks.register(:site, :post_render) do |site| + regenerator = Jekyll::Regenerator.new(site) + @changed_pages = site.pages.select do |p| + regenerator.regenerate?(p) + end + end + + # A note on ignoring files: LiveReload errs on the side of reloading when it + # comes to the message it gets. If, for example, a page is ignored but a CSS + # file linked in the page isn't, the page will still be reloaded if the CSS + # file is contained in the message sent to LiveReload. Additionally, the + # path matching is very loose so that a message to reload "/" will always + # lead the page to reload since every page starts with "/". + Jekyll::Hooks.register(:site, :post_write) do + if @changed_pages && @reload_reactor && @reload_reactor.running? + ignore, @changed_pages = @changed_pages.partition do |p| + Array(opts["livereload_ignore"]).any? do |filter| + File.fnmatch(filter, Jekyll.sanitized_path(p.relative_path)) + end + end + Jekyll.logger.debug "LiveReload:", "Ignoring #{ignore.map(&:relative_path)}" + @reload_reactor.reload(@changed_pages) + end + @changed_pages = nil + end + end + # Do a base pre-setup of WEBRick so that everything is in place # when we get ready to party, checking for an setting up an error page # and making sure our destination exists. @@ -92,6 +203,7 @@ def webrick_opts(opts) :MimeTypes => mime_types, :DocumentRoot => opts["destination"], :StartCallback => start_callback(opts["detach"]), + :StopCallback => stop_callback(opts["detach"]), :BindAddress => opts["host"], :Port => opts["port"], :DirectoryIndex => DIRECTORY_INDEX, @@ -108,11 +220,16 @@ def webrick_opts(opts) private def start_up_webrick(opts, destination) - server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } - server.mount(opts["baseurl"].to_s, Servlet, destination, file_handler_opts) - Jekyll.logger.info "Server address:", server_address(server, opts) - launch_browser server, opts if opts["open_url"] - boot_or_detach server, opts + if opts["livereload"] + @reload_reactor.start(opts) + end + + @server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } + @server.mount(opts["baseurl"].to_s, Servlet, destination, file_handler_opts) + + Jekyll.logger.info "Server address:", server_address(@server, opts) + launch_browser @server, opts if opts["open_url"] + boot_or_detach @server, opts end # Recreate NondisclosureName under utf-8 circumstance @@ -227,7 +344,29 @@ def enable_ssl(opts) def start_callback(detached) unless detached proc do - Jekyll.logger.info("Server running...", "press ctrl-c to stop.") + mutex.synchronize do + # Block until EventMachine reactor starts + @reload_reactor.started_event.wait unless @reload_reactor.nil? + @running = true + Jekyll.logger.info("Server running...", "press ctrl-c to stop.") + @run_cond.broadcast + end + end + end + end + + private + def stop_callback(detached) + unless detached + proc do + mutex.synchronize do + unless @reload_reactor.nil? + @reload_reactor.stop + @reload_reactor.stopped_event.wait + end + @running = false + @run_cond.broadcast + end end end end diff --git a/lib/jekyll/commands/serve/live_reload_reactor.rb b/lib/jekyll/commands/serve/live_reload_reactor.rb new file mode 100644 index 00000000000..498e78aeee4 --- /dev/null +++ b/lib/jekyll/commands/serve/live_reload_reactor.rb @@ -0,0 +1,153 @@ +# frozen_string_literal: true + +require "json" +require "em-websocket" + +require_relative "websockets" + +module Jekyll + module Commands + class Serve + class LiveReloadReactor + attr_reader :started_event + attr_reader :stopped_event + attr_reader :thread + + def initialize + @thread = nil + @websockets = [] + @connections_count = 0 + @started_event = Utils::ThreadEvent.new + @stopped_event = Utils::ThreadEvent.new + end + + def stop + # There is only one EventMachine instance per Ruby process so stopping + # it here will stop the reactor thread we have running. + EM.stop if EM.reactor_running? + Jekyll.logger.debug("LiveReload Server:", "halted") + end + + def running? + EM.reactor_running? + end + + def handle_websockets_event(ws) + ws.onopen do |handshake| + connect(ws, handshake) + end + + ws.onclose do + disconnect(ws) + end + + ws.onmessage do |msg| + print_message(msg) + end + + ws.onerror do |error| + log_error(error) + end + end + + # rubocop:disable Metrics/MethodLength + def start(opts) + @thread = Thread.new do + # Use epoll if the kernel supports it + EM.epoll + EM.run do + EM.error_handler do |e| + log_error(e) + end + + EM.start_server( + opts["host"], + opts["livereload_port"], + HttpAwareConnection, + opts + ) do |ws| + handle_websockets_event(ws) + end + + # Notify blocked threads that EventMachine has started or shutdown + EM.schedule do + @started_event.set + end + + EM.add_shutdown_hook do + @stopped_event.set + end + + Jekyll.logger.info( + "LiveReload address:", "#{opts["host"]}:#{opts["livereload_port"]}" + ) + end + end + @thread.abort_on_exception = true + end + + # For a description of the protocol see + # http://feedback.livereload.com/knowledgebase/articles/86174-livereload-protocol + def reload(pages) + pages.each do |p| + msg = { + :command => "reload", + :path => p.url, + :liveCSS => true, + } + + Jekyll.logger.debug("LiveReload:", "Reloading #{p.url}") + Jekyll.logger.debug(JSON.dump(msg)) + @websockets.each do |ws| + ws.send(JSON.dump(msg)) + end + end + end + + private + def connect(ws, handshake) + @connections_count += 1 + if @connections_count == 1 + message = "Browser connected" + message += " over SSL/TLS" if handshake.secure? + Jekyll.logger.info("LiveReload:", message) + end + ws.send( + JSON.dump( + :command => "hello", + :protocols => ["http://livereload.com/protocols/official-7"], + :serverName => "jekyll" + ) + ) + + @websockets << ws + end + + private + def disconnect(ws) + @websockets.delete(ws) + end + + private + def print_message(json_message) + msg = JSON.parse(json_message) + # Not sure what the 'url' command even does in LiveReload. The spec is silent + # on its purpose. + if msg["command"] == "url" + Jekyll.logger.info("LiveReload:", "Browser URL: #{msg["url"]}") + end + end + + private + def log_error(e) + Jekyll.logger.warn( + "LiveReload experienced an error. "\ + "Run with --verbose for more information." + ) + Jekyll.logger.debug("LiveReload Error:", e.message) + Jekyll.logger.debug("LiveReload Error:", e.backtrace.join("\n")) + end + end + end + end +end diff --git a/lib/jekyll/commands/serve/livereload_assets/livereload.js b/lib/jekyll/commands/serve/livereload_assets/livereload.js new file mode 100644 index 00000000000..eee60ec8b1d --- /dev/null +++ b/lib/jekyll/commands/serve/livereload_assets/livereload.js @@ -0,0 +1,1183 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o tag"); + return; + } + } + this.reloader = new Reloader(this.window, this.console, Timer); + this.connector = new Connector(this.options, this.WebSocket, Timer, { + connecting: (function(_this) { + return function() {}; + })(this), + socketConnected: (function(_this) { + return function() {}; + })(this), + connected: (function(_this) { + return function(protocol) { + var _base; + if (typeof (_base = _this.listeners).connect === "function") { + _base.connect(); + } + _this.log("LiveReload is connected to " + _this.options.host + ":" + _this.options.port + " (protocol v" + protocol + ")."); + return _this.analyze(); + }; + })(this), + error: (function(_this) { + return function(e) { + if (e instanceof ProtocolError) { + if (typeof console !== "undefined" && console !== null) { + return console.log("" + e.message + "."); + } + } else { + if (typeof console !== "undefined" && console !== null) { + return console.log("LiveReload internal error: " + e.message); + } + } + }; + })(this), + disconnected: (function(_this) { + return function(reason, nextDelay) { + var _base; + if (typeof (_base = _this.listeners).disconnect === "function") { + _base.disconnect(); + } + switch (reason) { + case 'cannot-connect': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + ", will retry in " + nextDelay + " sec."); + case 'broken': + return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + ", reconnecting in " + nextDelay + " sec."); + case 'handshake-timeout': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake timeout), will retry in " + nextDelay + " sec."); + case 'handshake-failed': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake failed), will retry in " + nextDelay + " sec."); + case 'manual': + break; + case 'error': + break; + default: + return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + " (" + reason + "), reconnecting in " + nextDelay + " sec."); + } + }; + })(this), + message: (function(_this) { + return function(message) { + switch (message.command) { + case 'reload': + return _this.performReload(message); + case 'alert': + return _this.performAlert(message); + } + }; + })(this) + }); + this.initialized = true; + } + + LiveReload.prototype.on = function(eventName, handler) { + return this.listeners[eventName] = handler; + }; + + LiveReload.prototype.log = function(message) { + return this.console.log("" + message); + }; + + LiveReload.prototype.performReload = function(message) { + var _ref, _ref1; + this.log("LiveReload received reload request: " + (JSON.stringify(message, null, 2))); + return this.reloader.reload(message.path, { + liveCSS: (_ref = message.liveCSS) != null ? _ref : true, + liveImg: (_ref1 = message.liveImg) != null ? _ref1 : true, + originalPath: message.originalPath || '', + overrideURL: message.overrideURL || '', + serverURL: "http://" + this.options.host + ":" + this.options.port + }); + }; + + LiveReload.prototype.performAlert = function(message) { + return alert(message.message); + }; + + LiveReload.prototype.shutDown = function() { + var _base; + if (!this.initialized) { + return; + } + this.connector.disconnect(); + this.log("LiveReload disconnected."); + return typeof (_base = this.listeners).shutdown === "function" ? _base.shutdown() : void 0; + }; + + LiveReload.prototype.hasPlugin = function(identifier) { + return !!this.pluginIdentifiers[identifier]; + }; + + LiveReload.prototype.addPlugin = function(pluginClass) { + var plugin; + if (!this.initialized) { + return; + } + if (this.hasPlugin(pluginClass.identifier)) { + return; + } + this.pluginIdentifiers[pluginClass.identifier] = true; + plugin = new pluginClass(this.window, { + _livereload: this, + _reloader: this.reloader, + _connector: this.connector, + console: this.console, + Timer: Timer, + generateCacheBustUrl: (function(_this) { + return function(url) { + return _this.reloader.generateCacheBustUrl(url); + }; + })(this) + }); + this.plugins.push(plugin); + this.reloader.addPlugin(plugin); + }; + + LiveReload.prototype.analyze = function() { + var plugin, pluginData, pluginsData, _i, _len, _ref; + if (!this.initialized) { + return; + } + if (!(this.connector.protocol >= 7)) { + return; + } + pluginsData = {}; + _ref = this.plugins; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i]; + pluginsData[plugin.constructor.identifier] = pluginData = (typeof plugin.analyze === "function" ? plugin.analyze() : void 0) || {}; + pluginData.version = plugin.constructor.version; + } + this.connector.sendCommand({ + command: 'info', + plugins: pluginsData, + url: this.window.location.href + }); + }; + + return LiveReload; + + })(); + +}).call(this); + +},{"./connector":1,"./options":5,"./reloader":7,"./timer":9}],5:[function(require,module,exports){ +(function() { + var Options; + + exports.Options = Options = (function() { + function Options() { + this.https = false; + this.host = null; + this.port = 35729; + this.snipver = null; + this.ext = null; + this.extver = null; + this.mindelay = 1000; + this.maxdelay = 60000; + this.handshake_timeout = 5000; + } + + Options.prototype.set = function(name, value) { + if (typeof value === 'undefined') { + return; + } + if (!isNaN(+value)) { + value = +value; + } + return this[name] = value; + }; + + return Options; + + })(); + + Options.extract = function(document) { + var element, keyAndValue, m, mm, options, pair, src, _i, _j, _len, _len1, _ref, _ref1; + _ref = document.getElementsByTagName('script'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + if ((src = element.src) && (m = src.match(/^[^:]+:\/\/(.*)\/z?livereload\.js(?:\?(.*))?$/))) { + options = new Options(); + options.https = src.indexOf("https") === 0; + if (mm = m[1].match(/^([^\/:]+)(?::(\d+))?$/)) { + options.host = mm[1]; + if (mm[2]) { + options.port = parseInt(mm[2], 10); + } + } + if (m[2]) { + _ref1 = m[2].split('&'); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + pair = _ref1[_j]; + if ((keyAndValue = pair.split('=')).length > 1) { + options.set(keyAndValue[0].replace(/-/g, '_'), keyAndValue.slice(1).join('=')); + } + } + } + return options; + } + } + return null; + }; + +}).call(this); + +},{}],6:[function(require,module,exports){ +(function() { + var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6'; + + exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7'; + + exports.ProtocolError = ProtocolError = (function() { + function ProtocolError(reason, data) { + this.message = "LiveReload protocol error (" + reason + ") after receiving data: \"" + data + "\"."; + } + + return ProtocolError; + + })(); + + exports.Parser = Parser = (function() { + function Parser(handlers) { + this.handlers = handlers; + this.reset(); + } + + Parser.prototype.reset = function() { + return this.protocol = null; + }; + + Parser.prototype.process = function(data) { + var command, e, message, options, _ref; + try { + if (this.protocol == null) { + if (data.match(/^!!ver:([\d.]+)$/)) { + this.protocol = 6; + } else if (message = this._parseMessage(data, ['hello'])) { + if (!message.protocols.length) { + throw new ProtocolError("no protocols specified in handshake message"); + } else if (__indexOf.call(message.protocols, PROTOCOL_7) >= 0) { + this.protocol = 7; + } else if (__indexOf.call(message.protocols, PROTOCOL_6) >= 0) { + this.protocol = 6; + } else { + throw new ProtocolError("no supported protocols found"); + } + } + return this.handlers.connected(this.protocol); + } else if (this.protocol === 6) { + message = JSON.parse(data); + if (!message.length) { + throw new ProtocolError("protocol 6 messages must be arrays"); + } + command = message[0], options = message[1]; + if (command !== 'refresh') { + throw new ProtocolError("unknown protocol 6 command"); + } + return this.handlers.message({ + command: 'reload', + path: options.path, + liveCSS: (_ref = options.apply_css_live) != null ? _ref : true + }); + } else { + message = this._parseMessage(data, ['reload', 'alert']); + return this.handlers.message(message); + } + } catch (_error) { + e = _error; + if (e instanceof ProtocolError) { + return this.handlers.error(e); + } else { + throw e; + } + } + }; + + Parser.prototype._parseMessage = function(data, validCommands) { + var e, message, _ref; + try { + message = JSON.parse(data); + } catch (_error) { + e = _error; + throw new ProtocolError('unparsable JSON', data); + } + if (!message.command) { + throw new ProtocolError('missing "command" key', data); + } + if (_ref = message.command, __indexOf.call(validCommands, _ref) < 0) { + throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ")", data); + } + return message; + }; + + return Parser; + + })(); + +}).call(this); + +},{}],7:[function(require,module,exports){ +(function() { + var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl; + + splitUrl = function(url) { + var hash, index, params; + if ((index = url.indexOf('#')) >= 0) { + hash = url.slice(index); + url = url.slice(0, index); + } else { + hash = ''; + } + if ((index = url.indexOf('?')) >= 0) { + params = url.slice(index); + url = url.slice(0, index); + } else { + params = ''; + } + return { + url: url, + params: params, + hash: hash + }; + }; + + pathFromUrl = function(url) { + var path; + url = splitUrl(url).url; + if (url.indexOf('file://') === 0) { + path = url.replace(/^file:\/\/(localhost)?/, ''); + } else { + path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/'); + } + return decodeURIComponent(path); + }; + + pickBestMatch = function(path, objects, pathFunc) { + var bestMatch, object, score, _i, _len; + bestMatch = { + score: 0 + }; + for (_i = 0, _len = objects.length; _i < _len; _i++) { + object = objects[_i]; + score = numberOfMatchingSegments(path, pathFunc(object)); + if (score > bestMatch.score) { + bestMatch = { + object: object, + score: score + }; + } + } + if (bestMatch.score > 0) { + return bestMatch; + } else { + return null; + } + }; + + numberOfMatchingSegments = function(path1, path2) { + var comps1, comps2, eqCount, len; + path1 = path1.replace(/^\/+/, '').toLowerCase(); + path2 = path2.replace(/^\/+/, '').toLowerCase(); + if (path1 === path2) { + return 10000; + } + comps1 = path1.split('/').reverse(); + comps2 = path2.split('/').reverse(); + len = Math.min(comps1.length, comps2.length); + eqCount = 0; + while (eqCount < len && comps1[eqCount] === comps2[eqCount]) { + ++eqCount; + } + return eqCount; + }; + + pathsMatch = function(path1, path2) { + return numberOfMatchingSegments(path1, path2) > 0; + }; + + IMAGE_STYLES = [ + { + selector: 'background', + styleNames: ['backgroundImage'] + }, { + selector: 'border', + styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage'] + } + ]; + + exports.Reloader = Reloader = (function() { + function Reloader(window, console, Timer) { + this.window = window; + this.console = console; + this.Timer = Timer; + this.document = this.window.document; + this.importCacheWaitPeriod = 200; + this.plugins = []; + } + + Reloader.prototype.addPlugin = function(plugin) { + return this.plugins.push(plugin); + }; + + Reloader.prototype.analyze = function(callback) { + return results; + }; + + Reloader.prototype.reload = function(path, options) { + var plugin, _base, _i, _len, _ref; + this.options = options; + if ((_base = this.options).stylesheetReloadTimeout == null) { + _base.stylesheetReloadTimeout = 15000; + } + _ref = this.plugins; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i]; + if (plugin.reload && plugin.reload(path, options)) { + return; + } + } + if (options.liveCSS) { + if (path.match(/\.css$/i)) { + if (this.reloadStylesheet(path)) { + return; + } + } + } + if (options.liveImg) { + if (path.match(/\.(jpe?g|png|gif)$/i)) { + this.reloadImages(path); + return; + } + } + return this.reloadPage(); + }; + + Reloader.prototype.reloadPage = function() { + return this.window.document.location.reload(); + }; + + Reloader.prototype.reloadImages = function(path) { + var expando, img, selector, styleNames, styleSheet, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _results; + expando = this.generateUniqueString(); + _ref = this.document.images; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + img = _ref[_i]; + if (pathsMatch(path, pathFromUrl(img.src))) { + img.src = this.generateCacheBustUrl(img.src, expando); + } + } + if (this.document.querySelectorAll) { + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + _ref1 = IMAGE_STYLES[_j], selector = _ref1.selector, styleNames = _ref1.styleNames; + _ref2 = this.document.querySelectorAll("[style*=" + selector + "]"); + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + img = _ref2[_k]; + this.reloadStyleImages(img.style, styleNames, path, expando); + } + } + } + if (this.document.styleSheets) { + _ref3 = this.document.styleSheets; + _results = []; + for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { + styleSheet = _ref3[_l]; + _results.push(this.reloadStylesheetImages(styleSheet, path, expando)); + } + return _results; + } + }; + + Reloader.prototype.reloadStylesheetImages = function(styleSheet, path, expando) { + var e, rule, rules, styleNames, _i, _j, _len, _len1; + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0; + } catch (_error) { + e = _error; + } + if (!rules) { + return; + } + for (_i = 0, _len = rules.length; _i < _len; _i++) { + rule = rules[_i]; + switch (rule.type) { + case CSSRule.IMPORT_RULE: + this.reloadStylesheetImages(rule.styleSheet, path, expando); + break; + case CSSRule.STYLE_RULE: + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + styleNames = IMAGE_STYLES[_j].styleNames; + this.reloadStyleImages(rule.style, styleNames, path, expando); + } + break; + case CSSRule.MEDIA_RULE: + this.reloadStylesheetImages(rule, path, expando); + } + } + }; + + Reloader.prototype.reloadStyleImages = function(style, styleNames, path, expando) { + var newValue, styleName, value, _i, _len; + for (_i = 0, _len = styleNames.length; _i < _len; _i++) { + styleName = styleNames[_i]; + value = style[styleName]; + if (typeof value === 'string') { + newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function(_this) { + return function(match, src) { + if (pathsMatch(path, pathFromUrl(src))) { + return "url(" + (_this.generateCacheBustUrl(src, expando)) + ")"; + } else { + return match; + } + }; + })(this)); + if (newValue !== value) { + style[styleName] = newValue; + } + } + } + }; + + Reloader.prototype.reloadStylesheet = function(path) { + var imported, link, links, match, style, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1; + links = (function() { + var _i, _len, _ref, _results; + _ref = this.document.getElementsByTagName('link'); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + link = _ref[_i]; + if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) { + _results.push(link); + } + } + return _results; + }).call(this); + imported = []; + _ref = this.document.getElementsByTagName('style'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + style = _ref[_i]; + if (style.sheet) { + this.collectImportedStylesheets(style, style.sheet, imported); + } + } + for (_j = 0, _len1 = links.length; _j < _len1; _j++) { + link = links[_j]; + this.collectImportedStylesheets(link, link.sheet, imported); + } + if (this.window.StyleFix && this.document.querySelectorAll) { + _ref1 = this.document.querySelectorAll('style[data-href]'); + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + style = _ref1[_k]; + links.push(style); + } + } + this.console.log("LiveReload found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets"); + match = pickBestMatch(path, links.concat(imported), (function(_this) { + return function(l) { + return pathFromUrl(_this.linkHref(l)); + }; + })(this)); + if (match) { + if (match.object.rule) { + this.console.log("LiveReload is reloading imported stylesheet: " + match.object.href); + this.reattachImportedRule(match.object); + } else { + this.console.log("LiveReload is reloading stylesheet: " + (this.linkHref(match.object))); + this.reattachStylesheetLink(match.object); + } + } else { + this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one"); + for (_l = 0, _len3 = links.length; _l < _len3; _l++) { + link = links[_l]; + this.reattachStylesheetLink(link); + } + } + return true; + }; + + Reloader.prototype.collectImportedStylesheets = function(link, styleSheet, result) { + var e, index, rule, rules, _i, _len; + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0; + } catch (_error) { + e = _error; + } + if (rules && rules.length) { + for (index = _i = 0, _len = rules.length; _i < _len; index = ++_i) { + rule = rules[index]; + switch (rule.type) { + case CSSRule.CHARSET_RULE: + continue; + case CSSRule.IMPORT_RULE: + result.push({ + link: link, + rule: rule, + index: index, + href: rule.href + }); + this.collectImportedStylesheets(link, rule.styleSheet, result); + break; + default: + break; + } + } + } + }; + + Reloader.prototype.waitUntilCssLoads = function(clone, func) { + var callbackExecuted, executeCallback, poll; + callbackExecuted = false; + executeCallback = (function(_this) { + return function() { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + return func(); + }; + })(this); + clone.onload = (function(_this) { + return function() { + _this.console.log("LiveReload: the new stylesheet has finished loading"); + _this.knownToSupportCssOnLoad = true; + return executeCallback(); + }; + })(this); + if (!this.knownToSupportCssOnLoad) { + (poll = (function(_this) { + return function() { + if (clone.sheet) { + _this.console.log("LiveReload is polling until the new CSS finishes loading..."); + return executeCallback(); + } else { + return _this.Timer.start(50, poll); + } + }; + })(this))(); + } + return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback); + }; + + Reloader.prototype.linkHref = function(link) { + return link.href || link.getAttribute('data-href'); + }; + + Reloader.prototype.reattachStylesheetLink = function(link) { + var clone, parent; + if (link.__LiveReload_pendingRemoval) { + return; + } + link.__LiveReload_pendingRemoval = true; + if (link.tagName === 'STYLE') { + clone = this.document.createElement('link'); + clone.rel = 'stylesheet'; + clone.media = link.media; + clone.disabled = link.disabled; + } else { + clone = link.cloneNode(false); + } + clone.href = this.generateCacheBustUrl(this.linkHref(link)); + parent = link.parentNode; + if (parent.lastChild === link) { + parent.appendChild(clone); + } else { + parent.insertBefore(clone, link.nextSibling); + } + return this.waitUntilCssLoads(clone, (function(_this) { + return function() { + var additionalWaitingTime; + if (/AppleWebKit/.test(navigator.userAgent)) { + additionalWaitingTime = 5; + } else { + additionalWaitingTime = 200; + } + return _this.Timer.start(additionalWaitingTime, function() { + var _ref; + if (!link.parentNode) { + return; + } + link.parentNode.removeChild(link); + clone.onreadystatechange = null; + return (_ref = _this.window.StyleFix) != null ? _ref.link(clone) : void 0; + }); + }; + })(this)); + }; + + Reloader.prototype.reattachImportedRule = function(_arg) { + var href, index, link, media, newRule, parent, rule, tempLink; + rule = _arg.rule, index = _arg.index, link = _arg.link; + parent = rule.parentStyleSheet; + href = this.generateCacheBustUrl(rule.href); + media = rule.media.length ? [].join.call(rule.media, ', ') : ''; + newRule = "@import url(\"" + href + "\") " + media + ";"; + rule.__LiveReload_newHref = href; + tempLink = this.document.createElement("link"); + tempLink.rel = 'stylesheet'; + tempLink.href = href; + tempLink.__LiveReload_pendingRemoval = true; + if (link.parentNode) { + link.parentNode.insertBefore(tempLink, link); + } + return this.Timer.start(this.importCacheWaitPeriod, (function(_this) { + return function() { + if (tempLink.parentNode) { + tempLink.parentNode.removeChild(tempLink); + } + if (rule.__LiveReload_newHref !== href) { + return; + } + parent.insertRule(newRule, index); + parent.deleteRule(index + 1); + rule = parent.cssRules[index]; + rule.__LiveReload_newHref = href; + return _this.Timer.start(_this.importCacheWaitPeriod, function() { + if (rule.__LiveReload_newHref !== href) { + return; + } + parent.insertRule(newRule, index); + return parent.deleteRule(index + 1); + }); + }; + })(this)); + }; + + Reloader.prototype.generateUniqueString = function() { + return 'livereload=' + Date.now(); + }; + + Reloader.prototype.generateCacheBustUrl = function(url, expando) { + var hash, oldParams, originalUrl, params, _ref; + if (expando == null) { + expando = this.generateUniqueString(); + } + _ref = splitUrl(url), url = _ref.url, hash = _ref.hash, oldParams = _ref.params; + if (this.options.overrideURL) { + if (url.indexOf(this.options.serverURL) < 0) { + originalUrl = url; + url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url); + this.console.log("LiveReload is overriding source URL " + originalUrl + " with " + url); + } + } + params = oldParams.replace(/(\?|&)livereload=(\d+)/, function(match, sep) { + return "" + sep + expando; + }); + if (params === oldParams) { + if (oldParams.length === 0) { + params = "?" + expando; + } else { + params = "" + oldParams + "&" + expando; + } + } + return url + params + hash; + }; + + return Reloader; + + })(); + +}).call(this); + +},{}],8:[function(require,module,exports){ +(function() { + var CustomEvents, LiveReload, k; + + CustomEvents = require('./customevents'); + + LiveReload = window.LiveReload = new (require('./livereload').LiveReload)(window); + + for (k in window) { + if (k.match(/^LiveReloadPlugin/)) { + LiveReload.addPlugin(window[k]); + } + } + + LiveReload.addPlugin(require('./less')); + + LiveReload.on('shutdown', function() { + return delete window.LiveReload; + }); + + LiveReload.on('connect', function() { + return CustomEvents.fire(document, 'LiveReloadConnect'); + }); + + LiveReload.on('disconnect', function() { + return CustomEvents.fire(document, 'LiveReloadDisconnect'); + }); + + CustomEvents.bind(document, 'LiveReloadShutDown', function() { + return LiveReload.shutDown(); + }); + +}).call(this); + +},{"./customevents":2,"./less":3,"./livereload":4}],9:[function(require,module,exports){ +(function() { + var Timer; + + exports.Timer = Timer = (function() { + function Timer(func) { + this.func = func; + this.running = false; + this.id = null; + this._handler = (function(_this) { + return function() { + _this.running = false; + _this.id = null; + return _this.func(); + }; + })(this); + } + + Timer.prototype.start = function(timeout) { + if (this.running) { + clearTimeout(this.id); + } + this.id = setTimeout(this._handler, timeout); + return this.running = true; + }; + + Timer.prototype.stop = function() { + if (this.running) { + clearTimeout(this.id); + this.running = false; + return this.id = null; + } + }; + + return Timer; + + })(); + + Timer.start = function(timeout, func) { + return setTimeout(func, timeout); + }; + +}).call(this); + +},{}]},{},[8]); diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 70b6d66df34..640720ee7d8 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -5,6 +5,128 @@ module Jekyll module Commands class Serve + # This class is used to determine if the Servlet should modify a served file + # to insert the LiveReload script tags + class SkipAnalyzer + BAD_USER_AGENTS = [%r!MSIE!].freeze + + def self.skip_processing?(request, response, options) + new(request, response, options).skip_processing? + end + + def initialize(request, response, options) + @options = options + @request = request + @response = response + end + + def skip_processing? + !html? || chunked? || inline? || bad_browser? + end + + def chunked? + @response["Transfer-Encoding"] == "chunked" + end + + def inline? + @response["Content-Disposition"] =~ %r!^inline! + end + + def bad_browser? + BAD_USER_AGENTS.any? { |pattern| @request["User-Agent"] =~ pattern } + end + + def html? + @response["Content-Type"] =~ %r!text/html! + end + end + + # This class inserts the LiveReload script tags into HTML as it is served + class BodyProcessor + HEAD_TAG_REGEX = %r!|! + + attr_reader :content_length, :new_body, :livereload_added + + def initialize(body, options) + @body = body + @options = options + @processed = false + end + + def processed? + @processed + end + + # rubocop:disable Metrics/MethodLength + def process! + @new_body = [] + # @body will usually be a File object but Strings occur in rare cases + if @body.respond_to?(:each) + begin + @body.each { |line| @new_body << line.to_s } + ensure + @body.close + end + else + @new_body = @body.lines + end + + @content_length = 0 + @livereload_added = false + + @new_body.each do |line| + if !@livereload_added && line[" + document.write( + ' + TEMPLATE + ERB.new(Jekyll::Utils.strip_heredoc(template)) + end + + def livereload_args + # XHTML standard requires ampersands to be encoded as entities when in + # attributes. See http://stackoverflow.com/a/2190292 + src = "" + if @options["livereload_min_delay"] + src += "&mindelay=#{@options["livereload_min_delay"]}" + end + if @options["livereload_max_delay"] + src += "&maxdelay=#{@options["livereload_max_delay"]}" + end + if @options["livereload_port"] + src += "&port=#{@options["livereload_port"]}" + end + src + end + end + class Servlet < WEBrick::HTTPServlet::FileHandler DEFAULTS = { "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ @@ -34,6 +156,21 @@ def search_file(req, res, basename) # rubocop:disable Naming/MethodName def do_GET(req, res) rtn = super + + if @jekyll_opts["livereload"] + return rtn if SkipAnalyzer.skip_processing?(req, res, @jekyll_opts) + + processor = BodyProcessor.new(res.body, @jekyll_opts) + processor.process! + res.body = processor.new_body + res.content_length = processor.content_length.to_s + + if processor.livereload_added + # Add a header to indicate that the page content has been modified + res["X-Rack-LiveReload"] = "1" + end + end + validate_and_ensure_charset(req, res) res.header.merge!(@headers) rtn diff --git a/lib/jekyll/commands/serve/websockets.rb b/lib/jekyll/commands/serve/websockets.rb new file mode 100644 index 00000000000..1e5f948e2be --- /dev/null +++ b/lib/jekyll/commands/serve/websockets.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require "http/parser" + +module Jekyll + module Commands + class Serve + # The LiveReload protocol requires the server to serve livereload.js over HTTP + # despite the fact that the protocol itself uses WebSockets. This custom connection + # class addresses the dual protocols that the server needs to understand. + class HttpAwareConnection < EventMachine::WebSocket::Connection + attr_reader :reload_body, :reload_size + + def initialize(_opts) + # If EventMachine SSL support on Windows ever gets better, the code below will + # set up the reactor to handle SSL + # + # @ssl_enabled = opts["ssl_cert"] && opts["ssl_key"] + # if @ssl_enabled + # em_opts[:tls_options] = { + # :private_key_file => Jekyll.sanitized_path(opts["source"], opts["ssl_key"]), + # :cert_chain_file => Jekyll.sanitized_path(opts["source"], opts["ssl_cert"]) + # } + # em_opts[:secure] = true + # end + + # This is too noisy even for --verbose, but uncomment if you need it for + # a specific WebSockets issue. Adding ?LR-verbose=true onto the URL will + # enable logging on the client side. + # em_opts[:debug] = true + + em_opts = {} + super(em_opts) + + reload_file = File.join(Serve.singleton_class::LIVERELOAD_DIR, "livereload.js") + + @reload_body = File.read(reload_file) + @reload_size = @reload_body.bytesize + end + + # rubocop:disable Metrics/MethodLength + def dispatch(data) + parser = Http::Parser.new + parser << data + + # WebSockets requests will have a Connection: Upgrade header + if parser.http_method != "GET" || parser.upgrade? + super + elsif parser.request_url =~ %r!^\/livereload.js! + headers = [ + "HTTP/1.1 200 OK", + "Content-Type: application/javascript", + "Content-Length: #{reload_size}", + "", + "", + ].join("\r\n") + send_data(headers) + + # stream_file_data would free us from keeping livereload.js in memory + # but JRuby blocks on that call and never returns + send_data(reload_body) + close_connection_after_writing + else + body = "This port only serves livereload.js over HTTP.\n" + headers = [ + "HTTP/1.1 400 Bad Request", + "Content-Type: text/plain", + "Content-Length: #{body.bytesize}", + "", + "", + ].join("\r\n") + send_data(headers) + send_data(body) + close_connection_after_writing + end + end + end + end + end +end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 55cf9be1e28..1d3cb9c4a72 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -8,6 +8,7 @@ module Utils autoload :Internet, "jekyll/utils/internet" autoload :Platforms, "jekyll/utils/platforms" autoload :Rouge, "jekyll/utils/rouge" + autoload :ThreadEvent, "jekyll/utils/thread_event" autoload :WinTZ, "jekyll/utils/win_tz" # Constants for use in #slugify diff --git a/lib/jekyll/utils/thread_event.rb b/lib/jekyll/utils/thread_event.rb new file mode 100644 index 00000000000..5afb50d93eb --- /dev/null +++ b/lib/jekyll/utils/thread_event.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require "thread" + +module Jekyll + module Utils + # Based on the pattern and code from + # https://emptysqua.re/blog/an-event-synchronization-primitive-for-ruby/ + class ThreadEvent + attr_reader :flag + + def initialize + @lock = Mutex.new + @cond = ConditionVariable.new + @flag = false + end + + def set + @lock.synchronize do + yield if block_given? + @flag = true + @cond.broadcast + end + end + + def wait + @lock.synchronize do + unless @flag + @cond.wait(@lock) + end + end + end + end + end +end diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 135e83e2dba..fd1751d8d40 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -3,7 +3,10 @@ require "webrick" require "mercenary" require "helper" +require "httpclient" require "openssl" +require "thread" +require "tmpdir" class TestCommandsServe < JekyllUnitTest def custom_opts(what) @@ -12,6 +15,128 @@ def custom_opts(what) ) end + def start_server(opts) + @thread = Thread.new do + merc = nil + cmd = Jekyll::Commands::Serve + Mercenary.program(:jekyll) do |p| + merc = cmd.init_with_program(p) + end + merc.execute(:serve, opts) + end + @thread.abort_on_exception = true + + Jekyll::Commands::Serve.mutex.synchronize do + unless Jekyll::Commands::Serve.running? + Jekyll::Commands::Serve.run_cond.wait(Jekyll::Commands::Serve.mutex) + end + end + end + + def serve(opts) + allow(Jekyll).to receive(:configuration).and_return(opts) + allow(Jekyll::Commands::Build).to receive(:process) + + start_server(opts) + + opts + end + + context "using LiveReload" do + setup do + @temp_dir = Dir.mktmpdir("jekyll_livereload_test") + @destination = File.join(@temp_dir, "_site") + Dir.mkdir(@destination) || flunk("Could not make directory #{@destination}") + @client = HTTPClient.new + @client.connect_timeout = 5 + @standard_options = { + "port" => 4000, + "host" => "localhost", + "baseurl" => "", + "detach" => false, + "livereload" => true, + "source" => @temp_dir, + "destination" => @destination, + } + + site = instance_double(Jekyll::Site) + simple_page = <<-HTML.gsub(%r!^\s*!, "") + + + + + Hello World + + +

    Hello! I am a simple web page.

    + + + HTML + + File.open(File.join(@destination, "hello.html"), "w") do |f| + f.write(simple_page) + end + allow(Jekyll::Site).to receive(:new).and_return(site) + end + + teardown do + capture_io do + Jekyll::Commands::Serve.shutdown + end + + Jekyll::Commands::Serve.mutex.synchronize do + if Jekyll::Commands::Serve.running? + Jekyll::Commands::Serve.run_cond.wait(Jekyll::Commands::Serve.mutex) + end + end + + FileUtils.remove_entry_secure(@temp_dir, true) + end + + should "serve livereload.js over HTTP on the default LiveReload port" do + skip_if_windows "EventMachine support on Windows is limited" + opts = serve(@standard_options) + content = @client.get_content( + "http://#{opts["host"]}:#{opts["livereload_port"]}/livereload.js" + ) + assert_match(%r!LiveReload.on!, content) + end + + should "serve nothing else over HTTP on the default LiveReload port" do + skip_if_windows "EventMachine support on Windows is limited" + opts = serve(@standard_options) + res = @client.get("http://#{opts["host"]}:#{opts["livereload_port"]}/") + assert_equal(400, res.status_code) + assert_match(%r!only serves livereload.js!, res.content) + end + + should "insert the LiveReload script tags" do + skip_if_windows "EventMachine support on Windows is limited" + opts = serve(@standard_options) + content = @client.get_content( + "http://#{opts["host"]}:#{opts["port"]}/#{opts["baseurl"]}/hello.html" + ) + assert_match( + %r!livereload.js\?snipver=1&port=#{opts["livereload_port"]}!, + content + ) + assert_match(%r!I am a simple web page!, content) + end + + should "apply the max and min delay options" do + skip_if_windows "EventMachine support on Windows is limited" + opts = serve(@standard_options.merge( + "livereload_max_delay" => "1066", + "livereload_min_delay" => "3" + )) + content = @client.get_content( + "http://#{opts["host"]}:#{opts["port"]}/#{opts["baseurl"]}/hello.html" + ) + assert_match(%r!&mindelay=3!, content) + assert_match(%r!&maxdelay=1066!, content) + end + end + context "with a program" do setup do @merc = nil From 3efb1ad85794bdd4e58ac5f2774b83ea34ada18e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 6 Dec 2017 16:33:53 -0500 Subject: [PATCH 2607/4996] Update history to reflect merge of #5142 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 54bd43db93d..9e67e778a8b 100644 --- a/History.markdown +++ b/History.markdown @@ -75,6 +75,7 @@ * Log Kramdown warnings if log level is WARN (#6522) * Add json extension to list of directory indices (#6550) * Dependency: Bump jekyll-watch to 2.0 (#6589) + * Add LiveReload functionality to Jekyll. (#5142) ### Site Enhancements From fcb1b410e3e93f180312b7a14aa5d1e0f2591c1e Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 7 Dec 2017 23:44:15 +0530 Subject: [PATCH 2608/4996] rename log_warnings to show_warnings --- docs/_docs/configuration.md | 2 +- lib/jekyll/configuration.rb | 2 +- lib/jekyll/converters/markdown/kramdown_parser.rb | 5 +++-- lib/jekyll/converters/smartypants.rb | 5 +++-- test/test_kramdown.rb | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index d5d6ebd7928..77b749815ee 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -688,7 +688,7 @@ kramdown: input: GFM hard_wrap: false footnote_nr: 1 - log_warnings: false + show_warnings: false ``` ## Liquid Options diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 3258ffab3eb..423ab65857d 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -80,7 +80,7 @@ class Configuration < Hash "input" => "GFM", "hard_wrap" => false, "footnote_nr" => 1, - "log_warnings" => false, + "show_warnings" => false, }, }.map { |k, v| [k, v.freeze] }].freeze diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index b1015dcc61d..bb03eaaab04 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -38,12 +38,13 @@ def setup def convert(content) document = Kramdown::Document.new(content, @config) - if @config["log_warnings"] + html_output = document.to_html + if @config["show_warnings"] document.warnings.each do |warning| Jekyll.logger.warn "Kramdown warning:", warning end end - document.to_html + html_output end private diff --git a/lib/jekyll/converters/smartypants.rb b/lib/jekyll/converters/smartypants.rb index 4882c0e4ffc..40c0aecd01d 100644 --- a/lib/jekyll/converters/smartypants.rb +++ b/lib/jekyll/converters/smartypants.rb @@ -30,12 +30,13 @@ def output_ext(_) def convert(content) document = Kramdown::Document.new(content, @config) - if @config["log_warnings"] + html_output = document.to_html.chomp + if @config["show_warnings"] document.warnings.each do |warning| Jekyll.logger.warn "Kramdown warning:", warning.sub(%r!^Warning:\s+!, "") end end - document.to_html.chomp + html_output end end end diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index d40a27e2538..f68bb17ce78 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -13,7 +13,7 @@ class TestKramdown < JekyllUnitTest "toc_levels" => "1..6", "auto_ids" => false, "footnote_nr" => 1, - "log_warnings" => true, + "show_warnings" => true, "syntax_highlighter" => "rouge", "syntax_highlighter_opts" => { From 2774a1aeb6048094e718ed7addf929f49742b875 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 13 Nov 2017 17:41:15 +0100 Subject: [PATCH 2609/4996] Fix Kramdown warnings --- History.markdown | 91 +++++++++---------- .../2013-07-24-jekyll-1-1-1-released.markdown | 31 +++---- 2 files changed, 57 insertions(+), 65 deletions(-) diff --git a/History.markdown b/History.markdown index 9ed4fdc835d..023bb41825c 100644 --- a/History.markdown +++ b/History.markdown @@ -2,50 +2,50 @@ ### Documentation - * Docs: GitHub Pages instructions (#6384) + * Add formester to the list of saas form backend (#6059) + * GitHub Pages instructions (#6384) * Improve documentation for theme-gem installation (#6387) * Fix diff syntax-highlighting (#6388) + * Update instructions (#6396) * Fix code-block highlighting in docs (#6398) - * Docs: Filtering Posts with categories, tags, or other variables (#6399) + * Filtering Posts with categories, tags, or other variables (#6399) * Fixes formatting on pre-formatted text. (#6405) - * Docs: updates (#6407) - * Docs: Fix `collections_dir` example (#6408) - * Docs: Renaming duplicate of "Scenario 6" to "Scenario 7" (#6411) - * Docs: Mark `collection_dir` as unreleased (#6412) - * Docs: Fix link to SUPPORT (#6415) - * Docs: Added new tutorial to tutorials section on docs (#6406) + * Added new tutorial to tutorials section on docs (#6406) + * Updates (#6407) + * Fix `collections_dir` example (#6408) + * Renaming duplicate of "Scenario 6" to "Scenario 7" (#6411) + * Mark `collection_dir` as unreleased (#6412) + * Fix link to SUPPORT (#6415) * Fix list appearance by adding missing `ol` tag (#6421) * Explain how to override output collection index page (#6424) * Added github-cards to the list of plugins (#6425) - * add post about diversity (#6447) - * Docs: Add a note about Liquid and syntax highlighting (#6466) + * CoC violation correspondants (#6429) + * Add a note about Liquid and syntax highlighting (#6466) + * Remove `sudo` from macOS troubleshooting instructions (#6486) * Add a note on `:jekyll_plugins` group in the docs (#6488) * Updated custom-404-page.md (#6489) - * Remove `sudo` from macOS troubleshooting instructions (#6486) - * add formester to the list of saas form backend (#6059) * Fix a few minor issues in the docs (#6494) + * Add jekyll-pwa-plugin (#6533) * Remove Jekyll-Smartify from plugins directory (#6548) ### Development Fixes + * Added direct collection access to future collection item feature test (#6151) + * add failing test for non-utf8 encoding (#6339) * Upgrade to Cucumber 3.0 (#6395) * Provide a better default hash for tracking liquid stats (#6417) - * Docs: CoC violation correspondants (#6429) - * add failing test for non-utf8 encoding (#6339) * Add configuration for first-timers bot (#6431) - * Update first-timers-issue-template.md (#6472) - * Site: Rename method (#6474) * Do not linkify escaped characters as PRs in History (#6468) * Rely on jekyll-mentions for linking usernames (#6469) + * Update first-timers-issue-template.md (#6472) * Enable `Lint/RescueWithoutErrorClass` Cop (#6482) - * Added direct collection access to future collection item feature test (#6151) * Clean up Rubocop config (#6495) - * Fix #6498: Use Gem to discover the location of bundler. (#6499) + * Use Gem to discover the location of bundler (#6499) * Remove unnecessary encoding comment (#6513) * Suggest using Rubocop to automatically fix errors (#6514) * Assert raising Psych::SyntaxError when `"strict_front_matter"=>true` (#6520) - * [RuboCop] Enable `Style/UnneededCapitalW` cop (#6526) * Use Kernel#Array instead of explicit Array check (#6525) + * RuboCop: Enable `Style/UnneededCapitalW` cop (#6526) * Refactor method to reduce ABC Metric size (#6529) * Remove parentheses around arguments to raise (#6532) * Use double-quotes around gem name (#6535) @@ -54,30 +54,29 @@ ### Minor Enhancements + * Add Utils::Internet.connected? to determine whether host machine has internet connection. (#5870) * Disable default layouts for Pages with a `layout: none` declaration (#6182) - * Upgrade to Rouge 3 (#6381) - * Allow the user to set collections_dir to put all collections under one subdirectory (#6331) * Scope path glob (#6268) + * Allow the user to set collections_dir to put all collections under one subdirectory (#6331) + * Upgrade to Rouge 3 (#6381) + * Allow URL filters to work directly with documents (#6478) + * filter relative_url should keep absolute urls with scheme/authority (#6490) + * .sass-cache doesn't *always* land in `options['source']` (#6500) * Allow plugins to modify the obsolete files. (#6502) - * .sass-cache doesn't *always* land in options['source'] (#6500) - * Add Utils::Internet.connected? to determine whether host machine has internet connection. (#5870) * Add latin mode to slugify (#6509) - * filter relative_url should keep absolute urls with scheme/authority (#6490) - * Log kramdown warnings if log level is WARN (#6522) - * Allow URL filters to work directly with documents (#6478) + * Log Kramdown warnings if log level is WARN (#6522) ### Site Enhancements - * Docs: Update instructions (#6396) - * Add special styling for code-blocks run in shell (#6389) - * Update list of files excluded from Docs site (#6457) - * Update site History (#6460) - * Site: Add default twitter card image (#6476) - * Update normalize.css to v7.0.0 (#6491) - * add jekyll-pwa-plugin (#6533) - * [ImgBot] optimizes images (#6519) - * Site: Back to original main navigation (#6544) - * Style mobile-docs select element (#6545) + * (#6389) Add special styling for code-blocks run in shell + * (#6447) Add post about diversity + * (#6457) Update list of files excluded from Docs site + * (#6460) Update site History + * (#6476) Add default twitter card image + * (#6491) Update normalize.css to v7.0.0 + * (#6519) Optimize images + * (#6544) Site: Back to original main navigation + * (#6545) Style mobile-docs select element ### Bug Fixes @@ -213,7 +212,7 @@ * added BibSonomy plugin (#6143) * add plugins for multiple page pagination (#6055) * Update minimum Ruby version in installation.md (#6164) - * [docs] Add information about finding a collection in `site.collections` (#6165) + * Add information about finding a collection in `site.collections` (#6165) * Add `{% raw %}` to Liquid example on site (#6179) * Added improved Pug plugin - removed 404 Jade plugin (#6174) * Linking the link (#6210) @@ -318,7 +317,7 @@ ### Development Fixes - * [Rubocop] add missing comma (#5835) + * Rubocop: add missing comma (#5835) * Appease classifier-reborn (#5934) * Allow releases & development on `*-stable` branches (#5926) * Add script/backport-pr (#5925) @@ -355,7 +354,7 @@ ### Bug Fixes * Exclude Gemfile by default (#5860) - * Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty (#5878) + * Convertible#validate_permalink!: ensure the return value of `data["permalink"]` is a string before asking if it is empty (#5878) * Allow abbreviated post dates (#5920) * Remove dependency on include from default about.md (#5903) * Allow colons in `uri_escape` filter (#5957) @@ -416,7 +415,7 @@ * Switch to `https` when possible. (#5611) * Update `_font-awesome.scss` to move .woff file before .ttf (#5614) * Update documentation on updating FontAwesome Iconset (#5655) - * [site] Use defaults for docs and news-items (#5744) + * Use defaults for docs and news-items (#5744) * Sort gems in `docs/_config.yml` (#5746) * Add missing class (#5791) * Improve template docs (#5694) @@ -477,7 +476,7 @@ * Update quickstart.md (#5758) * Correct minor typo (#5764) * Fix a markdown link to look properly on the web (#5769) - * [docs] Info about the help command usage (#5312) + * Info about the help command usage (#5312) * Add missing merge labels for jekyllbot (#5753) * Fix broken links in documentation (#5736) * Docs: add `match_regex` and `replace_regex` filters (#5799) @@ -609,10 +608,10 @@ * Site: exclude README.md and .gitignore (#5304) * Add link to Staticman (#5224) * Update url for OpenShift (#5320) - * [docs] add help for missing static_file e.g. on heroku (#5334) + * Add help for missing static_file e.g. on heroku (#5334) * Add a line about updating theme-gems in the docs (#5318) * Explain how to copy a theme's files (#5335) - * [docs] .md as default extension in examples (#5316) + * .md as default extension in examples (#5316) * Fix small typo in docs (#5347) * Add missing period to sentence in first paragraph. (#5372) * added jekyll-spotify plugin (#5369) @@ -621,7 +620,7 @@ * Add documentation for `relative_url` and `absolute_url` (#5405) * Bugfix on logo in JSON-LD (#5421) * Fix Travis.ci documentation (#5413) - * [docs] Update documentation regarding `bundle install` after `jekyll new` (#5428) + * Update documentation regarding `bundle install` after `jekyll new` (#5428) * Replace classic box-sizing reset with inheritance reset (#5411) * Update Wikipedia YAML list link (#5452) * Add Jekyll 3.3 release post (#5442) @@ -925,7 +924,7 @@ * Fix broken links to the Code of Conduct (#4436) * Upgrade notes: mention trailing slash in permalink; fixes #4440 (#4455) * Add hooks to the plugin categories toc (#4463) - * [add note] Jekyll 3 requires newer version of Ruby. (#4461) + * Jekyll 3 requires newer version of Ruby. (#4461) * Fix typo in upgrading docs (#4473) * Add note about upgrading documentation on jekyllrb.com/help/ (#4484) * Update Rake link (#4496) @@ -993,7 +992,7 @@ * Fix deep_merge_hashes! handling of drops and hashes (#4359) * Page should respect output extension of its permalink (#4373) * Disable auto-regeneration when running server detached (#4376) - * Drop#[]: only use public_send for keys in the content_methods array (#4388) + * Drop#: only use public_send for keys in the content_methods array (#4388) * Extract title from filename successfully when no date. (#4195) ### Development Fixes diff --git a/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown b/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown index 90b81847682..acbd58ad06e 100644 --- a/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown +++ b/docs/_posts/2013-07-24-jekyll-1-1-1-released.markdown @@ -6,25 +6,18 @@ version: 1.1.1 categories: [release] --- +Coming just 10 days after the release of v1.1.0, v1.1.1 is out with a patch for +the nasty excerpt inception bug ([#1339]({{ site.repository }}/issues/1339)) and +non-zero exit codes for invalid commands ([#1338]({{ site.repository +}}/issues/1338)). -Coming just 10 days after the release of v1.1.0, v1.1.1 is out with a patch for the nasty -excerpt inception bug ([#1339][]) and non-zero exit codes for invalid commands -([#1338][]). +To all those affected by the [strange excerpt bug in v1.1.0]({{ site.repository +}}/issues/1321), I'm sorry. I think we have it all patched up and it should be +deployed to [GitHub Pages](https://pages.github.com/) in the next couple weeks. +Thank you for your patience! -To all those affected by the [strange excerpt bug in v1.1.0][#1321], I'm sorry. I think we -have it all patched up and it should be deployed to [GitHub Pages][gh_pages] in the next -couple weeks. Thank you for your patience! +If you're checking out v1.1.x for the first time, definitely check out [what +shipped with v1.1.0!]({{ site.repository }}/releases/tag/v1.1.0) -If you're checking out v1.1.x for the first time, definitely check out [what shipped with -v1.1.0!][v1_1_0] - -See the [GitHub Release][] page for more a more detailed changelog for this release. - -{% assign issue_numbers = "1339|1338|1321" | split: "|" %} -{% for issue in issue_numbers %} -[#{{ issue }}]: {{ site.repository }}/issues/{{ issue }} -{% endfor %} - -[GitHub Release]: {{ site.repository }}/releases/tag/v1.1.1 -[gh_pages]: https://pages.github.com/ -[v1_1_0]: {{ site.repository }}/releases/tag/v1.1.0 +See the [GitHub Release]({{ site.repository }}/releases/tag/v1.1.1) page for +more a more detailed changelog for this release. From 57ec30d6ef20dc21b9c162a56314325ec4d3aa20 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 13 Nov 2017 18:21:04 +0100 Subject: [PATCH 2610/4996] Site: Kramdown and Rouge are set by default --- docs/_config.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index d6e4443cf6f..8ce439891cf 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,5 +1,3 @@ -markdown: kramdown -highlighter: rouge sass: style: compressed From a74853501aed84ba1d7fb2d77d8312790cea28df Mon Sep 17 00:00:00 2001 From: Doug Beney Date: Mon, 13 Nov 2017 14:49:39 -0500 Subject: [PATCH 2611/4996] Update plugins.md (#6555) Merge pull request 6555 --- docs/_docs/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 7564252fc31..61d484768a7 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -785,7 +785,7 @@ LESS.js files during generation. #### Converters -- [Pug plugin by Doug Beney](https://github.com/DougBeney/jekyll-pug): Pug (previously Jade) converter for Jekyll. +- [Pug plugin by Doug Beney](http://jekyll-pug.dougie.io): Use the popular Pug (previously Jade) templating language in Jekyll. Complete with caching, includes support, and much more. - [Textile converter](https://github.com/jekyll/jekyll-textile-converter): Convert `.textile` files into HTML. Also includes the `textilize` Liquid filter. - [Slim plugin](https://github.com/slim-template/jekyll-slim): Slim converter and includes for Jekyll with support for Liquid tags. - [HAML plugin by Sam Z](https://gist.github.com/517556): HAML converter for Jekyll. From d8d6360107bbe9943709243ae7cd76a66e0f1b20 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 13 Nov 2017 14:49:41 -0500 Subject: [PATCH 2612/4996] Update history to reflect merge of #6555 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 023bb41825c..966e90404e3 100644 --- a/History.markdown +++ b/History.markdown @@ -27,6 +27,7 @@ * Fix a few minor issues in the docs (#6494) * Add jekyll-pwa-plugin (#6533) * Remove Jekyll-Smartify from plugins directory (#6548) + * Updated Jekyll-Pug listing to include official website (#6555) ### Development Fixes From 32d1b43fc030090ff49fa776dc5b20b6e194c20d Mon Sep 17 00:00:00 2001 From: Aaron D Borden Date: Mon, 13 Nov 2017 13:30:23 -0800 Subject: [PATCH 2613/4996] Add json extension to list of directory indices (#6550) Merge pull request 6550 --- lib/jekyll/commands/serve.rb | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index a89d152e8c4..9861d2c68d7 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -17,6 +17,15 @@ class << self "Skips the initial site build which occurs before the server is started.",], }.freeze + DIRECTORY_INDEX = %w( + index.htm + index.html + index.rhtml + index.cgi + index.xml + index.json + ).freeze + # def init_with_program(prog) @@ -85,13 +94,7 @@ def webrick_opts(opts) :StartCallback => start_callback(opts["detach"]), :BindAddress => opts["host"], :Port => opts["port"], - :DirectoryIndex => %w( - index.htm - index.html - index.rhtml - index.cgi - index.xml - ), + :DirectoryIndex => DIRECTORY_INDEX, } opts[:DirectoryIndex] = [] if opts[:JekyllOptions]["show_dir_listing"] From c2ee73ef8df4704028e6419306f766e1eec02007 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 13 Nov 2017 16:30:25 -0500 Subject: [PATCH 2614/4996] Update history to reflect merge of #6550 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 966e90404e3..1e421c38023 100644 --- a/History.markdown +++ b/History.markdown @@ -66,6 +66,7 @@ * Allow plugins to modify the obsolete files. (#6502) * Add latin mode to slugify (#6509) * Log Kramdown warnings if log level is WARN (#6522) + * Add json extension to list of directory indices (#6550) ### Site Enhancements From 7c72e62552af1a4d1e597f0db60b5caab648d6b0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 15 Nov 2017 10:19:37 -0500 Subject: [PATCH 2615/4996] Site: Search with @Algolia DocSearch (#6557) Merge pull request 6557 --- docs/_includes/header.html | 1 + docs/_includes/search/input.html | 1 + docs/_includes/search/script.html | 9 ++++++ docs/_includes/top.html | 1 + docs/_layouts/default.html | 2 +- docs/_sass/_docsearch.scss | 50 +++++++++++++++++++++++++++++++ docs/_sass/_style.scss | 1 + docs/css/screen.scss | 1 + 8 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 docs/_includes/search/input.html create mode 100644 docs/_includes/search/script.html create mode 100644 docs/_sass/_docsearch.scss diff --git a/docs/_includes/header.html b/docs/_includes/header.html index 2577a807828..cca35e89fa7 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -13,6 +13,7 @@

    diff --git a/docs/_includes/search/input.html b/docs/_includes/search/input.html new file mode 100644 index 00000000000..729f5cabdfd --- /dev/null +++ b/docs/_includes/search/input.html @@ -0,0 +1 @@ + diff --git a/docs/_includes/search/script.html b/docs/_includes/search/script.html new file mode 100644 index 00000000000..f770c63aeaf --- /dev/null +++ b/docs/_includes/search/script.html @@ -0,0 +1,9 @@ + + diff --git a/docs/_includes/top.html b/docs/_includes/top.html index 155ffbcacaf..b67648d9d82 100644 --- a/docs/_includes/top.html +++ b/docs/_includes/top.html @@ -7,6 +7,7 @@ {% feed_meta %} + {% seo %} diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 77ebd5f7d82..8e9574adc63 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -8,6 +8,6 @@ {% include footer.html %} {% include anchor_links.html %} {% include analytics.html %} - + {% include search/script.html %} diff --git a/docs/_sass/_docsearch.scss b/docs/_sass/_docsearch.scss new file mode 100644 index 00000000000..bebe3125bf8 --- /dev/null +++ b/docs/_sass/_docsearch.scss @@ -0,0 +1,50 @@ +.searchbox { + .searchbox__input { + padding: 5px 5px 5px 29px; + border: none; + border-radius: 5px; + color: #444; + + &::-webkit-input-placeholder { + color: #aaa; + } + + &:-ms-input-placeholder { + color: #aaa; + } + + &::placeholder { + color: #aaa; + } + } +} + +.algolia-autocomplete { + .ds-dropdown-menu { + font-size: 1rem; + text-shadow: none; + + .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content { + background-color: rgba(221, 221, 221, 0.5); + } + } + + .algolia-docsearch-suggestion--category-header { + background-color: #444; + color: #ddd; + padding: 0.35em; + } + + .algolia-docsearch-suggestion--subcategory-column { + color: #444; + } + + .algolia-docsearch-suggestion--highlight { + background-color: #fc0; + color: #222; + } + + .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { + box-shadow: inset 0 -2px 0 0 #fc0; + } +} diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 38276c8f461..fe84083a372 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -62,6 +62,7 @@ nav { padding: 0; margin: 0; white-space: nowrap; + display: inline-block; } li { display: inline-block; } diff --git a/docs/css/screen.scss b/docs/css/screen.scss index 2eff7f89df7..4bc6bec3330 100644 --- a/docs/css/screen.scss +++ b/docs/css/screen.scss @@ -7,3 +7,4 @@ @import "pygments"; @import "font-awesome"; @import "style"; +@import "docsearch"; From 977cfb0ac09b2beece3be73015a1a42e53a56481 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 15 Nov 2017 10:19:40 -0500 Subject: [PATCH 2616/4996] Update history to reflect merge of #6557 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1e421c38023..595e02585f5 100644 --- a/History.markdown +++ b/History.markdown @@ -79,6 +79,7 @@ * (#6519) Optimize images * (#6544) Site: Back to original main navigation * (#6545) Style mobile-docs select element + * Site: Search with DocSearch by @Algolia (#6557) ### Bug Fixes From 22cba713dcf29e592a70b892e8fa512ad5f8c141 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Thu, 16 Nov 2017 00:55:16 +0530 Subject: [PATCH 2617/4996] Bump JRuby version in Travis config (#6561) Merge pull request 6561 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2cfe51b7697..1da8963ace7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ rvm: - &ruby2 2.3.5 - &ruby3 2.2.8 - &ruby4 2.1.10 - - &jruby jruby-9.1.13.0 + - &jruby jruby-9.1.14.0 matrix: include: From e4888f2e5220b529147273338449feca20341b9f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 15 Nov 2017 14:25:18 -0500 Subject: [PATCH 2618/4996] Update history to reflect merge of #6561 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 595e02585f5..ca4f2e6dc43 100644 --- a/History.markdown +++ b/History.markdown @@ -52,6 +52,7 @@ * Use double-quotes around gem name (#6535) * Dependencies: upgrade to toml 0.2.0 (#6541) * Lock to cucumber 3.0.1 on Ruby 2.1 (#6546) + * Bump JRuby version in Travis config (#6561) ### Minor Enhancements From 3f8cd30d4dec40342f6a1926e962755f349e6baa Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 15 Nov 2017 21:28:25 +0100 Subject: [PATCH 2619/4996] Site: Display search only on large resolutions --- docs/_sass/_style.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index fe84083a372..8ade52e6f75 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -172,6 +172,10 @@ h6:hover .header-link { } } +@media (max-width: 950px) { + .searchbox { display: none;} +} + /* Footer */ footer { From 68935f1bda79875c3da1a62dbdee2a553e6d741f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 16 Nov 2017 22:20:38 +0100 Subject: [PATCH 2620/4996] Reformat --- History.markdown | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/History.markdown b/History.markdown index ca4f2e6dc43..c92be8607c0 100644 --- a/History.markdown +++ b/History.markdown @@ -71,16 +71,16 @@ ### Site Enhancements - * (#6389) Add special styling for code-blocks run in shell - * (#6447) Add post about diversity - * (#6457) Update list of files excluded from Docs site - * (#6460) Update site History - * (#6476) Add default twitter card image - * (#6491) Update normalize.css to v7.0.0 - * (#6519) Optimize images - * (#6544) Site: Back to original main navigation - * (#6545) Style mobile-docs select element - * Site: Search with DocSearch by @Algolia (#6557) + * Add special styling for code-blocks run in shell (#6389) + * Add post about diversity (#6447) + * Update list of files excluded from Docs site (#6457) + * Update site History (#6460) + * Add default twitter card image (#6476) + * Update normalize.css to v7.0.0 (#6491) + * Optimize images (#6519) + * Back to original main navigation (#6544) + * Styles: mobile-docs select element (#6545) + * Search with DocSearch by @Algolia (#6557) ### Bug Fixes From 0fdb39bbd6925d63966c155ed4665c0e2f67886a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 17 Nov 2017 16:36:11 -0500 Subject: [PATCH 2621/4996] Avoid block parser warning in SmartyPants (#6565) Merge pull request 6565 --- lib/jekyll/converters/smartypants.rb | 7 ++++++- test/test_filters.rb | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/converters/smartypants.rb b/lib/jekyll/converters/smartypants.rb index 40c0aecd01d..a3c3c1560d0 100644 --- a/lib/jekyll/converters/smartypants.rb +++ b/lib/jekyll/converters/smartypants.rb @@ -3,9 +3,14 @@ class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown def initialize(source, options) super - @block_parsers = [:block_html] + @block_parsers = [:block_html, :content] @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :span_html] end + + def parse_content + add_text @src.scan(%r!\A.*\n!) + end + define_parser(:content, %r!\A!) end module Jekyll diff --git a/test/test_filters.rb b/test/test_filters.rb index a56df6da309..afedf7467bc 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -100,6 +100,10 @@ def select; end assert_equal "“", @filter.smartify("“") end + should "convert multiple lines" do + assert_equal "…\n…", @filter.smartify("...\n...") + end + should "allow raw HTML passthrough" do assert_equal( "Span HTML is not escaped", @@ -123,6 +127,12 @@ def select; end @filter.smartify(404) ) end + + should "not output any warnings" do + assert_empty( + capture_output { @filter.smartify("Test") } + ) + end end should "sassify with simple string" do From 13911961b9b30792ceda92f48a0847ec8dabbce2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 17 Nov 2017 16:36:12 -0500 Subject: [PATCH 2622/4996] Update history to reflect merge of #6565 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c92be8607c0..e7f21d83f51 100644 --- a/History.markdown +++ b/History.markdown @@ -85,6 +85,7 @@ ### Bug Fixes * Raise when theme root directory is not available (#6455) + * Avoid block parser warning in SmartyPants (#6565) ## 3.6.2 / 2017-10-21 From 0f354704804673331138706d8e1db5975733e665 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 20 Nov 2017 00:30:38 +0530 Subject: [PATCH 2623/4996] Site header redesign (#6567) Merge pull request 6567 --- docs/_includes/header.html | 26 +++++++++---- docs/_includes/mobile-nav-items.html | 17 ++++++++ docs/_includes/primary-nav-items.html | 3 -- docs/_sass/_docsearch.scss | 18 +++++++-- docs/_sass/_style.scss | 56 ++++++++++++++++++++------- 5 files changed, 91 insertions(+), 29 deletions(-) create mode 100644 docs/_includes/mobile-nav-items.html diff --git a/docs/_includes/header.html b/docs/_includes/header.html index cca35e89fa7..7cdcb970bc0 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -1,19 +1,31 @@
    -
    -
    diff --git a/docs/_includes/mobile-nav-items.html b/docs/_includes/mobile-nav-items.html new file mode 100644 index 00000000000..12fe4016e76 --- /dev/null +++ b/docs/_includes/mobile-nav-items.html @@ -0,0 +1,17 @@ + diff --git a/docs/_includes/primary-nav-items.html b/docs/_includes/primary-nav-items.html index 12fe4016e76..7609bd7e906 100644 --- a/docs/_includes/primary-nav-items.html +++ b/docs/_includes/primary-nav-items.html @@ -11,7 +11,4 @@
  • Help
  • -
  • - GitHub -
  • diff --git a/docs/_sass/_docsearch.scss b/docs/_sass/_docsearch.scss index bebe3125bf8..e984edea90e 100644 --- a/docs/_sass/_docsearch.scss +++ b/docs/_sass/_docsearch.scss @@ -1,24 +1,34 @@ .searchbox { + padding-top: 1px; .searchbox__input { - padding: 5px 5px 5px 29px; + padding: 6px 5px 5px 29px; + font-size: 0.75em; border: none; border-radius: 5px; - color: #444; + color: #555; + background-color: #333 !important; + box-shadow: 0 0 1px 0 #555; &::-webkit-input-placeholder { color: #aaa; } - &:-ms-input-placeholder { color: #aaa; } - &::placeholder { color: #aaa; } + + &:focus, &:active { + color: #eaeaea; + background-color: #252525 !important; + } } } +.searchbox__submit svg { fill: #fc0 } +.searchbox__reset svg { fill: #999 } + .algolia-autocomplete { .ds-dropdown-menu { font-size: 1rem; diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 8ade52e6f75..52e6e8e3008 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -14,7 +14,6 @@ body { font: 300 21px Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #ddd; background-color: #333; - border-top: 5px solid #fc0; @include box-shadow(inset 0 3px 30px rgba(0,0,0,.3)); text-shadow: 0 1px 3px rgba(0,0,0,.5); -webkit-font-feature-settings: "kern" 1; @@ -50,13 +49,28 @@ footer { /* Header */ header { + padding: 15px; + background: darken(#333, 3%); h1, nav { display: inline-block; } + .flexbox { + display: flex; + height: 50px; + + & > * { margin: auto } + } + + .logo { + display: block; + img { margin-top: -7px } + } + + .search .svg-icons { display: none } } -nav { +nav, .meta { ul { padding: 0; @@ -68,16 +82,20 @@ nav { li { display: inline-block; } } -.main-nav { - margin-top: 52px; +.meta ul { + margin-left: 10px; + + li { vertical-align: middle; } +} + +.main-nav, .meta { li { - margin-right: 10px; a { @include border-radius(5px); font-weight: 900; - font-size: 14px; + font-size: 0.75em; padding: 0.5em 1em; text-shadow: none; text-transform: uppercase; @@ -101,7 +119,6 @@ nav { } } } - .mobile-nav { padding: 0 5px; @@ -118,9 +135,9 @@ nav { color: #fc0; text-align: center; text-transform: uppercase; - font-size: 14px; + font-size: 0.625em; font-weight: 900; - padding: 5px; + padding: 10px 5px; @include border-radius(5px); } @@ -160,20 +177,29 @@ h6:hover .header-link { opacity: 1; } -@media (max-width: 768px) { - .main-nav ul { - text-align: right; +@media (max-width: 568px) { + header { padding-bottom: 0 } +} +@media (max-width: 580px) { + header { + .flexbox { height: auto } + .logo img { margin-top: 0 } } } +@media (max-width: 699px) { + .searchbox { display: none } +} +@media (max-width: 768px) { + .main-nav ul { text-align: right } +} @media (max-width: 830px) { .main-nav { .show-on-mobiles { display: inline; } .hide-on-mobiles { display: none; } } } - -@media (max-width: 950px) { - .searchbox { display: none;} +@media (max-width: 890px) { + .meta { display: none; } } /* Footer */ From f85a039633628b59baf01aede9940df51e4b1bf0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 19 Nov 2017 14:00:39 -0500 Subject: [PATCH 2624/4996] Update history to reflect merge of #6567 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e7f21d83f51..b71e88bc429 100644 --- a/History.markdown +++ b/History.markdown @@ -81,6 +81,7 @@ * Back to original main navigation (#6544) * Styles: mobile-docs select element (#6545) * Search with DocSearch by @Algolia (#6557) + * Site header redesign (#6567) ### Bug Fixes From 0f249eec9fc507db920f2e3b14cb94c707835d9f Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 20 Nov 2017 18:36:47 +0530 Subject: [PATCH 2625/4996] move logo above navigation on small screens (#6570) Merge pull request 6570 --- docs/_includes/header.html | 6 +++--- docs/_sass/_style.scss | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/_includes/header.html b/docs/_includes/header.html index 7cdcb970bc0..b289550d2d8 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -1,7 +1,4 @@
    -

    @@ -28,4 +25,7 @@

    +
    diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 52e6e8e3008..fb185972394 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -177,9 +177,6 @@ h6:hover .header-link { opacity: 1; } -@media (max-width: 568px) { - header { padding-bottom: 0 } -} @media (max-width: 580px) { header { .flexbox { height: auto } From c2195b01181fd54874bc2eb5877231af3b437075 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 20 Nov 2017 08:06:48 -0500 Subject: [PATCH 2626/4996] Update history to reflect merge of #6570 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b71e88bc429..94da8dcd180 100644 --- a/History.markdown +++ b/History.markdown @@ -82,6 +82,7 @@ * Styles: mobile-docs select element (#6545) * Search with DocSearch by @Algolia (#6557) * Site header redesign (#6567) + * Move logo above site navigation on small screens (#6570) ### Bug Fixes From 6b003a443887771eced77d3d6011f08bf6aad71d Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Wed, 22 Nov 2017 00:58:08 +0530 Subject: [PATCH 2627/4996] fail gracefully if "sass" gem cannot be loaded (#6573) Merge pull request 6573 --- lib/jekyll/theme.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index cf9829ea322..edd041eea5c 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -38,7 +38,7 @@ def assets_path def configure_sass return unless sass_path - require "sass" + Jekyll::External.require_with_graceful_fail "sass" Sass.load_paths << sass_path end From 398e7d50894a2a20975342ed27ffc6bbd0a1ec12 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 21 Nov 2017 14:28:10 -0500 Subject: [PATCH 2628/4996] Update history to reflect merge of #6573 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 94da8dcd180..85ca98c6371 100644 --- a/History.markdown +++ b/History.markdown @@ -88,6 +88,7 @@ * Raise when theme root directory is not available (#6455) * Avoid block parser warning in SmartyPants (#6565) + * Fail gracefully if "sass" gem cannot be loaded (#6573) ## 3.6.2 / 2017-10-21 From f906a3cb597c049b7febb9767bed2802d47a659d Mon Sep 17 00:00:00 2001 From: Jonathan Hooper Date: Wed, 22 Nov 2017 08:37:18 -0600 Subject: [PATCH 2629/4996] Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828) Merge pull request 5828 --- lib/jekyll/convertible.rb | 2 +- lib/jekyll/document.rb | 4 ++-- test/test_convertible.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 1236d9d1662..d3749a1ad1d 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -46,7 +46,7 @@ def read_yaml(base, name, opts = {}) self.content = $POSTMATCH self.data = SafeYAML.load(Regexp.last_match(1)) end - rescue SyntaxError => e + rescue Psych::SyntaxError => e Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" raise e if self.site.config["strict_front_matter"] rescue StandardError => e diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 5bb255666ea..1eb8418605e 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -266,7 +266,7 @@ def read(opts = {}) merge_defaults read_content(opts) read_post_data - rescue SyntaxError, StandardError, Errors::FatalException => e + rescue StandardError => e handle_read_error(e) end end @@ -463,7 +463,7 @@ def read_post_data private def handle_read_error(error) - if error.is_a? SyntaxError + if error.is_a? Psych::SyntaxError Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{error.message}" else Jekyll.logger.error "Error:", "could not read file #{path}: #{error.message}" diff --git a/test/test_convertible.rb b/test/test_convertible.rb index f05cb4fb2c7..5b73e252815 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -31,7 +31,7 @@ class TestConvertible < JekyllUnitTest ret = @convertible.read_yaml(@base, name) assert_equal({}, ret) end - assert_match(%r!YAML Exception|syntax error|Error reading file!, out) + assert_match(%r!YAML Exception!, out) assert_match(%r!#{File.join(@base, name)}!, out) end From a25fd7233435010ea75dd66485a0217548e0663f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 22 Nov 2017 09:37:20 -0500 Subject: [PATCH 2630/4996] Update history to reflect merge of #5828 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 85ca98c6371..ba659ed6be6 100644 --- a/History.markdown +++ b/History.markdown @@ -53,6 +53,7 @@ * Dependencies: upgrade to toml 0.2.0 (#6541) * Lock to cucumber 3.0.1 on Ruby 2.1 (#6546) * Bump JRuby version in Travis config (#6561) + * Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828) ### Minor Enhancements From ed03ca5c16eb45bcda315d63ccdfccc5513fb347 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Nov 2017 03:43:37 -0500 Subject: [PATCH 2631/4996] Docs: Include version badge for latest features (#6574) Merge pull request 6574 --- docs/_docs/collections.md | 6 +++--- docs/_docs/configuration.md | 2 +- docs/_docs/templates.md | 2 +- docs/_includes/docs_version_badge.html | 1 + docs/_sass/_style.scss | 24 ++++++++++++++++++++++++ 5 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 docs/_includes/docs_version_badge.html diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 0b59b7db6d1..30ea5592c65 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -46,10 +46,10 @@ defaults: layout: page ``` -
    -
    Gather your collections
    +
    +
    Gather your collections {%- include docs_version_badge.html version="3.7.0" -%}
    -

    From v3.7.0 you can optionally specify a directory to store all your collections in the same place with collections_dir: my_collections

    +

    You can optionally specify a directory to store all your collections in the same place with collections_dir: my_collections

    Then Jekyll will look in my_collections/_books for the books collection, and in my_collections/_recipes for the recipes collection.

    diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 77b749815ee..362d33c5525 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -549,7 +549,7 @@ defaults: In this example, the `layout` is set to `default` inside the [collection](../collections/) with the name `my_collection`. -It is also possible to use glob patterns when matching defaults. For example, it is possible to set specific layout for each `special-page.html` in any subfolder of `section` folder. +It is also possible to use glob patterns when matching defaults. For example, it is possible to set specific layout for each `special-page.html` in any subfolder of `section` folder. {%- include docs_version_badge.html version="3.7.0" -%} ```yaml collections: diff --git a/docs/_docs/templates.md b/docs/_docs/templates.md index 81eb5b2a696..390410aaf92 100644 --- a/docs/_docs/templates.md +++ b/docs/_docs/templates.md @@ -429,7 +429,7 @@ The default is `default`. They are as follows (with what they filter): - `default`: spaces and non-alphanumeric characters - `pretty`: spaces and non-alphanumeric characters except for `._~!$&'()+,;=@` - `ascii`: spaces, non-alphanumeric, and non-ASCII characters -- `latin`: like `default`, except Latin characters are first transliterated (e.g. `àèïòü` to `aeiou`) +- `latin`: like `default`, except Latin characters are first transliterated (e.g. `àèïòü` to `aeiou`) {%- include docs_version_badge.html version="3.7.0" -%} ## Tags diff --git a/docs/_includes/docs_version_badge.html b/docs/_includes/docs_version_badge.html new file mode 100644 index 00000000000..3c358109ffe --- /dev/null +++ b/docs/_includes/docs_version_badge.html @@ -0,0 +1 @@ +{{ include.version }} diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index fb185972394..11d89adf3a8 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -1030,6 +1030,30 @@ code.output { text-shadow: 0 1px 0 rgba(255,255,255,.25); } +/* Version badge */ + +.version-badge { + margin-left: .25em; + padding: 0.2em; + font-size: .75em; + font-weight: 400; + background-color: #fc0; + color: #222; + text-shadow: none; + vertical-align: middle; + border-radius: 3.75px; +} + +.note { + .version-badge { + font-size: 0.9rem; + padding: 0.1em 0.2em; + background-color: rgba(0,0,0,0.2); + color: #fff; + box-shadow: inset 0 1px 10px rgba(0,0,0,0.3),0 1px 0 rgba(255,255,255,0.1),0 -1px 0 rgba(0,0,0,0.5); + } +} + /* Responsive tables */ @media (max-width: 768px) { From f58d5988fa24e2770c38a47c72289101a363e6af Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Nov 2017 03:43:39 -0500 Subject: [PATCH 2632/4996] Update history to reflect merge of #6574 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ba659ed6be6..b9fb48435e1 100644 --- a/History.markdown +++ b/History.markdown @@ -84,6 +84,7 @@ * Search with DocSearch by @Algolia (#6557) * Site header redesign (#6567) * Move logo above site navigation on small screens (#6570) + * Docs: Include version badge for latest features (#6574) ### Bug Fixes From 7ef3260327ecaf69540f1828b2a16198dff0dd8c Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Fri, 24 Nov 2017 08:49:13 +0000 Subject: [PATCH 2633/4996] return correct file in dir if dir has same name as file (#6569) Merge pull request 6569 --- lib/jekyll/commands/serve/servlet.rb | 6 +++- test/fixtures/webrick/bar.html | 1 + test/fixtures/webrick/bar/baz.html | 1 + test/helper.rb | 54 ++++++++++++++++++++++++++++ test/test_commands_serve_servlet.rb | 38 ++++++++++++++++++++ 5 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/webrick/bar.html create mode 100644 test/fixtures/webrick/bar/baz.html create mode 100644 test/test_commands_serve_servlet.rb diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 2e41b697524..70b6d66df34 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -18,13 +18,17 @@ def initialize(server, root, callbacks) super end + def search_index_file(req, res) + super || search_file(req, res, ".html") + end + # Add the ability to tap file.html the same way that Nginx does on our # Docker images (or on GitHub Pages.) The difference is that we might end # up with a different preference on which comes first. def search_file(req, res, basename) # /file.* > /file/index.html > /file.html - super || super(req, res, ".html") || super(req, res, "#{basename}.html") + super || super(req, res, "#{basename}.html") end # rubocop:disable Naming/MethodName diff --git a/test/fixtures/webrick/bar.html b/test/fixtures/webrick/bar.html new file mode 100644 index 00000000000..76870bf2f38 --- /dev/null +++ b/test/fixtures/webrick/bar.html @@ -0,0 +1 @@ +Content of bar.html diff --git a/test/fixtures/webrick/bar/baz.html b/test/fixtures/webrick/bar/baz.html new file mode 100644 index 00000000000..794d5f2202d --- /dev/null +++ b/test/fixtures/webrick/bar/baz.html @@ -0,0 +1 @@ +Content of baz.html diff --git a/test/helper.rb b/test/helper.rb index 672fedd2862..aa94be13e61 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -44,6 +44,8 @@ def jruby? include Jekyll +require "jekyll/commands/serve/servlet" + # Report with color. Minitest::Reporters.use! [ Minitest::Reporters::DefaultReporter.new( @@ -194,3 +196,55 @@ def skip_if_windows(msg = nil) end end end + +class FakeLogger + def <<(str); end +end + +module TestWEBrick + + module_function + + def mount_server(&block) + server = WEBrick::HTTPServer.new(config) + + begin + server.mount("/", Jekyll::Commands::Serve::Servlet, document_root, + document_root_options) + + server.start + addr = server.listeners[0].addr + block.yield([server, addr[3], addr[1]]) + rescue StandardError => e + raise e + ensure + server.shutdown + sleep 0.1 until server.status == :Stop + end + end + + def config + logger = FakeLogger.new + { + :BindAddress => "127.0.0.1", :Port => 0, + :ShutdownSocketWithoutClose => true, + :ServerType => Thread, + :Logger => WEBrick::Log.new(logger), + :AccessLog => [[logger, ""]], + :JekyllOptions => {}, + } + end + + def document_root + "#{File.dirname(__FILE__)}/fixtures/webrick" + end + + def document_root_options + WEBrick::Config::FileHandler.merge({ + :FancyIndexing => true, + :NondisclosureName => [ + ".ht*", "~*", + ], + }) + end +end diff --git a/test/test_commands_serve_servlet.rb b/test/test_commands_serve_servlet.rb new file mode 100644 index 00000000000..1f84cbbbe64 --- /dev/null +++ b/test/test_commands_serve_servlet.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require "webrick" +require "helper" +require "net/http" + +class TestCommandsServeServlet < JekyllUnitTest + def get(path) + TestWEBrick.mount_server do |_server, addr, port| + http = Net::HTTP.new(addr, port) + req = Net::HTTP::Get.new(path) + + http.request(req) { |response| yield(response) } + end + end + + context "with a directory and file with the same name" do + should "find that file" do + get("/bar/") do |response| + assert_equal("200", response.code) + assert_equal("Content of bar.html", response.body.strip) + end + end + + should "find file in directory" do + get("/bar/baz") do |response| + assert_equal("200", response.code) + assert_equal("Content of baz.html", response.body.strip) + end + end + + should "return 404 for non-existing files" do + get("/bar/missing") do |response| + assert_equal("404", response.code) + end + end + end +end From 65fd99045926ed3331d59356dc765936b9bb0dff Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Nov 2017 03:49:15 -0500 Subject: [PATCH 2634/4996] Update history to reflect merge of #6569 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b9fb48435e1..94d3c9ecf35 100644 --- a/History.markdown +++ b/History.markdown @@ -91,6 +91,7 @@ * Raise when theme root directory is not available (#6455) * Avoid block parser warning in SmartyPants (#6565) * Fail gracefully if "sass" gem cannot be loaded (#6573) + * return correct file in dir if dir has same name as file (#6569) ## 3.6.2 / 2017-10-21 From abeee6fdf6849ce24ddb5987a282e2e35302ebeb Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 24 Nov 2017 17:49:08 +0530 Subject: [PATCH 2635/4996] use version-badge on an existing feature intro (#6575) Merge pull request 6575 --- docs/_docs/themes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index 6907ffb0c00..b5423a6b56c 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -224,9 +224,9 @@ Your theme's styles can be included in the user's stylesheet using the `@import` ``` {% endraw %} -### Theme-gem dependencies +### Theme-gem dependencies {%- include docs_version_badge.html version="3.5.0" -%} -From `v3.5`, Jekyll will automatically require all whitelisted `runtime_dependencies` of your theme-gem even if they're not explicitly included under the `plugins` array in the site's config file. (Note: whitelisting is only required when building or serving with the `--safe` option.) +Jekyll will automatically require all whitelisted `runtime_dependencies` of your theme-gem even if they're not explicitly included under the `plugins` array in the site's config file. (Note: whitelisting is only required when building or serving with the `--safe` option.) With this, the end-user need not keep track of the plugins required to be included in their config file for their theme-gem to work as intended. From 8060934f9689d77cc9ee4549057364a9a9d4c165 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 24 Nov 2017 07:19:10 -0500 Subject: [PATCH 2636/4996] Update history to reflect merge of #6575 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 94d3c9ecf35..d878b8d1fdc 100644 --- a/History.markdown +++ b/History.markdown @@ -85,6 +85,7 @@ * Site header redesign (#6567) * Move logo above site navigation on small screens (#6570) * Docs: Include version badge for latest features (#6574) + * Use version-badge on an existing feature intro (#6575) ### Bug Fixes From e063ac530c9c8508533128eae59fb3e7f23d4576 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Mon, 27 Nov 2017 01:06:41 +0530 Subject: [PATCH 2637/4996] drop forwarding to private methods (#6577) Merge pull request 6577 --- lib/jekyll/theme_builder.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/theme_builder.rb b/lib/jekyll/theme_builder.rb index aca89dd655c..9b43e0a3714 100644 --- a/lib/jekyll/theme_builder.rb +++ b/lib/jekyll/theme_builder.rb @@ -21,6 +21,14 @@ def create! initialize_git_repo end + def user_name + @user_name ||= `git config user.name`.chomp + end + + def user_email + @user_email ||= `git config user.email`.chomp + end + private def root @@ -85,14 +93,6 @@ def initialize_git_repo write_file(".gitignore", template("gitignore")) end - def user_name - @user_name ||= `git config user.name`.chomp - end - - def user_email - @user_email ||= `git config user.email`.chomp - end - class ERBRenderer extend Forwardable From 05bca8128c5069fdac4735afb79e390265be6727 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 26 Nov 2017 14:36:43 -0500 Subject: [PATCH 2638/4996] Update history to reflect merge of #6577 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d878b8d1fdc..f05f90020c6 100644 --- a/History.markdown +++ b/History.markdown @@ -54,6 +54,7 @@ * Lock to cucumber 3.0.1 on Ruby 2.1 (#6546) * Bump JRuby version in Travis config (#6561) * Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828) + * Drop forwarding to private methods by exposing those methods as public (#6577) ### Minor Enhancements From bd1d44493f559039c877203ffb52add57b47d732 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 29 Nov 2017 03:17:08 -0500 Subject: [PATCH 2639/4996] Upgrade pygments to v1.x (#5937) Merge pull request 5937 --- Gemfile | 2 +- lib/jekyll/tags/highlight.rb | 4 ++-- test/test_redcarpet.rb | 13 +++++++------ test/test_tags.rb | 23 ++++++++++++++--------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Gemfile b/Gemfile index 2ba32da780c..8590544ed3a 100644 --- a/Gemfile +++ b/Gemfile @@ -81,7 +81,7 @@ group :jekyll_optional_dependencies do platform :ruby, :mswin, :mingw, :x64_mingw do gem "classifier-reborn", "~> 2.1.0" gem "liquid-c", "~> 3.0" - gem "pygments.rb", "~> 0.6.0" + gem "pygments.rb", "~> 1.0" gem "rdiscount", "~> 2.0" gem "redcarpet", "~> 3.2", ">= 3.2.3" gem "yajl-ruby", "~> 1.2" diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index 683e3b2b456..256342c3fe6 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -86,7 +86,7 @@ def parse_options(input) end def render_pygments(code, is_safe) - Jekyll::External.require_with_graceful_fail("pygments") + Jekyll::External.require_with_graceful_fail("pygments") unless defined?(Pygments) highlighted_code = Pygments.highlight( code, @@ -118,7 +118,7 @@ def render_rouge(code) :gutter_class => "gutter", :code_class => "code" ) - lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText + lexer = ::Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText formatter.format(lexer.lex(code)) end diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb index f4208570931..29d787ae62f 100644 --- a/test/test_redcarpet.rb +++ b/test/test_redcarpet.rb @@ -46,16 +46,17 @@ class TestRedcarpet < JekyllUnitTest end should "render fenced code blocks with syntax highlighting" do - assert_equal "
    puts "Hello world"\n
    ", - @markdown.convert( - <<-EOS + assert_equal \ + "
    puts "Hello world"\n
    ", + @markdown.convert( + <<-EOS ```ruby puts "Hello world" ``` EOS - ).strip + ).strip end end diff --git a/test/test_tags.rb b/test/test_tags.rb index 43d83464362..a76f0df138a 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -185,7 +185,8 @@ def highlight_block_with_opts(options_string) should "render markdown with pygments" do assert_match( - %(
    test
    ), + %(
    ) +
    +          %(test
    ), @result ) end @@ -193,7 +194,7 @@ def highlight_block_with_opts(options_string) should "render markdown with pygments with line numbers" do assert_match( %(
    ) +
    -          %(1 test
    ), + %(1 test
    ), @result ) end @@ -206,7 +207,7 @@ def highlight_block_with_opts(options_string) should "not embed the file" do assert_match( - %(
    ) +
    +          %(
    ) +
               %(./jekyll.gemspec
    ), @result ) @@ -220,7 +221,8 @@ def highlight_block_with_opts(options_string) should "render markdown with pygments line handling" do assert_match( - %(
    Æ
    ), + %(
    ) +
    +          %(Æ
    ), @result ) end @@ -240,7 +242,8 @@ def highlight_block_with_opts(options_string) should "only strip the preceding newlines" do assert_match( - %(
         [,1] [,2]),
    +          %(
    ) +
    +          %(     [,1] [,2]),
               @result
             )
           end
    @@ -265,8 +268,8 @@ def highlight_block_with_opts(options_string)
     
           should "only strip the newlines which precede and succeed the entire block" do
             assert_match(
    -          "
    " \
    -          "     [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE
    ", + %(
    ) +
    +          %(     [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE
    ), @result ) end @@ -280,7 +283,8 @@ def highlight_block_with_opts(options_string) should "only strip the preceding newlines" do assert_match( - %(
         [,1] [,2]),
    +          %(
    ) +
    +          %(     [,1] [,2]),
               @result
             )
           end
    @@ -298,7 +302,8 @@ def highlight_block_with_opts(options_string)
     
           should "only strip the preceding newlines" do
             assert_match(
    -          %(
         [,1] [,2]),
    +          %(
    ) +
    +          %(     [,1] [,2]),
               @result
             )
           end
    
    From ff4718d82438512e297f035a4ccc66c848e75e7a Mon Sep 17 00:00:00 2001
    From: jekyllbot 
    Date: Wed, 29 Nov 2017 03:17:09 -0500
    Subject: [PATCH 2640/4996] Update history to reflect merge of #5937 [ci skip]
    
    ---
     History.markdown | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/History.markdown b/History.markdown
    index f05f90020c6..06d286eb9eb 100644
    --- a/History.markdown
    +++ b/History.markdown
    @@ -55,6 +55,7 @@
       * Bump JRuby version in Travis config (#6561)
       * Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828)
       * Drop forwarding to private methods by exposing those methods as public (#6577)
    +  * Upgrade pygments to v1.x (#5937)
     
     ### Minor Enhancements
     
    
    From 79bf9f286589c8a5991c480ddf53f946cfa36ba7 Mon Sep 17 00:00:00 2001
    From: jekyllbot 
    Date: Wed, 29 Nov 2017 03:37:07 -0500
    Subject: [PATCH 2641/4996] Bump yajl-ruby (#6582)
    
    Merge pull request 6582
    ---
     Gemfile | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/Gemfile b/Gemfile
    index 8590544ed3a..68bc28c24a5 100644
    --- a/Gemfile
    +++ b/Gemfile
    @@ -84,7 +84,7 @@ group :jekyll_optional_dependencies do
         gem "pygments.rb", "~> 1.0"
         gem "rdiscount", "~> 2.0"
         gem "redcarpet", "~> 3.2", ">= 3.2.3"
    -    gem "yajl-ruby", "~> 1.2"
    +    gem "yajl-ruby", "~> 1.3.1"
       end
     
       # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
    
    From 664b20d3752a81f5073b238906300203733db3d2 Mon Sep 17 00:00:00 2001
    From: jekyllbot 
    Date: Wed, 29 Nov 2017 03:37:08 -0500
    Subject: [PATCH 2642/4996] Update history to reflect merge of #6582 [ci skip]
    
    ---
     History.markdown | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/History.markdown b/History.markdown
    index 06d286eb9eb..49bfec78dda 100644
    --- a/History.markdown
    +++ b/History.markdown
    @@ -56,6 +56,7 @@
       * Rescue from Psych::SyntaxError instead of SyntaxError after parsing YAML (#5828)
       * Drop forwarding to private methods by exposing those methods as public (#6577)
       * Upgrade pygments to v1.x (#5937)
    +  * Bump yajl-ruby (#6582)
     
     ### Minor Enhancements
     
    
    From 61e53b6b6199263f6937979c1ed68b1ed888c192 Mon Sep 17 00:00:00 2001
    From: ashmaroli 
    Date: Wed, 29 Nov 2017 19:26:46 +0530
    Subject: [PATCH 2643/4996] cleanup test_redcarpet.rb (#6584)
    
    Merge pull request 6584
    ---
     test/test_redcarpet.rb | 57 ++++++++++++++++++------------------------
     1 file changed, 25 insertions(+), 32 deletions(-)
    
    diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb
    index 29d787ae62f..51da49c58e4 100644
    --- a/test/test_redcarpet.rb
    +++ b/test/test_redcarpet.rb
    @@ -19,6 +19,13 @@ class TestRedcarpet < JekyllUnitTest
           }
     
           @markdown = Converters::Markdown.new @config
    +
    +      @sample = Jekyll::Utils.strip_heredoc(<<-EOS
    +        ```ruby
    +        puts "Hello world"
    +        ```
    +      EOS
    +                                           )
         end
     
         should "pass redcarpet options" do
    @@ -35,7 +42,7 @@ class TestRedcarpet < JekyllUnitTest
     
         should "pass redcarpet render options" do
           assert_equal "

    bad code not here: i am bad

    ", - @markdown.convert("**bad code not here**: ").strip + @markdown.convert("**bad code not here**: ").strip end context "with pygments enabled" do @@ -46,17 +53,12 @@ class TestRedcarpet < JekyllUnitTest end should "render fenced code blocks with syntax highlighting" do - assert_equal \ - "
    puts "Hello world"\n
    ", - @markdown.convert( - <<-EOS -```ruby -puts "Hello world" -``` -EOS - ).strip + assert_equal( + %(
    puts "Hello world"\n
    ), + @markdown.convert(@sample).strip + ) end end @@ -66,16 +68,12 @@ class TestRedcarpet < JekyllUnitTest end should "render fenced code blocks with syntax highlighting" do - assert_equal "
    puts \"Hello world\"\n
    ", - @markdown.convert( - <<-EOS -```ruby -puts "Hello world" -``` - EOS - ).strip + assert_equal( + %(
    puts "Hello world"\n
    ), + @markdown.convert(@sample).strip + ) end end @@ -85,16 +83,11 @@ class TestRedcarpet < JekyllUnitTest end should "render fenced code blocks without syntax highlighting" do - assert_equal "
    puts "Hello world"\n
    "\ - "
    ", - @markdown.convert( - <<-EOS -```ruby -puts "Hello world" -``` - EOS - ).strip + assert_equal( + %(
    puts "Hello world"\n
    ), + @markdown.convert(@sample).strip + ) end end end From e3b8ba33da2666dc28a77c3e14945f5c93859a72 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 29 Nov 2017 08:56:47 -0500 Subject: [PATCH 2644/4996] Update history to reflect merge of #6584 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 49bfec78dda..75ca663c772 100644 --- a/History.markdown +++ b/History.markdown @@ -57,6 +57,7 @@ * Drop forwarding to private methods by exposing those methods as public (#6577) * Upgrade pygments to v1.x (#5937) * Bump yajl-ruby (#6582) + * Cleanup test_redcarpet.rb (#6584) ### Minor Enhancements From 65f7deca98964f93e51af44253d4e5a27c1949b9 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Thu, 30 Nov 2017 23:46:35 +0530 Subject: [PATCH 2645/4996] Add PageWithoutAFile class from jekyll plugins (#6556) Merge pull request 6556 --- lib/jekyll.rb | 1 + lib/jekyll/page_without_a_file.rb | 18 ++++ test/fixtures/physical.html | 6 ++ test/test_page_without_a_file.rb | 159 ++++++++++++++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 lib/jekyll/page_without_a_file.rb create mode 100644 test/fixtures/physical.html create mode 100644 test/test_page_without_a_file.rb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 733796cc2af..c909c3d13e4 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -61,6 +61,7 @@ module Jekyll autoload :ThemeAssetsReader, "jekyll/readers/theme_assets_reader" autoload :LogAdapter, "jekyll/log_adapter" autoload :Page, "jekyll/page" + autoload :PageWithoutAFile, "jekyll/page_without_a_file" autoload :PluginManager, "jekyll/plugin_manager" autoload :Publisher, "jekyll/publisher" autoload :Reader, "jekyll/reader" diff --git a/lib/jekyll/page_without_a_file.rb b/lib/jekyll/page_without_a_file.rb new file mode 100644 index 00000000000..2d30af51116 --- /dev/null +++ b/lib/jekyll/page_without_a_file.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Jekyll + # A Jekyll::Page subclass to handle processing files without reading it to + # determine the page-data and page-content based on Front Matter delimiters. + # + # The class instance is basically just a bare-bones entity with just + # attributes "dir", "name", "path", "url" defined on it. + class PageWithoutAFile < Page + def read_yaml(*) + @data ||= {} + end + + def inspect + "#" + end + end +end diff --git a/test/fixtures/physical.html b/test/fixtures/physical.html new file mode 100644 index 00000000000..8913980af32 --- /dev/null +++ b/test/fixtures/physical.html @@ -0,0 +1,6 @@ +--- +title: Physical file +permalink: /physical/ +--- + +A physical file entity diff --git a/test/test_page_without_a_file.rb b/test/test_page_without_a_file.rb new file mode 100644 index 00000000000..b1fa9c04c9a --- /dev/null +++ b/test/test_page_without_a_file.rb @@ -0,0 +1,159 @@ +# frozen_string_literal: true + +require "helper" + +class TestPageWithoutAFile < JekyllUnitTest + def setup_page(*args, base: source_dir, klass: PageWithoutAFile) + dir, file = args + if file.nil? + file = dir + dir = "" + end + klass.new(@site, base, dir, file) + end + + def render_and_write + @site.render + @site.cleanup + @site.write + end + + context "A PageWithoutAFile" do + setup do + clear_dest + @site = Site.new(Jekyll.configuration({ + "source" => source_dir, + "destination" => dest_dir, + "skip_config_files" => true, + })) + end + + context "with default site configuration" do + setup do + @page = setup_page("properties.html") + end + + should "not have page-content and page-data defined within it" do + assert_equal "pages", @page.type.to_s + assert_nil @page.content + assert_empty @page.data + end + + should "have basic attributes defined in it" do + regular_page = setup_page("properties.html", :klass => Page) + basic_attrs = %w(dir name path url) + attrs = { + "content" => "All the properties.\n", + "dir" => "/", + "excerpt" => nil, + "foo" => "bar", + "layout" => "default", + "name" => "properties.html", + "path" => "properties.html", + "permalink" => "/properties/", + "published" => nil, + "title" => "Properties Page", + "url" => "/properties.html", + } + attrs.each do |prop, value| + # assert the props being accessible in a Jekyll::Page instance + assert_equal "All the properties.\n", regular_page["content"] + assert_equal "properties.html", regular_page["name"] + + # assert differences with Jekyll::PageWithoutAFile instance + if basic_attrs.include?(prop) + assert_equal @page[prop], value, "For :" + else + assert_nil @page[prop] + end + end + end + end + + context "with site-wide permalink configuration" do + setup do + @site.permalink_style = :title + end + + should "generate page url accordingly" do + page = setup_page("properties.html") + assert_equal "/properties", page.url + end + end + + context "with default front matter configuration" do + setup do + @site.config["defaults"] = [ + { + "scope" => { + "path" => "", + "type" => "pages", + }, + "values" => { + "layout" => "default", + "author" => "John Doe", + }, + }, + ] + + @page = setup_page("info.md") + end + + should "respect front matter defaults" do + assert_nil @page.data["title"] + assert_equal "John Doe", @page.data["author"] + assert_equal "default", @page.data["layout"] + end + end + + context "with a path outside site.source" do + should "not access its contents" do + base = "../../../" + page = setup_page("pwd", :base => base) + + assert_equal "pwd", page.path + assert_nil page.content + end + end + + context "while processing" do + setup do + clear_dest + @site.config["title"] = "Test Site" + @page = setup_page("physical.html", :base => test_dir("fixtures")) + end + + should "recieve content provided to it" do + assert_nil @page.content + + @page.content = "{{ site.title }}" + assert_equal "{{ site.title }}", @page.content + end + + should "not be processed and written to disk at destination" do + @page.content = "Lorem ipsum dolor sit amet" + @page.data["permalink"] = "/virtual-about/" + + render_and_write + + refute_exist dest_dir("physical") + refute_exist dest_dir("virtual-about") + refute File.exist?(dest_dir("virtual-about", "index.html")) + end + + should "be processed and written to destination when passed as "\ + "an entry in 'site.pages' array" do + @page.content = "{{ site.title }}" + @page.data["permalink"] = "/virtual-about/" + + @site.pages << @page + render_and_write + + refute_exist dest_dir("physical") + assert_exist dest_dir("virtual-about") + assert File.exist?(dest_dir("virtual-about", "index.html")) + assert_equal "Test Site", File.read(dest_dir("virtual-about", "index.html")) + end + end + end +end From 7826bfe552d2e2209b4d3bbd909170b687fb9704 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 13 Nov 2017 16:43:27 +0530 Subject: [PATCH 2646/4996] last released version is at 3.6.2 --- lib/jekyll/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 6e0c1cf6ca6..8f0106064ce 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Jekyll - VERSION = "3.6.0".freeze + VERSION = "3.6.2".freeze end From 0c4b12e6aaffe3416b0bd066001e7cc3a8e8b804 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 30 Nov 2017 12:16:37 -0600 Subject: [PATCH 2647/4996] Update history to reflect merge of #6556 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 75ca663c772..fcd419fb053 100644 --- a/History.markdown +++ b/History.markdown @@ -58,6 +58,7 @@ * Upgrade pygments to v1.x (#5937) * Bump yajl-ruby (#6582) * Cleanup test_redcarpet.rb (#6584) + * Add PageWithoutAFile class from jekyll plugins (#6556) ### Minor Enhancements From 2fe54170b4b12eba92cc85229ea2d2cae6aa5e99 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 01:51:07 +0100 Subject: [PATCH 2648/4996] Dependency: Bump jekyll-watch to 2.0 (#6589) Merge pull request 6589 --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 98fd53824f4..90ad0ceb846 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -34,7 +34,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("colorator", "~> 1.0") s.add_runtime_dependency("i18n", "~> 0.7") s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") - s.add_runtime_dependency("jekyll-watch", "~> 1.1") + s.add_runtime_dependency("jekyll-watch", "~> 2.0") s.add_runtime_dependency("kramdown", "~> 1.14") s.add_runtime_dependency("liquid", "~> 4.0") s.add_runtime_dependency("mercenary", "~> 0.3.3") From 760d586de21982cc7df62e61d259950da9e861e7 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 2 Dec 2017 18:51:09 -0600 Subject: [PATCH 2649/4996] Update history to reflect merge of #6589 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fcd419fb053..54bd43db93d 100644 --- a/History.markdown +++ b/History.markdown @@ -74,6 +74,7 @@ * Add latin mode to slugify (#6509) * Log Kramdown warnings if log level is WARN (#6522) * Add json extension to list of directory indices (#6550) + * Dependency: Bump jekyll-watch to 2.0 (#6589) ### Site Enhancements From cdb031084c7deddd518b1dfaddccbbf8fd8c12bf Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 19:38:34 +0100 Subject: [PATCH 2650/4996] Docs: Avoid Kramdown warnings --- docs/_docs/history.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 85e493616af..a7308287028 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -153,7 +153,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - added BibSonomy plugin ([#6143]({{ site.repository }}/issues/6143)) - add plugins for multiple page pagination ([#6055]({{ site.repository }}/issues/6055)) - Update minimum Ruby version in installation.md ([#6164]({{ site.repository }}/issues/6164)) -- [docs] Add information about finding a collection in `site.collections` ([#6165]({{ site.repository }}/issues/6165)) +- Add information about finding a collection in `site.collections` ([#6165]({{ site.repository }}/issues/6165)) - Add {% raw %}`{% raw %}`{% endraw %} to Liquid example on site ([#6179]({{ site.repository }}/issues/6179)) - Added improved Pug plugin - removed 404 Jade plugin ([#6174]({{ site.repository }}/issues/6174)) - Linking the link ([#6210]({{ site.repository }}/issues/6210)) @@ -263,7 +263,7 @@ note: This file is autogenerated. Edit /History.markdown instead. ### Development Fixes {: #development-fixes-v3-5-0} -- [Rubocop] add missing comma ([#5835]({{ site.repository }}/issues/5835)) +- Rubocop: add missing comma ([#5835]({{ site.repository }}/issues/5835)) - Appease classifier-reborn ([#5934]({{ site.repository }}/issues/5934)) - Allow releases & development on `*-stable` branches ([#5926]({{ site.repository }}/issues/5926)) - Add script/backport-pr ([#5925]({{ site.repository }}/issues/5925)) @@ -302,7 +302,7 @@ note: This file is autogenerated. Edit /History.markdown instead. {: #bug-fixes-v3-5-0} - Exclude Gemfile by default ([#5860]({{ site.repository }}/issues/5860)) -- Convertible#validate_permalink!: ensure the return value of data["permalink"] is a string before asking if it is empty ([#5878]({{ site.repository }}/issues/5878)) +- Convertible#validate_permalink!: ensure the return value of `data["permalink"]` is a string before asking if it is empty ([#5878]({{ site.repository }}/issues/5878)) - Allow abbreviated post dates ([#5920]({{ site.repository }}/issues/5920)) - Remove dependency on include from default about.md ([#5903]({{ site.repository }}/issues/5903)) - Allow colons in `uri_escape` filter ([#5957]({{ site.repository }}/issues/5957)) @@ -378,7 +378,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Switch to `https` when possible. ([#5611]({{ site.repository }}/issues/5611)) - Update `_font-awesome.scss` to move .woff file before .ttf ([#5614]({{ site.repository }}/issues/5614)) - Update documentation on updating FontAwesome Iconset ([#5655]({{ site.repository }}/issues/5655)) -- [site] Use defaults for docs and news-items ([#5744]({{ site.repository }}/issues/5744)) +- Use defaults for docs and news-items ([#5744]({{ site.repository }}/issues/5744)) - Sort gems in `docs/_config.yml` ([#5746]({{ site.repository }}/issues/5746)) - Add missing class ([#5791]({{ site.repository }}/issues/5791)) - Improve template docs ([#5694]({{ site.repository }}/issues/5694)) @@ -440,7 +440,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Update quickstart.md ([#5758]({{ site.repository }}/issues/5758)) - Correct minor typo ([#5764]({{ site.repository }}/issues/5764)) - Fix a markdown link to look properly on the web ([#5769]({{ site.repository }}/issues/5769)) -- [docs] Info about the help command usage ([#5312]({{ site.repository }}/issues/5312)) +- Info about the help command usage ([#5312]({{ site.repository }}/issues/5312)) - Add missing merge labels for jekyllbot ([#5753]({{ site.repository }}/issues/5753)) - Fix broken links in documentation ([#5736]({{ site.repository }}/issues/5736)) - Docs: add `match_regex` and `replace_regex` filters ([#5799]({{ site.repository }}/issues/5799)) @@ -583,10 +583,10 @@ note: This file is autogenerated. Edit /History.markdown instead. - Site: exclude README.md and .gitignore ([#5304]({{ site.repository }}/issues/5304)) - Add link to Staticman ([#5224]({{ site.repository }}/issues/5224)) - Update url for OpenShift ([#5320]({{ site.repository }}/issues/5320)) -- [docs] add help for missing static_file e.g. on heroku ([#5334]({{ site.repository }}/issues/5334)) +- Add help for missing static_file e.g. on heroku ([#5334]({{ site.repository }}/issues/5334)) - Add a line about updating theme-gems in the docs ([#5318]({{ site.repository }}/issues/5318)) - Explain how to copy a theme's files ([#5335]({{ site.repository }}/issues/5335)) -- [docs] .md as default extension in examples ([#5316]({{ site.repository }}/issues/5316)) +- .md as default extension in examples ([#5316]({{ site.repository }}/issues/5316)) - Fix small typo in docs ([#5347]({{ site.repository }}/issues/5347)) - Add missing period to sentence in first paragraph. ([#5372]({{ site.repository }}/issues/5372)) - added jekyll-spotify plugin ([#5369]({{ site.repository }}/issues/5369)) @@ -595,7 +595,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Add documentation for `relative_url` and `absolute_url` ([#5405]({{ site.repository }}/issues/5405)) - Bugfix on logo in JSON-LD ([#5421]({{ site.repository }}/issues/5421)) - Fix Travis.ci documentation ([#5413]({{ site.repository }}/issues/5413)) -- [docs] Update documentation regarding `bundle install` after `jekyll new` ([#5428]({{ site.repository }}/issues/5428)) +- Update documentation regarding `bundle install` after `jekyll new` ([#5428]({{ site.repository }}/issues/5428)) - Replace classic box-sizing reset with inheritance reset ([#5411]({{ site.repository }}/issues/5411)) - Update Wikipedia YAML list link ([#5452]({{ site.repository }}/issues/5452)) - Add Jekyll 3.3 release post ([#5442]({{ site.repository }}/issues/5442)) @@ -929,7 +929,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Fix broken links to the Code of Conduct ([#4436]({{ site.repository }}/issues/4436)) - Upgrade notes: mention trailing slash in permalink; fixes [#4440]({{ site.repository }}/issues/4440) ([#4455]({{ site.repository }}/issues/4455)) - Add hooks to the plugin categories toc ([#4463]({{ site.repository }}/issues/4463)) -- [add note] Jekyll 3 requires newer version of Ruby. ([#4461]({{ site.repository }}/issues/4461)) +- Jekyll 3 requires newer version of Ruby. ([#4461]({{ site.repository }}/issues/4461)) - Fix typo in upgrading docs ([#4473]({{ site.repository }}/issues/4473)) - Add note about upgrading documentation on jekyllrb.com/help/ ([#4484]({{ site.repository }}/issues/4484)) - Update Rake link ([#4496]({{ site.repository }}/issues/4496)) @@ -1005,7 +1005,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Fix deep_merge_hashes! handling of drops and hashes ([#4359]({{ site.repository }}/issues/4359)) - Page should respect output extension of its permalink ([#4373]({{ site.repository }}/issues/4373)) - Disable auto-regeneration when running server detached ([#4376]({{ site.repository }}/issues/4376)) -- Drop#[]: only use public_send for keys in the content_methods array ([#4388]({{ site.repository }}/issues/4388)) +- Drop#: only use public_send for keys in the content_methods array ([#4388]({{ site.repository }}/issues/4388)) - Extract title from filename successfully when no date. ([#4195]({{ site.repository }}/issues/4195)) ### Development Fixes From 75ba9366df98d7743334b0ee9969b84b132fc9d3 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 19:39:02 +0100 Subject: [PATCH 2651/4996] Docs: Build for production --- docs/_docs/usage.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index dc273b29e90..d4dffa01099 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -21,6 +21,13 @@ jekyll build --watch # watched for changes, and regenerated automatically. ``` +Default URL is set to `http://localhost:4000` in development environment. {% include docs_version_badge.html version="3.3.0" %} + +If you want to build for your production environment: + + - Set your production URL in `_config.yml` e.g. `url: https://example.com`. + - Run `JEKYLL_ENV=production bundle exec jekyll build`. +
    Changes to _config.yml are not included during automatic regeneration.

    From e8c8eacf7bf24fa5cacc4e434aa15774c3a728a0 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 19:40:10 +0100 Subject: [PATCH 2652/4996] Dev: Run preview in incremental mode --- rake/site.rake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rake/site.rake b/rake/site.rake index 10d48c52651..d260e4472be 100644 --- a/rake/site.rake +++ b/rake/site.rake @@ -27,6 +27,8 @@ namespace :site do options = { "source" => File.expand_path(docs_folder), "destination" => File.expand_path("#{docs_folder}/_site"), + "incremental" => true, + "profile" => true, "watch" => true, "serving" => true, } From e3142e4c5a9b3a1001513f5970b482c23a1f80c0 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 3 Dec 2017 19:52:37 +0100 Subject: [PATCH 2653/4996] Docs: Add title and anchor --- docs/_docs/usage.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index d4dffa01099..a4201c1e1d3 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -21,7 +21,9 @@ jekyll build --watch # watched for changes, and regenerated automatically. ``` -Default URL is set to `http://localhost:4000` in development environment. {% include docs_version_badge.html version="3.3.0" %} +## Override default development settings + +Default URL is set to `http://localhost:4000` in development environment. {% include docs_version_badge.html version="3.3.0" %} If you want to build for your production environment: From 50ff219ba2aa4c9c8b267d231eed3813997fdd6d Mon Sep 17 00:00:00 2001 From: Alex Wood Date: Wed, 6 Dec 2017 16:33:51 -0500 Subject: [PATCH 2654/4996] Add LiveReload functionality to Jekyll. (#5142) Merge pull request 5142 --- Gemfile | 1 + jekyll.gemspec | 1 + lib/jekyll/commands/serve.rb | 179 ++- .../commands/serve/live_reload_reactor.rb | 153 +++ .../serve/livereload_assets/livereload.js | 1183 +++++++++++++++++ lib/jekyll/commands/serve/servlet.rb | 137 ++ lib/jekyll/commands/serve/websockets.rb | 80 ++ lib/jekyll/utils.rb | 1 + lib/jekyll/utils/thread_event.rb | 35 + test/test_commands_serve.rb | 125 ++ 10 files changed, 1875 insertions(+), 20 deletions(-) create mode 100644 lib/jekyll/commands/serve/live_reload_reactor.rb create mode 100644 lib/jekyll/commands/serve/livereload_assets/livereload.js create mode 100644 lib/jekyll/commands/serve/websockets.rb create mode 100644 lib/jekyll/utils/thread_event.rb diff --git a/Gemfile b/Gemfile index 68bc28c24a5..f7000acb61a 100644 --- a/Gemfile +++ b/Gemfile @@ -24,6 +24,7 @@ end group :test do gem "codeclimate-test-reporter", "~> 1.0.5" gem "cucumber", RUBY_VERSION >= "2.2" ? "~> 3.0" : "3.0.1" + gem "httpclient" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" # nokogiri v1.8 does not work with ruby 2.1 and below diff --git a/jekyll.gemspec b/jekyll.gemspec index 90ad0ceb846..b434881cace 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -32,6 +32,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("addressable", "~> 2.4") s.add_runtime_dependency("colorator", "~> 1.0") + s.add_runtime_dependency("em-websocket", "~> 0.5") s.add_runtime_dependency("i18n", "~> 0.7") s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") s.add_runtime_dependency("jekyll-watch", "~> 2.0") diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 9861d2c68d7..50438b5f7d5 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -1,20 +1,43 @@ # frozen_string_literal: true +require "thread" + module Jekyll module Commands class Serve < Command + # Similar to the pattern in Utils::ThreadEvent except we are maintaining the + # state of @running instead of just signaling an event. We have to maintain this + # state since Serve is just called via class methods instead of an instance + # being created each time. + @mutex = Mutex.new + @run_cond = ConditionVariable.new + @running = false + class << self COMMAND_OPTIONS = { - "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], - "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], - "open_url" => ["-o", "--open-url", "Launch your site in a browser"], - "detach" => ["-B", "--detach", "Run the server in the background"], - "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], - "port" => ["-P", "--port [PORT]", "Port to listen on"], - "show_dir_listing" => ["--show-dir-listing", + "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], + "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], + "open_url" => ["-o", "--open-url", "Launch your site in a browser"], + "detach" => ["-B", "--detach", + "Run the server in the background",], + "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], + "port" => ["-P", "--port [PORT]", "Port to listen on"], + "show_dir_listing" => ["--show-dir-listing", "Show a directory listing instead of loading your index file.",], - "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", + "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", "Skips the initial site build which occurs before the server is started.",], + "livereload" => ["-l", "--livereload", + "Use LiveReload to automatically refresh browsers",], + "livereload_ignore" => ["--livereload-ignore ignore GLOB1[,GLOB2[,...]]", + Array, + "Files for LiveReload to ignore. Remember to quote the values so your shell "\ + "won't expand them",], + "livereload_min_delay" => ["--livereload-min-delay [SECONDS]", + "Minimum reload delay",], + "livereload_max_delay" => ["--livereload-max-delay [SECONDS]", + "Maximum reload delay",], + "livereload_port" => ["--livereload-port [PORT]", Integer, + "Port for LiveReload to listen on",], }.freeze DIRECTORY_INDEX = %w( @@ -26,7 +49,11 @@ class << self index.json ).freeze - # + LIVERELOAD_PORT = 35_729 + LIVERELOAD_DIR = File.join(__dir__, "serve", "livereload_assets") + + attr_reader :mutex, :run_cond, :running + alias_method :running?, :running def init_with_program(prog) prog.command(:serve) do |cmd| @@ -41,20 +68,34 @@ def init_with_program(prog) end cmd.action do |_, opts| + opts["livereload_port"] ||= LIVERELOAD_PORT opts["serving"] = true opts["watch" ] = true unless opts.key?("watch") - config = configuration_from_options(opts) - if Jekyll.env == "development" - config["url"] = default_url(config) - end - [Build, Serve].each { |klass| klass.process(config) } + start(opts) end end end # + def start(opts) + # Set the reactor to nil so any old reactor will be GCed. + # We can't unregister a hook so in testing when Serve.start is + # called multiple times we don't want to inadvertently keep using + # a reactor created by a previous test when our test might not + @reload_reactor = nil + + register_reload_hooks(opts) if opts["livereload"] + config = configuration_from_options(opts) + if Jekyll.env == "development" + config["url"] = default_url(config) + end + [Build, Serve].each { |klass| klass.process(config) } + end + + # + def process(opts) opts = configuration_from_options(opts) destination = opts["destination"] @@ -63,6 +104,76 @@ def process(opts) start_up_webrick(opts, destination) end + def shutdown + @server.shutdown if running? + end + + # Perform logical validation of CLI options + + private + def validate_options(opts) + if opts["livereload"] + if opts["detach"] + Jekyll.logger.warn "Warning:", + "--detach and --livereload are mutually exclusive. Choosing --livereload" + opts["detach"] = false + end + if opts["ssl_cert"] || opts["ssl_key"] + # This is not technically true. LiveReload works fine over SSL, but + # EventMachine's SSL support in Windows requires building the gem's + # native extensions against OpenSSL and that proved to be a process + # so tedious that expecting users to do it is a non-starter. + Jekyll.logger.abort_with "Error:", "LiveReload does not support SSL" + end + unless opts["watch"] + # Using livereload logically implies you want to watch the files + opts["watch"] = true + end + elsif %w(livereload_min_delay + livereload_max_delay + livereload_ignore + livereload_port).any? { |o| opts[o] } + Jekyll.logger.abort_with "--livereload-min-delay, "\ + "--livereload-max-delay, --livereload-ignore, and "\ + "--livereload-port require the --livereload option." + end + end + + # + + private + # rubocop:disable Metrics/AbcSize + def register_reload_hooks(opts) + require_relative "serve/live_reload_reactor" + @reload_reactor = LiveReloadReactor.new + + Jekyll::Hooks.register(:site, :post_render) do |site| + regenerator = Jekyll::Regenerator.new(site) + @changed_pages = site.pages.select do |p| + regenerator.regenerate?(p) + end + end + + # A note on ignoring files: LiveReload errs on the side of reloading when it + # comes to the message it gets. If, for example, a page is ignored but a CSS + # file linked in the page isn't, the page will still be reloaded if the CSS + # file is contained in the message sent to LiveReload. Additionally, the + # path matching is very loose so that a message to reload "/" will always + # lead the page to reload since every page starts with "/". + Jekyll::Hooks.register(:site, :post_write) do + if @changed_pages && @reload_reactor && @reload_reactor.running? + ignore, @changed_pages = @changed_pages.partition do |p| + Array(opts["livereload_ignore"]).any? do |filter| + File.fnmatch(filter, Jekyll.sanitized_path(p.relative_path)) + end + end + Jekyll.logger.debug "LiveReload:", "Ignoring #{ignore.map(&:relative_path)}" + @reload_reactor.reload(@changed_pages) + end + @changed_pages = nil + end + end + # Do a base pre-setup of WEBRick so that everything is in place # when we get ready to party, checking for an setting up an error page # and making sure our destination exists. @@ -92,6 +203,7 @@ def webrick_opts(opts) :MimeTypes => mime_types, :DocumentRoot => opts["destination"], :StartCallback => start_callback(opts["detach"]), + :StopCallback => stop_callback(opts["detach"]), :BindAddress => opts["host"], :Port => opts["port"], :DirectoryIndex => DIRECTORY_INDEX, @@ -108,11 +220,16 @@ def webrick_opts(opts) private def start_up_webrick(opts, destination) - server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } - server.mount(opts["baseurl"].to_s, Servlet, destination, file_handler_opts) - Jekyll.logger.info "Server address:", server_address(server, opts) - launch_browser server, opts if opts["open_url"] - boot_or_detach server, opts + if opts["livereload"] + @reload_reactor.start(opts) + end + + @server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } + @server.mount(opts["baseurl"].to_s, Servlet, destination, file_handler_opts) + + Jekyll.logger.info "Server address:", server_address(@server, opts) + launch_browser @server, opts if opts["open_url"] + boot_or_detach @server, opts end # Recreate NondisclosureName under utf-8 circumstance @@ -227,7 +344,29 @@ def enable_ssl(opts) def start_callback(detached) unless detached proc do - Jekyll.logger.info("Server running...", "press ctrl-c to stop.") + mutex.synchronize do + # Block until EventMachine reactor starts + @reload_reactor.started_event.wait unless @reload_reactor.nil? + @running = true + Jekyll.logger.info("Server running...", "press ctrl-c to stop.") + @run_cond.broadcast + end + end + end + end + + private + def stop_callback(detached) + unless detached + proc do + mutex.synchronize do + unless @reload_reactor.nil? + @reload_reactor.stop + @reload_reactor.stopped_event.wait + end + @running = false + @run_cond.broadcast + end end end end diff --git a/lib/jekyll/commands/serve/live_reload_reactor.rb b/lib/jekyll/commands/serve/live_reload_reactor.rb new file mode 100644 index 00000000000..498e78aeee4 --- /dev/null +++ b/lib/jekyll/commands/serve/live_reload_reactor.rb @@ -0,0 +1,153 @@ +# frozen_string_literal: true + +require "json" +require "em-websocket" + +require_relative "websockets" + +module Jekyll + module Commands + class Serve + class LiveReloadReactor + attr_reader :started_event + attr_reader :stopped_event + attr_reader :thread + + def initialize + @thread = nil + @websockets = [] + @connections_count = 0 + @started_event = Utils::ThreadEvent.new + @stopped_event = Utils::ThreadEvent.new + end + + def stop + # There is only one EventMachine instance per Ruby process so stopping + # it here will stop the reactor thread we have running. + EM.stop if EM.reactor_running? + Jekyll.logger.debug("LiveReload Server:", "halted") + end + + def running? + EM.reactor_running? + end + + def handle_websockets_event(ws) + ws.onopen do |handshake| + connect(ws, handshake) + end + + ws.onclose do + disconnect(ws) + end + + ws.onmessage do |msg| + print_message(msg) + end + + ws.onerror do |error| + log_error(error) + end + end + + # rubocop:disable Metrics/MethodLength + def start(opts) + @thread = Thread.new do + # Use epoll if the kernel supports it + EM.epoll + EM.run do + EM.error_handler do |e| + log_error(e) + end + + EM.start_server( + opts["host"], + opts["livereload_port"], + HttpAwareConnection, + opts + ) do |ws| + handle_websockets_event(ws) + end + + # Notify blocked threads that EventMachine has started or shutdown + EM.schedule do + @started_event.set + end + + EM.add_shutdown_hook do + @stopped_event.set + end + + Jekyll.logger.info( + "LiveReload address:", "#{opts["host"]}:#{opts["livereload_port"]}" + ) + end + end + @thread.abort_on_exception = true + end + + # For a description of the protocol see + # http://feedback.livereload.com/knowledgebase/articles/86174-livereload-protocol + def reload(pages) + pages.each do |p| + msg = { + :command => "reload", + :path => p.url, + :liveCSS => true, + } + + Jekyll.logger.debug("LiveReload:", "Reloading #{p.url}") + Jekyll.logger.debug(JSON.dump(msg)) + @websockets.each do |ws| + ws.send(JSON.dump(msg)) + end + end + end + + private + def connect(ws, handshake) + @connections_count += 1 + if @connections_count == 1 + message = "Browser connected" + message += " over SSL/TLS" if handshake.secure? + Jekyll.logger.info("LiveReload:", message) + end + ws.send( + JSON.dump( + :command => "hello", + :protocols => ["http://livereload.com/protocols/official-7"], + :serverName => "jekyll" + ) + ) + + @websockets << ws + end + + private + def disconnect(ws) + @websockets.delete(ws) + end + + private + def print_message(json_message) + msg = JSON.parse(json_message) + # Not sure what the 'url' command even does in LiveReload. The spec is silent + # on its purpose. + if msg["command"] == "url" + Jekyll.logger.info("LiveReload:", "Browser URL: #{msg["url"]}") + end + end + + private + def log_error(e) + Jekyll.logger.warn( + "LiveReload experienced an error. "\ + "Run with --verbose for more information." + ) + Jekyll.logger.debug("LiveReload Error:", e.message) + Jekyll.logger.debug("LiveReload Error:", e.backtrace.join("\n")) + end + end + end + end +end diff --git a/lib/jekyll/commands/serve/livereload_assets/livereload.js b/lib/jekyll/commands/serve/livereload_assets/livereload.js new file mode 100644 index 00000000000..eee60ec8b1d --- /dev/null +++ b/lib/jekyll/commands/serve/livereload_assets/livereload.js @@ -0,0 +1,1183 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o tag"); + return; + } + } + this.reloader = new Reloader(this.window, this.console, Timer); + this.connector = new Connector(this.options, this.WebSocket, Timer, { + connecting: (function(_this) { + return function() {}; + })(this), + socketConnected: (function(_this) { + return function() {}; + })(this), + connected: (function(_this) { + return function(protocol) { + var _base; + if (typeof (_base = _this.listeners).connect === "function") { + _base.connect(); + } + _this.log("LiveReload is connected to " + _this.options.host + ":" + _this.options.port + " (protocol v" + protocol + ")."); + return _this.analyze(); + }; + })(this), + error: (function(_this) { + return function(e) { + if (e instanceof ProtocolError) { + if (typeof console !== "undefined" && console !== null) { + return console.log("" + e.message + "."); + } + } else { + if (typeof console !== "undefined" && console !== null) { + return console.log("LiveReload internal error: " + e.message); + } + } + }; + })(this), + disconnected: (function(_this) { + return function(reason, nextDelay) { + var _base; + if (typeof (_base = _this.listeners).disconnect === "function") { + _base.disconnect(); + } + switch (reason) { + case 'cannot-connect': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + ", will retry in " + nextDelay + " sec."); + case 'broken': + return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + ", reconnecting in " + nextDelay + " sec."); + case 'handshake-timeout': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake timeout), will retry in " + nextDelay + " sec."); + case 'handshake-failed': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake failed), will retry in " + nextDelay + " sec."); + case 'manual': + break; + case 'error': + break; + default: + return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + " (" + reason + "), reconnecting in " + nextDelay + " sec."); + } + }; + })(this), + message: (function(_this) { + return function(message) { + switch (message.command) { + case 'reload': + return _this.performReload(message); + case 'alert': + return _this.performAlert(message); + } + }; + })(this) + }); + this.initialized = true; + } + + LiveReload.prototype.on = function(eventName, handler) { + return this.listeners[eventName] = handler; + }; + + LiveReload.prototype.log = function(message) { + return this.console.log("" + message); + }; + + LiveReload.prototype.performReload = function(message) { + var _ref, _ref1; + this.log("LiveReload received reload request: " + (JSON.stringify(message, null, 2))); + return this.reloader.reload(message.path, { + liveCSS: (_ref = message.liveCSS) != null ? _ref : true, + liveImg: (_ref1 = message.liveImg) != null ? _ref1 : true, + originalPath: message.originalPath || '', + overrideURL: message.overrideURL || '', + serverURL: "http://" + this.options.host + ":" + this.options.port + }); + }; + + LiveReload.prototype.performAlert = function(message) { + return alert(message.message); + }; + + LiveReload.prototype.shutDown = function() { + var _base; + if (!this.initialized) { + return; + } + this.connector.disconnect(); + this.log("LiveReload disconnected."); + return typeof (_base = this.listeners).shutdown === "function" ? _base.shutdown() : void 0; + }; + + LiveReload.prototype.hasPlugin = function(identifier) { + return !!this.pluginIdentifiers[identifier]; + }; + + LiveReload.prototype.addPlugin = function(pluginClass) { + var plugin; + if (!this.initialized) { + return; + } + if (this.hasPlugin(pluginClass.identifier)) { + return; + } + this.pluginIdentifiers[pluginClass.identifier] = true; + plugin = new pluginClass(this.window, { + _livereload: this, + _reloader: this.reloader, + _connector: this.connector, + console: this.console, + Timer: Timer, + generateCacheBustUrl: (function(_this) { + return function(url) { + return _this.reloader.generateCacheBustUrl(url); + }; + })(this) + }); + this.plugins.push(plugin); + this.reloader.addPlugin(plugin); + }; + + LiveReload.prototype.analyze = function() { + var plugin, pluginData, pluginsData, _i, _len, _ref; + if (!this.initialized) { + return; + } + if (!(this.connector.protocol >= 7)) { + return; + } + pluginsData = {}; + _ref = this.plugins; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i]; + pluginsData[plugin.constructor.identifier] = pluginData = (typeof plugin.analyze === "function" ? plugin.analyze() : void 0) || {}; + pluginData.version = plugin.constructor.version; + } + this.connector.sendCommand({ + command: 'info', + plugins: pluginsData, + url: this.window.location.href + }); + }; + + return LiveReload; + + })(); + +}).call(this); + +},{"./connector":1,"./options":5,"./reloader":7,"./timer":9}],5:[function(require,module,exports){ +(function() { + var Options; + + exports.Options = Options = (function() { + function Options() { + this.https = false; + this.host = null; + this.port = 35729; + this.snipver = null; + this.ext = null; + this.extver = null; + this.mindelay = 1000; + this.maxdelay = 60000; + this.handshake_timeout = 5000; + } + + Options.prototype.set = function(name, value) { + if (typeof value === 'undefined') { + return; + } + if (!isNaN(+value)) { + value = +value; + } + return this[name] = value; + }; + + return Options; + + })(); + + Options.extract = function(document) { + var element, keyAndValue, m, mm, options, pair, src, _i, _j, _len, _len1, _ref, _ref1; + _ref = document.getElementsByTagName('script'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + if ((src = element.src) && (m = src.match(/^[^:]+:\/\/(.*)\/z?livereload\.js(?:\?(.*))?$/))) { + options = new Options(); + options.https = src.indexOf("https") === 0; + if (mm = m[1].match(/^([^\/:]+)(?::(\d+))?$/)) { + options.host = mm[1]; + if (mm[2]) { + options.port = parseInt(mm[2], 10); + } + } + if (m[2]) { + _ref1 = m[2].split('&'); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + pair = _ref1[_j]; + if ((keyAndValue = pair.split('=')).length > 1) { + options.set(keyAndValue[0].replace(/-/g, '_'), keyAndValue.slice(1).join('=')); + } + } + } + return options; + } + } + return null; + }; + +}).call(this); + +},{}],6:[function(require,module,exports){ +(function() { + var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6'; + + exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7'; + + exports.ProtocolError = ProtocolError = (function() { + function ProtocolError(reason, data) { + this.message = "LiveReload protocol error (" + reason + ") after receiving data: \"" + data + "\"."; + } + + return ProtocolError; + + })(); + + exports.Parser = Parser = (function() { + function Parser(handlers) { + this.handlers = handlers; + this.reset(); + } + + Parser.prototype.reset = function() { + return this.protocol = null; + }; + + Parser.prototype.process = function(data) { + var command, e, message, options, _ref; + try { + if (this.protocol == null) { + if (data.match(/^!!ver:([\d.]+)$/)) { + this.protocol = 6; + } else if (message = this._parseMessage(data, ['hello'])) { + if (!message.protocols.length) { + throw new ProtocolError("no protocols specified in handshake message"); + } else if (__indexOf.call(message.protocols, PROTOCOL_7) >= 0) { + this.protocol = 7; + } else if (__indexOf.call(message.protocols, PROTOCOL_6) >= 0) { + this.protocol = 6; + } else { + throw new ProtocolError("no supported protocols found"); + } + } + return this.handlers.connected(this.protocol); + } else if (this.protocol === 6) { + message = JSON.parse(data); + if (!message.length) { + throw new ProtocolError("protocol 6 messages must be arrays"); + } + command = message[0], options = message[1]; + if (command !== 'refresh') { + throw new ProtocolError("unknown protocol 6 command"); + } + return this.handlers.message({ + command: 'reload', + path: options.path, + liveCSS: (_ref = options.apply_css_live) != null ? _ref : true + }); + } else { + message = this._parseMessage(data, ['reload', 'alert']); + return this.handlers.message(message); + } + } catch (_error) { + e = _error; + if (e instanceof ProtocolError) { + return this.handlers.error(e); + } else { + throw e; + } + } + }; + + Parser.prototype._parseMessage = function(data, validCommands) { + var e, message, _ref; + try { + message = JSON.parse(data); + } catch (_error) { + e = _error; + throw new ProtocolError('unparsable JSON', data); + } + if (!message.command) { + throw new ProtocolError('missing "command" key', data); + } + if (_ref = message.command, __indexOf.call(validCommands, _ref) < 0) { + throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ")", data); + } + return message; + }; + + return Parser; + + })(); + +}).call(this); + +},{}],7:[function(require,module,exports){ +(function() { + var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl; + + splitUrl = function(url) { + var hash, index, params; + if ((index = url.indexOf('#')) >= 0) { + hash = url.slice(index); + url = url.slice(0, index); + } else { + hash = ''; + } + if ((index = url.indexOf('?')) >= 0) { + params = url.slice(index); + url = url.slice(0, index); + } else { + params = ''; + } + return { + url: url, + params: params, + hash: hash + }; + }; + + pathFromUrl = function(url) { + var path; + url = splitUrl(url).url; + if (url.indexOf('file://') === 0) { + path = url.replace(/^file:\/\/(localhost)?/, ''); + } else { + path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/'); + } + return decodeURIComponent(path); + }; + + pickBestMatch = function(path, objects, pathFunc) { + var bestMatch, object, score, _i, _len; + bestMatch = { + score: 0 + }; + for (_i = 0, _len = objects.length; _i < _len; _i++) { + object = objects[_i]; + score = numberOfMatchingSegments(path, pathFunc(object)); + if (score > bestMatch.score) { + bestMatch = { + object: object, + score: score + }; + } + } + if (bestMatch.score > 0) { + return bestMatch; + } else { + return null; + } + }; + + numberOfMatchingSegments = function(path1, path2) { + var comps1, comps2, eqCount, len; + path1 = path1.replace(/^\/+/, '').toLowerCase(); + path2 = path2.replace(/^\/+/, '').toLowerCase(); + if (path1 === path2) { + return 10000; + } + comps1 = path1.split('/').reverse(); + comps2 = path2.split('/').reverse(); + len = Math.min(comps1.length, comps2.length); + eqCount = 0; + while (eqCount < len && comps1[eqCount] === comps2[eqCount]) { + ++eqCount; + } + return eqCount; + }; + + pathsMatch = function(path1, path2) { + return numberOfMatchingSegments(path1, path2) > 0; + }; + + IMAGE_STYLES = [ + { + selector: 'background', + styleNames: ['backgroundImage'] + }, { + selector: 'border', + styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage'] + } + ]; + + exports.Reloader = Reloader = (function() { + function Reloader(window, console, Timer) { + this.window = window; + this.console = console; + this.Timer = Timer; + this.document = this.window.document; + this.importCacheWaitPeriod = 200; + this.plugins = []; + } + + Reloader.prototype.addPlugin = function(plugin) { + return this.plugins.push(plugin); + }; + + Reloader.prototype.analyze = function(callback) { + return results; + }; + + Reloader.prototype.reload = function(path, options) { + var plugin, _base, _i, _len, _ref; + this.options = options; + if ((_base = this.options).stylesheetReloadTimeout == null) { + _base.stylesheetReloadTimeout = 15000; + } + _ref = this.plugins; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i]; + if (plugin.reload && plugin.reload(path, options)) { + return; + } + } + if (options.liveCSS) { + if (path.match(/\.css$/i)) { + if (this.reloadStylesheet(path)) { + return; + } + } + } + if (options.liveImg) { + if (path.match(/\.(jpe?g|png|gif)$/i)) { + this.reloadImages(path); + return; + } + } + return this.reloadPage(); + }; + + Reloader.prototype.reloadPage = function() { + return this.window.document.location.reload(); + }; + + Reloader.prototype.reloadImages = function(path) { + var expando, img, selector, styleNames, styleSheet, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _results; + expando = this.generateUniqueString(); + _ref = this.document.images; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + img = _ref[_i]; + if (pathsMatch(path, pathFromUrl(img.src))) { + img.src = this.generateCacheBustUrl(img.src, expando); + } + } + if (this.document.querySelectorAll) { + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + _ref1 = IMAGE_STYLES[_j], selector = _ref1.selector, styleNames = _ref1.styleNames; + _ref2 = this.document.querySelectorAll("[style*=" + selector + "]"); + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + img = _ref2[_k]; + this.reloadStyleImages(img.style, styleNames, path, expando); + } + } + } + if (this.document.styleSheets) { + _ref3 = this.document.styleSheets; + _results = []; + for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { + styleSheet = _ref3[_l]; + _results.push(this.reloadStylesheetImages(styleSheet, path, expando)); + } + return _results; + } + }; + + Reloader.prototype.reloadStylesheetImages = function(styleSheet, path, expando) { + var e, rule, rules, styleNames, _i, _j, _len, _len1; + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0; + } catch (_error) { + e = _error; + } + if (!rules) { + return; + } + for (_i = 0, _len = rules.length; _i < _len; _i++) { + rule = rules[_i]; + switch (rule.type) { + case CSSRule.IMPORT_RULE: + this.reloadStylesheetImages(rule.styleSheet, path, expando); + break; + case CSSRule.STYLE_RULE: + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + styleNames = IMAGE_STYLES[_j].styleNames; + this.reloadStyleImages(rule.style, styleNames, path, expando); + } + break; + case CSSRule.MEDIA_RULE: + this.reloadStylesheetImages(rule, path, expando); + } + } + }; + + Reloader.prototype.reloadStyleImages = function(style, styleNames, path, expando) { + var newValue, styleName, value, _i, _len; + for (_i = 0, _len = styleNames.length; _i < _len; _i++) { + styleName = styleNames[_i]; + value = style[styleName]; + if (typeof value === 'string') { + newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function(_this) { + return function(match, src) { + if (pathsMatch(path, pathFromUrl(src))) { + return "url(" + (_this.generateCacheBustUrl(src, expando)) + ")"; + } else { + return match; + } + }; + })(this)); + if (newValue !== value) { + style[styleName] = newValue; + } + } + } + }; + + Reloader.prototype.reloadStylesheet = function(path) { + var imported, link, links, match, style, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1; + links = (function() { + var _i, _len, _ref, _results; + _ref = this.document.getElementsByTagName('link'); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + link = _ref[_i]; + if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) { + _results.push(link); + } + } + return _results; + }).call(this); + imported = []; + _ref = this.document.getElementsByTagName('style'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + style = _ref[_i]; + if (style.sheet) { + this.collectImportedStylesheets(style, style.sheet, imported); + } + } + for (_j = 0, _len1 = links.length; _j < _len1; _j++) { + link = links[_j]; + this.collectImportedStylesheets(link, link.sheet, imported); + } + if (this.window.StyleFix && this.document.querySelectorAll) { + _ref1 = this.document.querySelectorAll('style[data-href]'); + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + style = _ref1[_k]; + links.push(style); + } + } + this.console.log("LiveReload found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets"); + match = pickBestMatch(path, links.concat(imported), (function(_this) { + return function(l) { + return pathFromUrl(_this.linkHref(l)); + }; + })(this)); + if (match) { + if (match.object.rule) { + this.console.log("LiveReload is reloading imported stylesheet: " + match.object.href); + this.reattachImportedRule(match.object); + } else { + this.console.log("LiveReload is reloading stylesheet: " + (this.linkHref(match.object))); + this.reattachStylesheetLink(match.object); + } + } else { + this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one"); + for (_l = 0, _len3 = links.length; _l < _len3; _l++) { + link = links[_l]; + this.reattachStylesheetLink(link); + } + } + return true; + }; + + Reloader.prototype.collectImportedStylesheets = function(link, styleSheet, result) { + var e, index, rule, rules, _i, _len; + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0; + } catch (_error) { + e = _error; + } + if (rules && rules.length) { + for (index = _i = 0, _len = rules.length; _i < _len; index = ++_i) { + rule = rules[index]; + switch (rule.type) { + case CSSRule.CHARSET_RULE: + continue; + case CSSRule.IMPORT_RULE: + result.push({ + link: link, + rule: rule, + index: index, + href: rule.href + }); + this.collectImportedStylesheets(link, rule.styleSheet, result); + break; + default: + break; + } + } + } + }; + + Reloader.prototype.waitUntilCssLoads = function(clone, func) { + var callbackExecuted, executeCallback, poll; + callbackExecuted = false; + executeCallback = (function(_this) { + return function() { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + return func(); + }; + })(this); + clone.onload = (function(_this) { + return function() { + _this.console.log("LiveReload: the new stylesheet has finished loading"); + _this.knownToSupportCssOnLoad = true; + return executeCallback(); + }; + })(this); + if (!this.knownToSupportCssOnLoad) { + (poll = (function(_this) { + return function() { + if (clone.sheet) { + _this.console.log("LiveReload is polling until the new CSS finishes loading..."); + return executeCallback(); + } else { + return _this.Timer.start(50, poll); + } + }; + })(this))(); + } + return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback); + }; + + Reloader.prototype.linkHref = function(link) { + return link.href || link.getAttribute('data-href'); + }; + + Reloader.prototype.reattachStylesheetLink = function(link) { + var clone, parent; + if (link.__LiveReload_pendingRemoval) { + return; + } + link.__LiveReload_pendingRemoval = true; + if (link.tagName === 'STYLE') { + clone = this.document.createElement('link'); + clone.rel = 'stylesheet'; + clone.media = link.media; + clone.disabled = link.disabled; + } else { + clone = link.cloneNode(false); + } + clone.href = this.generateCacheBustUrl(this.linkHref(link)); + parent = link.parentNode; + if (parent.lastChild === link) { + parent.appendChild(clone); + } else { + parent.insertBefore(clone, link.nextSibling); + } + return this.waitUntilCssLoads(clone, (function(_this) { + return function() { + var additionalWaitingTime; + if (/AppleWebKit/.test(navigator.userAgent)) { + additionalWaitingTime = 5; + } else { + additionalWaitingTime = 200; + } + return _this.Timer.start(additionalWaitingTime, function() { + var _ref; + if (!link.parentNode) { + return; + } + link.parentNode.removeChild(link); + clone.onreadystatechange = null; + return (_ref = _this.window.StyleFix) != null ? _ref.link(clone) : void 0; + }); + }; + })(this)); + }; + + Reloader.prototype.reattachImportedRule = function(_arg) { + var href, index, link, media, newRule, parent, rule, tempLink; + rule = _arg.rule, index = _arg.index, link = _arg.link; + parent = rule.parentStyleSheet; + href = this.generateCacheBustUrl(rule.href); + media = rule.media.length ? [].join.call(rule.media, ', ') : ''; + newRule = "@import url(\"" + href + "\") " + media + ";"; + rule.__LiveReload_newHref = href; + tempLink = this.document.createElement("link"); + tempLink.rel = 'stylesheet'; + tempLink.href = href; + tempLink.__LiveReload_pendingRemoval = true; + if (link.parentNode) { + link.parentNode.insertBefore(tempLink, link); + } + return this.Timer.start(this.importCacheWaitPeriod, (function(_this) { + return function() { + if (tempLink.parentNode) { + tempLink.parentNode.removeChild(tempLink); + } + if (rule.__LiveReload_newHref !== href) { + return; + } + parent.insertRule(newRule, index); + parent.deleteRule(index + 1); + rule = parent.cssRules[index]; + rule.__LiveReload_newHref = href; + return _this.Timer.start(_this.importCacheWaitPeriod, function() { + if (rule.__LiveReload_newHref !== href) { + return; + } + parent.insertRule(newRule, index); + return parent.deleteRule(index + 1); + }); + }; + })(this)); + }; + + Reloader.prototype.generateUniqueString = function() { + return 'livereload=' + Date.now(); + }; + + Reloader.prototype.generateCacheBustUrl = function(url, expando) { + var hash, oldParams, originalUrl, params, _ref; + if (expando == null) { + expando = this.generateUniqueString(); + } + _ref = splitUrl(url), url = _ref.url, hash = _ref.hash, oldParams = _ref.params; + if (this.options.overrideURL) { + if (url.indexOf(this.options.serverURL) < 0) { + originalUrl = url; + url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url); + this.console.log("LiveReload is overriding source URL " + originalUrl + " with " + url); + } + } + params = oldParams.replace(/(\?|&)livereload=(\d+)/, function(match, sep) { + return "" + sep + expando; + }); + if (params === oldParams) { + if (oldParams.length === 0) { + params = "?" + expando; + } else { + params = "" + oldParams + "&" + expando; + } + } + return url + params + hash; + }; + + return Reloader; + + })(); + +}).call(this); + +},{}],8:[function(require,module,exports){ +(function() { + var CustomEvents, LiveReload, k; + + CustomEvents = require('./customevents'); + + LiveReload = window.LiveReload = new (require('./livereload').LiveReload)(window); + + for (k in window) { + if (k.match(/^LiveReloadPlugin/)) { + LiveReload.addPlugin(window[k]); + } + } + + LiveReload.addPlugin(require('./less')); + + LiveReload.on('shutdown', function() { + return delete window.LiveReload; + }); + + LiveReload.on('connect', function() { + return CustomEvents.fire(document, 'LiveReloadConnect'); + }); + + LiveReload.on('disconnect', function() { + return CustomEvents.fire(document, 'LiveReloadDisconnect'); + }); + + CustomEvents.bind(document, 'LiveReloadShutDown', function() { + return LiveReload.shutDown(); + }); + +}).call(this); + +},{"./customevents":2,"./less":3,"./livereload":4}],9:[function(require,module,exports){ +(function() { + var Timer; + + exports.Timer = Timer = (function() { + function Timer(func) { + this.func = func; + this.running = false; + this.id = null; + this._handler = (function(_this) { + return function() { + _this.running = false; + _this.id = null; + return _this.func(); + }; + })(this); + } + + Timer.prototype.start = function(timeout) { + if (this.running) { + clearTimeout(this.id); + } + this.id = setTimeout(this._handler, timeout); + return this.running = true; + }; + + Timer.prototype.stop = function() { + if (this.running) { + clearTimeout(this.id); + this.running = false; + return this.id = null; + } + }; + + return Timer; + + })(); + + Timer.start = function(timeout, func) { + return setTimeout(func, timeout); + }; + +}).call(this); + +},{}]},{},[8]); diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 70b6d66df34..640720ee7d8 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -5,6 +5,128 @@ module Jekyll module Commands class Serve + # This class is used to determine if the Servlet should modify a served file + # to insert the LiveReload script tags + class SkipAnalyzer + BAD_USER_AGENTS = [%r!MSIE!].freeze + + def self.skip_processing?(request, response, options) + new(request, response, options).skip_processing? + end + + def initialize(request, response, options) + @options = options + @request = request + @response = response + end + + def skip_processing? + !html? || chunked? || inline? || bad_browser? + end + + def chunked? + @response["Transfer-Encoding"] == "chunked" + end + + def inline? + @response["Content-Disposition"] =~ %r!^inline! + end + + def bad_browser? + BAD_USER_AGENTS.any? { |pattern| @request["User-Agent"] =~ pattern } + end + + def html? + @response["Content-Type"] =~ %r!text/html! + end + end + + # This class inserts the LiveReload script tags into HTML as it is served + class BodyProcessor + HEAD_TAG_REGEX = %r!|! + + attr_reader :content_length, :new_body, :livereload_added + + def initialize(body, options) + @body = body + @options = options + @processed = false + end + + def processed? + @processed + end + + # rubocop:disable Metrics/MethodLength + def process! + @new_body = [] + # @body will usually be a File object but Strings occur in rare cases + if @body.respond_to?(:each) + begin + @body.each { |line| @new_body << line.to_s } + ensure + @body.close + end + else + @new_body = @body.lines + end + + @content_length = 0 + @livereload_added = false + + @new_body.each do |line| + if !@livereload_added && line[" + document.write( + ' + TEMPLATE + ERB.new(Jekyll::Utils.strip_heredoc(template)) + end + + def livereload_args + # XHTML standard requires ampersands to be encoded as entities when in + # attributes. See http://stackoverflow.com/a/2190292 + src = "" + if @options["livereload_min_delay"] + src += "&mindelay=#{@options["livereload_min_delay"]}" + end + if @options["livereload_max_delay"] + src += "&maxdelay=#{@options["livereload_max_delay"]}" + end + if @options["livereload_port"] + src += "&port=#{@options["livereload_port"]}" + end + src + end + end + class Servlet < WEBrick::HTTPServlet::FileHandler DEFAULTS = { "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ @@ -34,6 +156,21 @@ def search_file(req, res, basename) # rubocop:disable Naming/MethodName def do_GET(req, res) rtn = super + + if @jekyll_opts["livereload"] + return rtn if SkipAnalyzer.skip_processing?(req, res, @jekyll_opts) + + processor = BodyProcessor.new(res.body, @jekyll_opts) + processor.process! + res.body = processor.new_body + res.content_length = processor.content_length.to_s + + if processor.livereload_added + # Add a header to indicate that the page content has been modified + res["X-Rack-LiveReload"] = "1" + end + end + validate_and_ensure_charset(req, res) res.header.merge!(@headers) rtn diff --git a/lib/jekyll/commands/serve/websockets.rb b/lib/jekyll/commands/serve/websockets.rb new file mode 100644 index 00000000000..1e5f948e2be --- /dev/null +++ b/lib/jekyll/commands/serve/websockets.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require "http/parser" + +module Jekyll + module Commands + class Serve + # The LiveReload protocol requires the server to serve livereload.js over HTTP + # despite the fact that the protocol itself uses WebSockets. This custom connection + # class addresses the dual protocols that the server needs to understand. + class HttpAwareConnection < EventMachine::WebSocket::Connection + attr_reader :reload_body, :reload_size + + def initialize(_opts) + # If EventMachine SSL support on Windows ever gets better, the code below will + # set up the reactor to handle SSL + # + # @ssl_enabled = opts["ssl_cert"] && opts["ssl_key"] + # if @ssl_enabled + # em_opts[:tls_options] = { + # :private_key_file => Jekyll.sanitized_path(opts["source"], opts["ssl_key"]), + # :cert_chain_file => Jekyll.sanitized_path(opts["source"], opts["ssl_cert"]) + # } + # em_opts[:secure] = true + # end + + # This is too noisy even for --verbose, but uncomment if you need it for + # a specific WebSockets issue. Adding ?LR-verbose=true onto the URL will + # enable logging on the client side. + # em_opts[:debug] = true + + em_opts = {} + super(em_opts) + + reload_file = File.join(Serve.singleton_class::LIVERELOAD_DIR, "livereload.js") + + @reload_body = File.read(reload_file) + @reload_size = @reload_body.bytesize + end + + # rubocop:disable Metrics/MethodLength + def dispatch(data) + parser = Http::Parser.new + parser << data + + # WebSockets requests will have a Connection: Upgrade header + if parser.http_method != "GET" || parser.upgrade? + super + elsif parser.request_url =~ %r!^\/livereload.js! + headers = [ + "HTTP/1.1 200 OK", + "Content-Type: application/javascript", + "Content-Length: #{reload_size}", + "", + "", + ].join("\r\n") + send_data(headers) + + # stream_file_data would free us from keeping livereload.js in memory + # but JRuby blocks on that call and never returns + send_data(reload_body) + close_connection_after_writing + else + body = "This port only serves livereload.js over HTTP.\n" + headers = [ + "HTTP/1.1 400 Bad Request", + "Content-Type: text/plain", + "Content-Length: #{body.bytesize}", + "", + "", + ].join("\r\n") + send_data(headers) + send_data(body) + close_connection_after_writing + end + end + end + end + end +end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 55cf9be1e28..1d3cb9c4a72 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -8,6 +8,7 @@ module Utils autoload :Internet, "jekyll/utils/internet" autoload :Platforms, "jekyll/utils/platforms" autoload :Rouge, "jekyll/utils/rouge" + autoload :ThreadEvent, "jekyll/utils/thread_event" autoload :WinTZ, "jekyll/utils/win_tz" # Constants for use in #slugify diff --git a/lib/jekyll/utils/thread_event.rb b/lib/jekyll/utils/thread_event.rb new file mode 100644 index 00000000000..5afb50d93eb --- /dev/null +++ b/lib/jekyll/utils/thread_event.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require "thread" + +module Jekyll + module Utils + # Based on the pattern and code from + # https://emptysqua.re/blog/an-event-synchronization-primitive-for-ruby/ + class ThreadEvent + attr_reader :flag + + def initialize + @lock = Mutex.new + @cond = ConditionVariable.new + @flag = false + end + + def set + @lock.synchronize do + yield if block_given? + @flag = true + @cond.broadcast + end + end + + def wait + @lock.synchronize do + unless @flag + @cond.wait(@lock) + end + end + end + end + end +end diff --git a/test/test_commands_serve.rb b/test/test_commands_serve.rb index 135e83e2dba..fd1751d8d40 100644 --- a/test/test_commands_serve.rb +++ b/test/test_commands_serve.rb @@ -3,7 +3,10 @@ require "webrick" require "mercenary" require "helper" +require "httpclient" require "openssl" +require "thread" +require "tmpdir" class TestCommandsServe < JekyllUnitTest def custom_opts(what) @@ -12,6 +15,128 @@ def custom_opts(what) ) end + def start_server(opts) + @thread = Thread.new do + merc = nil + cmd = Jekyll::Commands::Serve + Mercenary.program(:jekyll) do |p| + merc = cmd.init_with_program(p) + end + merc.execute(:serve, opts) + end + @thread.abort_on_exception = true + + Jekyll::Commands::Serve.mutex.synchronize do + unless Jekyll::Commands::Serve.running? + Jekyll::Commands::Serve.run_cond.wait(Jekyll::Commands::Serve.mutex) + end + end + end + + def serve(opts) + allow(Jekyll).to receive(:configuration).and_return(opts) + allow(Jekyll::Commands::Build).to receive(:process) + + start_server(opts) + + opts + end + + context "using LiveReload" do + setup do + @temp_dir = Dir.mktmpdir("jekyll_livereload_test") + @destination = File.join(@temp_dir, "_site") + Dir.mkdir(@destination) || flunk("Could not make directory #{@destination}") + @client = HTTPClient.new + @client.connect_timeout = 5 + @standard_options = { + "port" => 4000, + "host" => "localhost", + "baseurl" => "", + "detach" => false, + "livereload" => true, + "source" => @temp_dir, + "destination" => @destination, + } + + site = instance_double(Jekyll::Site) + simple_page = <<-HTML.gsub(%r!^\s*!, "") + + + + + Hello World + + +

    Hello! I am a simple web page.

    + + + HTML + + File.open(File.join(@destination, "hello.html"), "w") do |f| + f.write(simple_page) + end + allow(Jekyll::Site).to receive(:new).and_return(site) + end + + teardown do + capture_io do + Jekyll::Commands::Serve.shutdown + end + + Jekyll::Commands::Serve.mutex.synchronize do + if Jekyll::Commands::Serve.running? + Jekyll::Commands::Serve.run_cond.wait(Jekyll::Commands::Serve.mutex) + end + end + + FileUtils.remove_entry_secure(@temp_dir, true) + end + + should "serve livereload.js over HTTP on the default LiveReload port" do + skip_if_windows "EventMachine support on Windows is limited" + opts = serve(@standard_options) + content = @client.get_content( + "http://#{opts["host"]}:#{opts["livereload_port"]}/livereload.js" + ) + assert_match(%r!LiveReload.on!, content) + end + + should "serve nothing else over HTTP on the default LiveReload port" do + skip_if_windows "EventMachine support on Windows is limited" + opts = serve(@standard_options) + res = @client.get("http://#{opts["host"]}:#{opts["livereload_port"]}/") + assert_equal(400, res.status_code) + assert_match(%r!only serves livereload.js!, res.content) + end + + should "insert the LiveReload script tags" do + skip_if_windows "EventMachine support on Windows is limited" + opts = serve(@standard_options) + content = @client.get_content( + "http://#{opts["host"]}:#{opts["port"]}/#{opts["baseurl"]}/hello.html" + ) + assert_match( + %r!livereload.js\?snipver=1&port=#{opts["livereload_port"]}!, + content + ) + assert_match(%r!I am a simple web page!, content) + end + + should "apply the max and min delay options" do + skip_if_windows "EventMachine support on Windows is limited" + opts = serve(@standard_options.merge( + "livereload_max_delay" => "1066", + "livereload_min_delay" => "3" + )) + content = @client.get_content( + "http://#{opts["host"]}:#{opts["port"]}/#{opts["baseurl"]}/hello.html" + ) + assert_match(%r!&mindelay=3!, content) + assert_match(%r!&maxdelay=1066!, content) + end + end + context "with a program" do setup do @merc = nil From 28e20b933494edfe147645cd0dbbe3878e1e5659 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 6 Dec 2017 16:33:53 -0500 Subject: [PATCH 2655/4996] Update history to reflect merge of #5142 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 54bd43db93d..9e67e778a8b 100644 --- a/History.markdown +++ b/History.markdown @@ -75,6 +75,7 @@ * Log Kramdown warnings if log level is WARN (#6522) * Add json extension to list of directory indices (#6550) * Dependency: Bump jekyll-watch to 2.0 (#6589) + * Add LiveReload functionality to Jekyll. (#5142) ### Site Enhancements From 64ef79291f625c5df1e1323bb0541a403a74e297 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Fri, 8 Dec 2017 10:50:49 +0100 Subject: [PATCH 2656/4996] Update History.markdown --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9e67e778a8b..426f3976d00 100644 --- a/History.markdown +++ b/History.markdown @@ -73,6 +73,7 @@ * Allow plugins to modify the obsolete files. (#6502) * Add latin mode to slugify (#6509) * Log Kramdown warnings if log level is WARN (#6522) + * Add an option to configure kramdown warning output (#6554) * Add json extension to list of directory indices (#6550) * Dependency: Bump jekyll-watch to 2.0 (#6589) * Add LiveReload functionality to Jekyll. (#5142) From 713467817aaaee559455d32838e57d8993a78cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1nos=20Rusiczki?= Date: Fri, 8 Dec 2017 16:43:37 +0200 Subject: [PATCH 2657/4996] Remove link to severly outdated asset plugin (#6613) Merge pull request 6613 --- docs/_docs/plugins.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 61d484768a7..0cd17474ee4 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -929,7 +929,6 @@ You can find a few useful plugins at the following locations: - [Jekyll-pagination](https://github.com/blackwinter/jekyll-pagination): Jekyll plugin to extend the pagination generator. - [Jekyll-tagging](https://github.com/pattex/jekyll-tagging): Jekyll plugin to automatically generate a tag cloud and tag pages. - [Jekyll-scholar](https://github.com/inukshuk/jekyll-scholar): Jekyll extensions for the blogging scholar. -- [Jekyll-asset_bundler](https://github.com/moshen/jekyll-asset_bundler): Bundles and minifies JavaScript and CSS. - [Jekyll-assets](http://jekyll.github.io/jekyll-assets/) by [ixti](https://github.com/ixti): Rails-alike assets pipeline (write assets in CoffeeScript, Sass, LESS etc; specify dependencies for automatic bundling using simple declarative comments in assets; minify and compress; use JST templates; cache bust; and many-many more). - [JAPR](https://github.com/kitsched/japr): Jekyll Asset Pipeline Reborn - Powerful asset pipeline for Jekyll that collects, converts and compresses JavaScript and CSS assets. - [File compressor](https://gist.github.com/2758691) by [mytharcher](https://github.com/mytharcher): Compress HTML and JavaScript files on site build. From 1691685c775f2721c1984f6632dee0fc971dfcf9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 8 Dec 2017 09:43:38 -0500 Subject: [PATCH 2658/4996] Update history to reflect merge of #6613 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 426f3976d00..1a96151eaa5 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,7 @@ * Add jekyll-pwa-plugin (#6533) * Remove Jekyll-Smartify from plugins directory (#6548) * Updated Jekyll-Pug listing to include official website (#6555) + * Remove link to severly outdated asset plugin (#6613) ### Development Fixes From ba75c87f63c7cc8e3165be53a29a98ebbb5a55d8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Dec 2017 08:35:12 -0500 Subject: [PATCH 2659/4996] Remove paginate check (#6606) Merge pull request 6606 --- lib/jekyll/configuration.rb | 17 ++++------------- test/test_configuration.rb | 23 ++--------------------- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 423ab65857d..bfa61799f6a 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -97,7 +97,7 @@ class << self # problems and backwards-compatibility. def from(user_config) Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys) - .fix_common_issues.add_default_collections + .add_default_collections end end @@ -210,7 +210,7 @@ def read_config_files(files) warn err end - configuration.fix_common_issues.backwards_compatibilize.add_default_collections + configuration.backwards_compatibilize.add_default_collections end # Public: Split a CSV string into an array containing its values @@ -246,18 +246,9 @@ def backwards_compatibilize config end + # DEPRECATED. def fix_common_issues - config = clone - - if config.key?("paginate") && (!config["paginate"].is_a?(Integer) || - config["paginate"] < 1) - - Jekyll.logger.warn "Config Warning:", "The `paginate` key must be a positive" \ - " integer or nil. It's currently set to '#{config["paginate"].inspect}'." - config["paginate"] = nil - end - - config + self end def add_default_collections diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 3dbd5ca1c4e..e0f1b8b5b14 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -20,13 +20,8 @@ class TestConfiguration < JekyllUnitTest assert_equal result["source"], "blah" end - should "fix common mistakes" do - result = Configuration.from({ "paginate" => 0 }) - assert_nil( - result["paginate"], - "Expected 'paginate' to be corrected to 'nil', " \ - "but was #{result["paginate"].inspect}" - ) + should "return a valid Configuration instance" do + assert_instance_of Configuration, Configuration.from({}).fix_common_issues end should "add default collections" do @@ -263,20 +258,6 @@ class TestConfiguration < JekyllUnitTest assert @config.backwards_compatibilize["plugins"] end end - context "#fix_common_issues" do - setup do - @config = proc do |val| - Configuration[{ - "paginate" => val, - }] - end - end - should "sets an invalid 'paginate' value to nil" do - assert_nil @config.call(0).fix_common_issues["paginate"] - assert_nil @config.call(-1).fix_common_issues["paginate"] - assert_nil @config.call(true).fix_common_issues["paginate"] - end - end context "loading configuration" do setup do @path = source_dir("_config.yml") From fc783cd13cf965823ffbb9e8e9e397bb7c5000a9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Dec 2017 08:35:14 -0500 Subject: [PATCH 2660/4996] Update history to reflect merge of #6606 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1a96151eaa5..b2dcb30c820 100644 --- a/History.markdown +++ b/History.markdown @@ -78,6 +78,7 @@ * Add json extension to list of directory indices (#6550) * Dependency: Bump jekyll-watch to 2.0 (#6589) * Add LiveReload functionality to Jekyll. (#5142) + * Remove paginate check (#6606) ### Site Enhancements From f9044ac5c630809613d0d1c9e7c5f542dcc6826e Mon Sep 17 00:00:00 2001 From: Yashu Mittal Date: Mon, 11 Dec 2017 00:08:27 +0530 Subject: [PATCH 2661/4996] Default time zone depends upon server (#6617) Merge pull request 6617 --- docs/_docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 362d33c5525..63ebd047440 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -108,7 +108,7 @@ class="flag">flags
    (specified on the command-line) that control them. IANA Time Zone Database is valid, e.g. America/New_York. A list of all available values can be found - here. The default is the local time zone, as set by your operating system. + here. When serving on a local machine, the default time zone is set by your operating system. But when served on a remote host/server, the default time zone depends on the server's setting or location.

    From 0801caae8ec29eecd8fc5dce909b4cd0bf2a5fba Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Dec 2017 13:38:28 -0500 Subject: [PATCH 2662/4996] Update history to reflect merge of #6617 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b2dcb30c820..96321510813 100644 --- a/History.markdown +++ b/History.markdown @@ -29,6 +29,7 @@ * Remove Jekyll-Smartify from plugins directory (#6548) * Updated Jekyll-Pug listing to include official website (#6555) * Remove link to severly outdated asset plugin (#6613) + * Default time zone depends upon server (#6617) ### Development Fixes From 36d70ecb8eaa811290f87b2588d5583af2f3bf0a Mon Sep 17 00:00:00 2001 From: Kacper Duras Date: Mon, 11 Dec 2017 00:28:52 +0100 Subject: [PATCH 2663/4996] Add `disqus-for-jekyll` to plugins. (#6618) Merge pull request 6618 --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 0cd17474ee4..0d9593f94f3 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -905,6 +905,7 @@ You can find a few useful plugins at the following locations: - [BibSonomy](https://github.com/rjoberon/bibsonomy-jekyll): Jekyll plugin to generate publication lists from [BibSonomy](https://www.bibsonomy.org/). - [github-cards](https://github.com/edward-shen/github-cards): Creates styleable Github cards for your Github projects. +- [disqus-for-jekyll](https://github.com/kacperduras/disqus-for-jekyll): A Jekyll plugin to view the comments powered by Disqus. #### Collections From 977837fa3a524385609a33ffa47841b50a8f8a1a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 10 Dec 2017 18:28:54 -0500 Subject: [PATCH 2664/4996] Update history to reflect merge of #6618 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 96321510813..79210b93cd5 100644 --- a/History.markdown +++ b/History.markdown @@ -30,6 +30,7 @@ * Updated Jekyll-Pug listing to include official website (#6555) * Remove link to severly outdated asset plugin (#6613) * Default time zone depends upon server (#6617) + * Add `disqus-for-jekyll` to plugins. (#6618) ### Development Fixes From bc8fee97c56bb9b01dab3936030ec507cfbf3a03 Mon Sep 17 00:00:00 2001 From: Junko Suzuki Date: Tue, 12 Dec 2017 20:28:05 +0900 Subject: [PATCH 2665/4996] Update "Requirements" for Ruby version (#6623) Merge pull request 6623 --- docs/_docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 62377b698bd..8a87744d1f0 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -14,7 +14,7 @@ Installing Jekyll should be straight-forward if all requirements are met. Before you start, make sure your system has the following: - GNU/Linux, Unix, or macOS -- [Ruby](https://www.ruby-lang.org/en/downloads/) version 2.1 or above, including all development +- [Ruby](https://www.ruby-lang.org/en/downloads/) version 2.2.5 or above, including all development headers - [RubyGems](https://rubygems.org/pages/download) - [GCC](https://gcc.gnu.org/install/) and [Make](https://www.gnu.org/software/make/) (in case your system doesn't have them installed, which you can check by running `gcc -v` and `make -v` in your system's command line interface) From 71e3bce63d12ad1849507782db8e3a8d51a32770 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 12 Dec 2017 06:28:07 -0500 Subject: [PATCH 2666/4996] Update history to reflect merge of #6623 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 79210b93cd5..e90f1b62d9e 100644 --- a/History.markdown +++ b/History.markdown @@ -31,6 +31,7 @@ * Remove link to severly outdated asset plugin (#6613) * Default time zone depends upon server (#6617) * Add `disqus-for-jekyll` to plugins. (#6618) + * Update "Requirements" for Ruby version (#6623) ### Development Fixes From acb82c92a8b014c01588fa68e79ff1f0d6db722f Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 15 Dec 2017 02:13:18 +0530 Subject: [PATCH 2667/4996] Cleanup LiveReloadReactor (#6607) Merge pull request 6607 --- .../commands/serve/live_reload_reactor.rb | 66 ++++++------------- 1 file changed, 20 insertions(+), 46 deletions(-) diff --git a/lib/jekyll/commands/serve/live_reload_reactor.rb b/lib/jekyll/commands/serve/live_reload_reactor.rb index 498e78aeee4..e9261f4f8fc 100644 --- a/lib/jekyll/commands/serve/live_reload_reactor.rb +++ b/lib/jekyll/commands/serve/live_reload_reactor.rb @@ -14,7 +14,6 @@ class LiveReloadReactor attr_reader :thread def initialize - @thread = nil @websockets = [] @connections_count = 0 @started_event = Utils::ThreadEvent.new @@ -25,7 +24,7 @@ def stop # There is only one EventMachine instance per Ruby process so stopping # it here will stop the reactor thread we have running. EM.stop if EM.reactor_running? - Jekyll.logger.debug("LiveReload Server:", "halted") + Jekyll.logger.debug "LiveReload Server:", "halted" end def running? @@ -33,32 +32,18 @@ def running? end def handle_websockets_event(ws) - ws.onopen do |handshake| - connect(ws, handshake) - end - - ws.onclose do - disconnect(ws) - end - - ws.onmessage do |msg| - print_message(msg) - end - - ws.onerror do |error| - log_error(error) - end + ws.onopen { |handshake| connect(ws, handshake) } + ws.onclose { disconnect(ws) } + ws.onmessage { |msg| print_message(msg) } + ws.onerror { |error| log_error(error) } end - # rubocop:disable Metrics/MethodLength def start(opts) @thread = Thread.new do # Use epoll if the kernel supports it EM.epoll EM.run do - EM.error_handler do |e| - log_error(e) - end + EM.error_handler { |e| log_error(e) } EM.start_server( opts["host"], @@ -70,17 +55,11 @@ def start(opts) end # Notify blocked threads that EventMachine has started or shutdown - EM.schedule do - @started_event.set - end - - EM.add_shutdown_hook do - @stopped_event.set - end + EM.schedule { @started_event.set } + EM.add_shutdown_hook { @stopped_event.set } - Jekyll.logger.info( - "LiveReload address:", "#{opts["host"]}:#{opts["livereload_port"]}" - ) + Jekyll.logger.info "LiveReload address:", + "http://#{opts["host"]}:#{opts["livereload_port"]}" end end @thread.abort_on_exception = true @@ -90,17 +69,15 @@ def start(opts) # http://feedback.livereload.com/knowledgebase/articles/86174-livereload-protocol def reload(pages) pages.each do |p| - msg = { + json_message = JSON.dump({ :command => "reload", :path => p.url, :liveCSS => true, - } + }) - Jekyll.logger.debug("LiveReload:", "Reloading #{p.url}") - Jekyll.logger.debug(JSON.dump(msg)) - @websockets.each do |ws| - ws.send(JSON.dump(msg)) - end + Jekyll.logger.debug "LiveReload:", "Reloading #{p.url}" + Jekyll.logger.debug "", json_message + @websockets.each { |ws| ws.send(json_message) } end end @@ -110,7 +87,7 @@ def connect(ws, handshake) if @connections_count == 1 message = "Browser connected" message += " over SSL/TLS" if handshake.secure? - Jekyll.logger.info("LiveReload:", message) + Jekyll.logger.info "LiveReload:", message end ws.send( JSON.dump( @@ -134,18 +111,15 @@ def print_message(json_message) # Not sure what the 'url' command even does in LiveReload. The spec is silent # on its purpose. if msg["command"] == "url" - Jekyll.logger.info("LiveReload:", "Browser URL: #{msg["url"]}") + Jekyll.logger.info "LiveReload:", "Browser URL: #{msg["url"]}" end end private def log_error(e) - Jekyll.logger.warn( - "LiveReload experienced an error. "\ - "Run with --verbose for more information." - ) - Jekyll.logger.debug("LiveReload Error:", e.message) - Jekyll.logger.debug("LiveReload Error:", e.backtrace.join("\n")) + Jekyll.logger.error "LiveReload experienced an error. " \ + "Run with --trace for more information." + raise e end end end From 3b9ed96c3074b4ebc2dda3f910ff819929f54b52 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 14 Dec 2017 15:43:20 -0500 Subject: [PATCH 2668/4996] Update history to reflect merge of #6607 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e90f1b62d9e..3a9627f51bf 100644 --- a/History.markdown +++ b/History.markdown @@ -63,6 +63,7 @@ * Bump yajl-ruby (#6582) * Cleanup test_redcarpet.rb (#6584) * Add PageWithoutAFile class from jekyll plugins (#6556) + * Cleanup LiveReloadReactor (#6607) ### Minor Enhancements From 1082a394174ac0a3dfe3c52900263280330e9988 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 15 Dec 2017 13:40:22 +0530 Subject: [PATCH 2669/4996] Register reload hooks in Server#process (#6605) Merge pull request 6605 --- lib/jekyll/commands/serve.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb index 50438b5f7d5..849d37ed329 100644 --- a/lib/jekyll/commands/serve.rb +++ b/lib/jekyll/commands/serve.rb @@ -86,7 +86,6 @@ def start(opts) # a reactor created by a previous test when our test might not @reload_reactor = nil - register_reload_hooks(opts) if opts["livereload"] config = configuration_from_options(opts) if Jekyll.env == "development" config["url"] = default_url(config) @@ -99,6 +98,7 @@ def start(opts) def process(opts) opts = configuration_from_options(opts) destination = opts["destination"] + register_reload_hooks(opts) if opts["livereload"] setup(destination) start_up_webrick(opts, destination) From c471f943470b1853648b136723a2a6383512c7b0 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Dec 2017 03:10:23 -0500 Subject: [PATCH 2670/4996] Update history to reflect merge of #6605 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3a9627f51bf..73080421108 100644 --- a/History.markdown +++ b/History.markdown @@ -107,6 +107,7 @@ * Avoid block parser warning in SmartyPants (#6565) * Fail gracefully if "sass" gem cannot be loaded (#6573) * return correct file in dir if dir has same name as file (#6569) + * Register reload hooks in Server#process (#6605) ## 3.6.2 / 2017-10-21 From e149803e99641f88393c78ef5b21ab63788b769f Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 15 Dec 2017 13:41:39 +0530 Subject: [PATCH 2671/4996] memoize path to metadata file (#6602) Merge pull request 6602 --- lib/jekyll/regenerator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 91ce3003bdf..948de27ca27 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -128,7 +128,7 @@ def write_metadata # # Returns the String path of the file. def metadata_file - site.in_source_dir(".jekyll-metadata") + @metadata_file ||= site.in_source_dir(".jekyll-metadata") end # Check if metadata has been disabled From d1440b9738eedb11208d3e66a128263e705b6fc9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Dec 2017 03:11:40 -0500 Subject: [PATCH 2672/4996] Update history to reflect merge of #6602 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 73080421108..fc9aa60edc7 100644 --- a/History.markdown +++ b/History.markdown @@ -108,6 +108,7 @@ * Fail gracefully if "sass" gem cannot be loaded (#6573) * return correct file in dir if dir has same name as file (#6569) * Register reload hooks in Server#process (#6605) + * Memoize path to metadata file (#6602) ## 3.6.2 / 2017-10-21 From d854b2265619674376ee21c48bea5a1f1b72f2cf Mon Sep 17 00:00:00 2001 From: "Dr. Wolfram Schroers" Date: Fri, 15 Dec 2017 11:33:54 +0100 Subject: [PATCH 2673/4996] Add jekyll-category-pages plugin (#6632) Merge pull request 6632 --- docs/_docs/plugins.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 0d9593f94f3..0764784a220 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -782,6 +782,7 @@ LESS.js files during generation. - [Jekyll Art Gallery plugin](https://github.com/alexivkin/Jekyll-Art-Gallery-Plugin): An advanced art/photo gallery generation plugin for creating galleries from a set of image folders. Supports image tagging, thumbnails, sorting, image rotation, post-processing (remove EXIF, add watermark), multiple collections and much more. - [jekyll-ga](https://github.com/developmentseed/jekyll-ga): A Jekyll plugin that downloads Google Analytics data and adds it to posts. Useful for making a site that lists "most popular" content. [Read the introduction](https://developmentseed.org/blog/google-analytics-jekyll-plugin/) post on the developmentSEED blog. - [jekyll-multi-paginate](https://github.com/fadhilnapis/jekyll-multi-paginate): Simple Jekyll paginator for multiple page. Ease you to make pagination on multiple page especially like multiple language. +- [jekyll-category-pages](https://github.com/field-theory/jekyll-category-pages): Easy-to-use category index pages with and without pagination. Supports non-URL-safe category keywords and has extensive documentation and test coverage. #### Converters From 72ccd29edc9ed4a3494b451c303117165ef9c044 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Dec 2017 05:33:55 -0500 Subject: [PATCH 2674/4996] Update history to reflect merge of #6632 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fc9aa60edc7..5b6ec05d761 100644 --- a/History.markdown +++ b/History.markdown @@ -100,6 +100,7 @@ * Move logo above site navigation on small screens (#6570) * Docs: Include version badge for latest features (#6574) * Use version-badge on an existing feature intro (#6575) + * Add jekyll-category-pages plugin (#6632) ### Bug Fixes From 1971ddd7a35f890b70bcb5ab9a9ca806f3460eea Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Fri, 15 Dec 2017 19:05:53 +0530 Subject: [PATCH 2675/4996] use `require_relative` to load Jekyll classes (#6609) Merge pull request 6609 --- lib/jekyll/liquid_renderer.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/liquid_renderer.rb b/lib/jekyll/liquid_renderer.rb index 547fa4c7f3d..3c731724657 100644 --- a/lib/jekyll/liquid_renderer.rb +++ b/lib/jekyll/liquid_renderer.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true -require "jekyll/liquid_renderer/file" -require "jekyll/liquid_renderer/table" +require_relative "liquid_renderer/file" +require_relative "liquid_renderer/table" module Jekyll class LiquidRenderer From ff2795f98b0c08384e17065da8071051b370f1fc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Dec 2017 08:35:55 -0500 Subject: [PATCH 2676/4996] Update history to reflect merge of #6609 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5b6ec05d761..b2d04c0009e 100644 --- a/History.markdown +++ b/History.markdown @@ -110,6 +110,7 @@ * return correct file in dir if dir has same name as file (#6569) * Register reload hooks in Server#process (#6605) * Memoize path to metadata file (#6602) + * Use `require_relative` to load Jekyll classes (#6609) ## 3.6.2 / 2017-10-21 From ffe8b28c682494f1e7eeccf295a686a22998ea2e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Dec 2017 15:55:53 -0500 Subject: [PATCH 2677/4996] update classifier-reborn to 2.2.0 (#6631) Merge pull request 6631 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index f7000acb61a..055b7295869 100644 --- a/Gemfile +++ b/Gemfile @@ -80,7 +80,7 @@ group :jekyll_optional_dependencies do gem "toml", "~> 0.2.0" platform :ruby, :mswin, :mingw, :x64_mingw do - gem "classifier-reborn", "~> 2.1.0" + gem "classifier-reborn", "~> 2.2.0" gem "liquid-c", "~> 3.0" gem "pygments.rb", "~> 1.0" gem "rdiscount", "~> 2.0" From 999151dcaad7209254a4513f256ef87612690eff Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 15 Dec 2017 15:55:55 -0500 Subject: [PATCH 2678/4996] Update history to reflect merge of #6631 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b2d04c0009e..1a9a9ecd817 100644 --- a/History.markdown +++ b/History.markdown @@ -83,6 +83,7 @@ * Dependency: Bump jekyll-watch to 2.0 (#6589) * Add LiveReload functionality to Jekyll. (#5142) * Remove paginate check (#6606) + * update classifier-reborn to 2.2.0 (#6631) ### Site Enhancements From 94f74ff4ec41e78e0ce9e1e085a695fc792afdbc Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sat, 16 Dec 2017 07:33:20 +0530 Subject: [PATCH 2679/4996] correct custom inspect string for Jekyll::Page --- lib/jekyll/page.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 3b3d9353879..caea9cd924e 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -163,7 +163,7 @@ def destination(dest) # Returns the object as a debug String. def inspect - "#" + "#" end # Returns the Boolean of whether this Page is HTML or not. From 16b9ce908efc6ab3a9d7de3dd1ae16a1175186ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=B6ller?= Date: Sun, 17 Dec 2017 13:56:55 +0100 Subject: [PATCH 2680/4996] Fix: Update link to i18n_filter plugin (#6638) Merge pull request 6638 --- docs/_docs/plugins.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 0764784a220..57a52e3b361 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -813,7 +813,6 @@ LESS.js files during generation. - [Truncate HTML](https://github.com/MattHall/truncatehtml) by [Matt Hall](https://codebeef.com/): A Jekyll filter that truncates HTML while preserving markup structure. - [Domain Name Filter by Lawrence Woodman](https://github.com/LawrenceWoodman/domain_name-liquid_filter): Filters the input text so that just the domain name is left. - [Summarize Filter by Mathieu Arnold](https://gist.github.com/731597): Remove markup after a `
    ` tag. -- [i18n_filter](https://github.com/gacha/gacha.id.lv/blob/master/_plugins/i18n_filter.rb): Liquid filter to use I18n localization. - [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. From 76a0fc38887e684f65237dd35861a54dc4ab97e2 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 17 Dec 2017 07:56:56 -0500 Subject: [PATCH 2681/4996] Update history to reflect merge of #6638 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1a9a9ecd817..e8da4b625ad 100644 --- a/History.markdown +++ b/History.markdown @@ -32,6 +32,7 @@ * Default time zone depends upon server (#6617) * Add `disqus-for-jekyll` to plugins. (#6618) * Update "Requirements" for Ruby version (#6623) + * Fix: Update link to i18n_filter plugin (#6638) ### Development Fixes From d6152578155729756d6ae6ef0c13cd5c8266d839 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Thu, 21 Dec 2017 21:03:43 +0530 Subject: [PATCH 2682/4996] Improve docs styling for code to be run in shell (#6641) Merge pull request 6641 --- docs/_sass/_pygments.scss | 2 +- docs/_sass/_style.scss | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/_sass/_pygments.scss b/docs/_sass/_pygments.scss index 4b45bf60521..d5759a0fca3 100644 --- a/docs/_sass/_pygments.scss +++ b/docs/_sass/_pygments.scss @@ -1,6 +1,6 @@ .highlight { .hll { background-color: #ffffcc } - .c { color: #87ceeb} /* Comment */ + .c { color: #999; font-style: italic } /* Comment */ .err { color: #ffffff} /* Error */ .g { color: #ffffff} /* Generic */ .k { color: #f0e68c} /* Keyword */ diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 11d89adf3a8..69cc55ea9ee 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -1126,21 +1126,33 @@ code.output { } .language-sh { + position: relative; &:before { display: table; - padding: 5px 8px; + padding: 8px; width: 100%; - color: #272727; - text-shadow: none; - font-size: 14px; - line-height: 1.25; - font-weight: 700; - content: "TERMINAL"; - background: #7a7a7a; - border: 1px solid #333; + padding: 5px 0; + font: 400 16px/24px 'Helvetica Neue', Helvetica, Arial, sans-serif; + color: #444; + text-shadow: 0 1px 0 rgba(255,255,255,.5); + background-color: #f7f7f7; + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjclIiBzdG9wLWNvbG9yPSIjY2ZjZmNmIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2FhYWFhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7f7f7), color-stop(7%, #cfcfcf), to(#aaaaaa)); + background-image: -webkit-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%); + background-image: -moz-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%); + background-image: -o-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%); + background-image: linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f7f7', endColorstr='#aaaaaa',GradientType=0 ); + border-bottom: 1px solid #111; + text-align: center; + content: "terminal"; @include border-radius(5px 5px 0 0); + @include box-shadow(0 3px 10px rgba(0,0,0,.5)); } .highlight { @include border-radius(0 0 5px 5px); } + pre.highlight { + background: #1c1c1c; + } } From aef0e1c2527160c0a8f4f472811eacc5687c986f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 21 Dec 2017 10:33:45 -0500 Subject: [PATCH 2683/4996] Update history to reflect merge of #6641 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e8da4b625ad..c95a16e8bcc 100644 --- a/History.markdown +++ b/History.markdown @@ -103,6 +103,7 @@ * Docs: Include version badge for latest features (#6574) * Use version-badge on an existing feature intro (#6575) * Add jekyll-category-pages plugin (#6632) + * Improve docs styling for code to be run in shell (#6641) ### Bug Fixes From 14ab1bc9b297f43006f3e081ba89ab65b0d07909 Mon Sep 17 00:00:00 2001 From: Christian Oliff Date: Fri, 22 Dec 2017 00:35:47 +0900 Subject: [PATCH 2684/4996] Correct WordPress capitalization (#6645) Merge pull request 6645 --- docs/_docs/resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/resources.md b/docs/_docs/resources.md index d2a15c8ff8e..35963e22087 100644 --- a/docs/_docs/resources.md +++ b/docs/_docs/resources.md @@ -11,7 +11,7 @@ Jekyll's growing use is producing a wide variety of tutorials, frameworks, exten - [markdown-writer](https://atom.io/packages/markdown-writer): An Atom package for Jekyll. It can create new posts/drafts, manage tags/categories, insert link/images and add many useful key mappings. - [sublime-jekyll](https://github.com/23maverick23/sublime-jekyll): A Sublime Text package for Jekyll static sites. This package should help creating Jekyll sites and posts easier by providing access to key template tags and filters, as well as common completions and a current date/datetime command (for dating posts). You can install this package manually via GitHub, or via [Package Control](https://packagecontrol.io/packages/Jekyll). - [vim-jekyll](https://github.com/parkr/vim-jekyll): A vim plugin to generate new posts and run `jekyll build` all without leaving vim. -- [Wordpress2Jekyll](https://wordpress.org/plugins/wp2jekyll/): A Wordpress plugin that allows you to use Wordpress as your editor and (automatically) export content in to Jekyll. WordPress2Jekyll attempts to marry these two systems together in order to make a site that can be easily managed from all devices. +- [WordPress2Jekyll](https://wordpress.org/plugins/wp2jekyll/): A WordPress plugin that allows you to use WordPress as your editor and (automatically) export content in to Jekyll. WordPress2Jekyll attempts to marry these two systems together in order to make a site that can be easily managed from all devices. ## Useful Guides From 47e9304342721772a8e5f422728169e2f9150de9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 21 Dec 2017 10:35:49 -0500 Subject: [PATCH 2685/4996] Update history to reflect merge of #6645 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c95a16e8bcc..0c00be17e69 100644 --- a/History.markdown +++ b/History.markdown @@ -33,6 +33,7 @@ * Add `disqus-for-jekyll` to plugins. (#6618) * Update "Requirements" for Ruby version (#6623) * Fix: Update link to i18n_filter plugin (#6638) + * Correct WordPress capitalization (#6645) ### Development Fixes From 96d3b5e986b463e5ad15c342f265e58fda017023 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Thu, 21 Dec 2017 16:44:29 +0100 Subject: [PATCH 2686/4996] Docs: Remove requirements for Jekyll 2.x --- docs/_docs/installation.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 8a87744d1f0..398b5e1a38a 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -19,11 +19,6 @@ Before you start, make sure your system has the following: - [RubyGems](https://rubygems.org/pages/download) - [GCC](https://gcc.gnu.org/install/) and [Make](https://www.gnu.org/software/make/) (in case your system doesn't have them installed, which you can check by running `gcc -v` and `make -v` in your system's command line interface) -#### Only required for Jekyll 2 and earlier - -- [NodeJS](https://nodejs.org/), or another JavaScript runtime (for CoffeeScript support). -- [Python 2.7](https://www.python.org/downloads/) -
    Problems installing Jekyll?

    From 60f645eb769d49d1fe8f96ec442ffe164ff609a8 Mon Sep 17 00:00:00 2001 From: Alex Ibrado Date: Wed, 27 Dec 2017 00:26:12 +0800 Subject: [PATCH 2687/4996] Add Tweetsert, Stickyposts, Paginate::Content (#6651) Merge pull request 6651 --- docs/_docs/plugins.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index 57a52e3b361..61aed9ae5e8 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -783,6 +783,9 @@ LESS.js files during generation. - [jekyll-ga](https://github.com/developmentseed/jekyll-ga): A Jekyll plugin that downloads Google Analytics data and adds it to posts. Useful for making a site that lists "most popular" content. [Read the introduction](https://developmentseed.org/blog/google-analytics-jekyll-plugin/) post on the developmentSEED blog. - [jekyll-multi-paginate](https://github.com/fadhilnapis/jekyll-multi-paginate): Simple Jekyll paginator for multiple page. Ease you to make pagination on multiple page especially like multiple language. - [jekyll-category-pages](https://github.com/field-theory/jekyll-category-pages): Easy-to-use category index pages with and without pagination. Supports non-URL-safe category keywords and has extensive documentation and test coverage. +- [Tweetsert](https://github.com/ibrado/jekyll-tweetsert): Imports tweets (Twitter statuses) as new posts. Features multiple timeline support, hashtag import, filtering, automatic category and/or tags, optional retweets and replies. +- [Stickyposts](https://github.com/ibrado/jekyll-stickyposts): Moves or copies (pins) posts marked `sticky: true` to the top of the list. Perfect for keeping important announcements on the home page, or giving collections a descriptive entry. Paginator friendly. +- [Jekyll::Paginate::Content](https://github.com/ibrado/jekyll-paginate-content): Content paginator in the style of jekyll-paginator-v2 that splits pages, posts, and collection entries into several pages. Specify a separator or use HTML <h1> etc. headers. Automatic splitting, single-page view, pager/trail, self-adjusting links, multipage TOC, SEO support. #### Converters From 53cfa642fb50379b8795f80622bf9a5b934f2729 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 26 Dec 2017 11:26:13 -0500 Subject: [PATCH 2688/4996] Update history to reflect merge of #6651 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0c00be17e69..95094fa6d73 100644 --- a/History.markdown +++ b/History.markdown @@ -34,6 +34,7 @@ * Update "Requirements" for Ruby version (#6623) * Fix: Update link to i18n_filter plugin (#6638) * Correct WordPress capitalization (#6645) + * Add Tweetsert, Stickyposts, Paginate::Content (#6651) ### Development Fixes From b3286e7468964015d9fb611d81bede752230de01 Mon Sep 17 00:00:00 2001 From: Miguel Piedrafita Date: Mon, 1 Jan 2018 00:59:11 +0100 Subject: [PATCH 2689/4996] Update license year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index e177b1bfea7..c98bc25f316 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2008-2017 Tom Preston-Werner and Jekyll contributors +Copyright (c) 2008-2018 Tom Preston-Werner and Jekyll contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From a9fe56830b466917cfbcdd9bce1c0fdff49aa113 Mon Sep 17 00:00:00 2001 From: Jashank Jeremy Date: Wed, 3 Jan 2018 03:36:58 +1000 Subject: [PATCH 2690/4996] Switch to an actively-maintained TOML parser. (#6652) Merge pull request 6652 --- Gemfile | 2 +- lib/jekyll/configuration.rb | 4 ++-- test/test_configuration.rb | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 055b7295869..90ccf0a5197 100644 --- a/Gemfile +++ b/Gemfile @@ -77,7 +77,7 @@ group :jekyll_optional_dependencies do gem "kramdown", "~> 1.14" gem "mime-types", "~> 3.0" gem "rdoc", "~> 5.0" - gem "toml", "~> 0.2.0" + gem "tomlrb", "~> 1.2" platform :ruby, :mswin, :mingw, :x64_mingw do gem "classifier-reborn", "~> 2.2.0" diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index bfa61799f6a..601e1f97cf5 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -134,8 +134,8 @@ def verbose(override = {}) def safe_load_file(filename) case File.extname(filename) when %r!\.toml!i - Jekyll::External.require_with_graceful_fail("toml") unless defined?(TOML) - TOML.load_file(filename) + Jekyll::External.require_with_graceful_fail("tomlrb") unless defined?(Tomlrb) + Tomlrb.load_file(filename) when %r!\.ya?ml!i SafeYAML.load_file(filename) || {} else diff --git a/test/test_configuration.rb b/test/test_configuration.rb index e0f1b8b5b14..17c0d21985d 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -380,11 +380,11 @@ class TestConfiguration < JekyllUnitTest end should "load multiple config files" do - External.require_with_graceful_fail("toml") + External.require_with_graceful_fail("tomlrb") allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({}) allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return({}) - allow(TOML).to receive(:load_file).with(@paths[:toml]).and_return({}) + allow(Tomlrb).to receive(:load_file).with(@paths[:toml]).and_return({}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}") allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:toml]}") From 34694ae6d10bb6d2f8341d3adeb88177d46eb0e6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 2 Jan 2018 12:37:00 -0500 Subject: [PATCH 2691/4996] Update history to reflect merge of #6652 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 95094fa6d73..1ff7b423f63 100644 --- a/History.markdown +++ b/History.markdown @@ -87,6 +87,7 @@ * Add LiveReload functionality to Jekyll. (#5142) * Remove paginate check (#6606) * update classifier-reborn to 2.2.0 (#6631) + * Switch to an actively-maintained TOML parser. (#6652) ### Site Enhancements From bf8837e4955559ee3e4650adc3ac83b1c63ecad1 Mon Sep 17 00:00:00 2001 From: ashmaroli Date: Tue, 2 Jan 2018 23:20:43 +0530 Subject: [PATCH 2692/4996] fix permalink icon markup in news-item layout (#6639) Merge pull request 6639 --- docs/_layouts/news_item.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/_layouts/news_item.html b/docs/_layouts/news_item.html index 273db2e8384..de6508d069b 100644 --- a/docs/_layouts/news_item.html +++ b/docs/_layouts/news_item.html @@ -5,7 +5,10 @@

    {{ page.title }} - + + Permalink + +

    test\n
    \n

    This should not be highlighted, right?

    EOS assert_match(expected, @result) From a4f24f54ad41cda23d3355b2bd3784f53bb81c95 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 13 Jun 2019 08:01:25 -0400 Subject: [PATCH 3661/4996] Update history to reflect merge of #7709 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8032dd0014a..7b7ded33005 100644 --- a/History.markdown +++ b/History.markdown @@ -156,6 +156,7 @@ * Bump RuboCop to v0.70.x (#7678) * Remove override to Jekyll::Document#respond_to? (#7695) * Do not install docs on updating gems on Travis (#7706) + * Update TestTags in sync with Rouge v3.4 (#7709) ### Documentation From 478e3ab30137f68fe92b381e081800048fea1ca3 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 14 Jun 2019 05:59:57 +0530 Subject: [PATCH 3662/4996] Bump RuboCop to v0.71.0 (#7687) Merge pull request 7687 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 33faafb0b14..acbbcd6ea67 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,7 @@ group :test do gem "nokogiri", "~> 1.7" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.70.0" + gem "rubocop", "~> 0.71.0" gem "rubocop-performance" gem "test-dependency-theme", :path => File.expand_path("test/fixtures/test-dependency-theme", __dir__) gem "test-theme", :path => File.expand_path("test/fixtures/test-theme", __dir__) From f0b7c9b7834d0404c4f2c28c3a6ef859df1979e6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 13 Jun 2019 20:29:59 -0400 Subject: [PATCH 3663/4996] Update history to reflect merge of #7687 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 7b7ded33005..48e2e5b1af7 100644 --- a/History.markdown +++ b/History.markdown @@ -157,6 +157,7 @@ * Remove override to Jekyll::Document#respond_to? (#7695) * Do not install docs on updating gems on Travis (#7706) * Update TestTags in sync with Rouge v3.4 (#7709) + * Bump RuboCop to v0.71.0 (#7687) ### Documentation From 25898f8d9dd5954bdf7089d2f4d86294877fc07c Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 14 Jun 2019 15:46:09 +0530 Subject: [PATCH 3664/4996] Reword code-comment to reflect the implementation --- lib/jekyll/readers/static_file_reader.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/readers/static_file_reader.rb b/lib/jekyll/readers/static_file_reader.rb index 3dcc175d78c..97df05afce5 100644 --- a/lib/jekyll/readers/static_file_reader.rb +++ b/lib/jekyll/readers/static_file_reader.rb @@ -9,10 +9,9 @@ def initialize(site, dir) @unfiltered_content = [] end - # Read all the files in // for Yaml header and create a new Page - # object for each file. + # Create a new StaticFile object for every entry in a given list of basenames. # - # dir - The String relative path of the directory to read. + # files - an array of file basenames. # # Returns an array of static files. def read(files) From 52ae35a58982f6b015b61554a8feb98c0f022d84 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 21 Jun 2019 15:00:45 +0530 Subject: [PATCH 3665/4996] Disable color output from profile:memory task So that it is easier to parse the plaintext build logs --- rake/profile.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rake/profile.rake b/rake/profile.rake index 9c562d5ad99..d58c470ba23 100644 --- a/rake/profile.rake +++ b/rake/profile.rake @@ -39,7 +39,7 @@ namespace :profile do end if ENV["CI"] - report.pretty_print(scale_bytes: true, color_output: true) + report.pretty_print(scale_bytes: true, color_output: false) else FileUtils.mkdir_p("tmp") report_file = File.join("tmp", args.file) From e37ee47219c5f486e9a55b6bcbf6c70e0701c06f Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 21 Jun 2019 15:27:18 +0530 Subject: [PATCH 3666/4996] Fix offenses detected by rubocop-performance-1.4.0 --- test/test_entry_filter.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb index 95ac8cd4560..b3d820e0693 100644 --- a/test/test_entry_filter.rb +++ b/test/test_entry_filter.rb @@ -82,7 +82,6 @@ class TestEntryFilter < JekyllUnitTest assert_equal %w(), entries end - # rubocop:disable Performance/FixedSize should "include only safe symlinks in safe mode" do # no support for symlinks on Windows skip_if_windows "Jekyll does not currently support symlinks on Windows." @@ -93,7 +92,6 @@ class TestEntryFilter < JekyllUnitTest assert_equal %w(main.scss symlinked-file).length, site.pages.length refute_equal [], site.static_files end - # rubocop:enable Performance/FixedSize should "include symlinks in unsafe mode" do # no support for symlinks on Windows @@ -111,10 +109,8 @@ class TestEntryFilter < JekyllUnitTest site = fixture_site("safe" => true, "include" => ["symlinked-file-outside-source"]) site.reader.read_directories("symlink-test") - # rubocop:disable Performance/FixedSize assert_equal %w(main.scss symlinked-file).length, site.pages.length refute_includes site.static_files.map(&:name), "symlinked-file-outside-source" - # rubocop:enable Performance/FixedSize end end From 06eafadcbbda82510c7b4f89fa168733145dbf76 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 24 Jun 2019 01:53:09 +0530 Subject: [PATCH 3667/4996] Use regexp to filter special entries (#7702) Merge pull request 7702 --- lib/jekyll/entry_filter.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index 8035877c3cf..4a238036ec9 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -3,9 +3,7 @@ module Jekyll class EntryFilter attr_reader :site - SPECIAL_LEADING_CHARACTERS = [ - ".", "_", "#", "~", - ].freeze + SPECIAL_LEADING_CHAR_REGEX = %r!\A#{Regexp.union([".", "_", "#", "~"])}!o.freeze def initialize(site, base_directory = nil) @site = site @@ -50,8 +48,8 @@ def included?(entry) end def special?(entry) - SPECIAL_LEADING_CHARACTERS.include?(entry[0..0]) || - SPECIAL_LEADING_CHARACTERS.include?(File.basename(entry)[0..0]) + SPECIAL_LEADING_CHAR_REGEX.match?(entry) || + SPECIAL_LEADING_CHAR_REGEX.match?(File.basename(entry)) end def backup?(entry) From 9ccdae161b09e492a12353d23a5ad33fc64c3f65 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 23 Jun 2019 16:23:10 -0400 Subject: [PATCH 3668/4996] Update history to reflect merge of #7702 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 48e2e5b1af7..3e48771659f 100644 --- a/History.markdown +++ b/History.markdown @@ -158,6 +158,7 @@ * Do not install docs on updating gems on Travis (#7706) * Update TestTags in sync with Rouge v3.4 (#7709) * Bump RuboCop to v0.71.0 (#7687) + * Use regexp to filter special entries (#7702) ### Documentation From 68a31c8eb29671184d3dd34a6d936e7057ff1f5f Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 24 Jun 2019 03:45:25 +0530 Subject: [PATCH 3669/4996] Don't read symlinks in site.include in safe mode (#7711) Merge pull request 7711 --- lib/jekyll/reader.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 18730ab3800..797e4291a1b 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -161,11 +161,14 @@ def post_reader end def read_included_excludes + entry_filter = EntryFilter.new(site) + site.include.each do |entry| next if entry == ".htaccess" entry_path = site.in_source_dir(entry) next if File.directory?(entry_path) + next if entry_filter.symlink?(entry_path) read_included_file(entry_path) if File.file?(entry_path) end From 25b274621b38696f7e66ca7e6f44fce57a6f0379 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 23 Jun 2019 18:15:27 -0400 Subject: [PATCH 3670/4996] Update history to reflect merge of #7711 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3e48771659f..a506445a2d5 100644 --- a/History.markdown +++ b/History.markdown @@ -61,6 +61,7 @@ * Revert memoizing Site#docs_to_write and #documents (#7684) * Backport #7684 for v3.8.x: Revert memoizing Site#docs_to_write and refactor #documents (#7689) * Backport #7213 and #7633 for v3.8.x: Fix broken include_relative usage in excerpt (#7690) + * Don't read symlinks in site.include in safe mode (#7711) ### Minor Enhancements From e10a90987a382bbf94a4ed22f660457a0277ef4a Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 24 Jun 2019 23:16:28 +0530 Subject: [PATCH 3671/4996] Replace `String#=~` with `String#match?` (#7718) Merge pull request 7718 --- lib/jekyll/tags/include.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index d81dd8dee16..b43fe4532f2 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -54,7 +54,7 @@ def parse_params(context) end def validate_file_name(file) - if file =~ INVALID_SEQUENCES || file !~ VALID_FILENAME_CHARS + if file.match?(INVALID_SEQUENCES) || !file.match?(VALID_FILENAME_CHARS) raise ArgumentError, <<~MSG Invalid syntax for include tag. File contains invalid characters or sequences: @@ -90,7 +90,7 @@ def file_read_opts(context) # Render the variable if required def render_variable(context) - Liquid::Template.parse(@file).render(context) if @file =~ VARIABLE_SYNTAX + Liquid::Template.parse(@file).render(context) if @file.match?(VARIABLE_SYNTAX) end def tag_includes_dirs(context) From 7d340d933ac335bf4e25d95260873d0a89b99e1d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 24 Jun 2019 13:46:31 -0400 Subject: [PATCH 3672/4996] Update history to reflect merge of #7718 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a506445a2d5..209b96e7039 100644 --- a/History.markdown +++ b/History.markdown @@ -160,6 +160,7 @@ * Update TestTags in sync with Rouge v3.4 (#7709) * Bump RuboCop to v0.71.0 (#7687) * Use regexp to filter special entries (#7702) + * Replace `String#=~` with `String#match?` (#7718) ### Documentation From 27aa53cf823cdc3696f50eb4d469a7734a7a82f0 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 26 Jun 2019 02:32:04 +0530 Subject: [PATCH 3673/4996] Memoize SiteDrop#documents to reduce allocations (#7697) Merge pull request 7697 --- lib/jekyll/drops/site_drop.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/drops/site_drop.rb b/lib/jekyll/drops/site_drop.rb index acebb98816f..a13f87f291c 100644 --- a/lib/jekyll/drops/site_drop.rb +++ b/lib/jekyll/drops/site_drop.rb @@ -8,7 +8,7 @@ class SiteDrop < Drop mutable false def_delegator :@obj, :site_data, :data - def_delegators :@obj, :time, :pages, :static_files, :documents, :tags, :categories + def_delegators :@obj, :time, :pages, :static_files, :tags, :categories private def_delegator :@obj, :config, :fallback_data @@ -38,6 +38,16 @@ def collections @site_collections ||= @obj.collections.values.sort_by(&:label).map(&:to_liquid) end + # `Site#documents` cannot be memoized so that `Site#docs_to_write` can access the + # latest state of the attribute. + # + # Since this method will be called after `Site#pre_render` hook, the `Site#documents` + # array shouldn't thereafter change and can therefore be safely memoized to prevent + # additional computation of `Site#documents`. + def documents + @documents ||= @obj.documents + end + # `{{ site.related_posts }}` is how posts can get posts related to # them, either through LSI if it's enabled, or through the most # recent posts. From 52374cf8be512f47a5d166db35439b1621121cc3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 25 Jun 2019 17:02:07 -0400 Subject: [PATCH 3674/4996] Update history to reflect merge of #7697 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 209b96e7039..50b4845bbf4 100644 --- a/History.markdown +++ b/History.markdown @@ -105,6 +105,7 @@ * Reduce allocations from Jekyll::Document instances (#7625) * Add `type` attribute to Document instances (#7406) * Reduce allocations from where-filter (#7653) + * Memoize SiteDrop#documents to reduce allocations (#7697) ### Development Fixes From 62959527dd870691107739724c23b51ba03828f3 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 26 Jun 2019 11:33:47 +0530 Subject: [PATCH 3675/4996] Bump RuboCop to v0.72.x --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index acbbcd6ea67..1b93ae31332 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,7 @@ group :test do gem "nokogiri", "~> 1.7" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.71.0" + gem "rubocop", "~> 0.72.0" gem "rubocop-performance" gem "test-dependency-theme", :path => File.expand_path("test/fixtures/test-dependency-theme", __dir__) gem "test-theme", :path => File.expand_path("test/fixtures/test-theme", __dir__) From 45307215754b07279498e4f67b3e248ea632e153 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 27 Jun 2019 22:46:27 +0530 Subject: [PATCH 3676/4996] Replace `String#=~` with `String#match?` (#7723) Merge pull request 7723 --- lib/jekyll/utils.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 2defd372997..71dc9de59fa 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -135,7 +135,7 @@ def parse_date(input, msg = "Input could not be parsed.") # Returns true if the YAML front matter is present. # rubocop: disable PredicateName def has_yaml_header?(file) - !!(File.open(file, "rb", &:readline) =~ %r!\A---\s*\r?\n!) + File.open(file, "rb", &:readline).match? %r!\A---\s*\r?\n! rescue EOFError false end From c76996cd8efde8d624d09869be7b074f5bb2e5e3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 27 Jun 2019 13:16:29 -0400 Subject: [PATCH 3677/4996] Update history to reflect merge of #7723 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 50b4845bbf4..93a5ec6661f 100644 --- a/History.markdown +++ b/History.markdown @@ -62,6 +62,7 @@ * Backport #7684 for v3.8.x: Revert memoizing Site#docs_to_write and refactor #documents (#7689) * Backport #7213 and #7633 for v3.8.x: Fix broken include_relative usage in excerpt (#7690) * Don't read symlinks in site.include in safe mode (#7711) + * Replace `String#=~` with `String#match?` (#7723) ### Minor Enhancements From c87f5fa7fae28f8dba90ee67336f73ca56ec99e6 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 28 Jun 2019 09:01:06 +0530 Subject: [PATCH 3678/4996] Normalize paths in reports from `memory_profiler` --- rake/profile.rake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rake/profile.rake b/rake/profile.rake index d58c470ba23..d8c0f4ef023 100644 --- a/rake/profile.rake +++ b/rake/profile.rake @@ -39,7 +39,7 @@ namespace :profile do end if ENV["CI"] - report.pretty_print(scale_bytes: true, color_output: false) + report.pretty_print(scale_bytes: true, color_output: false, normalize_paths: true) else FileUtils.mkdir_p("tmp") report_file = File.join("tmp", args.file) @@ -50,7 +50,7 @@ namespace :profile do Jekyll.logger.info "Total allocated: #{total_allocated_output} (#{report.total_allocated} objects)".cyan Jekyll.logger.info "Total retained: #{total_retained_output} (#{report.total_retained} objects)".cyan - report.pretty_print(to_file: report_file, scale_bytes: true) + report.pretty_print(to_file: report_file, scale_bytes: true, normalize_paths: true) Jekyll.logger.info "\nDetailed Report saved into:", report_file.cyan end end From 3e8e6d22d7b9d2ce0c0fe06f79e87b774382969c Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 28 Jun 2019 16:08:02 +0530 Subject: [PATCH 3679/4996] Remove patch to modify config for kramdown (#7699) Merge pull request 7699 --- .../converters/markdown/kramdown_parser.rb | 8 ------- test/test_kramdown.rb | 23 ++++--------------- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index 6b78a5b99f4..64bb1d1c8d2 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -34,7 +34,6 @@ def setup @config["syntax_highlighter_opts"]["guess_lang"] = @config["guess_lang"] @config["coderay"] ||= {} # XXX: Legacy. modernize_coderay_config - make_accessible end def convert(content) @@ -64,13 +63,6 @@ def load_dependencies end end - def make_accessible(hash = @config) - hash.keys.each do |key| - hash[key.to_sym] = hash[key] - make_accessible(hash[key]) if hash[key].is_a?(Hash) - end - end - # config[kramdown][syntax_higlighter] > # config[kramdown][enable_coderay] > # config[highlighter] diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index fa333c957de..b4fc3b04505 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -22,6 +22,7 @@ class TestKramdown < JekyllUnitTest "css" => :class, "css_class" => "highlight", "formatter" => ::Rouge::Formatters::HTMLLegacy, + "foobar" => "lipsum", }, }, } @@ -35,24 +36,10 @@ class TestKramdown < JekyllUnitTest Jekyll::Cache.clear end - should "fill symbolized keys into config for compatibility with kramdown" do - kramdown_config = @markdown.instance_variable_get(:@parser) - .instance_variable_get(:@config) - - @kramdown_config_keys.each do |key| - assert kramdown_config.key?(key.to_sym), - "Expected #{kramdown_config} to include key #{key.to_sym.inspect}" - end - - @syntax_highlighter_opts_config_keys.each do |key| - assert kramdown_config["syntax_highlighter_opts"].key?(key.to_sym), - "Expected #{kramdown_config["syntax_highlighter_opts"]} to include " \ - "key #{key.to_sym.inspect}" - end - - assert_equal kramdown_config["smart_quotes"], kramdown_config[:smart_quotes] - assert_equal kramdown_config["syntax_highlighter_opts"]["css"], - kramdown_config[:syntax_highlighter_opts][:css] + should "not break kramdown" do + kramdown_doc = Kramdown::Document.new("# Some Header #", @config["kramdown"]) + assert_equal :class, kramdown_doc.options[:syntax_highlighter_opts][:css] + assert_equal "lipsum", kramdown_doc.options[:syntax_highlighter_opts][:foobar] end should "run Kramdown" do From 7dbe470dce3393b95d9da8f6c17ed2cee385f741 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 28 Jun 2019 06:38:04 -0400 Subject: [PATCH 3680/4996] Update history to reflect merge of #7699 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 93a5ec6661f..18218979854 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Always exclude certain paths from being processed (#7188) * Remove Jekyll::Utils#strip_heredoc in favor of a Ruby > 2.3 built in (#7584) * Incorporate `relative_url` within `post_url` tag (#7589) + * Remove patch to modify config for kramdown (#7699) ### Bug Fixes From 8abd4950a20af17bb27c6f2013eee8dccd03aee9 Mon Sep 17 00:00:00 2001 From: Yi Feng Xie Date: Fri, 28 Jun 2019 18:45:09 +0800 Subject: [PATCH 3681/4996] Update resources.md (#7598) Merge pull request 7598 --- docs/pages/resources.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/resources.md b/docs/pages/resources.md index 39f3aca86e7..2626970bf35 100644 --- a/docs/pages/resources.md +++ b/docs/pages/resources.md @@ -85,3 +85,4 @@ Use a SaaS service as a backend for functionality on your Jekyll site - A way to [extend Jekyll](https://github.com/rfelix/jekyll_ext) without forking and modifying the Jekyll gem codebase and some [portable Jekyll extensions](https://wiki.github.com/rfelix/jekyll_ext/extensions) that can be reused and shared. - [Using your Rails layouts in Jekyll](http://numbers.brighterplanet.com/2010/08/09/sharing-rails-views-with-jekyll) +- [Jekpack](https://github.com/yfxie/jekpack/) an integration of Jekyll and Webpack to make them work together. From 2265e82181a1d96da9910cad233b479fda2d5967 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 28 Jun 2019 06:45:11 -0400 Subject: [PATCH 3682/4996] Update history to reflect merge of #7598 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 18218979854..9938d532c4e 100644 --- a/History.markdown +++ b/History.markdown @@ -288,6 +288,7 @@ * Solve "GitHub Page build failure" in 10-deployment.md (#7648) * Fix typo from 'Github' to 'GitHub' (#7691) * fix link to Site Source config (#7708) + * Add Jekpack to resources page (#7598) ### Site Enhancements From 24f1978412093332bebe24522aa5b6102bad6eae Mon Sep 17 00:00:00 2001 From: David Kennell Date: Fri, 28 Jun 2019 11:27:59 -0500 Subject: [PATCH 3683/4996] Introduce frontmatter in step 2 (#7704) Merge pull request 7704 --- docs/_docs/step-by-step/02-liquid.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/_docs/step-by-step/02-liquid.md b/docs/_docs/step-by-step/02-liquid.md index 1c3ad02c614..5de70a2861c 100644 --- a/docs/_docs/step-by-step/02-liquid.md +++ b/docs/_docs/step-by-step/02-liquid.md @@ -66,9 +66,19 @@ Now it's your turn, change the Hello World! on your page to output as lowercase: ``` {% endraw %} +To get our changes processed by Jekyll we need to add [front matter](03-front-matter/) to the top of the page: + +```markdown +--- +# front matter tells Jekyll to process Liquid +--- +``` + +Our "Hello World!" will now be downcased on render. + It may not seem like it now, but much of Jekyll's power comes from combining -Liquid with other features. +Liquid with other features. -In order to see the changes from `downcase` Liquid filter, we will need to add front matter. +In order to see the changes from `downcase` Liquid filter, we will need to add front matter. That's next. Let's keep going. From 6435bd616763738e9961abcd9dae41cf8106388e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 28 Jun 2019 12:28:02 -0400 Subject: [PATCH 3684/4996] Update history to reflect merge of #7704 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9938d532c4e..092ce44decb 100644 --- a/History.markdown +++ b/History.markdown @@ -289,6 +289,7 @@ * Fix typo from 'Github' to 'GitHub' (#7691) * fix link to Site Source config (#7708) * Add Jekpack to resources page (#7598) + * Introduce frontmatter in step 2 (#7704) ### Site Enhancements From ebe62e8a282c57b4408c29cf5081f709ac61a321 Mon Sep 17 00:00:00 2001 From: Edgar Tinajero Date: Mon, 1 Jul 2019 11:56:38 -0600 Subject: [PATCH 3685/4996] Update log output for an invalid theme directory (#7679) Merge pull request 7679 --- Gemfile | 1 + features/theme.feature | 11 +++++++++++ lib/jekyll/theme.rb | 15 +++++++++++++-- .../test-theme-skinny/_layouts/default.html | 11 +++++++++++ .../fixtures/test-theme-skinny/_layouts/home.html | 5 +++++ .../test-theme-skinny/test-theme-skinny.gemspec | 11 +++++++++++ 6 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/test-theme-skinny/_layouts/default.html create mode 100644 test/fixtures/test-theme-skinny/_layouts/home.html create mode 100644 test/fixtures/test-theme-skinny/test-theme-skinny.gemspec diff --git a/Gemfile b/Gemfile index 1b93ae31332..df6d2f2718d 100644 --- a/Gemfile +++ b/Gemfile @@ -31,6 +31,7 @@ group :test do gem "rubocop-performance" gem "test-dependency-theme", :path => File.expand_path("test/fixtures/test-dependency-theme", __dir__) gem "test-theme", :path => File.expand_path("test/fixtures/test-theme", __dir__) + gem "test-theme-skinny", :path => File.expand_path("test/fixtures/test-theme-skinny", __dir__) gem "test-theme-symlink", :path => File.expand_path("test/fixtures/test-theme-symlink", __dir__) gem "jruby-openssl" if RUBY_ENGINE == "jruby" diff --git a/features/theme.feature b/features/theme.feature index 650c167577e..3941abc8d86 100644 --- a/features/theme.feature +++ b/features/theme.feature @@ -57,6 +57,17 @@ Feature: Writing themes And I should see "From your site." in "_site/assets/application.coffee" And I should see "From your site." in "_site/assets/base.js" + Scenario: A theme with *just* layouts + Given I have a configuration file with "theme" set to "test-theme-skinny" + And I have an "index.html" page with layout "home" that contains "The quick brown fox." + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And I should see "Message: The quick brown fox." in "_site/index.html" + But I should not see "_includes" in the build output + And I should not see "_sass" in the build output + And I should not see "assets" in the build output + Scenario: Requiring dependencies of a theme Given I have a configuration file with "theme" set to "test-dependency-theme" When I run jekyll build diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index 3eb44157763..ac0330201ea 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -62,11 +62,22 @@ def realpath_for(folder) # escape the theme root. # However, symlinks are allowed to point to other directories within the theme. Jekyll.sanitized_path(root, File.realpath(Jekyll.sanitized_path(root, folder.to_s))) - rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP - Jekyll.logger.warn "Invalid theme folder:", folder + rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP => e + log_realpath_exception(e, folder) nil end + def log_realpath_exception(err, folder) + return if err.is_a?(Errno::ENOENT) + + case err + when Errno::EACCES + Jekyll.logger.error "Theme error:", "Directory '#{folder}' is not accessible." + when Errno::ELOOP + Jekyll.logger.error "Theme error:", "Directory '#{folder}' includes a symbolic link loop." + end + end + def gemspec @gemspec ||= Gem::Specification.find_by_name(name) rescue Gem::LoadError diff --git a/test/fixtures/test-theme-skinny/_layouts/default.html b/test/fixtures/test-theme-skinny/_layouts/default.html new file mode 100644 index 00000000000..837a4dc7696 --- /dev/null +++ b/test/fixtures/test-theme-skinny/_layouts/default.html @@ -0,0 +1,11 @@ + + + + + Skinny + + +

    Hello World

    + {{ content }} + + diff --git a/test/fixtures/test-theme-skinny/_layouts/home.html b/test/fixtures/test-theme-skinny/_layouts/home.html new file mode 100644 index 00000000000..6d9ce5c7ef1 --- /dev/null +++ b/test/fixtures/test-theme-skinny/_layouts/home.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +Message: {{ content }} diff --git a/test/fixtures/test-theme-skinny/test-theme-skinny.gemspec b/test/fixtures/test-theme-skinny/test-theme-skinny.gemspec new file mode 100644 index 00000000000..84f59b9d709 --- /dev/null +++ b/test/fixtures/test-theme-skinny/test-theme-skinny.gemspec @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +Gem::Specification.new do |s| + s.name = "test-theme-skinny" + s.version = "0.1.0" + s.licenses = ["MIT"] + s.summary = "This is a theme with just layouts used to test Jekyll" + s.authors = ["Jekyll"] + s.files = ["lib/example.rb"] + s.homepage = "https://github.com/jekyll/jekyll" +end From ed8681b1e735fe8983709ce482798eb4d6ea3e9d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 1 Jul 2019 13:56:41 -0400 Subject: [PATCH 3686/4996] Update history to reflect merge of #7679 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 092ce44decb..7b16dfa75f3 100644 --- a/History.markdown +++ b/History.markdown @@ -64,6 +64,7 @@ * Backport #7213 and #7633 for v3.8.x: Fix broken include_relative usage in excerpt (#7690) * Don't read symlinks in site.include in safe mode (#7711) * Replace `String#=~` with `String#match?` (#7723) + * Update log output for an invalid theme directory (#7679) ### Minor Enhancements From 03b500b7b7aebfe41afda7f51384758c61a94f74 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Tue, 2 Jul 2019 23:54:02 +0530 Subject: [PATCH 3687/4996] Move updates from generated file to source file #7464 and #7671 erroneously made changes to the auto-generated document `docs/_docs/contributing.md` instead of the source file `.github/CONTRIBUTING.markdown` --- .github/CONTRIBUTING.markdown | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/CONTRIBUTING.markdown b/.github/CONTRIBUTING.markdown index 7283ca881e6..fc1b9852a81 100644 --- a/.github/CONTRIBUTING.markdown +++ b/.github/CONTRIBUTING.markdown @@ -4,7 +4,7 @@ Hi there! Interested in contributing to Jekyll? We'd love your help. Jekyll is a ## Where to get help or report a problem -See [the support guidelines](https://jekyllrb.com/docs/support/) +See the [support guidelines](https://jekyllrb.com/docs/support/) ## Ways to contribute @@ -12,9 +12,9 @@ Whether you're a developer, a designer, or just a Jekyll devotee, there are lots * [Install Jekyll on your computer](https://jekyllrb.com/docs/installation/) and kick the tires. Does it work? Does it do what you'd expect? If not, [open an issue](https://github.com/jekyll/jekyll/issues/new) and let us know. * Comment on some of the project's [open issues](https://github.com/jekyll/jekyll/issues). Have you experienced the same problem? Know a work around? Do you have a suggestion for how the feature could be better? -* Read through [the documentation](https://jekyllrb.com/docs/home/), and click the "improve this page" button, any time you see something confusing, or have a suggestion for something that could be improved. -* Browse through [the Jekyll discussion forum](https://talk.jekyllrb.com/), and lend a hand answering questions. There's a good chance you've already experienced what another user is experiencing. -* Find [an open issue](https://github.com/jekyll/jekyll/issues) (especially [those labeled `help-wanted`](https://github.com/jekyll/jekyll/issues?q=is%3Aopen+is%3Aissue+label%3Ahelp-wanted)), and submit a proposed fix. If it's your first pull request, we promise we won't bite, and are glad to answer any questions. +* Read through the [documentation](https://jekyllrb.com/docs/home/), and click the "improve this page" button, any time you see something confusing, or have a suggestion for something that could be improved. +* Browse through the [Jekyll discussion forum](https://talk.jekyllrb.com/), and lend a hand answering questions. There's a good chance you've already experienced what another user is experiencing. +* Find an [open issue](https://github.com/jekyll/jekyll/issues) (especially [those labeled `help-wanted`](https://github.com/jekyll/jekyll/issues?q=is%3Aopen+is%3Aissue+label%3Ahelp-wanted)), and submit a proposed fix. If it's your first pull request, we promise we won't bite, and are glad to answer any questions. * Help evaluate [open pull requests](https://github.com/jekyll/jekyll/pulls), by testing the changes locally and reviewing what's proposed. ## Submitting a pull request @@ -49,7 +49,7 @@ That's it! You'll be automatically subscribed to receive updates as others revie 2. Clone the repository locally `git clone https://github.com//jekyll`. 3. Create a new, descriptively named branch to contain your change ( `git checkout -b my-awesome-feature` ). 4. Hack away, add tests. Not necessarily in that order. -5. Make sure everything still passes by running `script/cibuild` (see [the tests section](#running-tests-locally) below) +5. Make sure everything still passes by running `script/cibuild` (see the [tests section](#running-tests-locally) below) 6. Push the branch up ( `git push origin my-awesome-feature` ). 7. Create a pull request by visiting `https://github.com//jekyll` and following the instructions at the top of the screen. @@ -89,7 +89,7 @@ If you want to add your plugin to the [list of plugins](https://jekyllrb.com/doc ## Code Contributions -Interesting in submitting a pull request? Awesome. Read on. There's a few common gotchas that we'd love to help you avoid. +Interested in submitting a pull request? Awesome. Read on. There's a few common gotchas that we'd love to help you avoid. ### Tests and documentation From 5b195ffe749e3620ba00e6e4d811c5c05432ae54 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 3 Jul 2019 00:14:23 +0530 Subject: [PATCH 3688/4996] Generate a new site to reflect unreleased changes --- docs/_docs/contributing.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index e709fcaeab7..93f1674cd45 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -119,6 +119,8 @@ If your contribution changes any Jekyll behavior, make sure to update the docume Jekyll's methods. It also provides you with helpful methods to quickly create a site or configuration. [Feel free to check it out!](https://github.com/jekyll/jekyll/blob/master/script/console) +* Previously, we've used the WIP Probot app to help contributors determine whether their pull request is ready for review. Please use a [draft pull request](https://help.github.com/en/articles/about-pull-requests#draft-pull-requests) instead. When you're ready, [mark the pull request as ready for review](https://help.github.com/en/articles/changing-the-stage-of-a-pull-request) + ## Running tests locally ### Test Dependencies From e318d1c836024a94234241cc910b5eb78e2fed23 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 2 Jul 2019 11:27:02 -0400 Subject: [PATCH 3689/4996] Create 3.8.6 release notes --- History.markdown | 2 +- docs/_docs/history.md | 19 +++++++++++++++++++ .../2019-07-02-jekyll-3-8-6-released.markdown | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 docs/_posts/2019-07-02-jekyll-3-8-6-released.markdown diff --git a/History.markdown b/History.markdown index 7b16dfa75f3..603cc7e8b1c 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,4 @@ -## HEAD +## 3.8.6 / 2018-07-03 ### Major Enhancements diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 8d646bfe3fd..062505718c3 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,6 +4,25 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- +## 3.8.6 / 2018-07-03 +{: #v3-8-6} + +### Bug Fixes +{: #bug-fixes-v3-8-6} + +- Update log output for an invalid theme directory ([#7734]({{ site.repository }}/issues/7734)) +- Memoize `SiteDrop#documents` to reduce allocations ([#7722]({{ site.repository }}/issues/7722)) +- Excerpt handling of custom and intermediate tags ([#7467]({{ site.repository }}/issues/7467)) +- Escape valid special chars in a site's path name ([#7573]({{ site.repository }}/issues/7573)) +- Revert memoizing `Site#docs_to_write` and refactor `#documents` ([#7689]({{ site.repository }}/issues/7689)) +- Fix broken `include_relative` usage in excerpt ([#7690]({{ site.repository }}/issues/7690)) + +### Security Fixes +{: #security-fixes-v3-8-6} + +- Theme gems: ensure directories aren't symlinks ([#7424]({{ site.repository }}/issues/7424)) + + ## 3.8.5 / 2018-11-04 {: #v3-8-5} diff --git a/docs/_posts/2019-07-02-jekyll-3-8-6-released.markdown b/docs/_posts/2019-07-02-jekyll-3-8-6-released.markdown new file mode 100644 index 00000000000..f05cd7cd981 --- /dev/null +++ b/docs/_posts/2019-07-02-jekyll-3-8-6-released.markdown @@ -0,0 +1,19 @@ +--- +title: 'Jekyll 3.8.6 Released' +date: 2019-07-02 11:21:02 -0400 +author: parkr +version: 3.8.6 +categories: [release] +--- + +We have another patch release in the 3.8 series! This time, we have one security patch +and a handful of bug patches, including: + +- Filter symlinks from theme gems +- Fix excerpt handling of some Liquid tags +- Handle case where a theme directory doesn't exist +- A few internal optimizations to reduce memory overhead + +... and a few more! You can check out the patches and see all the details in [the release notes](/docs/history/#v3-8-6) + +Happy Jekylling! From fcb8a1ecd3130beb870769291f8d0f4adab3c9d9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 2 Jul 2019 12:06:27 -0400 Subject: [PATCH 3690/4996] Update contributing documentation on the website --- docs/_docs/contributing.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index 93f1674cd45..91fb42cc1de 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -8,7 +8,7 @@ Hi there! Interested in contributing to Jekyll? We'd love your help. Jekyll is a ## Where to get help or report a problem -See the [support guidelines](https://jekyllrb.com/docs/support/) +See [the support guidelines](https://jekyllrb.com/docs/support/) ## Ways to contribute @@ -16,9 +16,9 @@ Whether you're a developer, a designer, or just a Jekyll devotee, there are lots * [Install Jekyll on your computer](https://jekyllrb.com/docs/installation/) and kick the tires. Does it work? Does it do what you'd expect? If not, [open an issue](https://github.com/jekyll/jekyll/issues/new) and let us know. * Comment on some of the project's [open issues](https://github.com/jekyll/jekyll/issues). Have you experienced the same problem? Know a work around? Do you have a suggestion for how the feature could be better? -* Read through the [documentation](https://jekyllrb.com/docs/home/), and click the "improve this page" button, any time you see something confusing, or have a suggestion for something that could be improved. -* Browse through the [Jekyll discussion forum](https://talk.jekyllrb.com/), and lend a hand answering questions. There's a good chance you've already experienced what another user is experiencing. -* Find an [open issue](https://github.com/jekyll/jekyll/issues) (especially [those labeled `help-wanted`](https://github.com/jekyll/jekyll/issues?q=is%3Aopen+is%3Aissue+label%3Ahelp-wanted)), and submit a proposed fix. If it's your first pull request, we promise we won't bite, and are glad to answer any questions. +* Read through [the documentation](https://jekyllrb.com/docs/home/), and click the "improve this page" button, any time you see something confusing, or have a suggestion for something that could be improved. +* Browse through [the Jekyll discussion forum](https://talk.jekyllrb.com/), and lend a hand answering questions. There's a good chance you've already experienced what another user is experiencing. +* Find [an open issue](https://github.com/jekyll/jekyll/issues) (especially [those labeled `help-wanted`](https://github.com/jekyll/jekyll/issues?q=is%3Aopen+is%3Aissue+label%3Ahelp-wanted)), and submit a proposed fix. If it's your first pull request, we promise we won't bite, and are glad to answer any questions. * Help evaluate [open pull requests](https://github.com/jekyll/jekyll/pulls), by testing the changes locally and reviewing what's proposed. ## Submitting a pull request @@ -53,7 +53,7 @@ That's it! You'll be automatically subscribed to receive updates as others revie 2. Clone the repository locally `git clone https://github.com//jekyll`. 3. Create a new, descriptively named branch to contain your change ( `git checkout -b my-awesome-feature` ). 4. Hack away, add tests. Not necessarily in that order. -5. Make sure everything still passes by running `script/cibuild` (see the [tests section](#running-tests-locally) below) +5. Make sure everything still passes by running `script/cibuild` (see [the tests section](#running-tests-locally) below) 6. Push the branch up ( `git push origin my-awesome-feature` ). 7. Create a pull request by visiting `https://github.com//jekyll` and following the instructions at the top of the screen. @@ -93,7 +93,7 @@ If you want to add your plugin to the [list of plugins](https://jekyllrb.com/doc ## Code Contributions -Interested in submitting a pull request? Awesome. Read on. There's a few common gotchas that we'd love to help you avoid. +Interesting in submitting a pull request? Awesome. Read on. There's a few common gotchas that we'd love to help you avoid. ### Tests and documentation From b7e3f10a08d5701cd0d9f16eef38137bcaea809d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 2 Jul 2019 12:06:59 -0400 Subject: [PATCH 3691/4996] Move 3.8.6 documentation to the correct location in the History.markdown --- History.markdown | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 603cc7e8b1c..f0e5badc9ee 100644 --- a/History.markdown +++ b/History.markdown @@ -1,4 +1,4 @@ -## 3.8.6 / 2018-07-03 +## HEAD ### Major Enhancements @@ -305,6 +305,21 @@ * Release v4.0.0.pre.alpha1 (#7574) +## 3.8.6 / 2018-07-03 + +### Bug Fixes + + * Update log output for an invalid theme directory (#7734) + * Memoize `SiteDrop#documents` to reduce allocations (#7722) + * Excerpt handling of custom and intermediate tags (#7467) + * Escape valid special chars in a site's path name (#7573) + * Revert memoizing `Site#docs_to_write` and refactor `#documents` (#7689) + * Fix broken `include_relative` usage in excerpt (#7690) + +### Security Fixes + + * Theme gems: ensure directories aren't symlinks (#7424) + ## 3.8.5 / 2018-11-04 ### Bug Fixes From 7c34db39912bc9d7abb0f0c2e9a0dd0048dd6b88 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 2 Jul 2019 18:17:17 +0200 Subject: [PATCH 3692/4996] Fix date --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index f0e5badc9ee..143be635584 100644 --- a/History.markdown +++ b/History.markdown @@ -305,7 +305,7 @@ * Release v4.0.0.pre.alpha1 (#7574) -## 3.8.6 / 2018-07-03 +## 3.8.6 / 2019-07-02 ### Bug Fixes From f42e0e7169ad7f485b47d05c790e5c4a5991feef Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 2 Jul 2019 13:54:15 -0400 Subject: [PATCH 3693/4996] Regenerate the History file bassed on our new date --- docs/_docs/history.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/history.md b/docs/_docs/history.md index 062505718c3..de6a93bb8a4 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -4,7 +4,7 @@ permalink: "/docs/history/" note: This file is autogenerated. Edit /History.markdown instead. --- -## 3.8.6 / 2018-07-03 +## 3.8.6 / 2019-07-02 {: #v3-8-6} ### Bug Fixes From 5bc21d82f6c4aec5f0c4aaefbb5fb0d2cf258890 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 2 Jul 2019 21:29:07 +0200 Subject: [PATCH 3694/4996] Regenerate Contributing --- docs/_docs/contributing.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index 91fb42cc1de..93f1674cd45 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -8,7 +8,7 @@ Hi there! Interested in contributing to Jekyll? We'd love your help. Jekyll is a ## Where to get help or report a problem -See [the support guidelines](https://jekyllrb.com/docs/support/) +See the [support guidelines](https://jekyllrb.com/docs/support/) ## Ways to contribute @@ -16,9 +16,9 @@ Whether you're a developer, a designer, or just a Jekyll devotee, there are lots * [Install Jekyll on your computer](https://jekyllrb.com/docs/installation/) and kick the tires. Does it work? Does it do what you'd expect? If not, [open an issue](https://github.com/jekyll/jekyll/issues/new) and let us know. * Comment on some of the project's [open issues](https://github.com/jekyll/jekyll/issues). Have you experienced the same problem? Know a work around? Do you have a suggestion for how the feature could be better? -* Read through [the documentation](https://jekyllrb.com/docs/home/), and click the "improve this page" button, any time you see something confusing, or have a suggestion for something that could be improved. -* Browse through [the Jekyll discussion forum](https://talk.jekyllrb.com/), and lend a hand answering questions. There's a good chance you've already experienced what another user is experiencing. -* Find [an open issue](https://github.com/jekyll/jekyll/issues) (especially [those labeled `help-wanted`](https://github.com/jekyll/jekyll/issues?q=is%3Aopen+is%3Aissue+label%3Ahelp-wanted)), and submit a proposed fix. If it's your first pull request, we promise we won't bite, and are glad to answer any questions. +* Read through the [documentation](https://jekyllrb.com/docs/home/), and click the "improve this page" button, any time you see something confusing, or have a suggestion for something that could be improved. +* Browse through the [Jekyll discussion forum](https://talk.jekyllrb.com/), and lend a hand answering questions. There's a good chance you've already experienced what another user is experiencing. +* Find an [open issue](https://github.com/jekyll/jekyll/issues) (especially [those labeled `help-wanted`](https://github.com/jekyll/jekyll/issues?q=is%3Aopen+is%3Aissue+label%3Ahelp-wanted)), and submit a proposed fix. If it's your first pull request, we promise we won't bite, and are glad to answer any questions. * Help evaluate [open pull requests](https://github.com/jekyll/jekyll/pulls), by testing the changes locally and reviewing what's proposed. ## Submitting a pull request @@ -53,7 +53,7 @@ That's it! You'll be automatically subscribed to receive updates as others revie 2. Clone the repository locally `git clone https://github.com//jekyll`. 3. Create a new, descriptively named branch to contain your change ( `git checkout -b my-awesome-feature` ). 4. Hack away, add tests. Not necessarily in that order. -5. Make sure everything still passes by running `script/cibuild` (see [the tests section](#running-tests-locally) below) +5. Make sure everything still passes by running `script/cibuild` (see the [tests section](#running-tests-locally) below) 6. Push the branch up ( `git push origin my-awesome-feature` ). 7. Create a pull request by visiting `https://github.com//jekyll` and following the instructions at the top of the screen. @@ -93,7 +93,7 @@ If you want to add your plugin to the [list of plugins](https://jekyllrb.com/doc ## Code Contributions -Interesting in submitting a pull request? Awesome. Read on. There's a few common gotchas that we'd love to help you avoid. +Interested in submitting a pull request? Awesome. Read on. There's a few common gotchas that we'd love to help you avoid. ### Tests and documentation From fea0b69d398f6934ad67bbbac84281ddadfab4d7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 2 Jul 2019 16:51:40 -0400 Subject: [PATCH 3695/4996] 3.8.6: add release note for 3c06609406 --- History.markdown | 1 + docs/_docs/history.md | 1 + 2 files changed, 2 insertions(+) diff --git a/History.markdown b/History.markdown index 143be635584..f9f337c5e60 100644 --- a/History.markdown +++ b/History.markdown @@ -315,6 +315,7 @@ * Escape valid special chars in a site's path name (#7573) * Revert memoizing `Site#docs_to_write` and refactor `#documents` (#7689) * Fix broken `include_relative` usage in excerpt (#7690) + * Install platform-specific gems as required (3c06609406) ### Security Fixes diff --git a/docs/_docs/history.md b/docs/_docs/history.md index de6a93bb8a4..5756d65f560 100644 --- a/docs/_docs/history.md +++ b/docs/_docs/history.md @@ -16,6 +16,7 @@ note: This file is autogenerated. Edit /History.markdown instead. - Escape valid special chars in a site's path name ([#7573]({{ site.repository }}/issues/7573)) - Revert memoizing `Site#docs_to_write` and refactor `#documents` ([#7689]({{ site.repository }}/issues/7689)) - Fix broken `include_relative` usage in excerpt ([#7690]({{ site.repository }}/issues/7690)) +- Install platform-specific gems as required (3c06609406) ### Security Fixes {: #security-fixes-v3-8-6} From 77b6033f2fa15b0d89af40ac7b21059ba3f350b8 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 10 Jul 2019 16:15:59 +0530 Subject: [PATCH 3696/4996] Update Jekyll version in docs header --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 9abf560087e..0c7a2b1b6d7 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,5 +1,5 @@ --- -version: 3.8.5 +version: 3.8.6 min_ruby_version: 2.4.0 name: Jekyll • Simple, blog-aware, static sites description: Transform your plain text into static websites and blogs From 135ebe26604e697fa8766deec8fb672e592e405b Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 12 Jul 2019 20:14:45 +0530 Subject: [PATCH 3697/4996] Reduce Array objects generated from utility method (#7749) Merge pull request 7749 --- lib/jekyll/utils.rb | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 71dc9de59fa..8aea4ac258b 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -68,11 +68,14 @@ def duplicable?(obj) # # Returns an array def pluralized_array_from_hash(hash, singular_key, plural_key) - [].tap do |array| - value = value_from_singular_key(hash, singular_key) - value ||= value_from_plural_key(hash, plural_key) - array << value - end.flatten.compact + array = [] + value = value_from_singular_key(hash, singular_key) + value ||= value_from_plural_key(hash, plural_key) + + array << value + array.flatten! + array.compact! + array end def value_from_singular_key(hash, key) From 4c9cbad6775749ccf4f16be8dab5eb054d182c55 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 12 Jul 2019 10:44:47 -0400 Subject: [PATCH 3698/4996] Update history to reflect merge of #7749 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f9f337c5e60..98b50b76da8 100644 --- a/History.markdown +++ b/History.markdown @@ -165,6 +165,7 @@ * Bump RuboCop to v0.71.0 (#7687) * Use regexp to filter special entries (#7702) * Replace `String#=~` with `String#match?` (#7718) + * Reduce Array objects generated from utility method (#7749) ### Documentation From ffe8d168f250ed52f27657f4001e4500227b7c1f Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 14 Jul 2019 12:33:46 +0530 Subject: [PATCH 3699/4996] Prefer Regexp#match? over String#match? This commit fixes a minor regression introduced in the commit e10a909 Prefer using `Regexp#match` because `@file` or `file` in these lines could be `nil` if the `tag_markup` is just whitespace. In that scenario, Jekyll should proceed to the validation logic and bail instead of raising a `NoMethodError` exception. --- History.markdown | 1 - lib/jekyll/tags/include.rb | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/History.markdown b/History.markdown index 98b50b76da8..d7af2ccc7cc 100644 --- a/History.markdown +++ b/History.markdown @@ -164,7 +164,6 @@ * Update TestTags in sync with Rouge v3.4 (#7709) * Bump RuboCop to v0.71.0 (#7687) * Use regexp to filter special entries (#7702) - * Replace `String#=~` with `String#match?` (#7718) * Reduce Array objects generated from utility method (#7749) ### Documentation diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index b43fe4532f2..20a41bb779c 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -54,7 +54,7 @@ def parse_params(context) end def validate_file_name(file) - if file.match?(INVALID_SEQUENCES) || !file.match?(VALID_FILENAME_CHARS) + if INVALID_SEQUENCES.match?(file) || !VALID_FILENAME_CHARS.match?(file) raise ArgumentError, <<~MSG Invalid syntax for include tag. File contains invalid characters or sequences: @@ -90,7 +90,7 @@ def file_read_opts(context) # Render the variable if required def render_variable(context) - Liquid::Template.parse(@file).render(context) if @file.match?(VARIABLE_SYNTAX) + Liquid::Template.parse(@file).render(context) if VARIABLE_SYNTAX.match?(@file) end def tag_includes_dirs(context) From 854e83230ec94384e876f3c5c6be104b45c92274 Mon Sep 17 00:00:00 2001 From: Chris Oliver Date: Mon, 15 Jul 2019 10:38:53 -0500 Subject: [PATCH 3700/4996] Add recursive navigation tutorial (#7720) Merge pull request 7720 --- docs/_tutorials/navigation.md | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index 87368b0fee3..bcb9fe152a5 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -605,3 +605,65 @@ The `for item in items` loop looks through each `item` and gets the `title` and For more details on the `group_by` filter, see [Jekyll's Templates documentation](https://jekyllrb.com/docs/templates/) as well as [this Siteleaf tutorial](https://www.siteleaf.com/blog/advanced-liquid-group-by/). For more details on the `sort` filter, see [sort](https://shopify.github.io/liquid/filters/sort/) in Liquid's documentation. Whether you use properties in your doc's front matter to retrieve your pages or a YAML data file, in both cases you can programmatically build a more robust navigation for your site. + +## Scenario 9: Nested tree navigation with recursion + +Suppose you want a nested tree navigation of any depth. We can achieve this by recursively looping through our tree of navigation links. + +**YAML** + +```yaml +nav: + - title: Deployment + url: deployment.html + subnav: + - title: Heroku + url: heroku.html + subnav: + - title: Jekyll on Heroku + url: jekyll-on-heroku.html + - title: Help + url: help.html +``` + +**Liquid** + +First, we'll create an include that we can use for rendering the navigation tree. This file would be `_includes/nav.html` + +{% raw %} +```liquid +
      + {% for item in include.nav %} +
    • {{ item.title }}
    • + + {% if item.subnav %} + {% include nav.html nav=item.subnav %} + {% endif %} + {% endfor %} +
    +``` +{% endraw %} + +To render this in your layout or pages, you would simply include the template and pass in the `nav` parameter. In this case, we'll use the `page.nav` to grab it from the yaml frontmatter. + +{% raw %} +```liquid +{% include nav.html nav=page.nav %} +``` +{% endraw %} + +Our include will use this first, then look through each item for a `subnav` property to recursively render the nested lists. + +**Result** +
    + +
    From 7096885e98a72a3ed8cbe4c2c666d0f490211ea9 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 15 Jul 2019 11:38:55 -0400 Subject: [PATCH 3701/4996] Update history to reflect merge of #7720 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d7af2ccc7cc..158b7d23a37 100644 --- a/History.markdown +++ b/History.markdown @@ -291,6 +291,7 @@ * fix link to Site Source config (#7708) * Add Jekpack to resources page (#7598) * Introduce frontmatter in step 2 (#7704) + * Add recursive navigation tutorial (#7720) ### Site Enhancements From 8d5b5fa4dc839519ed0b5c2203e6b7925a6b0caa Mon Sep 17 00:00:00 2001 From: strangehill Date: Thu, 18 Jul 2019 17:13:59 +0800 Subject: [PATCH 3702/4996] Update .gitignore snippet in tutorial (#7748) --- docs/_tutorials/using-jekyll-with-bundler.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/_tutorials/using-jekyll-with-bundler.md b/docs/_tutorials/using-jekyll-with-bundler.md index 3aa34bbb0c6..0acbad289fe 100644 --- a/docs/_tutorials/using-jekyll-with-bundler.md +++ b/docs/_tutorials/using-jekyll-with-bundler.md @@ -95,12 +95,14 @@ in. You can use this `.gitignore` to get started, if you want. **.gitignore** ``` -# Ignore folders generated by Bundler -vendor -.bundle +# Ignore metadata generated by Jekyll +_site/ +.sass-cache/ +.jekyll-cache/ +.jekyll-metadata -# Ignore folders generated by Jekyll -.sass-cache -_site +# Ignore folders generated by Bundler +.bundle/ +vendor/ ``` From 5157bdc753d7f761e77ce15fe3cf626305639626 Mon Sep 17 00:00:00 2001 From: Andrew Marcuse Date: Sat, 20 Jul 2019 11:36:32 -0400 Subject: [PATCH 3703/4996] Update mime.types (#7756) Merge pull request 7756 --- lib/jekyll/mime.types | 64 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/lib/jekyll/mime.types b/lib/jekyll/mime.types index af68d359e11..3fb0529680e 100644 --- a/lib/jekyll/mime.types +++ b/lib/jekyll/mime.types @@ -19,18 +19,17 @@ application/davmount+xml davmou application/docbook+xml dbk application/dssc+der dssc application/dssc+xml xdssc -application/ecmascript ecma +application/ecmascript ecma es application/emma+xml emma application/epub+zip epub application/exi exi application/font-tdpfr pfr -application/font-woff woff -application/font-woff2 woff2 application/geo+json geojson application/gml+xml gml application/gpx+xml gpx application/gxf gxf application/gzip gz +application/hjson hjson application/hyperstudio stk application/inkml+xml ink inkml application/ipfix ipfix @@ -61,6 +60,8 @@ application/mp21 m21 mp application/mp4 mp4s m4p application/msword doc dot application/mxf mxf +application/n-quads nq +application/n-triples nt application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy exe dll deb dmg iso img msi msp msm buffer application/oda oda application/oebps-package+xml opf @@ -86,7 +87,8 @@ application/pls+xml pls application/postscript ai eps ps application/prs.cww cww application/pskc+xml pskcxml -application/rdf+xml rdf +application/raml+yaml raml +application/rdf+xml rdf owl application/reginfo+xml rif application/relax-ng-compact-syntax rnc application/resource-lists+xml rl @@ -107,6 +109,7 @@ application/sdp sdp application/set-payment-initiation setpay application/set-registration-initiation setreg application/shf+xml shf +application/sieve siv sieve application/smil+xml smi smil application/sparql-query rq application/sparql-results+xml srx @@ -143,7 +146,10 @@ application/vnd.anser-web-certificate-issue-initiation cii application/vnd.anser-web-funds-transfer-initiation fti application/vnd.antix.game-component atx application/vnd.apple.installer+xml mpkg +application/vnd.apple.keynote keynote application/vnd.apple.mpegurl m3u8 +application/vnd.apple.numbers numbers +application/vnd.apple.pages pages application/vnd.apple.pkpass pkpass application/vnd.aristanetworks.swi swi application/vnd.astraea-software.iota iota @@ -154,6 +160,7 @@ application/vnd.businessobjects rep application/vnd.chemdraw+xml cdxml application/vnd.chipnuts.karaoke-mmd mmd application/vnd.cinderella cdy +application/vnd.citationstyles.style+xml csl application/vnd.claymore cla application/vnd.cloanto.rp9 rp9 application/vnd.clonk.c4group c4g c4d c4f c4p c4u @@ -482,6 +489,7 @@ application/vnd.yellowriver-custom-menu cmp application/vnd.zul zir zirz application/vnd.zzazz.deck+xml zaz application/voicexml+xml vxml +application/wasm wasm application/widget wgt application/winhlp hlp application/wsdl+xml wsdl @@ -521,10 +529,8 @@ application/x-eva eva application/x-font-bdf bdf application/x-font-ghostscript gsf application/x-font-linux-psf psf -application/x-font-otf otf application/x-font-pcf pcf application/x-font-snf snf -application/x-font-ttf ttf ttc application/x-font-type1 pfa pfb pfm afm application/x-freearc arc application/x-futuresplash spl @@ -661,20 +667,41 @@ chemical/x-cmdf cmdf chemical/x-cml cml chemical/x-csml csml chemical/x-xyz xyz +font/collection ttc +font/otf otf +font/ttf ttf +font/woff woff +font/woff2 woff2 +image/aces exr image/apng apng image/bmp bmp image/cgm cgm +image/dicom-rle drle +image/fits fits image/g3fax g3 image/gif gif +image/heic heic +image/heic-sequence heics +image/heif heif +image/heif-sequence heifs image/ief ief +image/jls jls +image/jp2 jp2 jpg2 image/jpeg jpeg jpg jpe +image/jpm jpm +image/jpx jpx jpf +image/jxr jxr image/ktx ktx image/png png image/prs.btif btif +image/prs.pti pti image/sgi sgi image/svg+xml svg svgz -image/tiff tiff tif +image/t38 t38 +image/tiff tif tiff +image/tiff-fx tfx image/vnd.adobe.photoshop psd +image/vnd.airzip.accelerator.azv azv image/vnd.dece.graphic uvi uvvi uvg uvvg image/vnd.djvu djvu djv image/vnd.dvb.subtitle sub @@ -685,20 +712,22 @@ image/vnd.fpx fpx image/vnd.fst fst image/vnd.fujixerox.edmics-mmr mmr image/vnd.fujixerox.edmics-rlc rlc +image/vnd.microsoft.icon ico image/vnd.ms-modi mdi image/vnd.ms-photo wdp image/vnd.net-fpx npx +image/vnd.tencent.tap tap +image/vnd.valve.source.texture vtf image/vnd.wap.wbmp wbmp image/vnd.xiff xif +image/vnd.zbrush.pcx pcx image/webp webp image/x-3ds 3ds image/x-cmu-raster ras image/x-cmx cmx image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico image/x-jng jng image/x-mrsid-image sid -image/x-pcx pcx image/x-pict pic pct image/x-portable-anymap pnm image/x-portable-bitmap pbm @@ -709,7 +738,14 @@ image/x-tga tga image/x-xbitmap xbm image/x-xpixmap xpm image/x-xwindowdump xwd +message/disposition-notification disposition-notification +message/global u8msg +message/global-delivery-status u8dsn +message/global-disposition-notification u8mdn +message/global-headers u8hdr message/rfc822 eml mime +message/vnd.wfa.wsc wsc +model/3mf 3mf model/gltf+json gltf model/gltf-binary glb model/iges igs iges @@ -719,6 +755,11 @@ model/vnd.dwf dwf model/vnd.gdl gdl model/vnd.gtw gtw model/vnd.mts mts +model/vnd.opengex ogex +model/vnd.parasolid.transmit.binary x_b +model/vnd.parasolid.transmit.text x_t +model/vnd.usdz+zip usdz +model/vnd.valve.source.compiled-map bsp model/vnd.vtu vtu model/vrml wrl vrml model/x3d+binary x3db x3dbz @@ -729,18 +770,19 @@ text/calendar ics if text/coffeescript coffee litcoffee text/css css text/csv csv -text/hjson hjson text/html html htm shtml text/jade jade text/jsx jsx text/less less text/markdown markdown md text/mathml mml +text/mdx mdx text/n3 n3 text/plain txt text conf def list log in ini text/prs.lines.tag dsc text/richtext rtx text/sgml sgml sgm +text/shex shex text/slim slim slm text/stylus stylus styl text/tab-separated-values tsv @@ -788,7 +830,7 @@ video/h261 h261 video/h263 h263 video/h264 h264 video/jpeg jpgv -video/jpm jpm jpgm +video/jpm jpgm video/mj2 mj2 mjp2 video/mp2t ts video/mp4 mp4 mp4v mpg4 From 384a8748054cd0a4bd4ee748afd0a3ec121d06c8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 20 Jul 2019 11:36:34 -0400 Subject: [PATCH 3704/4996] Update history to reflect merge of #7756 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 158b7d23a37..6328aee1f9e 100644 --- a/History.markdown +++ b/History.markdown @@ -165,6 +165,7 @@ * Bump RuboCop to v0.71.0 (#7687) * Use regexp to filter special entries (#7702) * Reduce Array objects generated from utility method (#7749) + * Update mime.types (#7756) ### Documentation From 882279c3075f4b9d036ab0fda00a5ea294968739 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 24 Jul 2019 15:15:27 +0200 Subject: [PATCH 3705/4996] Add default Sass dir --- docs/_docs/configuration/default.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_docs/configuration/default.md b/docs/_docs/configuration/default.md index 8908578da0a..68ab49fc9bd 100644 --- a/docs/_docs/configuration/default.md +++ b/docs/_docs/configuration/default.md @@ -16,6 +16,8 @@ plugins_dir : _plugins layouts_dir : _layouts data_dir : _data includes_dir : _includes +sass: + sass_dir: _sass collections: posts: output : true From 179599645810f289cbd6cd6eee4e519b7857f478 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 25 Jul 2019 22:05:30 +0530 Subject: [PATCH 3706/4996] Replace redundant Array#map with Array#each (#7761) Merge pull request 7761 --- lib/jekyll/readers/page_reader.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/readers/page_reader.rb b/lib/jekyll/readers/page_reader.rb index 62d7419efec..af4b879db39 100644 --- a/lib/jekyll/readers/page_reader.rb +++ b/lib/jekyll/readers/page_reader.rb @@ -9,14 +9,13 @@ def initialize(site, dir) @unfiltered_content = [] end - # Read all the files in // for Yaml header and create a new Page - # object for each file. + # Create a new `Jekyll::Page` object for each entry in a given array. # - # dir - The String relative path of the directory to read. + # files - An array of file names inside `@dir` # - # Returns an array of static pages. + # Returns an array of publishable `Jekyll::Page` objects. def read(files) - files.map do |page| + files.each do |page| @unfiltered_content << Page.new(@site, @site.source, @dir, page) end @unfiltered_content.select { |page| site.publisher.publish?(page) } From 0f4b7be88ddd39593c226486f056f7402e75299c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 25 Jul 2019 12:35:32 -0400 Subject: [PATCH 3707/4996] Update history to reflect merge of #7761 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6328aee1f9e..fecb45a63c2 100644 --- a/History.markdown +++ b/History.markdown @@ -166,6 +166,7 @@ * Use regexp to filter special entries (#7702) * Reduce Array objects generated from utility method (#7749) * Update mime.types (#7756) + * Replace redundant Array#map with Array#each (#7761) ### Documentation From f3a03a14cd26ff716809f1bb01dde95f56d7890a Mon Sep 17 00:00:00 2001 From: Matt Kraai Date: Wed, 31 Jul 2019 05:49:38 -0700 Subject: [PATCH 3708/4996] Fix misspelling (#7764) Merge pull request 7764 --- docs/_docs/installation/windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/installation/windows.md b/docs/_docs/installation/windows.md index 4623b40541e..ceda22b01ce 100644 --- a/docs/_docs/installation/windows.md +++ b/docs/_docs/installation/windows.md @@ -23,7 +23,7 @@ We only cover RubyInstaller-2.4 and newer here, older versions need to 1. Download and Install a **Ruby+Devkit** version from [RubyInstaller Downloads](https://rubyinstaller.org/downloads/). Use default options for installation. 2. Run the `ridk install` step on the last stage of the installation wizard. This is needed for installing gems with native - extensions. You can find addtional information regarding this in the + extensions. You can find additional information regarding this in the [RubyInstaller Documentation](https://github.com/oneclick/rubyinstaller2#using-the-installer-on-a-target-system) 3. Open a new command prompt window from the start menu, so that changes to the `PATH` environment variable becomes effective. Install Jekyll and Bundler via: `gem install jekyll bundler` From 4eec5a55c350200b6b82832731ce4d8ac98d5d6b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 31 Jul 2019 08:49:40 -0400 Subject: [PATCH 3709/4996] Update history to reflect merge of #7764 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fecb45a63c2..75f674975f6 100644 --- a/History.markdown +++ b/History.markdown @@ -294,6 +294,7 @@ * Add Jekpack to resources page (#7598) * Introduce frontmatter in step 2 (#7704) * Add recursive navigation tutorial (#7720) + * Fix misspelling of "additional" (#7764) ### Site Enhancements From b55927e8f71b5d3cd6258f7f0d08962dd759cf7d Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 2 Aug 2019 01:51:00 +0530 Subject: [PATCH 3710/4996] Add PathManager class to cache interim paths (#7732) Merge pull request 7732 --- lib/jekyll.rb | 1 + lib/jekyll/entry_filter.rb | 4 ++-- lib/jekyll/page.rb | 2 +- lib/jekyll/path_manager.rb | 31 +++++++++++++++++++++++++++++++ lib/jekyll/reader.rb | 2 +- lib/jekyll/tags/include.rb | 2 +- 6 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 lib/jekyll/path_manager.rb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 2b0e63826bd..07304057049 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -65,6 +65,7 @@ module Jekyll autoload :LogAdapter, "jekyll/log_adapter" autoload :Page, "jekyll/page" autoload :PageWithoutAFile, "jekyll/page_without_a_file" + autoload :PathManager, "jekyll/path_manager" autoload :PluginManager, "jekyll/plugin_manager" autoload :Publisher, "jekyll/publisher" autoload :Reader, "jekyll/reader" diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index 4a238036ec9..b8f4e044238 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -90,12 +90,12 @@ def symlink_outside_site_source?(entry) # Check if an entry matches a specific pattern. # Returns true if path matches against any glob pattern, else false. def glob_include?(enumerator, entry) - entry_with_source = File.join(site.source, entry) + entry_with_source = PathManager.join(site.source, entry) enumerator.any? do |pattern| case pattern when String - pattern_with_source = File.join(site.source, pattern) + pattern_with_source = PathManager.join(site.source, pattern) File.fnmatch?(pattern_with_source, entry_with_source) || entry_with_source.start_with?(pattern_with_source) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index e6d691c25dc..f353252d825 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -47,7 +47,7 @@ def initialize(site, base, dir, name) end process(name) - read_yaml(File.join(base, dir), name) + read_yaml(PathManager.join(base, dir), name) data.default_proc = proc do |_, key| site.frontmatter_defaults.find(relative_path, type, key) diff --git a/lib/jekyll/path_manager.rb b/lib/jekyll/path_manager.rb new file mode 100644 index 00000000000..eeed1f95890 --- /dev/null +++ b/lib/jekyll/path_manager.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Jekyll + # A singleton class that caches frozen instances of path strings returned from its methods. + # + # NOTE: + # This class exists because `File.join` allocates an Array and returns a new String on every + # call using **the same arguments**. Caching the result means reduced memory usage. + # However, the caches are never flushed so that they can be used even when a site is + # regenerating. The results are frozen to deter mutation of the cached string. + # + # Therefore, employ this class only for situations where caching the result is necessary + # for performance reasons. + # + class PathManager + # This class cannot be initialized from outside + private_class_method :new + + # Wraps `File.join` to cache the frozen result. + # Reassigns `nil`, empty strings and empty arrays to a frozen empty string beforehand. + # + # Returns a frozen string. + def self.join(base, item) + base = "" if base.nil? || base.empty? + item = "" if item.nil? || item.empty? + @join ||= {} + @join[base] ||= {} + @join[base][item] ||= File.join(base, item).freeze + end + end +end diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index 797e4291a1b..381d9d3165f 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -85,7 +85,7 @@ def retrieve_posts(dir) def retrieve_dirs(_base, dir, dot_dirs) dot_dirs.each do |file| dir_path = site.in_source_dir(dir, file) - rel_path = File.join(dir, file) + rel_path = PathManager.join(dir, file) @site.reader.read_directories(rel_path) unless @site.dest.chomp("/") == dir_path end end diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 20a41bb779c..7fabe25fea9 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -100,7 +100,7 @@ def tag_includes_dirs(context) def locate_include_file(context, file, safe) includes_dirs = tag_includes_dirs(context) includes_dirs.each do |dir| - path = File.join(dir.to_s, file.to_s) + path = PathManager.join(dir, file) return path if valid_include_file?(path, dir.to_s, safe) end raise IOError, could_not_locate_message(file, includes_dirs, safe) From 532c499751f564512d4f7ae84721afb3a2523ba1 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 1 Aug 2019 16:21:04 -0400 Subject: [PATCH 3711/4996] Update history to reflect merge of #7732 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 75f674975f6..13089508aea 100644 --- a/History.markdown +++ b/History.markdown @@ -109,6 +109,7 @@ * Add `type` attribute to Document instances (#7406) * Reduce allocations from where-filter (#7653) * Memoize SiteDrop#documents to reduce allocations (#7697) + * Add PathManager class to cache interim paths (#7732) ### Development Fixes From 07270c7cfd94aa1b5cfbbd8b9d2e5aedfe203a0b Mon Sep 17 00:00:00 2001 From: Michael Bishop Date: Fri, 2 Aug 2019 23:32:07 -0400 Subject: [PATCH 3712/4996] docs: improve how to include rouge stylesheets (#7752) Merge pull request 7752 --- docs/_docs/liquid/tags.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/_docs/liquid/tags.md b/docs/_docs/liquid/tags.md index d402a8558c2..d5ee9d6373f 100644 --- a/docs/_docs/liquid/tags.md +++ b/docs/_docs/liquid/tags.md @@ -78,7 +78,17 @@ end In order for the highlighting to show up, you’ll need to include a highlighting stylesheet. For Pygments or Rouge you can use a stylesheet for Pygments, you -can find an example gallery [here](http://help.farbox.com/pygments.html). +can find an example gallery +[here](https://jwarby.github.io/jekyll-pygments-themes/languages/ruby.html) +or from [its repository](https://github.com/jwarby/jekyll-pygments-themes). + +Copy the CSS file (`native.css` for example) into your css directory and import +the syntax highlighter styles into your `main.css`: + +```css +@import "native.css"; +``` + ## Links From a87ca206dad4e2c026a3141612a02c6bffc72519 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 2 Aug 2019 23:32:09 -0400 Subject: [PATCH 3713/4996] Update history to reflect merge of #7752 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 13089508aea..79c861500fc 100644 --- a/History.markdown +++ b/History.markdown @@ -296,6 +296,7 @@ * Introduce frontmatter in step 2 (#7704) * Add recursive navigation tutorial (#7720) * Fix misspelling of "additional" (#7764) + * docs: improve how to include rouge stylesheets (#7752) ### Site Enhancements From 6a4f8bdbeccee063c4bb823aba3df16bafc88615 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 4 Aug 2019 08:49:34 +0200 Subject: [PATCH 3714/4996] Fix: rubocop offenses (#7769) Merge pull request 7769 --- lib/jekyll/excerpt.rb | 2 +- lib/jekyll/filters.rb | 2 ++ lib/jekyll/readers/post_reader.rb | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index dee4613fbbc..c7048e6e1cd 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -155,7 +155,7 @@ def sanctify_liquid_tags(head) tag_names.flatten! tag_names.reverse_each do |tag_name| next unless liquid_block?(tag_name) - next if head =~ endtag_regex_stash(tag_name) + next if endtag_regex_stash(tag_name).match?(head) modified = true head << "\n{% end#{tag_name} %}" diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index cec65ba3943..0353e857eec 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -368,6 +368,7 @@ def item_property(item, property) end end + # rubocop:disable Performance/RegexpMatch # return numeric values as numbers for proper sorting def parse_sort_input(property) number_like = %r!\A\s*-?(?:\d+\.?\d*|\.\d+)\s*\Z! @@ -375,6 +376,7 @@ def parse_sort_input(property) property end + # rubocop:enable Performance/RegexpMatch def as_liquid(item) case item diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb index bdbe6f5c269..17b12321ae4 100644 --- a/lib/jekyll/readers/post_reader.rb +++ b/lib/jekyll/readers/post_reader.rb @@ -50,7 +50,7 @@ def read_publishable(dir, magic_dir, matcher) # Returns klass type of content files def read_content(dir, magic_dir, matcher) @site.reader.get_entries(dir, magic_dir).map do |entry| - next unless entry =~ matcher + next unless matcher.match?(entry) path = @site.in_source_dir(File.join(dir, magic_dir, entry)) Document.new(path, From 9a10ff9b5abc1949083becb2d265abace2ec5215 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 4 Aug 2019 02:49:36 -0400 Subject: [PATCH 3715/4996] Update history to reflect merge of #7769 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 79c861500fc..10518295ff3 100644 --- a/History.markdown +++ b/History.markdown @@ -168,6 +168,7 @@ * Reduce Array objects generated from utility method (#7749) * Update mime.types (#7756) * Replace redundant Array#map with Array#each (#7761) + * Fix: rubocop offenses (#7769) ### Documentation From 0f5e15811fe8f9a33a6cd1e3c05859b627f12e93 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 4 Aug 2019 18:07:45 +0530 Subject: [PATCH 3716/4996] Remove warnings and fixes for deprecated config (#7440) Merge pull request 7440 --- docs/_docs/upgrading/3-to-4.md | 10 +++ features/markdown.feature | 2 +- features/pagination.feature | 6 +- features/plugins.feature | 6 +- features/rendering.feature | 4 +- jekyll.gemspec | 8 +- lib/jekyll/configuration.rb | 151 +++++++-------------------------- test/test_configuration.rb | 108 ++++++++++++----------- 8 files changed, 107 insertions(+), 188 deletions(-) diff --git a/docs/_docs/upgrading/3-to-4.md b/docs/_docs/upgrading/3-to-4.md index 8bd02757e8f..09a46b99b60 100644 --- a/docs/_docs/upgrading/3-to-4.md +++ b/docs/_docs/upgrading/3-to-4.md @@ -156,3 +156,13 @@ Notes: ``` * Vendors that provide a versioned Jekyll Environment Image (e.g. Docker Image, GitHub Pages, etc) will have to manually whitelist kramdown's extension gems in their distributions for Jekyll 4.0. + +## Deprecated Configuration Options + +Jekyll 4.0 has dropped support for all legacy configuration options that were deprecated over multiple +releases in the previous series. + +To that end, we shall no longer output a deprecation warning when we encounter a legacy config key nor +shall we gracefully assign their values to the newer counterparts. Depending on the key, it shall either +be ignored or raise an `InvalidConfigurationError` error if the key is still valid but the associated +value is not of the valid type. diff --git a/features/markdown.feature b/features/markdown.feature index 3649a6d1013..71b13ad969f 100644 --- a/features/markdown.feature +++ b/features/markdown.feature @@ -21,7 +21,7 @@ Feature: Markdown Given I have a configuration file with: | key | value | | paginate | 5 | - | gems | [jekyll-paginate] | + | plugins | [jekyll-paginate] | And I have an "index.html" page that contains "Index - {% for post in paginator.posts %} {{ post.content }} {% endfor %}" And I have a _posts directory And I have the following post: diff --git a/features/pagination.feature b/features/pagination.feature index b8b89ed09cc..e818985066c 100644 --- a/features/pagination.feature +++ b/features/pagination.feature @@ -7,7 +7,7 @@ Feature: Site pagination Given I have a configuration file with: | key | value | | paginate | | - | gems | [jekyll-paginate] | + | plugins | [jekyll-paginate] | And I have a _layouts directory And I have an "index.html" page that contains "{{ paginator.posts.size }}" And I have a _posts directory @@ -35,7 +35,7 @@ Feature: Site pagination | paginate | 1 | | paginate_path | /blog/page-:num | | permalink | /blog/:year/:month/:day/:title | - | gems | [jekyll-paginate] | + | plugins | [jekyll-paginate] | And I have a blog directory And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}" And I have a _posts directory @@ -63,7 +63,7 @@ Feature: Site pagination | paginate | 1 | | paginate_path | /blog/page/:num | | permalink | /blog/:year/:month/:day/:title | - | gems | [jekyll-paginate] | + | plugins | [jekyll-paginate] | And I have a blog directory And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}" And I have an "index.html" page that contains "Don't pick me!" diff --git a/features/plugins.feature b/features/plugins.feature index be01a4a918e..e903783b18d 100644 --- a/features/plugins.feature +++ b/features/plugins.feature @@ -4,7 +4,7 @@ Feature: Configuring and using plugins Scenario: Add a gem-based plugin Given I have an "index.html" file that contains "Whatever" - And I have a configuration file with "gems" set to "[jekyll_test_plugin]" + And I have a configuration file with "plugins" set to "[jekyll_test_plugin]" When I run jekyll build Then I should get a zero exit status And the _site directory should exist @@ -15,7 +15,7 @@ Feature: Configuring and using plugins Given I have an "index.html" file that contains "Whatever" And I have a configuration file with: | key | value | - | gems | [jekyll_test_plugin] | + | plugins | [jekyll_test_plugin] | | whitelist | [] | When I run jekyll build --safe Then I should get a zero exit status @@ -27,7 +27,7 @@ Feature: Configuring and using plugins Given I have an "index.html" file that contains "Whatever" And I have a configuration file with: | key | value | - | gems | [jekyll_test_plugin, jekyll_test_plugin_malicious] | + | plugins | [jekyll_test_plugin, jekyll_test_plugin_malicious] | | whitelist | [jekyll_test_plugin] | When I run jekyll build --safe Then I should get a zero exit status diff --git a/features/rendering.feature b/features/rendering.feature index 0b42d44ba27..654facd5f95 100644 --- a/features/rendering.feature +++ b/features/rendering.feature @@ -98,7 +98,7 @@ Feature: Rendering Scenario: Don't place asset files in layout Given I have an "index.scss" page with layout "simple" that contains ".foo-bar { color:black; }" And I have an "index.coffee" page with layout "simple" that contains "whatever()" - And I have a configuration file with "gems" set to "[jekyll-coffeescript]" + And I have a configuration file with "plugins" set to "[jekyll-coffeescript]" And I have a simple layout that contains "{{ content }}Ahoy, indeed!" When I run jekyll build Then I should get a zero exit status @@ -165,7 +165,7 @@ Feature: Rendering Scenario: Render liquid in CoffeeScript with jekyll-coffeescript enabled Given I have an "index.coffee" page with animal "cicada" that contains "hey='for {{page.animal}}'" - And I have a configuration file with "gems" set to "[jekyll-coffeescript]" + And I have a configuration file with "plugins" set to "[jekyll-coffeescript]" When I run jekyll build Then I should get a zero exit status And the _site directory should exist diff --git a/jekyll.gemspec b/jekyll.gemspec index cdcb16ea137..acbb41ebdf7 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -48,7 +48,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("safe_yaml", "~> 1.0") s.post_install_message = <<~MSG - ---------------------------------------------------------------------------------- + ------------------------------------------------------------------------------------- This version of Jekyll comes with some major changes. Most notably: @@ -59,6 +59,10 @@ Gem::Specification.new do |s| * Our `post_url` tag now comes with the `relative_url` filter incorporated into it. You shouldn't prepend `{{ site.baseurl }}` to `{% post_url 2019-03-27-hello %}` For further details: https://github.com/jekyll/jekyll/pull/7589 - ---------------------------------------------------------------------------------- + + * Support for deprecated configuration options has been removed. We will no longer + output a warning and gracefully assign their values to the newer counterparts + internally. + ------------------------------------------------------------------------------------- MSG end diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 7b2cb4301a7..2e4d609dd6b 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -79,15 +79,11 @@ class Configuration < Hash class << self # Static: Produce a Configuration ready for use in a Site. - # It takes the input, fills in the defaults where values do not - # exist, and patches common issues including migrating options for - # backwards compatiblity. Except where a key or value is being fixed, - # the user configuration will override the defaults. + # It takes the input, fills in the defaults where values do not exist. # # user_config - a Hash or Configuration of overrides. # - # Returns a Configuration filled with defaults and fixed for common - # problems and backwards-compatibility. + # Returns a Configuration filled with defaults. def from(user_config) Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys) .add_default_collections.add_default_excludes @@ -132,8 +128,8 @@ def safe_load_file(filename) when %r!\.ya?ml!i SafeYAML.load_file(filename) || {} else - raise ArgumentError, "No parser for '#{filename}' is available. - Use a .y(a)ml or .toml file instead." + raise ArgumentError, + "No parser for '#{filename}' is available. Use a .y(a)ml or .toml file instead." end end @@ -169,7 +165,11 @@ def config_files(override) def read_config_file(file) file = File.expand_path(file) next_config = safe_load_file(file) - check_config_is_hash!(next_config, file) + + unless next_config.is_a?(Hash) + raise ArgumentError, "Configuration file: (INVALID) #{file}".yellow + end + Jekyll.logger.info "Configuration file:", file next_config rescue SystemCallError @@ -177,8 +177,7 @@ def read_config_file(file) Jekyll.logger.warn "Configuration file:", "none" {} else - Jekyll.logger.error "Fatal:", "The configuration file '#{file}' - could not be found." + Jekyll.logger.error "Fatal:", "The configuration file '#{file}' could not be found." raise LoadError, "The Configuration file '#{file}' could not be found." end end @@ -200,12 +199,11 @@ def read_config_files(files) configuration = Utils.deep_merge_hashes(configuration, new_config) end rescue ArgumentError => e - Jekyll.logger.warn "WARNING:", "Error reading configuration. " \ - "Using defaults (and options)." + Jekyll.logger.warn "WARNING:", "Error reading configuration. Using defaults (and options)." warn e end - configuration.backwards_compatibilize.add_default_collections + configuration.validate.add_default_collections end # Public: Split a CSV string into an array containing its values @@ -217,35 +215,18 @@ def csv_to_array(csv) csv.split(",").map(&:strip) end - # Public: Ensure the proper options are set in the configuration to allow for - # backwards-compatibility with Jekyll pre-1.0 + # Public: Ensure the proper options are set in the configuration # - # Returns the backwards-compatible configuration - def backwards_compatibilize + # Returns the configuration Hash + def validate config = clone - # Provide backwards-compatibility - check_auto(config) - check_server(config) - check_plugins(config) - renamed_key "server_port", "port", config - renamed_key "gems", "plugins", config - renamed_key "layouts", "layouts_dir", config - renamed_key "data_source", "data_dir", config - - check_pygments(config) + check_plugins(config) check_include_exclude(config) - check_coderay(config) - check_maruku(config) config end - # DEPRECATED. - def fix_common_issues - self - end - def add_default_collections config = clone @@ -284,15 +265,6 @@ def add_default_excludes config end - def renamed_key(old, new, config) - if config.key?(old) - Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" \ - " option has been renamed to '#{new}'. Please update your config" \ - " file accordingly." - config[new] = config.delete(old) - end - end - private def style_to_permalink(permalink_style) @@ -312,77 +284,13 @@ def style_to_permalink(permalink_style) end end - # Private: Checks if a given config is a hash - # - # extracted_config - the value to check - # file - the file from which the config was extracted - # - # Raises an ArgumentError if given config is not a hash - def check_config_is_hash!(extracted_config, file) - unless extracted_config.is_a?(Hash) - raise ArgumentError, "Configuration file: (INVALID) #{file}".yellow - end - end - - def check_auto(config) - if config.key?("auto") || config.key?("watch") - Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" \ - " be set from your configuration file(s). Use the" \ - " --[no-]watch/-w command-line option instead." - config.delete("auto") - config.delete("watch") - end - end - - def check_server(config) - if config.key?("server") - Jekyll::Deprecator.deprecation_message "The 'server' configuration option" \ - " is no longer accepted. Use the 'jekyll serve'" \ - " subcommand to serve your site with WEBrick." - config.delete("server") - end - end - - def check_pygments(config) - if config.key?("pygments") - Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" \ - " has been renamed to 'highlighter'. Please update your" \ - " config file accordingly. The allowed values are 'rouge', " \ - "'pygments' or null." - - config["highlighter"] = "pygments" if config["pygments"] - config.delete("pygments") - end - end - def check_include_exclude(config) %w(include exclude).each do |option| - if config[option].is_a?(String) - Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" \ - " must now be specified as an array, but you specified" \ - " a string. For now, we've treated the string you provided" \ - " as a list of comma-separated values." - config[option] = csv_to_array(config[option]) - end - config[option]&.map!(&:to_s) - end - end + next unless config.key?(option) + next if config[option].is_a?(Array) - def check_coderay(config) - if (config["kramdown"] || {}).key?("use_coderay") - Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" \ - " to 'enable_coderay' in your configuration file." - config["kramdown"]["use_coderay"] = config["kramdown"].delete("enable_coderay") - end - end - - def check_maruku(config) - if config.fetch("markdown", "kramdown").to_s.casecmp("maruku").zero? - Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " \ - "Markdown processor, which has been removed as of 3.0.0. " \ - "We recommend you switch to Kramdown. To do this, replace " \ - "`markdown: maruku` with `markdown: kramdown` in your " \ - "`_config.yml` file." + raise Jekyll::Errors::InvalidConfigurationError, + "'#{option}' should be set as an array, but was: #{config[option].inspect}." end end @@ -391,17 +299,16 @@ def check_maruku(config) # config - the config hash # # Raises a Jekyll::Errors::InvalidConfigurationError if the config `plugins` - # is a string + # is not an Array. def check_plugins(config) - if config.key?("plugins") && config["plugins"].is_a?(String) - Jekyll.logger.error "Configuration Error:", "You specified the" \ - " `plugins` config in your configuration file as a string, please" \ - " use an array instead. If you wanted to set the directory of your" \ - " plugins, use the config key `plugins_dir` instead." - raise Jekyll::Errors::InvalidConfigurationError, - "'plugins' should not be a string, but was: " \ - "#{config["plugins"].inspect}. Use 'plugins_dir' instead." - end + return unless config.key?("plugins") + return if config["plugins"].is_a?(Array) + + Jekyll.logger.error "'plugins' should be set as an array of gem-names, but was: " \ + "#{config["plugins"].inspect}. Use 'plugins_dir' instead to set the directory " \ + "for your non-gemified Ruby plugins." + raise Jekyll::Errors::InvalidConfigurationError, + "'plugins' should be set as an array, but was: #{config["plugins"].inspect}." end end end diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 4f20cd0fa52..75e42e25d9e 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -21,7 +21,7 @@ class TestConfiguration < JekyllUnitTest end should "return a valid Configuration instance" do - assert_instance_of Configuration, Configuration.from({}).fix_common_issues + assert_instance_of Configuration, Configuration.from({}) end should "add default collections" do @@ -92,15 +92,19 @@ class TestConfiguration < JekyllUnitTest should "only assign collections.posts.permalink if a permalink is specified" do result = Configuration[{ "permalink" => "pretty", "collections" => {} }] .add_default_collections - expected = { "posts" => { - "output" => true, - "permalink" => "/:categories/:year/:month/:day/:title/", - } } + + expected = { + "posts" => { + "output" => true, + "permalink" => "/:categories/:year/:month/:day/:title/", + }, + } + assert_equal expected, result["collections"] - result = Configuration[{ "permalink" => nil, "collections" => {} }] - .add_default_collections + result = Configuration[{ "permalink" => nil, "collections" => {} }].add_default_collections expected = { "posts" => { "output" => true } } + assert_equal expected, result["collections"] end @@ -120,6 +124,7 @@ class TestConfiguration < JekyllUnitTest :include => [".htaccess"], :source => "./", }] + @string_keys = Configuration[{ "markdown" => "kramdown", "permalink" => "date", @@ -128,13 +133,16 @@ class TestConfiguration < JekyllUnitTest "source" => "./", }] end + should "stringify symbol keys" do assert_equal @string_keys, @mixed_keys.stringify_keys end + should "not mess with keys already strings" do assert_equal @string_keys, @string_keys.stringify_keys end end + context "#config_files" do setup do @config = Configuration[{ "source" => source_dir }] @@ -150,32 +158,39 @@ class TestConfiguration < JekyllUnitTest assert @config.config_files(@one_config_file).is_a?(Array) assert @config.config_files(@multiple_files).is_a?(Array) end + should "return the default config path if no config files are specified" do assert_equal [source_dir("_config.yml")], @config.config_files(@no_override) end + should "return .yaml if it exists but .yml does not" do allow(File).to receive(:exist?).with(source_dir("_config.yml")).and_return(false) allow(File).to receive(:exist?).with(source_dir("_config.yaml")).and_return(true) assert_equal [source_dir("_config.yaml")], @config.config_files(@no_override) end + should "return .yml if both .yml and .yaml exist" do allow(File).to receive(:exist?).with(source_dir("_config.yml")).and_return(true) assert_equal [source_dir("_config.yml")], @config.config_files(@no_override) end + should "return .toml if that exists" do allow(File).to receive(:exist?).with(source_dir("_config.yml")).and_return(false) allow(File).to receive(:exist?).with(source_dir("_config.yaml")).and_return(false) allow(File).to receive(:exist?).with(source_dir("_config.toml")).and_return(true) assert_equal [source_dir("_config.toml")], @config.config_files(@no_override) end + should "return .yml if both .yml and .toml exist" do allow(File).to receive(:exist?).with(source_dir("_config.yml")).and_return(true) allow(File).to receive(:exist?).with(source_dir("_config.toml")).and_return(true) assert_equal [source_dir("_config.yml")], @config.config_files(@no_override) end + should "return the config if given one config file" do assert_equal %w(config.yml), @config.config_files(@one_config_file) end + should "return an array of the config files if given many config files" do assert_equal( %w(config/site.yml config/deploy.toml configuration.yml), @@ -204,77 +219,59 @@ class TestConfiguration < JekyllUnitTest should "continue to read config files if one is empty" do allow(SafeYAML).to receive(:load_file).with(File.expand_path("empty.yml")).and_return(false) - allow(SafeYAML) - .to receive(:load_file) - .with(File.expand_path("not_empty.yml")) - .and_return("foo" => "bar", "include" => "", "exclude" => "") + allow(SafeYAML).to receive(:load_file).with(File.expand_path("not_empty.yml")).and_return( + "foo" => "bar" + ) Jekyll.logger.log_level = :warn - read_config = @config.read_config_files(["empty.yml", "not_empty.yml"]) + read_config = @config.read_config_files(%w(empty.yml not_empty.yml)) Jekyll.logger.log_level = :info assert_equal "bar", read_config["foo"] end end - context "#backwards_compatibilize" do + + context "#validate" do setup do @config = Configuration[{ "auto" => true, "watch" => true, "server" => true, - "exclude" => "READ-ME.md, Gemfile,CONTRIBUTING.hello.markdown", - "include" => "STOP_THE_PRESSES.txt,.heloses, .git", "pygments" => true, "layouts" => true, "data_source" => true, "gems" => [], }] end - should "unset 'auto' and 'watch'" do - assert @config.key?("auto") - assert @config.key?("watch") - assert !@config.backwards_compatibilize.key?("auto") - assert !@config.backwards_compatibilize.key?("watch") - end - should "unset 'server'" do - assert @config.key?("server") - assert !@config.backwards_compatibilize.key?("server") - end - should "transform string exclude into an array" do - assert @config.key?("exclude") - assert @config.backwards_compatibilize.key?("exclude") - expected = %w(READ-ME.md Gemfile CONTRIBUTING.hello.markdown) - assert_equal expected, @config.backwards_compatibilize["exclude"] - end - should "transform string include into an array" do - assert @config.key?("include") - assert @config.backwards_compatibilize.key?("include") - expected = %w(STOP_THE_PRESSES.txt .heloses .git) - assert_equal expected, @config.backwards_compatibilize["include"] - end - should "set highlighter to pygments" do - assert @config.key?("pygments") - assert !@config.backwards_compatibilize.key?("pygments") - assert_equal "pygments", @config.backwards_compatibilize["highlighter"] - end - should "adjust directory names" do - assert @config.key?("layouts") - assert !@config.backwards_compatibilize.key?("layouts") - assert @config.backwards_compatibilize["layouts_dir"] - assert @config.key?("data_source") - assert !@config.backwards_compatibilize.key?("data_source") - assert @config.backwards_compatibilize["data_dir"] + + should "raise an error if `exclude` key is a string" do + config = Configuration[{ "exclude" => "READ-ME.md, Gemfile,CONTRIBUTING.hello.markdown" }] + assert_raises(Jekyll::Errors::InvalidConfigurationError) { config.validate } + end + + should "raise an error if `include` key is a string" do + config = Configuration[{ "include" => "STOP_THE_PRESSES.txt,.heloses, .git" }] + assert_raises(Jekyll::Errors::InvalidConfigurationError) { config.validate } end + should "raise an error if `plugins` key is a string" do config = Configuration[{ "plugins" => "_plugin" }] - assert_raises Jekyll::Errors::InvalidConfigurationError do - config.backwards_compatibilize - end + assert_raises(Jekyll::Errors::InvalidConfigurationError) { config.validate } end - should "set the `gems` config to `plugins`" do + + should "not rename configuration keys" do + assert @config.key?("layouts") + assert @config.validate.key?("layouts") + refute @config.validate.key?("layouts_dir") + + assert @config.key?("data_source") + assert @config.validate.key?("data_source") + refute @config.validate.key?("data_dir") + assert @config.key?("gems") - assert !@config.backwards_compatibilize["gems"] - assert @config.backwards_compatibilize["plugins"] + assert @config.validate.key?("gems") + refute @config.validate.key?("plugins") end end + context "loading configuration" do setup do @path = source_dir("_config.yml") @@ -331,6 +328,7 @@ class TestConfiguration < JekyllUnitTest # as opposed to: assert_equal ':foo', SafeYAML.load(':foo') end end + context "loading config from external file" do setup do @paths = { From 0e591f08dafe284d7326b7d951411b67d5b3eb42 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 4 Aug 2019 08:37:47 -0400 Subject: [PATCH 3717/4996] Update history to reflect merge of #7440 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 10518295ff3..c99f4f95ed1 100644 --- a/History.markdown +++ b/History.markdown @@ -110,6 +110,7 @@ * Reduce allocations from where-filter (#7653) * Memoize SiteDrop#documents to reduce allocations (#7697) * Add PathManager class to cache interim paths (#7732) + * Remove warnings and fixes for deprecated config (#7440) ### Development Fixes From 6511342e159db9d54d247000767cf19c1880d5a9 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Sun, 4 Aug 2019 13:20:11 -0500 Subject: [PATCH 3718/4996] Prepare Jekyll 4.0.0 beta1 (#7716) Merge pull request 7716 --- ...0-jekyll-4-0-0-pre-beta1-released.markdown | 40 +++++++++++++++++++ lib/jekyll/version.rb | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 docs/_posts/2019-07-20-jekyll-4-0-0-pre-beta1-released.markdown diff --git a/docs/_posts/2019-07-20-jekyll-4-0-0-pre-beta1-released.markdown b/docs/_posts/2019-07-20-jekyll-4-0-0-pre-beta1-released.markdown new file mode 100644 index 00000000000..24936f38fc7 --- /dev/null +++ b/docs/_posts/2019-07-20-jekyll-4-0-0-pre-beta1-released.markdown @@ -0,0 +1,40 @@ +--- +title: Jekyll 4.0.0.pre.beta1 Released +date: 2019-07-20 10:43:31 -0500 +author: mattr- +version: 4.0.0.pre.beta1 +categories: [release] +--- + +Dear Jekyllers, + +It's time for another pre-release of Jekyll 4! 🎉 + +This pre-release moves us further down the path of releasing Jekyll 4.0.0. All the same goodies [from the last pre-release](/news/2019/03/18/jekyll-4-0-0-pre-alpha1-released/) are here, along with a few more things I want to highlight: + +Jekyll 4.0 is a new *major* version and it comes with a few breaking changes, notably : + +1. We dropped support for [Ruby 2.3 which EOL at the end of March 2019](https://www.ruby-lang.org/en/downloads/). + GitHub Pages runs Ruby 2.5.x, services like Netlify or Forestry already upgraded to latest Ruby 2.6.x. +2. `link` tag now include `relative_url` filter, hurray [no more need to prepend `{% raw %}{{ site.baseurl }}{% endraw %}` ](https://github.com/jekyll/jekyll/pull/6727). +3. [`{% raw %}{% highlight %}{% endraw %}` now behaves like `{% raw %}{% raw %}{% endraw %}`](https://github.com/jekyll/jekyll/pull/6821), so you can no longer use `include` tags within. +4. We dropped support for Pygments, RedCarpet and rdiscount. +5. We bumped kramdown to v2. + +If you're a plugin developer, we still need your feedback! Your plugin may not work with version 4 and we'd like to fix those issues before we release. + +Checkout the complete [changelog](https://github.com/jekyll/jekyll/releases/tag/v4.0.0.pre.beta1) for more details. + +To test this pre version run: + +```sh +gem install jekyll --pre +``` + +Please test this version thoroughly and file bugs as you encounter them. + +Thanks to our dear contributors for helping making Jekyll better: + +Aidan Fitzgerald, Akshat Kedia, Alex Wood, Alexey Kopytko, Alexey Pelykh, Ali Thompson, Ana María Martínez Gómez, Ananthakumar, Andreas Möller, Andrew Lyndem, Andy Alt, Anne Gentle, Anny, Arjun Thakur, Arthur Attwell, Ashwin Maroli, Behrang, Belhassen Chelbi, Ben Keith, Ben Otte, Bilawal Hameed, Boris Schapira, Boris van Hoytema, Brett C, Chris Finazzo, Christian Oliff, Damien Solodow, Dan Allen, Dan Friedman, Daniel Höpfl, David J. Malan, Denis McDonald, Derek Smart, Derpy, Dusty Candland, ExE Boss, Frank Taillandier, Gareth Cooper, Grzegorz Kaczorek, Isaac Goodman, Jacob Byers, Jakob Krigovsky, Jan Pobořil, Joe Shannon, Jordan Morgan, Jorie Tappa, Josue Caraballo, Justin Vallelonga, Jörg Steinsträter, Karel Bílek, Keith Mifsud, Kelly-Ann Green, Ken Salomon, Kevin Plattret, Kyle Barbour, Lars Kanis, Leandro Facchinetti, Luis Enrique Perez Alvarez, Luis Guillermo Yáñez, Ma HongJun, Manu Mathew, Mario, Martin Scharm, Matt Massicotte, Matthew Rathbone, Maxwell Gerber, Mertcan Yücel, Michael Hiiva, Mike Kasberg, Mike Neumegen, Monica Powell, Nicolas Hoizey, Nikhil Swaminathan, Nikita Skalkin, Olivia Hugger, Parker Moore, Pat Hawks, Patrick Favre-Bulle, Paul Kim, Philip Belesky, Preston Lim, Ralph, Robert Riemann, Rosário Pereira Fernandes, Samuel Gruetter, Scott Killen, Sri Pravan Paturi, Stephan Fischer, Stephen Weiss, Steven Westmoreland, Sundaram Kalyan Vedala, Thanos Kolovos, Timo Schuhmacher, Tobias, Tom Harvey, Tushar Prajapati, Victor Afanasev, Vitor Oliveira, Wouter Schoot, XhmikosR, Zhang Xiangze, _94gsc, argv-minus-one, chrisfinazzo, ikeji, jess, jpasholk, makmm, mo khan, ninevra, penguinpet, 김정환, 104fps + +Happy Jekylling everyone! diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb index 226550da3b1..15b8763be9d 100644 --- a/lib/jekyll/version.rb +++ b/lib/jekyll/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Jekyll - VERSION = "4.0.0.pre.alpha1" + VERSION = "4.0.0.pre.beta1" end From 21202589dea5aa4ca4fe7c5618f2f5269470e285 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 4 Aug 2019 14:20:13 -0400 Subject: [PATCH 3719/4996] Update history to reflect merge of #7716 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c99f4f95ed1..6f02194e7b2 100644 --- a/History.markdown +++ b/History.markdown @@ -312,6 +312,7 @@ ### release * Release v4.0.0.pre.alpha1 (#7574) + * Prepare Jekyll 4.0.0 beta1 (#7716) ## 3.8.6 / 2019-07-02 From 8e52cdbb6b952230d9468d377e7fa43fcdfca56d Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Sun, 4 Aug 2019 13:21:33 -0500 Subject: [PATCH 3720/4996] Release :gem: 4.0.0.pre.beta1 From 91f82907a3dc9c6453a11a74fd637ffd03d9c180 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 4 Aug 2019 21:34:17 +0200 Subject: [PATCH 3721/4996] update date --- ...down => 2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/_posts/{2019-07-20-jekyll-4-0-0-pre-beta1-released.markdown => 2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown} (99%) diff --git a/docs/_posts/2019-07-20-jekyll-4-0-0-pre-beta1-released.markdown b/docs/_posts/2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown similarity index 99% rename from docs/_posts/2019-07-20-jekyll-4-0-0-pre-beta1-released.markdown rename to docs/_posts/2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown index 24936f38fc7..cf470f2987e 100644 --- a/docs/_posts/2019-07-20-jekyll-4-0-0-pre-beta1-released.markdown +++ b/docs/_posts/2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown @@ -1,6 +1,6 @@ --- title: Jekyll 4.0.0.pre.beta1 Released -date: 2019-07-20 10:43:31 -0500 +date: 2019-08-04 10:43:31 -0500 author: mattr- version: 4.0.0.pre.beta1 categories: [release] From f446aebf07a7c06369c99d98410fc0339fd9040b Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 5 Aug 2019 01:33:56 +0530 Subject: [PATCH 3722/4996] Delegate --profile tabulation to `terminal-table` (#7627) Merge pull request 7627 --- jekyll.gemspec | 1 + lib/jekyll/liquid_renderer/table.rb | 77 +++++++---------------------- test/test_liquid_renderer.rb | 6 +-- 3 files changed, 21 insertions(+), 63 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index acbb41ebdf7..68d79fc68af 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -46,6 +46,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("pathutil", "~> 0.9") s.add_runtime_dependency("rouge", "~> 3.0") s.add_runtime_dependency("safe_yaml", "~> 1.0") + s.add_runtime_dependency("terminal-table", "~> 1.8") s.post_install_message = <<~MSG ------------------------------------------------------------------------------------- diff --git a/lib/jekyll/liquid_renderer/table.rb b/lib/jekyll/liquid_renderer/table.rb index 1f83529a0bf..a55bb8c9201 100644 --- a/lib/jekyll/liquid_renderer/table.rb +++ b/lib/jekyll/liquid_renderer/table.rb @@ -10,72 +10,29 @@ def initialize(stats) end def to_s(num_of_rows = 50) - data = data_for_table(num_of_rows) - widths = table_widths(data) - generate_table(data, widths) + tabulate(data_for_table(num_of_rows)) end private - def generate_table(data, widths) - str = +"\n" - - table_head = data.shift - table_foot = data.pop - - 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 << generate_table_head_border(table_foot, widths) - str << generate_row(table_foot, widths).rstrip - - 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| - str << if cell_index.zero? - cell_data.ljust(widths[cell_index], " ") - else - 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 + def tabulate(data) + require "terminal-table" + + header = data.shift + footer = data.pop + output = +"\n" + + table = Terminal::Table.new do |t| + t << header + t << :separator + data.each { |row| t << row } + t << :separator + t << footer + t.style = { :alignment => :right, :border_top => false, :border_bottom => false } + t.align_column(0, :left) end - widths + output << table.to_s << "\n" end # rubocop:disable Metrics/AbcSize diff --git a/test/test_liquid_renderer.rb b/test/test_liquid_renderer.rb index 32e980b8af9..13e6867295b 100644 --- a/test/test_liquid_renderer.rb +++ b/test/test_liquid_renderer.rb @@ -16,9 +16,9 @@ class TestLiquidRenderer < JekyllUnitTest # rubocop:disable Metrics/LineLength expected = [ - %r!^Filename\s+|\s+Count\s+|\s+Bytes\s+|\s+Time$!, - %r!^-+\++-+\++-+\++-+$!, - %r!^_posts/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$!, + %r!^\| Filename\s+|\s+Count\s+|\s+Bytes\s+|\s+Time$!, + %r!^\+(?:-+\+){4}$!, + %r!^\|_posts/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$!, ] # rubocop:enable Metrics/LineLength From f8c66f02e11f10a0797e299ed918cd5833902175 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 4 Aug 2019 16:03:58 -0400 Subject: [PATCH 3723/4996] Update history to reflect merge of #7627 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 6f02194e7b2..5cb511678a3 100644 --- a/History.markdown +++ b/History.markdown @@ -111,6 +111,7 @@ * Memoize SiteDrop#documents to reduce allocations (#7697) * Add PathManager class to cache interim paths (#7732) * Remove warnings and fixes for deprecated config (#7440) + * Delegate --profile tabulation to `terminal-table` (#7627) ### Development Fixes From 764201dc8edc24969d52ccad5d18db9672afe78c Mon Sep 17 00:00:00 2001 From: Michelle Greer Date: Sun, 4 Aug 2019 15:06:00 -0500 Subject: [PATCH 3724/4996] Added Bonsai Search (#7543) Merge pull request 7543 --- docs/pages/resources.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/resources.md b/docs/pages/resources.md index 2626970bf35..30a2d1895d6 100644 --- a/docs/pages/resources.md +++ b/docs/pages/resources.md @@ -67,6 +67,7 @@ Use a SaaS service as a backend for functionality on your Jekyll site ### Search - [Algolia](https://blog.algolia.com/instant-search-blog-documentation-jekyll-plugin/): Add a powerful instant search to your Jekyll site + - [Bonsai Search](https://docs.bonsai.io/article/217-jekyll): The easiest way to use Elasticsearch for your Jekyll site - [CloudSh](https://cloudsh.com/generators/How-to-setup-search-on-Jekyll/): Website search with a few lines of JavaScript ## Other commentary From 2c7cbddeba7f547834fe37273fc513fdee648f61 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 4 Aug 2019 16:06:02 -0400 Subject: [PATCH 3725/4996] Update history to reflect merge of #7543 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 5cb511678a3..01c1d5f9dab 100644 --- a/History.markdown +++ b/History.markdown @@ -300,6 +300,7 @@ * Add recursive navigation tutorial (#7720) * Fix misspelling of "additional" (#7764) * docs: improve how to include rouge stylesheets (#7752) + * Added Bonsai Search (#7543) ### Site Enhancements From 65f88311685c0df5aa3a0ee0970d41b879fd3de8 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 5 Aug 2019 01:38:54 +0530 Subject: [PATCH 3726/4996] Reduce allocations by using #each_with_object (#7758) Merge pull request 7758 --- lib/jekyll/configuration.rb | 10 ++++++---- lib/jekyll/convertible.rb | 7 ++++--- lib/jekyll/site.rb | 6 +++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 2e4d609dd6b..298a90fa932 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -4,7 +4,7 @@ module Jekyll class Configuration < Hash # Default options. Overridden by values in _config.yml. # Strings rather than symbols are used for compatibility with YAML. - DEFAULTS = Configuration[{ + DEFAULTS = { # Where things are "source" => Dir.pwd, "destination" => File.join(Dir.pwd, "_site"), @@ -75,7 +75,7 @@ class Configuration < Hash "footnote_nr" => 1, "show_warnings" => false, }, - }.map { |k, v| [k, v.freeze] }].freeze + }.each_with_object(Configuration.new) { |(k, v), hsh| hsh[k] = v.freeze }.freeze class << self # Static: Produce a Configuration ready for use in a Site. @@ -94,7 +94,7 @@ def from(user_config) # # Return a copy of the hash where all its keys are strings def stringify_keys - reduce({}) { |hsh, (k, v)| hsh.merge(k.to_s => v) } + each_with_object({}) { |(k, v), hsh| hsh[k.to_s] = v } end def get_config_value_with_override(config_key, override) @@ -235,7 +235,9 @@ def add_default_collections # Ensure we have a hash. if config["collections"].is_a?(Array) - config["collections"] = Hash[config["collections"].map { |c| [c, {}] }] + config["collections"] = config["collections"].each_with_object({}) do |collection, hash| + hash[collection] = {} + end end config["collections"] = Utils.deep_merge_hashes( diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 35f6b0f4863..3847831f888 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -112,9 +112,10 @@ def render_liquid(content, payload, info, path) # # Returns the Hash representation of this Convertible. def to_liquid(attrs = nil) - further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map do |attribute| - [attribute, send(attribute)] - end] + further_data = \ + (attrs || self.class::ATTRIBUTES_FOR_LIQUID).each_with_object({}) do |attribute, hsh| + hsh[attribute] = send(attribute) + end defaults = site.frontmatter_defaults.all(relative_path, type) Utils.deep_merge_hashes defaults, Utils.deep_merge_hashes(data, further_data) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 50653e9042f..8aca2d655a0 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -145,9 +145,9 @@ def ensure_not_in_dest # # Returns a Hash containing collection name-to-instance pairs. def collections - @collections ||= Hash[collection_names.map do |coll| - [coll, Jekyll::Collection.new(self, coll)] - end] + @collections ||= collection_names.each_with_object({}) do |name, hsh| + hsh[name] = Jekyll::Collection.new(self, name) + end end # The list of collection names. From 93794d9239fefb8e496645bc214df00b82dc4b33 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 4 Aug 2019 16:08:55 -0400 Subject: [PATCH 3727/4996] Update history to reflect merge of #7758 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 01c1d5f9dab..463bcde76d5 100644 --- a/History.markdown +++ b/History.markdown @@ -171,6 +171,7 @@ * Update mime.types (#7756) * Replace redundant Array#map with Array#each (#7761) * Fix: rubocop offenses (#7769) + * Reduce allocations by using #each_with_object (#7758) ### Documentation From a0c3a6bced74661c2810e291e0ab85c3626d2913 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 5 Aug 2019 01:39:27 +0530 Subject: [PATCH 3728/4996] Memoize fallback_data for Drop (#7728) Merge pull request 7728 --- lib/jekyll/drops/url_drop.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/drops/url_drop.rb b/lib/jekyll/drops/url_drop.rb index 6edb7d64d72..98a03f4a305 100644 --- a/lib/jekyll/drops/url_drop.rb +++ b/lib/jekyll/drops/url_drop.rb @@ -125,7 +125,7 @@ def y_day private def fallback_data - {} + @fallback_data ||= {} end end end From 2736589ba19ab8390168be58480df4f359745464 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 4 Aug 2019 16:09:29 -0400 Subject: [PATCH 3729/4996] Update history to reflect merge of #7728 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 463bcde76d5..a1dd6eba518 100644 --- a/History.markdown +++ b/History.markdown @@ -172,6 +172,7 @@ * Replace redundant Array#map with Array#each (#7761) * Fix: rubocop offenses (#7769) * Reduce allocations by using #each_with_object (#7758) + * Memoize fallback_data for Drop (#7728) ### Documentation From 8035a3e153cee4ee48af3dda46f3472c8b524d2f Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 5 Aug 2019 01:41:12 +0530 Subject: [PATCH 3730/4996] Use String#end_with? to check if entry is a backup (#7701) Merge pull request 7701 --- lib/jekyll/entry_filter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb index b8f4e044238..4f527eddf57 100644 --- a/lib/jekyll/entry_filter.rb +++ b/lib/jekyll/entry_filter.rb @@ -53,7 +53,7 @@ def special?(entry) end def backup?(entry) - entry[-1..-1] == "~" + entry.end_with?("~") end def excluded?(entry) From 272360a80b75a79333491ed4876ad7cb668ccee8 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 4 Aug 2019 16:11:13 -0400 Subject: [PATCH 3731/4996] Update history to reflect merge of #7701 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a1dd6eba518..e32abe94383 100644 --- a/History.markdown +++ b/History.markdown @@ -173,6 +173,7 @@ * Fix: rubocop offenses (#7769) * Reduce allocations by using #each_with_object (#7758) * Memoize fallback_data for Drop (#7728) + * Use String#end_with? to check if entry is a backup (#7701) ### Documentation From 0490d71661c1383a815ae9ef85863566acf93087 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 4 Aug 2019 22:25:14 +0200 Subject: [PATCH 3732/4996] Fix 404 --- docs/_posts/2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_posts/2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown b/docs/_posts/2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown index cf470f2987e..64f16975b13 100644 --- a/docs/_posts/2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown +++ b/docs/_posts/2019-08-04-jekyll-4-0-0-pre-beta1-released.markdown @@ -4,6 +4,7 @@ date: 2019-08-04 10:43:31 -0500 author: mattr- version: 4.0.0.pre.beta1 categories: [release] +redirect_from: /news/2019/07/20/jekyll-4-0-0-pre-beta1-released/ --- Dear Jekyllers, From de60632309bdd3a1cc16d2b2bdc6137ca2217d2d Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 14 Aug 2019 23:06:11 +0530 Subject: [PATCH 3733/4996] Remove configuration of theme sass files from Core (#7290) Merge pull request 7290 --- Gemfile | 4 ++++ features/rendering.feature | 2 +- features/theme.feature | 13 ++++++++++--- jekyll.gemspec | 2 +- lib/jekyll/theme.rb | 8 -------- test/fixtures/test-theme/assets/style.scss | 2 +- test/test_filters.rb | 14 +++++++++----- test/test_sass.rb | 7 ++++++- test/test_site.rb | 5 +++-- test/test_theme.rb | 6 ------ test/test_theme_assets_reader.rb | 2 +- 11 files changed, 36 insertions(+), 29 deletions(-) diff --git a/Gemfile b/Gemfile index df6d2f2718d..3828ee7a503 100644 --- a/Gemfile +++ b/Gemfile @@ -7,6 +7,10 @@ gemspec :name => "jekyll" # refinements introduced in i18n-1.3.0 gem "i18n", "~> 1.2.0" if RUBY_ENGINE == "jruby" +# Point to the sass-converter's repository to ensure Windows builds render as expected. +# Remove once "jekyll-sass-converter-2.0.0" ships. +gem "jekyll-sass-converter", :github => "jekyll/jekyll-sass-converter" + gem "rake", "~> 12.0" group :development do diff --git a/features/rendering.feature b/features/rendering.feature index 654facd5f95..2ecd86dc37b 100644 --- a/features/rendering.feature +++ b/features/rendering.feature @@ -154,7 +154,7 @@ Feature: Rendering When I run jekyll build Then I should get a zero exit status And the _site directory should exist - And I should see ".foo-bar {\n color: red; }" in "_site/index.css" + And I should see ".foo-bar { color: red; }\n\n\/\*# sourceMappingURL=index.css.map \*\/" in "_site/index.css" Scenario: Not render liquid in CoffeeScript without explicitly including jekyll-coffeescript Given I have an "index.coffee" page with animal "cicada" that contains "hey='for {{page.animal}}'" diff --git a/features/theme.feature b/features/theme.feature index 3941abc8d86..5f78a233152 100644 --- a/features/theme.feature +++ b/features/theme.feature @@ -16,12 +16,19 @@ Feature: Writing themes Scenario: A theme with SCSS Given I have a configuration file with "theme" set to "test-theme" - And I have a css directory - And I have a "css/main.scss" page that contains "@import 'test-theme-black';" When I run jekyll build Then I should get a zero exit status And the _site directory should exist - And I should see ".sample {\n color: black; }" in "_site/css/main.css" + And I should see ".sample { color: red; }\n\n\/\*# sourceMappingURL=style.css.map \*\/" in "_site/assets/style.css" + + Scenario: Overriding a theme with SCSS + Given I have a configuration file with "theme" set to "test-theme" + And I have an assets directory + And I have an "assets/style.scss" page that contains "@import 'test-theme-black';" + When I run jekyll build + Then I should get a zero exit status + And the _site directory should exist + And I should see ".sample { color: black; }\n\n\/\*# sourceMappingURL=style.css.map \*\/" in "_site/assets/style.css" Scenario: A theme with an include Given I have a configuration file with "theme" set to "test-theme" diff --git a/jekyll.gemspec b/jekyll.gemspec index 68d79fc68af..a3ac65bd2b8 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -37,7 +37,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("colorator", "~> 1.0") s.add_runtime_dependency("em-websocket", "~> 0.5") s.add_runtime_dependency("i18n", ">= 0.9.5", "< 2") - s.add_runtime_dependency("jekyll-sass-converter", "~> 1.0") + s.add_runtime_dependency("jekyll-sass-converter", "= 2.0.0.pre.beta") s.add_runtime_dependency("jekyll-watch", "~> 2.0") s.add_runtime_dependency("kramdown", "~> 2.1") s.add_runtime_dependency("kramdown-parser-gfm", "~> 1.0") diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index ac0330201ea..5ef4d044504 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -10,7 +10,6 @@ def initialize(name) @name = name.downcase.strip Jekyll.logger.debug "Theme:", name Jekyll.logger.debug "Theme source:", root - configure_sass end def root @@ -38,13 +37,6 @@ def assets_path @assets_path ||= path_for "assets" end - def configure_sass - return unless sass_path - - External.require_with_graceful_fail("sass") unless defined?(Sass) - Sass.load_paths << sass_path - end - def runtime_dependencies gemspec.runtime_dependencies end diff --git a/test/fixtures/test-theme/assets/style.scss b/test/fixtures/test-theme/assets/style.scss index 47c4a2f1375..00096523507 100644 --- a/test/fixtures/test-theme/assets/style.scss +++ b/test/fixtures/test-theme/assets/style.scss @@ -1,3 +1,3 @@ --- --- -@import "test-theme-{{ site.theme-color | default: "red" }}"; +@import "test-theme-{{ site.theme-color | default: 'red' }}"; diff --git a/test/test_filters.rb b/test/test_filters.rb index 39ec85653eb..19f841eed25 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -138,14 +138,18 @@ def select; end should "sassify with simple string" do assert_equal( - "p {\n color: #123456; }\n", - @filter.sassify("$blue:#123456\np\n color: $blue") + "p { color: #123456; }\n", + @filter.sassify(<<~SASS) + $blue: #123456 + p + color: $blue + SASS ) end should "scssify with simple string" do assert_equal( - "p {\n color: #123456; }\n", + "p { color: #123456; }\n", @filter.scssify("$blue:#123456; p{color: $blue}") ) end @@ -811,7 +815,7 @@ def to_liquid "The list of grouped items for '' is not an Array." ) # adjust array.size to ignore symlinked page in Windows - qty = Utils::Platforms.really_windows? ? 15 : 16 + qty = Utils::Platforms.really_windows? ? 16 : 18 assert_equal qty, g["items"].size end end @@ -1066,7 +1070,7 @@ def to_liquid "The list of grouped items for '' is not an Array." ) # adjust array.size to ignore symlinked page in Windows - qty = Utils::Platforms.really_windows? ? 15 : 16 + qty = Utils::Platforms.really_windows? ? 16 : 18 assert_equal qty, g["items"].size end end diff --git a/test/test_sass.rb b/test/test_sass.rb index 686631d6020..d4708ef40f0 100644 --- a/test/test_sass.rb +++ b/test/test_sass.rb @@ -14,7 +14,12 @@ class TestSass < JekyllUnitTest end should "import SCSS partial" do - assert_equal ".half {\n width: 50%; }\n", File.read(@test_css_file) + result = <<~CSS + .half { width: 50%; } + + /*# sourceMappingURL=main.css.map */ + CSS + assert_equal result.rstrip, File.read(@test_css_file) end should "register the SCSS converter" do diff --git a/test/test_site.rb b/test/test_site.rb index c8166fed700..70614fdef2e 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -240,6 +240,7 @@ def generate(site) index.html index.html info.md + main.css.map main.scss properties.html sitemap.xml @@ -248,9 +249,9 @@ def generate(site) ) unless Utils::Platforms.really_windows? # files in symlinked directories may appear twice - sorted_pages.push("main.scss", "symlinked-file").sort! + sorted_pages.push("main.css.map", "main.scss", "symlinked-file").sort! end - assert_equal sorted_pages, @site.pages.map(&:name) + assert_equal sorted_pages, @site.pages.map(&:name).sort! end should "read posts" do diff --git a/test/test_theme.rb b/test/test_theme.rb index bc1f8de6821..4c6fee2750c 100644 --- a/test/test_theme.rb +++ b/test/test_theme.rb @@ -26,12 +26,6 @@ def setup Theme.new("foo").version end end - - should "add itself to sass's load path" do - @theme.configure_sass - message = "Sass load paths should include the theme sass dir" - assert Sass.load_paths.include?(@theme.sass_path), message - end end context "path generation" do diff --git a/test/test_theme_assets_reader.rb b/test/test_theme_assets_reader.rb index 983f63b7a80..02ce004fad6 100644 --- a/test/test_theme_assets_reader.rb +++ b/test/test_theme_assets_reader.rb @@ -39,7 +39,7 @@ def refute_file_with_relative_path(haystack, relative_path) file = @site.pages.find { |f| f.relative_path == "assets/style.scss" } refute_nil file assert_equal @site.in_dest_dir("assets/style.css"), file.destination(@site.dest) - assert_includes file.output, ".sample {\n color: black; }" + assert_includes file.output, ".sample { color: black; }" end should "not overwrite site content with the same relative path" do From 65773e19a8aed4d7e7fd6ad7f8cbb33f2fcec6ff Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Aug 2019 13:36:15 -0400 Subject: [PATCH 3734/4996] Update history to reflect merge of #7290 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e32abe94383..a232a2a1ac3 100644 --- a/History.markdown +++ b/History.markdown @@ -65,6 +65,7 @@ * Don't read symlinks in site.include in safe mode (#7711) * Replace `String#=~` with `String#match?` (#7723) * Update log output for an invalid theme directory (#7679) + * Remove configuration of theme sass files from Core (#7290) ### Minor Enhancements From 4e37fb64200e08d2ea532be1d269064aaedd7ab5 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 14 Aug 2019 23:54:55 +0530 Subject: [PATCH 3735/4996] Use jekyll-sass-converter-2.0 by default (#7778) Merge pull request 7778 --- Gemfile | 4 ---- jekyll.gemspec | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 3828ee7a503..df6d2f2718d 100644 --- a/Gemfile +++ b/Gemfile @@ -7,10 +7,6 @@ gemspec :name => "jekyll" # refinements introduced in i18n-1.3.0 gem "i18n", "~> 1.2.0" if RUBY_ENGINE == "jruby" -# Point to the sass-converter's repository to ensure Windows builds render as expected. -# Remove once "jekyll-sass-converter-2.0.0" ships. -gem "jekyll-sass-converter", :github => "jekyll/jekyll-sass-converter" - gem "rake", "~> 12.0" group :development do diff --git a/jekyll.gemspec b/jekyll.gemspec index a3ac65bd2b8..cec995b90d6 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -37,7 +37,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("colorator", "~> 1.0") s.add_runtime_dependency("em-websocket", "~> 0.5") s.add_runtime_dependency("i18n", ">= 0.9.5", "< 2") - s.add_runtime_dependency("jekyll-sass-converter", "= 2.0.0.pre.beta") + s.add_runtime_dependency("jekyll-sass-converter", "~> 2.0") s.add_runtime_dependency("jekyll-watch", "~> 2.0") s.add_runtime_dependency("kramdown", "~> 2.1") s.add_runtime_dependency("kramdown-parser-gfm", "~> 1.0") From fd476206d7d3690bec8df0f5d0a2407120b9e65d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 14 Aug 2019 14:24:57 -0400 Subject: [PATCH 3736/4996] Update history to reflect merge of #7778 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a232a2a1ac3..885eb807617 100644 --- a/History.markdown +++ b/History.markdown @@ -175,6 +175,7 @@ * Reduce allocations by using #each_with_object (#7758) * Memoize fallback_data for Drop (#7728) * Use String#end_with? to check if entry is a backup (#7701) + * Use jekyll-sass-converter-2.0 by default (#7778) ### Documentation From 326ab2dfb70f18c3f0e5d9bfafd4f48232ec68f5 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 15 Aug 2019 00:12:34 +0530 Subject: [PATCH 3737/4996] Using jekyll-sass-converter 2.0 is a major change --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 885eb807617..ca40aba78a5 100644 --- a/History.markdown +++ b/History.markdown @@ -26,6 +26,7 @@ * Remove Jekyll::Utils#strip_heredoc in favor of a Ruby > 2.3 built in (#7584) * Incorporate `relative_url` within `post_url` tag (#7589) * Remove patch to modify config for kramdown (#7699) + * Use jekyll-sass-converter-2.0 by default (#7778) ### Bug Fixes @@ -175,7 +176,6 @@ * Reduce allocations by using #each_with_object (#7758) * Memoize fallback_data for Drop (#7728) * Use String#end_with? to check if entry is a backup (#7701) - * Use jekyll-sass-converter-2.0 by default (#7778) ### Documentation From 26914126c77712637d3e7a53ce52b841e9afe229 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Wed, 14 Aug 2019 21:18:32 +0200 Subject: [PATCH 3738/4996] Cleanup History --- History.markdown | 198 +++++++++++++++++++---------------------------- 1 file changed, 81 insertions(+), 117 deletions(-) diff --git a/History.markdown b/History.markdown index ca40aba78a5..23a3805b17a 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Drop support for `jekyll-watch-1.4.0` and older (#7287) * Incorporate `relative_url` filter in `link` tag (#6727) * Upgrade kramdown dependency to v2.x (#7492) + * Upgrade jekyll-sass-converter to v2.x - Sassc + sourcemaps (#7778) * Upgrade i18n to v1.x (#6931) * Add `Jekyll::Cache` class to handle caching on disk (#7169) * Cache converted markdown (#7159) @@ -26,7 +27,6 @@ * Remove Jekyll::Utils#strip_heredoc in favor of a Ruby > 2.3 built in (#7584) * Incorporate `relative_url` within `post_url` tag (#7589) * Remove patch to modify config for kramdown (#7699) - * Use jekyll-sass-converter-2.0 by default (#7778) ### Bug Fixes @@ -71,9 +71,12 @@ ### Minor Enhancements * Enhance `--blank` scaffolding (#7310) + * Use `jekyll-compose` if installed (#6932) + * Disable Liquid via front matter (#6824) + * Configure cache_dir (#7232) + * ISO week date drops (#5981) * Fix custom 404 page for GitHub pages (#7132) * Load config file from within current theme-gem (#7304) - * Use `jekyll-compose` if installed (#6932) * Suggest re-running command with `--trace` on fail (#6551) * Support for binary operators in where_exp filter (#6998) * Automatically load `_config.toml` (#7299) @@ -85,7 +88,6 @@ * Cache globbed paths in front matter defaults (#7345) * Cache computed item property (#7301) * Cleanup Markdown converter (#7519) - * Disable Liquid via front matter (#6824) * Do not process Liquid in post excerpt when disabled in front matter (#7146) * Liquefied link tag (#6269) * Update item_property to return numbers as numbers instead of strings (#6608) @@ -98,10 +100,8 @@ * Add a custom inspect string for StaticFile objects (#7422) * Remind user to include gem in the Gemfile on error (#7476) * Search Front matter defaults for Page objects with relative_path (#7261) - * Configure cache_dir (#7232) * Lock use of `tzinfo` gem to v1.x (#7521, #7562) * Utilize absolute paths of user-provided file paths (#7450) - * ISO week date drops (#5981) * Detect `nil` and empty values in objects with `where` filter (#7580) * Initialize mutations for Drops only if necessary (#7657) * Reduce Array allocations via Jekyll::Cleaner (#7659) @@ -117,209 +117,173 @@ ### Development Fixes + * Upgrade liquid-c to v4.0 (#7375) + * Bump RuboCop to v0.71.0 (#7687) + * Target Ruby 2.4 syntax (#7583) + * Fix: RuboCop offenses (#7769) * Use communicative method parameters (#7566) * Scan `assert_equal` methods and rectify any offenses with a custom RuboCop cop (#7130) - * Add a script to profile docs with CI (#7540) - * Test with Ruby 2.6 on AppVeyor (#7518) + * CI: Test with Ruby 2.6 (#7438) + * CI: Test with Ruby 2.6 on AppVeyor (#7518) + * CI: Update RuboCop config (#7050) + * CI: Add a script to profile docs (#7540) + * CI(Appveyor): shallow clone with 5 last commits (#7312) + * CI: Test with oldest and latest Ruby only (#7412) + * CI: Update excludes for CodeClimate Analyses (#7365) + * CI: Lock Travis to Bundler-1.16.2 (#7144) + * CI: Bump tested version of JRuby to 9.2.7.0 (#7612) + * CI: Do not install docs on updating gems on Travis (#7706) * Update gemspec (#7425) - * Upgrade liquid-c to v4.0 (#7375) - * Bump RuboCop to v0.63.x (#7489) - * Bump RuboCop to v0.62.x (#7449) - * Bump RuboCop to v0.61.x (#7401) - * Bump RuboCop to v0.60.x (#7338) - * Bump RuboCop to v0.59.0 (#7237) - * Bump RuboCop to v0.57.x (#7078) - * Relax version constraint on classifier-reborn gem (#7471) - * Test with Ruby v2.6 (#7438) + * deps: relax version constraint on classifier-reborn gem (#7471) + * deps: update yajl-ruby (#7278) + * deps: bump yajl-ruby to v1.4.0 (#6976) * Create symlink only if target is accessible (#7429) - * Test with oldest and latest Ruby only (#7412) * Switch to `:install_if` for wdm gem (#7372) - * Update excludes for CodeClimate Analyses (#7365) - * CI(Appveyor): shallow clone with 5 last commits (#7312) - * update yajl-ruby (#7278) * Add cucumber feature to test include_relative tag (#7213) * Small benchmark refactoring (#7211) - * Lock Travis to Bundler-1.16.2 (#7144) * Fix incorrectly passed arguments to assert_equal (#7134) * fix up refute_equal call (#7133) * Fix RuboCop offences in test files (#7128) * Use assert_include (#7093) * Remember to release docs gem (#7066) - * Update RuboCop's config (#7050) * Useless privates removed (#6768) * Load Rouge for TestKramdown (#7007) - * yajl-ruby update to v1.4.0 (#6976) * Update instructions for releasing docs Gem (#6975) * We are not using Ruby 2.2 anymore (#6977) * Remove unnecessary Jekyll::Page constant (#6770) * Remove unused error class (#6511) * Add a Cucumber feature for post_url tag (#7586) - * Bump tested version of JRuby to 9.2.7.0 (#7612) * Generate a "TOTAL" row for build-profile table (#7614) - * Target Ruby 2.4 syntax in RuboCop scans (#7583) - * Bump RuboCop to v0.68.x (#7637) * Refactor Jekyll::Cache (#7532) * Store list of expected extnames in a constant (#7638) - * Bump RuboCop to v0.69.x (#7656) * Profile allocations from a build session (#7646) * Update small typo in contributing.md (#7671) - * Bump RuboCop to v0.70.x (#7678) * Remove override to Jekyll::Document#respond_to? (#7695) - * Do not install docs on updating gems on Travis (#7706) * Update TestTags in sync with Rouge v3.4 (#7709) - * Bump RuboCop to v0.71.0 (#7687) * Use regexp to filter special entries (#7702) * Reduce Array objects generated from utility method (#7749) * Update mime.types (#7756) * Replace redundant Array#map with Array#each (#7761) - * Fix: rubocop offenses (#7769) * Reduce allocations by using #each_with_object (#7758) * Memoize fallback_data for Drop (#7728) * Use String#end_with? to check if entry is a backup (#7701) ### Documentation - * Add Installation Instructions for Ubuntu (#6925) - * add liquid tag jekyll-flickr (#6946) - * Updated copy - fixed casing of SaaS on resources page. (#6949) + * Refactor docs (#7205) + * Add a link to Giraffe Academy's tutorial (#7325) * Do not advise users to install Jekyll outside of Bundler (#6927) + * Remove documentation for using Redcarpet (#6990) + * Install Docs that Work on MacOS 10.14 (#7561) + * Add Installation Instructions for Ubuntu (#6925) * Don't prompt for sudo when installing with Ubuntu WSL (#6781) - * Fix typo (#6969) + * Installation instructions for Fedora (#7198) + * Update Windows install docs (#6926) + * List all standard liquid filters (#7333) + * List all static files variables (#7002) + * Improve how to include Rouge stylesheets (#7752) + * Mention CommonMark plugins (#7418) + * Add TSV to list of supported _data files. (#7168) + * How to deploy using pre-push git hook (#7179) + * Hosting with AWS Amplify (#7510) + * CircleCI deployment through CircleCI v2 (#7024) + * GitHub Pages: use themes from other repos (#7112) + * Document page.dir and page.name (#7373) + * Document custom tag blocks (#7359) + * Document converter methods (#7289) + * Document `{{ page.collection }}` (#7430) + * Document Jekyll Filters with YAML data (#7335) + * Document where Jekyll looks for layouts in a site (#7564) + * plugin: liquid tag jekyll-flickr (#6946) + * plugin: jekyll-target-blank (#7046) + * plugin: json-get. (#7086) + * plugin: `jekyll-info` (#7091) + * plugin: jekyll-xml-source (#7114) + * plugin: jekyll-firstimage filter (#7127) + * plugin: CAT (#7011) + * Resources: Statictastic (#7593) + * Resources: Bonsai Search (#7543) + * Resources: Formspark (#7601) + * Resources: Jekpack(#7598) + * Resources: formX (#7536) + * Resources: 99inbound's Jekyll post (#7348) + * Resources: CloudSh (#7497) + * Community: DEV Community's Jekyll tag (#7139) + * Showcase: developer.spotify.com (#7217) + * Showcase: Isomer (#7300) * Add version number for group_by_exp doc (#6956) - * Update Windows install docs (#6926) - * Remove documentation for using Redcarpet (#6990) * Updated nginx configuration for custom-404-page documentation (#6994) - * List all static files variables (#7002) - * Document that _drafts need to be contained within the custom collection directory (#6985) - * Change for passive voice. (#7005) - * Added the CAT plugin to the plugin list (#7011) - * Updated to supported version (#7031) * Clarify definition of 'draft' (#7037) - * Listed the jekyll-target-blank plugin in plugins list. (#7046) - * Typo (#7058) + * _drafts need to be contained within the custom collection directory (#6985) + * Updated to supported version (#7031) * Add Hints for some Improved Travis Config in Doc (#7049) - * Added plugin json-get. (#7086) * Update travis-ci.md to point out "this is an example Gemfile" (#7089) - * Adding `jekyll-info` plugin (#7091) - * GitHub enables you to use themes from other repos (#7112) - * Updates to CODE OF CONDUCT (v1.4.0) (#7105) * Instructions to view theme’s files under Linux (#7095) - * Add jekyll-xml-source (#7114) - * Add the jekyll-firstimage filter plugin (#7127) * Use a real theme in the example (#7125) * Update docs about post creation (#7138) - * Add DEV Community's Jekyll tag to community page (#7139) * Initialize upgrading doc for v4.0 (#7140) * Add version badge for date filters with ordinal (#7162) - * Add closing tags for <a> (#7163) - * Add TSV to list of supported _data files. (#7168) * Corrected sample usage of postfiles (#7181) - * Add missing html end tag for code example in section 'For loops' (#7199) * Resolve "Unable to locate package ruby2.4" error (#7196) - * Installation instructions for Fedora (#7198) - * New docs (#7205) - * List all standard liquid filters (#7333) * Correct stylesheet url in tutorial step 7 (#7210) - * Add some minor improvements to image loading in Showcase page (#7214) - * Fix minor grammatical error (#7215) - * Add developer.spotify.com to the Jekyll Showcase (#7217) * Removes quotes from markdown for assets (#7223) * Clarified front matter requirement (#7234) - * Minor whitespace fixes (#7238) * Explicit location of where to create blog.html (#7241) - * Fix a small grammar error/typo in the docs (#7260) * Reference the build command options that allows multiple config files (#7266) - * Update 10-deployment.md (#7268) * Add more issue template(s) and pull request template (#7269) * Suggest sites use OpenSSL instead of GnuTLS for their site's CI (#7010) * Fix broken Contributors link in README.markdown (#7200) * Add title tag to item in RSS template (#7282) - * More inclusive writing (#7283) - * Document converter methods (#7289) * Add link tag to item in RSS template (#7291) - * Add Isomer to showcase (#7300) - * Added missing semicolon (#7306) - * "This restricts you..." to "This restricts your" (#7307) - * Add a link to Giraffe Academy's tutorial (#7325) - * Grammar correction (#7327) - * Document Jekyll Filters with YAML data (#7335) * Remove redundant instruction comment (#7342) - * Minimize rendering count (#7343) - * Update posts.md (#7360) - * Add info how to deploy using pre-push git hook (#7179) * Textile is only supported through a converter plugin (#7003) - * Add documentation for custom tag blocks (#7359) - * Added 99inbound's Jekyll post to form resources (#7348) - * Document page.dir and page.name (#7373) + * Add recursive navigation tutorial (#7720) * Remove installation instructions with Homebrew (#7381) * Fix dead link and misleading prose (#7383) * Fix content management section (#7385) - * Proposed re-wording of Sass note. :) (#7392) * Apply ruby official guide documents (#7393) * Fix group_by_exp filter example (#7394) - * Adjust team page listings (#7395) - * Update resources.md (#7396) - * Update resources.md (#7397) * Remove alt attribute from a tags (#7407) - * Fix grammatical error in permalinks.md (#7409) * Fix BASH code-block in ubuntu.md (#7420) * zlib is missing (#7428) - * Include docs for `{{ page.collection }}` (#7430) - * Permalink docs typo fixes (#7459) * Fixed unnecessary aticles and pronouns (#7466) - * Grammatical correction (#7464) - * Update resources.md (#7472) * Store SSL key and cert in site source (#7473) - * Minor doc fixes (#7495) - * Changed order of steps (#7503) - * Hosting with AWS Amplify (#7510) * Fix typo in tutorial for converting existing site (#7524) - * Add CloudSh to resource page. (#7497) * Check if var exists before include tag (#7530) - * Added formX to form-backend resources (#7536) * Clarify docs on collections regarding the need for front matter (#7538) * Fix incorrect Windows path in themes.md (#7525) - * Document where Jekyll looks for layouts in a site (#7564) - * Mention CommonMark plugins (#7418) * Addresses bundle not found. (#7351) - * Example of CircleCI deployment through CircleCI v2 (#7024) - * v4.0 development post (#6934) - * Release post for v3.8.0 (#6849) - * Release Post for v3.6.3, v3.7.4 and v3.8.4 (#7259) - * Adds Statictastic to the list of resources (#7593) - * Update 07-assets.md (#7599) - * Fix link space (#7600) - * Added Formspark to form resources (#7601) - * Simplify couple of includes in the docs site (#7607) - * Avoid generating empty classnames (#7610) - * Install Docs that Work on MacOS 10.14 (#7561) * Update the contribution docs for draft pull requests (#7619) - * Doc: Data file section adds TSV (#7640) + * Data file section adds TSV (#7640) * Indicate where the _sass folder is by default (#7644) * Docs: add version tags to new placeholders (#5981) for permalinks (#7647) * Solve "GitHub Page build failure" in 10-deployment.md (#7648) - * Fix typo from 'Github' to 'GitHub' (#7691) * fix link to Site Source config (#7708) - * Add Jekpack to resources page (#7598) * Introduce frontmatter in step 2 (#7704) - * Add recursive navigation tutorial (#7720) - * Fix misspelling of "additional" (#7764) - * docs: improve how to include rouge stylesheets (#7752) - * Added Bonsai Search (#7543) - -### Site Enhancements - * Add @ashmaroli to Core Team listing (#7398) * Lnk to Tidelift in site's footer (#7377) * Link to OpenCollective backing (#7378 * Link to sponsor listing in README (#7405) + * Adjust team page listings (#7395) + * Updates to CODE OF CONDUCT (v1.4.0) (#7105) + * More inclusive writing (#7283) + +### Site Enhancements + * Better Performance (#7388) + * Add some minor improvements to image loading in Showcase page (#7214) * Simplify assigning classname to docs' aside-links (#7609) + * Simplify couple of includes in the docs site (#7607) + * Avoid generating empty classnames (#7610) + * Minimize rendering count (#7343) -### release +### Release - * Release v4.0.0.pre.alpha1 (#7574) - * Prepare Jekyll 4.0.0 beta1 (#7716) + * Release post for v4.0.0 beta1 (#7716) + * Release post for v4.0.0.pre.alpha1 (#7574) + * Release post for v3.8.0 (#6849) + * Release post for v3.6.3, v3.7.4 and v3.8.4 (#7259) + * Post: v4.0 development (#6934) ## 3.8.6 / 2019-07-02 From 759315bfa394191d961e6363b4b527af6cb942c9 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 17 Aug 2019 14:02:14 +0200 Subject: [PATCH 3739/4996] Upgrade documentation for Jekyll v4.0 --- .travis.yml | 4 +-- docs/_config.yml | 3 +- docs/_data/ruby.yml | 3 ++ docs/_docs/collections.md | 3 -- docs/_docs/front-matter.md | 6 ++-- docs/_docs/installation.md | 2 +- docs/_docs/installation/macos.md | 14 ++++----- docs/_docs/liquid/filters.md | 2 +- docs/_docs/liquid/tags.md | 40 ++++++++++-------------- docs/_docs/permalinks.md | 14 ++++----- docs/_docs/ruby-101.md | 8 ++--- docs/_docs/themes.md | 28 +++++++---------- docs/_docs/upgrading/3-to-4.md | 6 ++-- docs/_docs/usage.md | 4 +-- docs/_includes/news_contents_mobile.html | 2 +- docs/latest_version.txt | 2 +- jekyll.gemspec | 3 +- lib/jekyll/commands/new.rb | 4 +-- 18 files changed, 68 insertions(+), 80 deletions(-) create mode 100644 docs/_data/ruby.yml diff --git a/.travis.yml b/.travis.yml index 177239f77cb..6e84755212b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ cache: bundler language: ruby rvm: - - &ruby1 2.6.0 - - &ruby2 2.4.5 + - &ruby1 2.6.3 + - &ruby2 2.4.6 - &jruby jruby-9.2.7.0 matrix: diff --git a/docs/_config.yml b/docs/_config.yml index 0c7a2b1b6d7..e7aebd56fb3 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,6 +1,5 @@ --- version: 3.8.6 -min_ruby_version: 2.4.0 name: Jekyll • Simple, blog-aware, static sites description: Transform your plain text into static websites and blogs url: https://jekyllrb.com @@ -54,6 +53,8 @@ feed: sass: style: compressed +strict_front_matter: true + exclude: - .gitignore - .jekyll-cache diff --git a/docs/_data/ruby.yml b/docs/_data/ruby.yml new file mode 100644 index 00000000000..be3cdb28a14 --- /dev/null +++ b/docs/_data/ruby.yml @@ -0,0 +1,3 @@ +min_version: 2.4.0 +current_version: 2.6.3 +current_version_output: ruby 2.6.3p62 (2019-04-16 revision 67580) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index f951564ea5f..e2e6ac6883f 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -114,8 +114,6 @@ You can link to the generated page using the `url` attribute: There are special [permalink variables for collections](/docs/permalinks/) to help you control the output url for the entire collection. -{% if site.version == '4.0.0' %}{% comment %} Remove this encapsulation when v4.0 ships {% endcomment %} - ## Custom Sorting of Documents By default, documents in a collection are sorted by their paths. But you can control this sorting via the collection's metadata. @@ -164,7 +162,6 @@ collections: ``` If both metadata keys have been defined properly, `order` list takes precedence. -{% endif %} ## Liquid Attributes diff --git a/docs/_docs/front-matter.md b/docs/_docs/front-matter.md index 084235133f7..a3deb697193 100644 --- a/docs/_docs/front-matter.md +++ b/docs/_docs/front-matter.md @@ -33,7 +33,7 @@ relies on.
    -
    ProTip™: Front Matter Variables Are Optional
    +
    Front Matter Variables Are Optional

    If you want to use Liquid tags and variables but don’t need anything in your front matter, just leave it empty! The set @@ -114,7 +114,7 @@ front matter of a page or post.

    -
    ProTip™: Render Posts Marked As Unpublished
    +
    Render Posts Marked As Unpublished

    To preview unpublished pages, run `jekyll serve` or `jekyll build` with the `--unpublished` switch. Jekyll also has a handy drafts @@ -201,7 +201,7 @@ These are available out-of-the-box to be used in the front matter for a post.

    -
    ProTip™: Don't repeat yourself
    +
    Don't repeat yourself

    If you don't want to repeat your frequently used front matter variables over and over, define defaults diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index e40cebd7f7b..22c60276a2a 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -8,7 +8,7 @@ Jekyll is a [Ruby Gem](/docs/ruby-101/#gems) that can be installed on most syste ## Requirements -* [Ruby](https://www.ruby-lang.org/en/downloads/) version {{ site.min_ruby_version }} or above, including all development headers (ruby version can be checked by running `ruby -v`) +* [Ruby](https://www.ruby-lang.org/en/downloads/) version **{{ site.data.ruby.min_version }}** or above, including all development headers (ruby version can be checked by running `ruby -v`) * [RubyGems](https://rubygems.org/pages/download) (which you can check by running `gem -v`) * [GCC](https://gcc.gnu.org/install/) and [Make](https://www.gnu.org/software/make/) (in case your system doesn't have them installed, which you can check by running `gcc -v`,`g++ -v` and `make -v` in your system's command line interface) diff --git a/docs/_docs/installation/macos.md b/docs/_docs/installation/macos.md index 1a9970917ce..56b1b2ffda1 100644 --- a/docs/_docs/installation/macos.md +++ b/docs/_docs/installation/macos.md @@ -12,7 +12,7 @@ xcode-select --install ## Install Ruby -Jekyll requires Ruby > {{ site.min_ruby_version }}. +Jekyll requires **Ruby > {{ site.data.ruby.min_version }}**. As macOS Mojave 10.14 comes only with ruby 2.3.x, you'll have to install a newer version of Ruby. ### With Homebrew {#brew} @@ -25,7 +25,7 @@ To run the latest Ruby version you need to install it through [Homebrew](https:/ brew install ruby ``` -Don't forget to add the brew ruby path to your shell config : +Add the brew ruby path to your shell config : ``` export PATH=/usr/local/opt/ruby/bin:$PATH @@ -38,7 +38,7 @@ which ruby # /usr/local/opt/ruby/bin/ruby ruby -v -# ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18] +{{ site.data.ruby.current_version_output }} ``` Yay, we are now running current stable Ruby! @@ -66,10 +66,10 @@ Restart your terminal for changes to take effect. Now you can install the Ruby version of our choice, let's go with current latest stable Ruby: ```sh -rbenv install 2.6.2 -rbenv global 2.6.2 +rbenv install {{ site.data.ruby.current_version }} +rbenv global {{ site.data.ruby.current_version }} ruby -v -# ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18] +{{ site.data.ruby.current_version_output }} ``` That's it! Head over [rbenv command references](https://github.com/rbenv/rbenv#command-reference) to learn how to use different versions of Ruby in your projects. @@ -88,7 +88,7 @@ and then get your Ruby version using ```sh ruby -v -# ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18] +{{ site.data.ruby.current_version_output }} ``` Then append your path file with the following, replacing the `X.X` with the first two digits of your Ruby version. diff --git a/docs/_docs/liquid/filters.md b/docs/_docs/liquid/filters.md index bd33c07c2d7..fafcd250313 100644 --- a/docs/_docs/liquid/filters.md +++ b/docs/_docs/liquid/filters.md @@ -104,7 +104,7 @@ The default is `default`. They are as follows (with what they filter): - `ascii`: spaces, non-alphanumeric, and non-ASCII characters - `latin`: like `default`, except Latin characters are first transliterated (e.g. `àèïòü` to `aeiou`) {%- include docs_version_badge.html version="3.7.0" -%}. -### Detecting `nil` values with `where` filter {%- include docs_version_badge.html version="4.0.0" -%} +### Detecting `nil` values with `where` filter {%- include docs_version_badge.html version="4.0" -%} You can use the `where` filter to detect documents and pages with properties that are `nil` or `""`. For example, diff --git a/docs/_docs/liquid/tags.md b/docs/_docs/liquid/tags.md index d5ee9d6373f..cc181593422 100644 --- a/docs/_docs/liquid/tags.md +++ b/docs/_docs/liquid/tags.md @@ -16,19 +16,12 @@ If you have page snippets that you use repeatedly across your site, an Jekyll has built in support for syntax highlighting of over 100 languages thanks to [Rouge](http://rouge.jneen.net). Rouge is the default highlighter -in Jekyll 3 and above. To use it in Jekyll 2, set `highlighter` to `rouge` -and ensure the `rouge` gem is installed properly. - -Alternatively, you can use [Pygments](http://pygments.org) to highlight your -code snippets in Jekyll 3.x and below. To use Pygments, you must have Python -installed on your system, have the `pygments.rb` gem installed and set -`highlighter` to `pygments` in your site's configuration file. Pygments -supports [over 100 languages](http://pygments.org/languages/) - -

    -

    Using Pygments has been deprecated and will not be officially supported in - Jekyll 4, meaning that the configuration setting highlighter: pygments - will automatically fall back to using Rouge which is written in Ruby +in Jekyll 3 and above. + +

    +

    Using Pygments has been deprecated and is not supported in + Jekyll 4, the configuration setting highlighter: pygments + now automatically falls back to using Rouge which is written in Ruby and 100% compatible with stylesheets for Pygments.

    @@ -47,14 +40,14 @@ end The argument to the `highlight` tag (`ruby` in the example above) is the language identifier. To find the appropriate identifier to use for the language you want to highlight, look for the “short name” on the [Rouge -wiki](https://github.com/jayferd/rouge/wiki/List-of-supported-languages-and-lexers) -or the [Pygments' Lexers page](http://pygments.org/docs/lexers/). +wiki](https://github.com/jayferd/rouge/wiki/List-of-supported-languages-and-lexers). -
    +
    Jekyll processes all Liquid filters in code blocks

    If you are using a language that contains curly braces, you will likely need to place {% raw %} and - {% endraw %} tags around your code.

    + {% endraw %} tags around your code. + Since {% include docs_version_badge.html version="4.0" %} you can add render_with_liquid: false in your front matter to disable Liquid entirely for a particular document.

    ### Line numbers @@ -89,9 +82,11 @@ the syntax highlighter styles into your `main.css`: @import "native.css"; ``` - ## Links +{: .note } +Since Jekyll {% include docs_version_badge.html version="v4.0"%} you don't need to prepend `link` and `post_url` tags with `site.baseurl` + ### Linking to pages {#link} To link to a post, a page, collection item, or file, the `link` tag will generate the correct permalink URL for the path you specify. For example, if you use the `link` tag to link to `mypage.html`, even if you change your permalink style to include the file extension or omit it, the URL formed by the `link` tag will always be valid. @@ -118,9 +113,6 @@ You can also use the `link` tag to create a link in Markdown as follows: ``` {% endraw %} -{: .note } -Since {% include docs_version_badge.html version="v4.0"%} you don't need to prepend `link` tags with `site.baseurl` - The path to the post, page, or collection is defined as the path relative to the root directory (where your config file is) to the file, not the path from your existing page to the other page. For example, suppose you're creating a link in `page_a.md` (stored in `pages/folder1/folder2`) to `page_b.md` (stored in `pages/folder1`). Your path in the link would not be `../page_b.html`. Instead, it would be `/pages/folder1/page_b.md`. @@ -137,7 +129,7 @@ If you want to include a link to a post on your site, the `post_url` tag will ge {% raw %} ```liquid -{{ site.baseurl }}{% post_url 2010-07-21-name-of-post %} +{% post_url 2010-07-21-name-of-post %} ``` {% endraw %} @@ -145,7 +137,7 @@ If you organize your posts in subdirectories, you need to include subdirectory p {% raw %} ```liquid -{{ site.baseurl }}{% post_url /subdir/2010-07-21-name-of-post %} +{% post_url /subdir/2010-07-21-name-of-post %} ``` {% endraw %} @@ -155,6 +147,6 @@ You can also use this tag to create a link to a post in Markdown as follows: {% raw %} ```liquid -[Name of Link]({{ site.baseurl }}{% post_url 2010-07-21-name-of-post %}) +[Name of Link]({% post_url 2010-07-21-name-of-post %}) ``` {% endraw %} diff --git a/docs/_docs/permalinks.md b/docs/_docs/permalinks.md index 13697c55d82..ccf3ede2b85 100644 --- a/docs/_docs/permalinks.md +++ b/docs/_docs/permalinks.md @@ -110,7 +110,7 @@ Here's the full list of placeholders available:

    long_month

    - {% include docs_version_badge.html version="4.0.0" %} + {% include docs_version_badge.html version="4.0" %}

    Full month name, e.g. “January”.

    @@ -149,7 +149,7 @@ Here's the full list of placeholders available:

    w_year

    - {% include docs_version_badge.html version="4.0.0" %} + {% include docs_version_badge.html version="4.0" %}

    Week year which may differ from the month year for up to three days at the start of January and end of December

    @@ -158,7 +158,7 @@ Here's the full list of placeholders available:

    week

    - {% include docs_version_badge.html version="4.0.0" %} + {% include docs_version_badge.html version="4.0" %}

    Week number of the current year, starting with the first week having a majority of its days in January. (01..53)

    @@ -167,7 +167,7 @@ Here's the full list of placeholders available:

    w_day

    - {% include docs_version_badge.html version="4.0.0" %} + {% include docs_version_badge.html version="4.0" %}

    Day of the week, starting with Monday. (1..7)

    @@ -176,7 +176,7 @@ Here's the full list of placeholders available:

    short_day

    - {% include docs_version_badge.html version="4.0.0" %} + {% include docs_version_badge.html version="4.0" %}

    Three-letter weekday abbreviation, e.g. “Sun”.

    @@ -185,7 +185,7 @@ Here's the full list of placeholders available:

    long_day

    - {% include docs_version_badge.html version="4.0.0" %} + {% include docs_version_badge.html version="4.0" %}

    Weekday name, e.g. “Sunday”.

    @@ -302,7 +302,7 @@ For posts, Jekyll also provides the following built-in styles for convenience:

    weekdate

    - {% include docs_version_badge.html version="4.0.0" %} + {% include docs_version_badge.html version="4.0" %}

    /:categories/:year/W:week/:short_day/:title:output_ext

    diff --git a/docs/_docs/ruby-101.md b/docs/_docs/ruby-101.md index f3ec778b043..0b6f32c4cc9 100644 --- a/docs/_docs/ruby-101.md +++ b/docs/_docs/ruby-101.md @@ -24,13 +24,13 @@ A gem is code you can include in Ruby projects. It allows you to package up func A `Gemfile` is a list of gems required for your site. For a simple Jekyll site it might look something like this: ```ruby -source 'https://rubygems.org' +source "https://rubygems.org" -gem 'jekyll' +gem "jekyll" group :jekyll_plugins do - gem 'jekyll-feed' - gem 'jekyll-seo-tag' + gem "jekyll-feed" + gem "jekyll-seo-tag" end ``` diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index cb7563344b5..0a09e84898a 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -43,7 +43,7 @@ To locate a theme's files on your computer: 1. Run `bundle show` followed by the name of the theme's gem, e.g., `bundle show minima` for Jekyll's default theme. - This returns the location of the gem-based theme files. For example, the Minima theme's files might be located in `/usr/local/lib/ruby/gems/2.3.0/gems/minima-2.1.0` on macOS. + This returns the location of the gem-based theme files. For example, the Minima theme's files might be located in `/usr/local/lib/ruby/gems/2.6.0/gems/minima-2.5.1` on macOS. 2. Open the theme's directory in Finder or Explorer: @@ -55,10 +55,10 @@ To locate a theme's files on your computer: # First get the gem's installation path: # # bundle show minima - # => C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/minima-2.1.0 + # => C:/Ruby26-x64/lib/ruby/gems/{{ site.data.ruby.current_version }}/gems/minima-2.5.1 # # then invoke explorer with above path, substituting `/` with `\` - explorer C:\Ruby24-x64\lib\ruby\gems\2.4.0\gems\minima-2.1.0 + explorer C:\Ruby26-x64\lib\ruby\gems\{{ site.data.ruby.current_version}}\gems\minima-2.5.1 # On Linux xdg-open $(bundle show minima) @@ -121,8 +121,8 @@ To do this, copy the files from the theme gem's directory into your Jekyll site Then you must tell Jekyll about the plugins that were referenced by the theme. You can find these plugins in the theme's gemspec file as runtime dependencies. If you were converting the Minima theme, for example, you might see: ``` -spec.add_runtime_dependency "jekyll-feed", "~> 0.9" -spec.add_runtime_dependency "jekyll-seo-tag", "~> 2.1" +spec.add_runtime_dependency "jekyll-feed", "~> 0.12" +spec.add_runtime_dependency "jekyll-seo-tag", "~> 2.6" ``` You should include these references in the `Gemfile` in one of two ways. @@ -132,8 +132,8 @@ You could list them individually in both `Gemfile` and `_config.yml`. ```ruby # ./Gemfile -gem "jekyll-feed", "~> 0.9" -gem "jekyll-seo-tag", "~> 2.1" +gem "jekyll-feed", "~> 0.12" +gem "jekyll-seo-tag", "~> 2.6" ``` ```yaml @@ -150,8 +150,8 @@ Or you could list them explicitly as Jekyll plugins in your Gemfile, and not upd # ./Gemfile group :jekyll_plugins do - gem "jekyll-feed", "~> 0.9" - gem "jekyll-seo-tag", "~> 2.1" + gem "jekyll-feed", "~> 0.12" + gem "jekyll-seo-tag", "~> 2.6" end ``` @@ -161,7 +161,7 @@ If you're publishing on GitHub Pages you should update only your `_config.yml` a Finally, remove references to the theme gem in `Gemfile` and configuration. For example, to remove `minima`: -- Open `Gemfile` and remove `gem "minima", "~> 2.0"`. +- Open `Gemfile` and remove `gem "minima", "~> 2.5"`. - Open `_config.yml` and remove `theme: minima`. Now `bundle update` will no longer get updates for the theme gem. @@ -187,7 +187,7 @@ To install a gem-based theme: ```diff # ./Gemfile - - gem "minima", "~> 2.0" + - gem "minima", "~> 2.5" + gem "jekyll-theme-minimal" ``` @@ -282,10 +282,7 @@ Jekyll will automatically require all whitelisted `runtime_dependencies` of your With this, the end-user need not keep track of the plugins required to be included in their config file for their theme-gem to work as intended. -{% if site.version == '4.0.0' %} -{% comment %} Remove this encapsulation when `v4.0` ships {% endcomment %} - -### Pre-configuring Theme-gems {%- include docs_version_badge.html version="4.0.0" -%} +### Pre-configuring Theme-gems {%- include docs_version_badge.html version="4.0" -%} Jekyll will read-in a `_config.yml` at the root of the theme-gem and merge its data into the site's existing configuration data. @@ -298,7 +295,6 @@ But unlike other entities loaded from within the theme, loading the config file While this feature is to enable easier adoption of a theme, the restrictions ensure that a theme-config cannot affect the build in a concerning manner. Any plugins required by the theme will have to be listed manually by the user or provided by the theme's `gemspec` file. This feature will let the theme-gem to work with *theme-specific config variables* out-of-the-box. -{% endif %} ### Documenting your theme diff --git a/docs/_docs/upgrading/3-to-4.md b/docs/_docs/upgrading/3-to-4.md index 09a46b99b60..40e73320be0 100644 --- a/docs/_docs/upgrading/3-to-4.md +++ b/docs/_docs/upgrading/3-to-4.md @@ -5,17 +5,17 @@ permalink: /docs/upgrading/3-to-4/ A few things have changed in Jekyll 4. -Before we dive in, you need to have at least Ruby {{ site.min_ruby_version }} +Before we dive in, you need to have at least Ruby {{ site.data.ruby.min_version }} installed. Run the following in your terminal to check ```sh ruby -v -ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18] +{{ site.data.ruby.current_version_output }} ``` -If you're using a supported Ruby version > {{ site.min_ruby_version }}, go ahead +If you're using a supported Ruby version > {{ site.data.ruby.min_version }}, go ahead and fetch the latest version of Jekyll: ```sh diff --git a/docs/_docs/usage.md b/docs/_docs/usage.md index 76d2bd96ae0..9aac2e4d3d3 100644 --- a/docs/_docs/usage.md +++ b/docs/_docs/usage.md @@ -12,9 +12,9 @@ You can use this command in a number of ways: * `jekyll build` or `jekyll b` - Performs a one off build your site to `./_site` (by default) * `jekyll serve` or `jekyll s` - Builds your site any time a source file changes and serves it locally * `jekyll doctor` - Outputs any deprecation or configuration issues -* `jekyll new-theme` - Creates a new Jekyll theme scaffold -* `jekyll clean` - Removes the generated site and metadata file +* `jekyll clean` - Removes all generated files: destination folder, metadata file, Sass and Jekyll caches. * `jekyll help` - Shows help, optionally for a given subcommand, e.g. `jekyll help build` +* `jekyll new-theme` - Creates a new Jekyll theme scaffold Typically you'll use `jekyll serve` while developing locally and `jekyll build` when you need to generate the site for production. diff --git a/docs/_includes/news_contents_mobile.html b/docs/_includes/news_contents_mobile.html index e8fb55e7228..8f8ba563947 100644 --- a/docs/_includes/news_contents_mobile.html +++ b/docs/_includes/news_contents_mobile.html @@ -2,7 +2,7 @@ - {% for section in site.data.docs_nav %} + {% for section in site.data.docs_nav -%} - {% for item in section.docs %} - {% assign p = site.documents | where: "url", item.link | first %} - - {% endfor %} + {%- for item in section.docs -%} + {% assign p = site.documents | where: "url", item.link | first %} + + {%- endfor %} - {% endfor %} + {% endfor -%}
    diff --git a/docs/_includes/docs_variables_table.html b/docs/_includes/docs_variables_table.html index df5e9b17a29..feafa7106c3 100644 --- a/docs/_includes/docs_variables_table.html +++ b/docs/_includes/docs_variables_table.html @@ -7,12 +7,12 @@ - {% for var in include.scope %} + {% for var in include.scope -%}

    {{ var.name }}

    {{- var.description -}}

    - {% endfor %} + {% endfor -%}
    diff --git a/docs/_includes/header.html b/docs/_includes/header.html index 418e04d5746..b38a89ec25f 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -9,23 +9,19 @@

    diff --git a/docs/_includes/mobile-nav-items.html b/docs/_includes/mobile-nav-items.html index fc8f10ef9b6..6b9b0062a55 100644 --- a/docs/_includes/mobile-nav-items.html +++ b/docs/_includes/mobile-nav-items.html @@ -1,18 +1,14 @@
      - {% for p in site.data.primary_nav %} - {%- if p.show_on_mobile %} + {% for p in site.data.primary_nav -%} + {% if p.show_on_mobile -%}
    • - {{ p.title }} -
    • - {%- endif %} - {% endfor %} -
    • - GitHub -
    • + {%- if page.url == '/' %} class="current" {% endif -%} + {% else -%} + {%- if page.url contains p.link %} class="current" {% endif -%} + {% endif -%} + >{{ p.title }} + {% endif -%} + {% endfor -%} +
    • GitHub
    diff --git a/docs/_includes/news_contents.html b/docs/_includes/news_contents.html index 737a2114e55..d717b20dd12 100644 --- a/docs/_includes/news_contents.html +++ b/docs/_includes/news_contents.html @@ -10,24 +10,24 @@

    Recent Releases

    Other News

      - {% for post in site.posts %} - {% unless post.categories contains 'release' %} -
    • - {{ post.title }} -
    • - {% endunless %} - {% endfor %} + {% for post in site.posts -%} + {% unless post.categories contains 'release' -%} +
    • + {{ post.title }} +
    • + {% endunless -%} + {% endfor -%}
    diff --git a/docs/_includes/news_item.html b/docs/_includes/news_item.html index db490c8ed5a..e7a7dbc2def 100644 --- a/docs/_includes/news_item.html +++ b/docs/_includes/news_item.html @@ -1,25 +1,25 @@ diff --git a/docs/_includes/primary-nav-items.html b/docs/_includes/primary-nav-items.html index b27cceb6618..eb30a699693 100644 --- a/docs/_includes/primary-nav-items.html +++ b/docs/_includes/primary-nav-items.html @@ -1,13 +1,11 @@
      - {% for p in site.data.primary_nav %} + {% for p in site.data.primary_nav -%}
    • - {{ p.title }} -
    • - {% endfor %} + {% if page.url == p.link %} class="current" {%- endif -%} + {% else -%} + {% if page.url contains p.link %} class="current" {%- endif -%} + {% endif -%} + >{{ p.title }} + {% endfor -%}
    diff --git a/docs/_includes/section_nav_tutorials.html b/docs/_includes/section_nav_tutorials.html index 30812bbafe4..8d665f5139b 100644 --- a/docs/_includes/section_nav_tutorials.html +++ b/docs/_includes/section_nav_tutorials.html @@ -1,39 +1,39 @@ -{% comment %} +{%- comment -%} Map grabs the tutorials sections, giving us an array of arrays. Join, flattens all the items to a comma delimited string. Split turns it into an array again. -{% endcomment %} -{% assign tutorials = site.data.tutorials | map: 'tutorials' | join: ',' | split: ',' %} +{%- endcomment -%} +{%- assign tutorials = site.data.tutorials | map: 'tutorials' | join: ',' | split: ',' -%} -{% comment %} +{%- comment -%} Because this is built for every page, lets find where we are in the ordered document list by comparing url strings. Then if there's something previous or next, lets build a link to it. -{% endcomment %} +{%- endcomment -%} -{% for tutorial in tutorials %} - {% assign tutorial_url = tutorial | prepend:"/tutorials/" | append:"/" %} - {% if tutorial_url == page.url %} -
    -
    - {% if forloop.first %} - Back - {% else %} - {% assign previous = forloop.index0 | minus: 1 %} - {% assign previous_page = tutorials[previous] | prepend:"/tutorials/" | append:"/" %} - - {% endif %} -
    -
    - {% if forloop.last %} - Next - {% else %} - {% assign next = forloop.index0 | plus: 1 %} - {% assign next_page = tutorials[next] | prepend:"/tutorials/" | append:"/" %} - - {% endif %} -
    +{% for tutorial in tutorials -%} + {% assign tutorial_url = tutorial | prepend:"/tutorials/" | append:"/" -%} + {% if tutorial_url == page.url -%} +
    +
    + {% if forloop.first -%} + Back + {% else -%} + {% assign previous = forloop.index0 | minus: 1 -%} + {% assign previous_page = tutorials[previous] | prepend:"/tutorials/" | append:"/" -%} + + {% endif -%}
    -
    - {% break %} - {% endif %} -{% endfor %} \ No newline at end of file +
    + {% if forloop.last -%} + Next + {% else -%} + {% assign next = forloop.index0 | plus: 1 -%} + {% assign next_page = tutorials[next] | prepend:"/tutorials/" | append:"/" -%} + + {% endif -%} +
    +
    +
    + {% break -%} + {% endif -%} +{% endfor -%} diff --git a/docs/_includes/step-index.html b/docs/_includes/step-index.html index eb03b551e93..798fb7c5531 100644 --- a/docs/_includes/step-index.html +++ b/docs/_includes/step-index.html @@ -1,65 +1,34 @@ -{% assign docs = site.docs | where_exp: "doc", "doc.url contains '/step-by-step/'" %} +{% assign docs = site.docs | where_exp: "doc", "doc.url contains '/step-by-step/'" -%} -{% for tutorial in tutorials %} - {% assign tutorial_url = tutorial | prepend:"/tutorials/" | append:"/" %} - {% if tutorial_url == page.url %} +{% for doc in docs -%} + {% if doc.url == page.url -%}
    - {% if forloop.first %} - Back - {% else %} - {% assign previous = forloop.index0 | minus: 1 %} - {% assign previous_page = tutorials[previous] | prepend:"/tutorials/" | append:"/" %} - - {% endif %} + {% if forloop.first -%} + Back + {% else -%} + {% assign previous = forloop.index0 | minus: 1 -%} + + {% endif -%}
    - {% if forloop.last %} - Next - {% else %} - {% assign next = forloop.index0 | plus: 1 %} - {% assign next_page = tutorials[next] | prepend:"/tutorials/" | append:"/" %} - - {% endif %} + {% if forloop.last -%} + Next + {% else -%} + {% assign next = forloop.index0 | plus: 1 -%} + + {% endif -%}
    - {% break %} - {% endif %} -{% endfor %} - - -{% for doc in docs %} - {% if doc.url == page.url %} -
    -
    - {% if forloop.first %} - Back - {% else %} - {% assign previous = forloop.index0 | minus: 1 %} - - {% endif %} -
    -
    - {% if forloop.last %} - Next - {% else %} - {% assign next = forloop.index0 | plus: 1 %} - - {% endif %} -
    -
    -
    - {% break %} - {% endif %} -{% endfor %} + {% break -%} + {% endif -%} +{% endfor -%}
      - {% for step in docs %} -
    1. - - {{ step.title }} - -
    2. - {% endfor %} + {% for step in docs -%} +
    3. + {{- step.title -}} +
    4. + {% endfor -%}
    diff --git a/docs/_includes/tutorials_contents.html b/docs/_includes/tutorials_contents.html index 5c9cdc8ee7f..75fe9fc5063 100644 --- a/docs/_includes/tutorials_contents.html +++ b/docs/_includes/tutorials_contents.html @@ -1,10 +1,16 @@
    diff --git a/docs/_includes/tutorials_contents_mobile.html b/docs/_includes/tutorials_contents_mobile.html index 901fdf5c435..217bc326752 100644 --- a/docs/_includes/tutorials_contents_mobile.html +++ b/docs/_includes/tutorials_contents_mobile.html @@ -1,10 +1,14 @@
    diff --git a/docs/_includes/tutorials_option.html b/docs/_includes/tutorials_option.html deleted file mode 100644 index 482c2143337..00000000000 --- a/docs/_includes/tutorials_option.html +++ /dev/null @@ -1,5 +0,0 @@ -{% for item in include.items %} - {% assign item_url = item | prepend:"/tutorials/" | append:"/" %} - {% assign tutorial = site.tutorials | where: "url", item_url | first %} - -{% endfor %} diff --git a/docs/_includes/tutorials_ul.html b/docs/_includes/tutorials_ul.html deleted file mode 100644 index a2b613262cd..00000000000 --- a/docs/_includes/tutorials_ul.html +++ /dev/null @@ -1,7 +0,0 @@ -
      -{% for item in include.items %} - {% assign item_url = item | prepend:"/tutorials/" | append:"/" %} - {% assign p = site.tutorials | where:"url", item_url | first %} -
    • {{ p.title }}
    • -{% endfor %} -
    diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 8e9574adc63..9234c13c754 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -1,13 +1,13 @@ -{% include top.html %} +{%- include top.html -%} - {% include header.html %} + {%- include header.html -%} - {{ content }} + {{- content -}} - {% include footer.html %} - {% include anchor_links.html %} - {% include analytics.html %} - {% include search/script.html %} + {%- include footer.html -%} + {%- include anchor_links.html -%} + {%- include analytics.html -%} + {%- include search/script.html -%} diff --git a/docs/_layouts/docs.html b/docs/_layouts/docs.html index ab179e50462..f52e7831cbf 100644 --- a/docs/_layouts/docs.html +++ b/docs/_layouts/docs.html @@ -2,24 +2,20 @@ layout: default --- -
    -
    - - {% include docs_contents_mobile.html %} - -
    - -
    - - {% include docs_contents.html %} - -
    - +
    +
    + {% include docs_contents_mobile.html -%} +
    +
    -
    + {% include docs_contents.html -%} +
    +
    +
    diff --git a/docs/_layouts/news.html b/docs/_layouts/news.html index 8f7945f345a..7b776bc7446 100644 --- a/docs/_layouts/news.html +++ b/docs/_layouts/news.html @@ -2,18 +2,13 @@ layout: default --- -
    -
    - - {% include news_contents_mobile.html %} - -
    - {{ content }} -
    - - {% include news_contents.html %} - -
    - +
    +
    + {% include news_contents_mobile.html -%} +
    + {{- content -}}
    -
    + {% include news_contents.html -%} +
    +
    +
    diff --git a/docs/_layouts/news_item.html b/docs/_layouts/news_item.html index e9fa2aec859..74d5d91b010 100644 --- a/docs/_layouts/news_item.html +++ b/docs/_layouts/news_item.html @@ -12,17 +12,17 @@

    diff --git a/docs/_layouts/page.html b/docs/_layouts/page.html index bae31bb365c..28364e7dbde 100644 --- a/docs/_layouts/page.html +++ b/docs/_layouts/page.html @@ -4,15 +4,12 @@
    -

    {{ page.title }}

    {{ content }}
    -
    -
    diff --git a/docs/_layouts/step.html b/docs/_layouts/step.html index 7a3a593f9cf..3bf1101cc8e 100644 --- a/docs/_layouts/step.html +++ b/docs/_layouts/step.html @@ -1,26 +1,21 @@ --- layout: default --- -
    -
    - - {% include docs_contents_mobile.html %} - -
    -
    - -

    Step by Step Tutorial

    -

    {{ page.position }}. {{ page.title }}

    - {{ content }} - {% include step-index.html %} -
    -
    - - {% include docs_contents.html %} - -
    - +
    +
    + {% include docs_contents_mobile.html -%} +
    +
    + +

    Step by Step Tutorial

    +

    {{ page.position }}. {{ page.title }}

    + {{ content }} + {% include step-index.html -%} +
    -
    + {% include docs_contents.html -%} +
    +
    +
    diff --git a/docs/_layouts/tutorials.html b/docs/_layouts/tutorials.html index 3850971c336..26d1aed00a9 100644 --- a/docs/_layouts/tutorials.html +++ b/docs/_layouts/tutorials.html @@ -2,26 +2,21 @@ layout: default --- -
    -
    - - {% include tutorials_contents_mobile.html %} - -
    -
    - -

    {{ page.title }}

    - {{ content }} - {% include section_nav_tutorials.html %} -
    -
    - - {% include tutorials_contents.html %} - -
    - +
    +
    + {%- include tutorials_contents_mobile.html -%} +
    +
    + +

    {{ page.title }}

    + {{- content -}} + {%- include section_nav_tutorials.html -%} +
    -
    + {%- include tutorials_contents.html -%} +
    +
    +
    diff --git a/docs/pages/404.html b/docs/pages/404.html index 9edc873bf92..dc4d97355f6 100644 --- a/docs/pages/404.html +++ b/docs/pages/404.html @@ -18,18 +18,10 @@

    The resource you requested was not found. Here are some links to help you find your way:

    diff --git a/docs/pages/news.html b/docs/pages/news.html index 94139fc00db..b806b0e5f5c 100644 --- a/docs/pages/news.html +++ b/docs/pages/news.html @@ -5,6 +5,6 @@ author: all --- -{% for post in site.posts %} - {% include news_item.html %} -{% endfor %} +{% for post in site.posts -%} + {% include news_item.html -%} +{% endfor -%} diff --git a/docs/pages/releases.html b/docs/pages/releases.html index 153d022c133..9736fbd8afe 100644 --- a/docs/pages/releases.html +++ b/docs/pages/releases.html @@ -5,6 +5,6 @@ author: all --- -{% for post in site.categories.release %} - {% include news_item.html %} -{% endfor %} +{% for post in site.categories.release -%} + {% include news_item.html -%} +{% endfor -%} diff --git a/docs/pages/showcase.html b/docs/pages/showcase.html index 58d52c0a912..98cd89174b6 100644 --- a/docs/pages/showcase.html +++ b/docs/pages/showcase.html @@ -9,18 +9,18 @@

    Jekyll is used for all kinds of usecases. Here's some of our favorites:

    From 4d131eb069b8de4a982e5b976352175aa882db27 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 24 Feb 2020 18:44:13 -0500 Subject: [PATCH 3899/4996] Update history to reflect merge of #8020 [ci skip] --- History.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.markdown b/History.markdown index 0a0bcb9a18c..fd1ffe3616a 100644 --- a/History.markdown +++ b/History.markdown @@ -76,6 +76,10 @@ * Add Visual Studio Code Development Container (#8016) * Configure kramdown toc_levels as array by default (#8015) +### Site Enhancements + + * Optimize rendering of the documentation site (#8020) + ## 4.0.0 / 2019-08-19 ### Major Enhancements From 39e2a8b5f5eceda74712cbfae9494d4cfdc1ea16 Mon Sep 17 00:00:00 2001 From: Dmitry Egorov <40038420+dmiedev@users.noreply.github.com> Date: Wed, 26 Feb 2020 09:28:36 +0300 Subject: [PATCH 3900/4996] [Docs] Fix asset link ref in step-by-step tutorial (#8026) Merge pull request 8026 --- docs/_docs/step-by-step/07-assets.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/step-by-step/07-assets.md b/docs/_docs/step-by-step/07-assets.md index eb1534b7da9..5d8b1b8a92d 100644 --- a/docs/_docs/step-by-step/07-assets.md +++ b/docs/_docs/step-by-step/07-assets.md @@ -70,7 +70,7 @@ Open `_layouts/default.html` and add the stylesheet to the ``: {{ page.title }} - + {% include navigation.html %} From b1573b62921c51d123bf433e64cf6ee2197473c7 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 26 Feb 2020 01:28:38 -0500 Subject: [PATCH 3901/4996] Update history to reflect merge of #8026 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fd1ffe3616a..bac495b8d9f 100644 --- a/History.markdown +++ b/History.markdown @@ -56,6 +56,7 @@ * Fix file references in Step by Step Tutorial's Assets step (#8007) * docs: improve highlighting of code blocks (#8017) * remove leading slash from Sass file location (#8021) + * [Docs] Fix asset link ref in step-by-step tutorial (#8026) ### Development Fixes From 3d045d277e439d846f9c417ed00e34ba8abbea64 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 26 Feb 2020 22:06:19 +0530 Subject: [PATCH 3902/4996] Optimize markdown parsing with Kramdown by reusing the options and parser objects (#8013) Merge pull request 8013 --- .../converters/markdown/kramdown_parser.rb | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index 64bb1d1c8d2..aebd6ee7fef 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -1,5 +1,63 @@ # Frozen-string-literal: true +module Kramdown + # A Kramdown::Document subclass meant to optimize memory usage from initializing + # a kramdown document for parsing. + # + # The optimization is by using the same options Hash (and its derivatives) for + # converting all Markdown documents in a Jekyll site. + class JekyllDocument < Document + class << self + attr_reader :options, :parser + + # The implementation is basically the core logic in +Kramdown::Document#initialize+ + # + # rubocop:disable Naming/MemoizedInstanceVariableName + def setup(options) + @cache ||= {} + + # reset variables on a subsequent set up with a different options Hash + unless @cache[:id] == options.hash + @options = @parser = nil + @cache[:id] = options.hash + end + + @options ||= Options.merge(options).freeze + @parser ||= begin + parser_name = (@options[:input] || "kramdown").to_s + parser_name = parser_name[0..0].upcase + parser_name[1..-1] + try_require("parser", parser_name) + + if Parser.const_defined?(parser_name) + Parser.const_get(parser_name) + else + raise Kramdown::Error, "kramdown has no parser to handle the specified " \ + "input format: #{@options[:input]}" + end + end + end + # rubocop:enable Naming/MemoizedInstanceVariableName + + private + + def try_require(type, name) + require "kramdown/#{type}/#{Utils.snake_case(name)}" + rescue LoadError + false + end + end + + def initialize(source, options = {}) + JekyllDocument.setup(options) + + @options = JekyllDocument.options + @root, @warnings = JekyllDocument.parser.parse(source, @options) + end + end +end + +# + module Jekyll module Converters class Markdown @@ -37,7 +95,7 @@ def setup end def convert(content) - document = Kramdown::Document.new(content, @config) + document = Kramdown::JekyllDocument.new(content, @config) html_output = document.to_html if @config["show_warnings"] document.warnings.each do |warning| From aef8f11f6c5bc894f65a6b21aca495ff607b5e7c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 26 Feb 2020 11:36:22 -0500 Subject: [PATCH 3903/4996] Update history to reflect merge of #8013 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index bac495b8d9f..af2b690d154 100644 --- a/History.markdown +++ b/History.markdown @@ -16,6 +16,7 @@ * Update item_property to recognize integers (#7878) * Include _config.yml in a new theme's gemspec (#7865) * Add an option to easily disable disk-cache (#7928) + * Optimize markdown parsing with Kramdown by reusing the options and parser objects (#8013) ### Documentation From a9fb26fc33a9d1a92f56215645b9a9b8ba053ff0 Mon Sep 17 00:00:00 2001 From: Matt Penna Date: Wed, 26 Feb 2020 19:46:25 -0500 Subject: [PATCH 3904/4996] Corrected command to modify PATH (#8029) Merge pull request 8029 --- docs/_docs/installation/macos.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/installation/macos.md b/docs/_docs/installation/macos.md index 6bda62648dd..98c656ea389 100644 --- a/docs/_docs/installation/macos.md +++ b/docs/_docs/installation/macos.md @@ -29,7 +29,7 @@ brew install ruby Add the brew ruby path to your shell config: ```bash -export PATH=/usr/local/opt/ruby/bin:$PATH +echo 'export PATH="/usr/local/opt/ruby/bin:$PATH"' >> ~/.bash_profile ``` Then relaunch your terminal and check your updated Ruby setup: From 4a6f91810c2ee14ab13de9687275275f10f9a56a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 26 Feb 2020 19:46:28 -0500 Subject: [PATCH 3905/4996] Update history to reflect merge of #8029 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index af2b690d154..fcdf84d7050 100644 --- a/History.markdown +++ b/History.markdown @@ -58,6 +58,7 @@ * docs: improve highlighting of code blocks (#8017) * remove leading slash from Sass file location (#8021) * [Docs] Fix asset link ref in step-by-step tutorial (#8026) + * Corrected command to modify PATH (#8029) ### Development Fixes From 0378c3628c3e5b2684724c71157fee538dee504e Mon Sep 17 00:00:00 2001 From: Matt Penna Date: Thu, 27 Feb 2020 00:22:03 -0500 Subject: [PATCH 3906/4996] Corrected command to modify PATH (#8030) Merge pull request 8030 --- docs/_docs/installation/macos.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/installation/macos.md b/docs/_docs/installation/macos.md index 98c656ea389..04d3c77984c 100644 --- a/docs/_docs/installation/macos.md +++ b/docs/_docs/installation/macos.md @@ -95,7 +95,7 @@ ruby -v Then append your path file with the following, replacing the `X.X` with the first two digits of your Ruby version. ```bash -export PATH=$HOME/.gem/ruby/X.X.0/bin:$PATH +echo 'export PATH="$HOME/.gem/ruby/X.X.0/bin:$PATH"' >> ~/.bash_profile ``` To check that your gem paths point to your home directory run: From 70fc6b377d3f44197ae3f4b7c146e849f49f54b5 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 27 Feb 2020 00:22:06 -0500 Subject: [PATCH 3907/4996] Update history to reflect merge of #8030 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index fcdf84d7050..67ea362d279 100644 --- a/History.markdown +++ b/History.markdown @@ -59,6 +59,7 @@ * remove leading slash from Sass file location (#8021) * [Docs] Fix asset link ref in step-by-step tutorial (#8026) * Corrected command to modify PATH (#8029) + * Corrected command to modify PATH (#8030) ### Development Fixes From 7ba99f0010b207d540f1dc8944cfb4d23589dc22 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 27 Feb 2020 18:44:16 +0530 Subject: [PATCH 3908/4996] Docs: Render full contents of just the latest post (#8032) Merge pull request 8032 --- docs/_includes/news_item.html | 2 +- docs/_includes/news_item_archive.html | 26 ++++++++++++++++++++++ docs/_layouts/news_item.html | 2 +- docs/_sass/_style.scss | 31 ++++++++++++++++++++++++--- docs/pages/news.html | 6 +++++- docs/pages/releases.html | 6 +++++- 6 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 docs/_includes/news_item_archive.html diff --git a/docs/_includes/news_item.html b/docs/_includes/news_item.html index e7a7dbc2def..6070d051f83 100644 --- a/docs/_includes/news_item.html +++ b/docs/_includes/news_item.html @@ -16,7 +16,7 @@

    {% assign author = post.author -%}

    diff --git a/docs/_includes/news_item_archive.html b/docs/_includes/news_item_archive.html new file mode 100644 index 00000000000..553439f1ef3 --- /dev/null +++ b/docs/_includes/news_item_archive.html @@ -0,0 +1,26 @@ + diff --git a/docs/_layouts/news_item.html b/docs/_layouts/news_item.html index 74d5d91b010..494b86caf85 100644 --- a/docs/_layouts/news_item.html +++ b/docs/_layouts/news_item.html @@ -22,7 +22,7 @@

    {% assign author = page.author -%}

    diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index deafe505f50..4a17e410b82 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -664,13 +664,38 @@ article h2:first-child { margin-top: 0; } } .post-date, -.post-author { margin-left: 10px; } +.post-author { margin-left: 15px; } +.post-author .author-name { margin-left: 8px } .news article + article { - margin-top: -10px; - @include border-radius(0 0 10px 10px); + margin-top: -6px; + padding: 15px 40px; border-top: 1px solid #555; + border-radius: 0; @include box-shadow(0 -1px 0 #2f2f2f); + + h2.post-title { + margin-bottom: 0.45em; + } + .post-category { + margin-right: 20px; + padding-left: 0; + width: 150px; + box-sizing: border-box; + .label { + float: right; + } + } + .cell-left, .cell-right { + display: inline-block; + } + .cell-left { + max-width: 180px; + } + .cell-right { + width: calc(100% - 130px); + } + .post-date { margin-left: 0 } } /* Code Highlighting */ diff --git a/docs/pages/news.html b/docs/pages/news.html index b806b0e5f5c..c010d2d3a0e 100644 --- a/docs/pages/news.html +++ b/docs/pages/news.html @@ -6,5 +6,9 @@ --- {% for post in site.posts -%} - {% include news_item.html -%} + {% if forloop.index == 1 -%} + {% include news_item.html -%} + {% else -%} + {% include news_item_archive.html -%} + {% endif -%} {% endfor -%} diff --git a/docs/pages/releases.html b/docs/pages/releases.html index 9736fbd8afe..f8416c07e11 100644 --- a/docs/pages/releases.html +++ b/docs/pages/releases.html @@ -6,5 +6,9 @@ --- {% for post in site.categories.release -%} - {% include news_item.html -%} + {% if forloop.index == 1 -%} + {% include news_item.html -%} + {% else -%} + {% include news_item_archive.html -%} + {% endif -%} {% endfor -%} From 53bb8bd7d38b13b41b7db4340054d0d544aedebe Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 27 Feb 2020 08:14:17 -0500 Subject: [PATCH 3909/4996] Update history to reflect merge of #8032 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 67ea362d279..38814144263 100644 --- a/History.markdown +++ b/History.markdown @@ -60,6 +60,7 @@ * [Docs] Fix asset link ref in step-by-step tutorial (#8026) * Corrected command to modify PATH (#8029) * Corrected command to modify PATH (#8030) + * Docs: Render full contents of just the latest post (#8032) ### Development Fixes From b05e6ee8aef4b04a83bd4082b9d7a81d77cc4737 Mon Sep 17 00:00:00 2001 From: Eric Knibbe Date: Fri, 28 Feb 2020 14:29:47 -0500 Subject: [PATCH 3910/4996] docs: improvements for note boxes (#8037) Merge pull request 8037 --- docs/_docs/collections.md | 8 +++--- docs/_docs/configuration/environments.md | 10 +++---- docs/_docs/installation/macos.md | 4 +-- docs/_docs/installation/windows.md | 10 ++++--- docs/_docs/liquid/tags.md | 17 ++++++------ .../maintaining/affinity-team-captain.md | 2 +- docs/_docs/maintaining/avoiding-burnout.md | 2 +- .../maintaining/becoming-a-maintainer.md | 2 +- docs/_docs/maintaining/index.md | 2 +- .../maintaining/merging-a-pull-request.md | 2 +- .../maintaining/releasing-a-new-version.md | 2 +- .../maintaining/reviewing-a-pull-request.md | 2 +- docs/_docs/maintaining/special-labels.md | 2 +- docs/_docs/maintaining/triaging-an-issue.md | 2 +- docs/_docs/pages.md | 14 +++++----- docs/_docs/plugins/commands.md | 2 +- docs/_docs/plugins/installation.md | 13 ++++------ docs/_docs/plugins/tags.md | 11 ++++---- docs/_docs/posts.md | 2 +- docs/_docs/step-by-step/07-assets.md | 6 ++--- docs/_docs/structure.md | 26 +++++++++---------- docs/_docs/themes.md | 6 ++--- docs/_docs/upgrading/2-to-3.md | 4 +-- docs/_sass/_style.scss | 10 +++++++ .../convert-existing-site-to-jekyll.md | 2 +- docs/_tutorials/index.md | 4 +-- docs/_tutorials/navigation.md | 4 +-- 27 files changed, 90 insertions(+), 81 deletions(-) diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 00e41181b68..4e591d3b587 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -25,9 +25,11 @@ collections: people: true ``` -
    -

    When defining a collection as a sequence, its pages will not be rendered by default. To enable this, output: true must be specified on the collection, which requires defining the collection as a mapping. For more information, see the section Output

    -
    +{: .note .info} +When defining a collection as a sequence, its pages will not be rendered by +default. To enable this, output: true must be specified on the +collection, which requires defining the collection as a mapping. For more +information, see the section Output.
    Gather your collections {%- include docs_version_badge.html version="3.7.0" -%}
    diff --git a/docs/_docs/configuration/environments.md b/docs/_docs/configuration/environments.md index be8d376fc45..95250cc854a 100644 --- a/docs/_docs/configuration/environments.md +++ b/docs/_docs/configuration/environments.md @@ -42,8 +42,8 @@ environment but not include it in production environments. By specifying the option in the build command, you avoid having to change values in your configuration files when moving from one environment to another. -
    -

    - To switch part of your config settings depending on the environment, use the build command option, for example --config _config.yml,_config_development.yml. Settings in later files override settings in earlier files. -

    -
    +{: .note} +To switch part of your config settings depending on the environment, use the +build command option, +for example --config _config.yml,_config_development.yml. Settings +in later files override settings in earlier files. diff --git a/docs/_docs/installation/macos.md b/docs/_docs/installation/macos.md index 04d3c77984c..836c8e77772 100644 --- a/docs/_docs/installation/macos.md +++ b/docs/_docs/installation/macos.md @@ -104,9 +104,9 @@ To check that your gem paths point to your home directory run: gem env ``` -And check that `GEM PATHS:` points to a path in your home directory +And check that `GEM PATHS:` points to a path in your home directory. -{: .note } +{: .note .info} Every time you update Ruby to a version with a different first two digits, you will need to update your path to match. ### Global Install diff --git a/docs/_docs/installation/windows.md b/docs/_docs/installation/windows.md index 73020ba81c0..e564edde35f 100644 --- a/docs/_docs/installation/windows.md +++ b/docs/_docs/installation/windows.md @@ -35,7 +35,8 @@ That's it, you're ready to use Jekyll! If you are using Windows 10 version 1607 or later, another option to run Jekyll is by [installing](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide) the Windows Subsystem for Linux. -*Note:* You must have [Windows Subsystem for Linux](https://msdn.microsoft.com/en-us/commandline/wsl/about) enabled. +{: .note .info} +You must have [Windows Subsystem for Linux](https://msdn.microsoft.com/en-us/commandline/wsl/about) enabled. First let's make sure all our packages / repositories are up to date. Open a new Command Prompt instance, and type the following: @@ -89,7 +90,8 @@ with the current date in the filename. the "Running Jekyll as Non-Superuser" instructions in Troubleshooting.

    -**Note:** Bash on Ubuntu on Windows is still under development, so you may run into issues. +{: .note .info} +Bash on Ubuntu on Windows is still under development, so you may run into issues. ## Encoding @@ -125,11 +127,11 @@ gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
    TZInfo 2.0 incompatibility

    - v2.0 of the TZInfo library has introduced a change in how timezone offsets are calculated. + Version 2.0 of the TZInfo library has introduced a change in how timezone offsets are calculated. This will result in incorrect date and time for your posts when the site is built with Jekyll 3.x on Windows.

    - We therefore recommend that you lock the Timezone library to v1.2 and above by listing + We therefore recommend that you lock the Timezone library to version 1.2 and above by listing gem 'tzinfo', '~> 1.2' in your Gemfile.

    diff --git a/docs/_docs/liquid/tags.md b/docs/_docs/liquid/tags.md index 508684527ba..a813cd9c5d4 100644 --- a/docs/_docs/liquid/tags.md +++ b/docs/_docs/liquid/tags.md @@ -18,12 +18,11 @@ Jekyll has built in support for syntax highlighting of over 100 languages thanks to [Rouge](http://rouge.jneen.net). Rouge is the default highlighter in Jekyll 3 and above. -
    -

    Using Pygments has been deprecated and is not supported in - Jekyll 4, the configuration setting highlighter: pygments - now automatically falls back to using Rouge which is written in Ruby - and 100% compatible with stylesheets for Pygments.

    -
    +{: .note .warning} +Using Pygments has been deprecated and is not supported in +Jekyll 4; the configuration setting highlighter: pygments +now automatically falls back to using Rouge which is written in Ruby +and 100% compatible with stylesheets for Pygments. To render a code block with syntax highlighting, surround your code as follows: @@ -47,7 +46,7 @@ wiki](https://github.com/jayferd/rouge/wiki/List-of-supported-languages-and-lexe

    If you are using a language that contains curly braces, you will likely need to place {% raw %} and {% endraw %} tags around your code. - Since {% include docs_version_badge.html version="4.0" %} you can add render_with_liquid: false in your front matter to disable Liquid entirely for a particular document.

    + Since Jekyll {% include docs_version_badge.html version="4.0" %}, you can add render_with_liquid: false in your front matter to disable Liquid entirely for a particular document.

    ### Line numbers @@ -84,8 +83,8 @@ the syntax highlighter styles into your `main.css`: ## Links -{: .note } -Since Jekyll {% include docs_version_badge.html version="v4.0"%} you don't need to prepend `link` and `post_url` tags with `site.baseurl` +{: .note} +Since Jekyll {% include docs_version_badge.html version="4.0"%}, you don't need to prepend `link` and `post_url` tags with `site.baseurl`. ### Linking to pages {#link} diff --git a/docs/_docs/maintaining/affinity-team-captain.md b/docs/_docs/maintaining/affinity-team-captain.md index 70d0e10da16..a1d982f9e85 100644 --- a/docs/_docs/maintaining/affinity-team-captain.md +++ b/docs/_docs/maintaining/affinity-team-captain.md @@ -3,7 +3,7 @@ title: Affinity Team Captains --- **This guide is for affinity team captains.** These special people are **team maintainers** of one of our [affinity teams][] and help triage and evaluate the issues and contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -{: .note .info } +{: .note .info} ## Affinity teams & their captains diff --git a/docs/_docs/maintaining/avoiding-burnout.md b/docs/_docs/maintaining/avoiding-burnout.md index ea9f88a2c84..42f4b7d3207 100644 --- a/docs/_docs/maintaining/avoiding-burnout.md +++ b/docs/_docs/maintaining/avoiding-burnout.md @@ -3,7 +3,7 @@ title: "Avoiding Burnout" --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -{: .note .info } +{: .note .info} # 1. Use Jekyll diff --git a/docs/_docs/maintaining/becoming-a-maintainer.md b/docs/_docs/maintaining/becoming-a-maintainer.md index 00abef54bd8..21474b0e1e5 100644 --- a/docs/_docs/maintaining/becoming-a-maintainer.md +++ b/docs/_docs/maintaining/becoming-a-maintainer.md @@ -3,7 +3,7 @@ title: "Becoming a Maintainer" --- **This guide is for contributors.** These special people have contributed to one or more of Jekyll's repositories, but do not yet have write access to any. You may find what is written here interesting, but it’s definitely not for everyone. -{: .note .info } +{: .note .info} So you want to become a maintainer of a Jekyll project? We'd love to have you! Here are some things we like to see from community members before we promote them to maintainers. diff --git a/docs/_docs/maintaining/index.md b/docs/_docs/maintaining/index.md index 645030e28c9..1d517ce47cd 100644 --- a/docs/_docs/maintaining/index.md +++ b/docs/_docs/maintaining/index.md @@ -4,7 +4,7 @@ permalink: /docs/maintaining/ --- **This guide is for Jekyll contributors and maintainers.** These special people contribute to one or more of Jekyll's repositories or help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -{: .note .info } +{: .note .info} Hello! This is where we document various processes for maintaining Jekyll. Being a maintainer for any Jekyll project is a big responsibility, so we put together some helpful documentation for various tasks you might do as a maintainer. diff --git a/docs/_docs/maintaining/merging-a-pull-request.md b/docs/_docs/maintaining/merging-a-pull-request.md index 34fa1fec3c6..d24a298c895 100644 --- a/docs/_docs/maintaining/merging-a-pull-request.md +++ b/docs/_docs/maintaining/merging-a-pull-request.md @@ -3,7 +3,7 @@ title: "Merging a Pull Request" --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -{: .note .info } +{: .note .info} ## Code Review diff --git a/docs/_docs/maintaining/releasing-a-new-version.md b/docs/_docs/maintaining/releasing-a-new-version.md index f85f499e408..5e1cbc3f0db 100644 --- a/docs/_docs/maintaining/releasing-a-new-version.md +++ b/docs/_docs/maintaining/releasing-a-new-version.md @@ -3,7 +3,7 @@ title: "Releasing a new version" --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -{: .note .info } +{: .note .info} The most important thing to understand before making a release is that there's no need to feel nervous. Most things are revertable, and even if you do publish an incomplete gem version, we can always skip that one. Don't hestitate to contact the other maintainers if you feel unsure or don't know what to do next. diff --git a/docs/_docs/maintaining/reviewing-a-pull-request.md b/docs/_docs/maintaining/reviewing-a-pull-request.md index a0a6e353de5..cff0efd3874 100644 --- a/docs/_docs/maintaining/reviewing-a-pull-request.md +++ b/docs/_docs/maintaining/reviewing-a-pull-request.md @@ -3,7 +3,7 @@ title: "Reviewing a Pull Request" --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -{: .note .info } +{: .note .info} ## Respond Kindly diff --git a/docs/_docs/maintaining/special-labels.md b/docs/_docs/maintaining/special-labels.md index 964ff0e2e07..4d89841f6cf 100644 --- a/docs/_docs/maintaining/special-labels.md +++ b/docs/_docs/maintaining/special-labels.md @@ -3,7 +3,7 @@ title: "Special Labels" --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -{: .note .info } +{: .note .info} We use a series of "special labels" on GitHub.com to automate handling of some parts of the pull request and issue process. @jekyllbot may automatically apply or remove certain labels based on actions taken by users or maintainers. Below are the labels and how they work: diff --git a/docs/_docs/maintaining/triaging-an-issue.md b/docs/_docs/maintaining/triaging-an-issue.md index 36bfdcc95a9..ac0833b1f08 100644 --- a/docs/_docs/maintaining/triaging-an-issue.md +++ b/docs/_docs/maintaining/triaging-an-issue.md @@ -3,7 +3,7 @@ title: "Triaging an Issue" --- **This guide is for maintainers.** These special people have **write access** to one or more of Jekyll's repositories and help merge the contributions of others. You may find what is written here interesting, but it’s definitely not for everyone. -{: .note .info } +{: .note .info} Before evaluating an issue, it is important to identify if it is a feature request or a bug. For the Jekyll project the following definitions are used diff --git a/docs/_docs/pages.md b/docs/_docs/pages.md index 98b21b7d098..d707d0f44da 100644 --- a/docs/_docs/pages.md +++ b/docs/_docs/pages.md @@ -15,8 +15,8 @@ and associated URLs might look like: ``` . -|-- about.md # => http://example.com/about.html -|-- index.html # => http://example.com/ +├── about.md # => http://example.com/about.html +├── index.html # => http://example.com/ └── contact.html # => http://example.com/contact.html ``` @@ -24,11 +24,11 @@ If you have a lot of pages, you can organize them into subfolders. The same subf ``` . -|-- about.md # => http://example.com/about.html -|-- documentation # folder containing pages - └── doc1.md # => http://example.com/documentation/doc1.html -|-- design # folder containing pages - └── draft.md # => http://example.com/design/draft.html +├── about.md # => http://example.com/about.html +├── documentation # folder containing pages +│ └── doc1.md # => http://example.com/documentation/doc1.html +├── design # folder containing pages +│ └── draft.md # => http://example.com/design/draft.html ``` ## Changing the output URL diff --git a/docs/_docs/plugins/commands.md b/docs/_docs/plugins/commands.md index cd704346ea8..0666c779a5f 100644 --- a/docs/_docs/plugins/commands.md +++ b/docs/_docs/plugins/commands.md @@ -2,7 +2,7 @@ title: Commands permalink: /docs/plugins/commands/ --- -As of version 2.5.0, Jekyll can be extended with plugins which provide +As of version {% include docs_version_badge.html version="2.5.0"%}, Jekyll can be extended with plugins which provide subcommands for the `jekyll` executable. This is possible by including the relevant plugins in a `Gemfile` group called `:jekyll_plugins`: diff --git a/docs/_docs/plugins/installation.md b/docs/_docs/plugins/installation.md index 02e7b628b53..2e4fad122d2 100644 --- a/docs/_docs/plugins/installation.md +++ b/docs/_docs/plugins/installation.md @@ -52,7 +52,7 @@ You have 3 options for installing plugins:

    -
    +
    _plugins, _config.yml and Gemfile can be used simultaneously @@ -73,10 +73,7 @@ processing the rest of your source directory. A gem included here will be activated even if its not explicitly listed under the `plugins:` key in your site's config file. -
    -

    - Gems included in the :jekyll-plugins group are activated - regardless of the --safe mode setting. Be aware of what - gems are included under this group! -

    -
    +{: .note .warning} +Gems included in the :jekyll-plugins group are activated +regardless of the --safe mode setting. Be aware of which +gems are included under this group! diff --git a/docs/_docs/plugins/tags.md b/docs/_docs/plugins/tags.md index fff0a45fd3a..3695a94c712 100644 --- a/docs/_docs/plugins/tags.md +++ b/docs/_docs/plugins/tags.md @@ -107,9 +107,8 @@ And we would still get the same output as above on the page:

    page rendered at: Tue June 22 23:38:47 –0500 2010

    ``` -
    -

    In the above example, the tag block and the tag are both registered with - the name render_time but to register a tag and a tag block using - the same name in the same project is not recommended as this may lead to - conflicts.

    -
    +{: .note .info} +In the above example, the tag block and the tag are both registered with +the name render_time, but to register a tag and a tag block using +the same name in the same project is not recommended as this may lead to +conflicts. diff --git a/docs/_docs/posts.md b/docs/_docs/posts.md index 6fff5a08f56..34e21f5c717 100644 --- a/docs/_docs/posts.md +++ b/docs/_docs/posts.md @@ -200,7 +200,7 @@ create a `_drafts` folder in your site's root and create your first draft: ``` . ├── _drafts -| └── a-draft-post.md +│ └── a-draft-post.md ... ``` diff --git a/docs/_docs/step-by-step/07-assets.md b/docs/_docs/step-by-step/07-assets.md index 5d8b1b8a92d..8399f15bfb4 100644 --- a/docs/_docs/step-by-step/07-assets.md +++ b/docs/_docs/step-by-step/07-assets.md @@ -11,9 +11,9 @@ Jekyll sites often use this structure to keep assets organized: ``` . ├── assets -| ├── css -| ├── images -| └── js +│ ├── css +│ ├── images +│ └── js ... ``` diff --git a/docs/_docs/structure.md b/docs/_docs/structure.md index 33a74aa710d..1843bc0e4d6 100644 --- a/docs/_docs/structure.md +++ b/docs/_docs/structure.md @@ -8,31 +8,31 @@ A basic Jekyll site usually looks something like this: . ├── _config.yml ├── _data -| └── members.yml +│ └── members.yml ├── _drafts -| ├── begin-with-the-crazy-ideas.md -| └── on-simplicity-in-technology.md +│ ├── begin-with-the-crazy-ideas.md +│ └── on-simplicity-in-technology.md ├── _includes -| ├── footer.html -| └── header.html +│ ├── footer.html +│ └── header.html ├── _layouts -| ├── default.html -| └── post.html +│ ├── default.html +│ └── post.html ├── _posts -| ├── 2007-10-29-why-every-programmer-should-play-nethack.md -| └── 2009-04-26-barcamp-boston-4-roundup.md +│ ├── 2007-10-29-why-every-programmer-should-play-nethack.md +│ └── 2009-04-26-barcamp-boston-4-roundup.md ├── _sass -| ├── _base.scss -| └── _layout.scss +│ ├── _base.scss +│ └── _layout.scss ├── _site ├── .jekyll-metadata └── index.html # can also be an 'index.md' with valid front matter ``` -
    +
    Directory structure of Jekyll sites using gem-based themes

    - Starting Jekyll 3.2, a new Jekyll project bootstrapped with jekyll new uses gem-based themes to define the look of the site. This results in a lighter default directory structure : _layouts, _includes and _sass are stored in the theme-gem, by default. + Since version {% include docs_version_badge.html version="3.2"%}, a new Jekyll project bootstrapped with jekyll new uses gem-based themes to define the look of the site. This results in a lighter default directory structure: _layouts, _includes and _sass are stored in the theme-gem, by default.


    diff --git a/docs/_docs/themes.md b/docs/_docs/themes.md index a518ee2b0b8..99ab3cbf2db 100644 --- a/docs/_docs/themes.md +++ b/docs/_docs/themes.md @@ -120,8 +120,8 @@ Jekyll will look first to your site's content before looking to the theme's defa Note that making copies of theme files will prevent you from receiving any theme updates on those files. An alternative, to continue getting theme updates on all stylesheets, is to use higher specificity CSS selectors in your own additional, originally named CSS files. -Refer to your selected theme's documentation and source repository for more information on what files you can override. {: .note .info} +Refer to your selected theme's documentation and source repository for more information on which files you can override. ## Converting gem-based themes to regular themes @@ -221,8 +221,8 @@ To install a gem-based theme: bundle exec jekyll serve ``` +{: .note .info} You can have multiple themes listed in your site's `Gemfile`, but only one theme can be selected in your site's `_config.yml`. -{: .note .info } If you're publishing your Jekyll site on [GitHub Pages](https://pages.github.com/), note that GitHub Pages supports only [some gem-based themes](https://pages.github.com/themes/). GitHub Pages also supports [using any theme hosted on GitHub](https://help.github.com/articles/adding-a-jekyll-theme-to-your-github-pages-site/#adding-a-jekyll-theme-in-your-sites-_configyml-file) using the `remote_theme` configuration as if it were a gem-based theme. @@ -320,8 +320,8 @@ Themes are visual. Show users what your theme looks like by including a screensh To preview your theme as you're authoring it, it may be helpful to add dummy content in, for example, `/index.html` and `/page.html` files. This will allow you to use the `jekyll build` and `jekyll serve` commands to preview your theme, just as you'd preview a Jekyll site. +{: .note .info} If you do preview your theme locally, be sure to add `/_site` to your theme's `.gitignore` file to prevent the compiled site from also being included when you distribute your theme. -{: .info .note} ### Publishing your theme diff --git a/docs/_docs/upgrading/2-to-3.md b/docs/_docs/upgrading/2-to-3.md index 0c45fe0224e..f034d492c39 100644 --- a/docs/_docs/upgrading/2-to-3.md +++ b/docs/_docs/upgrading/2-to-3.md @@ -12,8 +12,8 @@ Before we dive in, go ahead and fetch the latest version of Jekyll: gem update jekyll ``` -Since v3.2 Jekyll requires Ruby version >= 2.1 -{: .note .warning } +{: .note .warning} +Since version {% include docs_version_badge.html version="3.2"%}, Jekyll requires Ruby version >= 2.1.

    Diving in
    diff --git a/docs/_sass/_style.scss b/docs/_sass/_style.scss index 4a17e410b82..324609fe3c5 100644 --- a/docs/_sass/_style.scss +++ b/docs/_sass/_style.scss @@ -991,6 +991,16 @@ code.output { } } +p.note { + color: #fff; + font-weight: 400; + font-size: .75em; + + &:after { + line-height: 1.21; + } +} + .info { background-color: #0389aa; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAzODlhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDYxN2YiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); diff --git a/docs/_tutorials/convert-existing-site-to-jekyll.md b/docs/_tutorials/convert-existing-site-to-jekyll.md index cbfd859373c..bdac10306b5 100644 --- a/docs/_tutorials/convert-existing-site-to-jekyll.md +++ b/docs/_tutorials/convert-existing-site-to-jekyll.md @@ -83,8 +83,8 @@ cd my_jekyll_site jekyll serve ``` -If you have a Gemfile, [use Bundler](/docs/ruby-101/#bundler) by typing `bundle exec jekyll serve` instead. {: .note .info} +If you have a Gemfile, [use Bundler](/docs/ruby-101/#bundler) by typing `bundle exec jekyll serve` instead. When you serve the site, you get a preview URL such as `http://127.0.0.1:4000/` (which is the same as `http://localhost:4000/`). The site's files are built into the `_site` folder by default. diff --git a/docs/_tutorials/index.md b/docs/_tutorials/index.md index ec537203ba9..4deb89bcf98 100644 --- a/docs/_tutorials/index.md +++ b/docs/_tutorials/index.md @@ -15,8 +15,8 @@ In contrast to [Docs](/docs/home/), Tutorials provide more detailed, narrative i In short, tutorials aren't the core reference information in docs. They walk users through processes from beginning to end. -{: .info .note} -**Note:** The Tutorials section is new, so there aren't many tutorials yet. You can add a tutorial here to help populate this section. +{: .note .info} +The Tutorials section is new, so there aren't many tutorials yet. You can add a tutorial here to help populate this section. Some of these techniques might even guide you through a supporting tool, script, service, or other hack used with your Jekyll site. Feel free to include tutorials involving external services with Jekyll as well. However, note that Jekyll in no way endorses any third-party tools mentioned in tutorials. diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index 7ba036ef8b8..c1c86a259b8 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -69,8 +69,8 @@ docs:
    -{: .note .info } -For the results in these fictitious samples, `#` is manually substituted for the actual link value to avoid 404 errors.) +{: .note .info} +For the results in these fictitious samples, `#` is manually substituted for the actual link value (to avoid 404 errors.) When you use a `for` loop, you choose how you want to refer to the items you're looping through. The variable you choose (in this case, `item`) becomes how you access the properties of each item in the list. Dot notation is used to get a property of the item (for example, `item.url`). From e6d082488cf4805096b4dd5399a40b761771bfdf Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 28 Feb 2020 14:29:49 -0500 Subject: [PATCH 3911/4996] Update history to reflect merge of #8037 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 38814144263..c402d3b83af 100644 --- a/History.markdown +++ b/History.markdown @@ -61,6 +61,7 @@ * Corrected command to modify PATH (#8029) * Corrected command to modify PATH (#8030) * Docs: Render full contents of just the latest post (#8032) + * docs: improvements for note boxes (#8037) ### Development Fixes From 028c306c11fa86eaa7e540617af36b47a7fffaa8 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 2 Mar 2020 16:21:28 +0100 Subject: [PATCH 3912/4996] chore: redirect questions to the forum --- .github/ISSUE_TEMPLATE/config.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000000..ef9a6e1abae --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Jekyll Community Forum + url: https://talk.jekyllrb.com/ + about: Please ask and answer questions here. From 6ae640755fc1608358c45afd9b06e2aa1ec6e56e Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 2 Mar 2020 16:22:42 +0100 Subject: [PATCH 3913/4996] chore: remove question template --- .github/ISSUE_TEMPLATE/question.md | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/question.md diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md deleted file mode 100644 index abde4c60018..00000000000 --- a/.github/ISSUE_TEMPLATE/question.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: Question -about: Have any questions about how Jekyll works? -title: '' -labels: '' -assignees: '' - ---- - - From ea57ef78da1c358f578ddb2ae7b222476fa0b118 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 4 Mar 2020 20:44:53 +0530 Subject: [PATCH 3914/4996] Simplify Jekyll::Hooks.trigger logic (#8044) Merge pull request 8044 --- lib/jekyll/hooks.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb index a6fbc74370f..47cdae4c613 100644 --- a/lib/jekyll/hooks.rb +++ b/lib/jekyll/hooks.rb @@ -91,11 +91,8 @@ def self.insert_hook(owner, event, priority, &block) # interface for Jekyll core components to trigger hooks def self.trigger(owner, event, *args) # proceed only if there are hooks to call - return unless @registry[owner] - return unless @registry[owner][event] - - # hooks to call for this owner and event - hooks = @registry[owner][event] + hooks = @registry.dig(owner, event) + return if hooks.nil? || hooks.empty? # sort and call hooks according to priority and load order hooks.sort_by { |h| @hook_priority[h] }.each do |hook| From ab6ef0b257e4c7aafec0518d93bea3e9c4b75b75 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Wed, 4 Mar 2020 10:14:55 -0500 Subject: [PATCH 3915/4996] Update history to reflect merge of #8044 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index c402d3b83af..9e3d417f677 100644 --- a/History.markdown +++ b/History.markdown @@ -81,6 +81,7 @@ * Update unit tests for Kramdown-based converter (#8014) * Add Visual Studio Code Development Container (#8016) * Configure kramdown toc_levels as array by default (#8015) + * Simplify Jekyll::Hooks.trigger logic (#8044) ### Site Enhancements From 0f4c8d22482fdc65c4d91ce657d9fceb07e16319 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 6 Mar 2020 21:38:56 +0530 Subject: [PATCH 3916/4996] Allow multiple binary operator in where_exp filter (#8047) Merge pull request 8047 --- lib/jekyll/filters.rb | 10 +++++++--- test/test_filters.rb | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 31b24d7a9b3..fcfe6477903 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -432,10 +432,14 @@ def parse_condition(exp) # # Returns an instance of Liquid::Condition def parse_binary_comparison(parser) - parse_comparison(parser).tap do |condition| - binary_operator = parser.id?("and") || parser.id?("or") - condition.send(binary_operator, parse_comparison(parser)) if binary_operator + condition = parse_comparison(parser) + first_condition = condition + while (binary_operator = parser.id?("and") || parser.id?("or")) + child_condition = parse_comparison(parser) + condition.send(binary_operator, child_condition) + condition = child_condition end + first_condition end # Generates a Liquid::Condition object from a Liquid::Parser object based on whether the parsed diff --git a/test/test_filters.rb b/test/test_filters.rb index c9358a610a1..89a586cca4e 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -997,6 +997,23 @@ def to_liquid ) end + should "filter objects across multiple conditions" do + sample = [ + { "color" => "teal", "size" => "large", "type" => "variable" }, + { "color" => "red", "size" => "large", "type" => "fixed" }, + { "color" => "red", "size" => "medium", "type" => "variable" }, + { "color" => "blue", "size" => "medium", "type" => "fixed" }, + ] + assert_equal( + [ + { "color" => "red", "size" => "large", "type" => "fixed" }, + ], + @filter.where_exp( + sample, "item", "item.type == 'fixed' and item.color == 'red' or item.color == 'teal'" + ) + ) + end + should "stringify during comparison for compatibility with liquid parsing" do hash = { "The Words" => { "rating" => 1.2, "featured" => false }, From 27ca06326a00a6c783270027a35b4b59844cb45c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 6 Mar 2020 11:08:59 -0500 Subject: [PATCH 3917/4996] Update history to reflect merge of #8047 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9e3d417f677..0bdab578b54 100644 --- a/History.markdown +++ b/History.markdown @@ -9,6 +9,7 @@ * Memoize absolute_url and relative_url filters (#7793) * Fix documentation comment for Jekyll::Converters::Identity (#7883) * Optimize Jekyll::Filters#item_property (#7696) + * Allow multiple binary operators in where_exp filter (#8047) ### Minor Enhancements From c8d673c98415cd91e0b35e13b6341310969de006 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 7 Mar 2020 09:57:14 +0100 Subject: [PATCH 3918/4996] docs: external links Third-party services, deployment services --- docs/_tutorials/convert-existing-site-to-jekyll.md | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/docs/_tutorials/convert-existing-site-to-jekyll.md b/docs/_tutorials/convert-existing-site-to-jekyll.md index bdac10306b5..650006744ce 100644 --- a/docs/_tutorials/convert-existing-site-to-jekyll.md +++ b/docs/_tutorials/convert-existing-site-to-jekyll.md @@ -515,14 +515,7 @@ You can also auto-generate your sitemap by adding a gem called [`jekyll-sitemap` ## 12. Add external services -For other services you might need (such as contact forms, search, comments, and more), look for third-party services. For example, you might use the following: - - * For comments: [Disqus](https://disqus.com/) - * For a newsletter: [Tinyletter](https://tinyletter.com/) - * For contact forms: [Wufoo](https://www.wufoo.com/) - * For search: [Algolia Docsearch](https://community.algolia.com/docsearch/) - -For more details on services for static sites, see the [Third Parties](https://learn.cloudcannon.com/jekyll-third-parties/) list and tutorials from CloudCannon. +For other services you might need (such as contact forms, search, comments, and more), [look for third-party services](https://serverless.css-tricks.com/services/). We listed some [integrations on our resources page](/resources/#integrations) but in todays's world of SaaS and APis the list is endless. Your Jekyll pages consist of HTML, CSS, and JavaScript, so pretty much any code you need to embed will work without a problem. @@ -540,7 +533,7 @@ layout: null Although websites can implement more sophisticated features and functionality, we've covered the basics in this tutorial. You now have a fully functional Jekyll site. -To deploy your site, consider using [GitHub Pages](https://pages.github.com/), [Netlify](https://www.netlify.com/), [Amazon AWS S3](https://aws.amazon.com/s3/) using the [s3_website plugin](https://github.com/laurilehmijoki/s3_website), or just FTP your files to your web server. +To deploy your site, consider using [GitHub Pages](https://pages.github.com/), [Netlify](https://www.netlify.com/), [ZEIT](https://zeit.co), [Render](https://render.com), [Amazon AWS S3](https://aws.amazon.com/s3/) using the [s3_website plugin](https://github.com/laurilehmijoki/s3_website), or just FTP your files to your web server. You can also package your layouts, includes and assets into a Ruby `gem` and [make it a Jekyll theme](/docs/themes/). From 422470dc6ee53c1b6af3052bc288678d4cfa4b29 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sat, 7 Mar 2020 10:36:49 +0100 Subject: [PATCH 3919/4996] docs: ZEIT and Render --- docs/_docs/deployment/third-party.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/_docs/deployment/third-party.md b/docs/_docs/deployment/third-party.md index 7c25c5746dc..7882e48368a 100644 --- a/docs/_docs/deployment/third-party.md +++ b/docs/_docs/deployment/third-party.md @@ -35,10 +35,18 @@ Install the Kickster gem and you are good to go. More documentation can here fou ## Netlify -Netlify provides Global CDN, Continuous Deployment, one click HTTPS and [much more](https://www.netlify.com/features/), providing developers the most robust toolset available for modern web projects, without added complexity. Netlify supports custom plugins for Jekyll and has a free plan for open source projects. +Netlify provides Global CDN, Continuous Deployment, one click HTTPS and [much more](https://www.netlify.com/features/), providing developers a robust toolset for modern web projects, without added complexity. Netlify supports custom plugins for Jekyll and has a free plan for open source projects. Read this [Jekyll step-by-step guide](https://www.netlify.com/blog/2015/10/28/a-step-by-step-guide-jekyll-3.0-on-netlify/) to setup your Jekyll site on Netlify. +## Render + +[Render](https://render.com) provides zero config continuous deployment for static sites. The service is free under 100GB monthly bandwith. + ## 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). + +## ZEIT + +[ZEIT](https://zeit.co/) provides zero config continuous deployment, HTTPS Custom domains, high performance smart CDN, you get instant static deploy for free. From 3e182ef25e707748528d25a7f8a385b96524e4e5 Mon Sep 17 00:00:00 2001 From: Riccardo Porreca Date: Sat, 7 Mar 2020 17:40:24 +0100 Subject: [PATCH 3920/4996] Non-deprecated `vendor/bundle` path configuration (#8048) Merge pull request 8048 --- docs/_tutorials/using-jekyll-with-bundler.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_tutorials/using-jekyll-with-bundler.md b/docs/_tutorials/using-jekyll-with-bundler.md index 069602e2061..73e77679469 100644 --- a/docs/_tutorials/using-jekyll-with-bundler.md +++ b/docs/_tutorials/using-jekyll-with-bundler.md @@ -41,7 +41,7 @@ other gems on your system. If you skip this step, Bundler will install your dependencies globally on your system. ```sh -bundle install --path vendor/bundle +bundle config set path 'vendor/bundle' ```
    From a1c18b6e8712dfce12cece11d4f68245e8f18c62 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sat, 7 Mar 2020 11:40:26 -0500 Subject: [PATCH 3921/4996] Update history to reflect merge of #8048 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0bdab578b54..89468543248 100644 --- a/History.markdown +++ b/History.markdown @@ -63,6 +63,7 @@ * Corrected command to modify PATH (#8030) * Docs: Render full contents of just the latest post (#8032) * docs: improvements for note boxes (#8037) + * Non-deprecated `vendor/bundle` path configuration (#8048) ### Development Fixes From 256b0875cb944512da5daa4e5cecf3b3c9aaee9f Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 10 Mar 2020 01:20:31 +0100 Subject: [PATCH 3922/4996] site: make resources editable --- docs/_layouts/page.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/_layouts/page.html b/docs/_layouts/page.html index 28364e7dbde..caa618649fd 100644 --- a/docs/_layouts/page.html +++ b/docs/_layouts/page.html @@ -6,6 +6,11 @@
    + {%- if page.permalink contains "resources" %} + + {% endif -%}

    {{ page.title }}

    {{ content }}
    From 325e6bb3f8b5026618df7d8940a251229b1d1476 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 10 Mar 2020 01:21:06 +0100 Subject: [PATCH 3923/4996] docs: add page layout to philosophy --- docs/pages/philosophy.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/philosophy.md b/docs/pages/philosophy.md index e6c08397934..93021fbe163 100644 --- a/docs/pages/philosophy.md +++ b/docs/pages/philosophy.md @@ -1,4 +1,5 @@ --- +layout: page title: Philosophy permalink: /philosophy/ --- From 1115eebe15316b992870f6ba4d41971b11af97b2 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 10 Mar 2020 01:24:32 +0100 Subject: [PATCH 3924/4996] docs: add typeform --- docs/pages/resources.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/resources.md b/docs/pages/resources.md index f15684e608d..dd57de83acf 100644 --- a/docs/pages/resources.md +++ b/docs/pages/resources.md @@ -69,6 +69,7 @@ Use a SaaS service as a backend for functionality on your Jekyll site - [formX](https://formx.stream) - [Simple Form](https://getsimpleform.com/) - [SmartForms](https://smartforms.dev/) + - [Typeform](https://www.typeform.com/templates/c/forms/) ### Search - [Algolia](https://blog.algolia.com/instant-search-blog-documentation-jekyll-plugin/): Add a powerful instant search to your Jekyll site From f826b8b5eab9bdce08868c5e09de87a02dd536a4 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 12 Mar 2020 20:28:17 +0530 Subject: [PATCH 3925/4996] Fix documents custom-ordering logic (#8028) Merge pull request 8028 --- lib/jekyll/collection.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 874d26f2215..318642151a1 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -239,7 +239,7 @@ def sort_docs_by_key! # Fall back to `Document#<=>` if the properties were equal or were non-sortable # Otherwise continue with current sort-order - if order.zero? || order.nil? + if order.nil? || order.zero? apples[-1] <=> olives[-1] else order From 88360bd17d5824a5cff01321722a3f0e7418a620 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 12 Mar 2020 10:58:20 -0400 Subject: [PATCH 3926/4996] Update history to reflect merge of #8028 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 89468543248..259f50d56cc 100644 --- a/History.markdown +++ b/History.markdown @@ -10,6 +10,7 @@ * Fix documentation comment for Jekyll::Converters::Identity (#7883) * Optimize Jekyll::Filters#item_property (#7696) * Allow multiple binary operators in where_exp filter (#8047) + * Fix documents custom-ordering logic (#8028) ### Minor Enhancements From a4b1ca2c757fcbd96e14f8701702dbba41070977 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 15 Mar 2020 23:49:54 +0100 Subject: [PATCH 3927/4996] chore: simplify require for Jekyll::VERSION (#8057) Merge pull request 8057 --- jekyll.gemspec | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 370084ab4d6..6ebe33dbe85 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -1,8 +1,6 @@ # frozen_string_literal: true -lib = File.expand_path("lib", __dir__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require "jekyll/version" +require_relative "lib/jekyll/version" Gem::Specification.new do |s| s.name = "jekyll" From 190a35dc9a5d3ff5f2cea1837f55c2f38f272ee6 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 15 Mar 2020 18:49:57 -0400 Subject: [PATCH 3928/4996] Update history to reflect merge of #8057 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 259f50d56cc..da80fcffc37 100644 --- a/History.markdown +++ b/History.markdown @@ -85,6 +85,7 @@ * Add Visual Studio Code Development Container (#8016) * Configure kramdown toc_levels as array by default (#8015) * Simplify Jekyll::Hooks.trigger logic (#8044) + * chore: simplify require for Jekyll::VERSION (#8057) ### Site Enhancements From ee5d0cffd6dc2934d665259a4799bc4e74fcc3d7 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 16 Mar 2020 12:36:30 +0530 Subject: [PATCH 3929/4996] Remove version-constraint relaxation for i18n gem (#8055) Merge pull request 8055 --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 6ebe33dbe85..1c7682adf4f 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -34,7 +34,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("addressable", "~> 2.4") s.add_runtime_dependency("colorator", "~> 1.0") s.add_runtime_dependency("em-websocket", "~> 0.5") - s.add_runtime_dependency("i18n", ">= 0.9.5", "< 2") + s.add_runtime_dependency("i18n", "~> 1.0") s.add_runtime_dependency("jekyll-sass-converter", "~> 2.0") s.add_runtime_dependency("jekyll-watch", "~> 2.0") s.add_runtime_dependency("kramdown", "~> 2.1") From e9174dfd3bd3c8470606bd5e17702e926c8c3625 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 16 Mar 2020 03:06:32 -0400 Subject: [PATCH 3930/4996] Update history to reflect merge of #8055 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index da80fcffc37..73da178e041 100644 --- a/History.markdown +++ b/History.markdown @@ -86,6 +86,7 @@ * Configure kramdown toc_levels as array by default (#8015) * Simplify Jekyll::Hooks.trigger logic (#8044) * chore: simplify require for Jekyll::VERSION (#8057) + * Remove version-constraint relaxation for i18n gem (#8055) ### Site Enhancements From 7948578cd3eecae4ffc78522b17160da2f99ca48 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 16 Mar 2020 13:54:45 +0530 Subject: [PATCH 3931/4996] Mirror `spec.homepage` as `metadata["homepage_uri"]` (#8056) Merge pull request 8056 --- jekyll.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 1c7682adf4f..e02bb29a184 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -19,10 +19,10 @@ Gem::Specification.new do |s| s.require_paths = ["lib"] s.metadata = { + "source_code_uri" => "https://github.com/jekyll/jekyll", "bug_tracker_uri" => "https://github.com/jekyll/jekyll/issues", "changelog_uri" => "https://github.com/jekyll/jekyll/releases", - "homepage_uri" => "https://jekyllrb.com", - "source_code_uri" => "https://github.com/jekyll/jekyll", + "homepage_uri" => s.homepage, } s.rdoc_options = ["--charset=UTF-8"] From c193677dc52166f551a72ab4c1ec05890c46577f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 16 Mar 2020 04:24:46 -0400 Subject: [PATCH 3932/4996] Update history to reflect merge of #8056 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 73da178e041..228663c976a 100644 --- a/History.markdown +++ b/History.markdown @@ -87,6 +87,7 @@ * Simplify Jekyll::Hooks.trigger logic (#8044) * chore: simplify require for Jekyll::VERSION (#8057) * Remove version-constraint relaxation for i18n gem (#8055) + * Mirror `spec.homepage` as `metadata["homepage_uri"]` (#8056) ### Site Enhancements From dc5e1d7056949415358993749a69d96ad25dd06f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Kl=C3=BCpfel?= Date: Thu, 19 Mar 2020 11:10:25 +0100 Subject: [PATCH 3933/4996] Update 09-collections.md (#8060) Merge pull request 8060 --- docs/_docs/step-by-step/09-collections.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_docs/step-by-step/09-collections.md b/docs/_docs/step-by-step/09-collections.md index b41003292cf..d7a33b15910 100644 --- a/docs/_docs/step-by-step/09-collections.md +++ b/docs/_docs/step-by-step/09-collections.md @@ -112,6 +112,8 @@ collections: output: true ``` +Restart the jekyll server once more for the configuration changes to take effect. + You can link to the output page using `author.url`. Add the link to the `staff.html` page: From 0683ab143ea5e6a0ee8bc9fc1d8694666da43d6b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 19 Mar 2020 06:10:27 -0400 Subject: [PATCH 3934/4996] Update history to reflect merge of #8060 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 228663c976a..3a59d1fa48b 100644 --- a/History.markdown +++ b/History.markdown @@ -65,6 +65,7 @@ * Docs: Render full contents of just the latest post (#8032) * docs: improvements for note boxes (#8037) * Non-deprecated `vendor/bundle` path configuration (#8048) + * Update 09-collections.md (#8060) ### Development Fixes From 1fe5bd0cf5bc03b376bd9ca446192f7285233298 Mon Sep 17 00:00:00 2001 From: Kieran Barker <29986418+kieranbarker@users.noreply.github.com> Date: Fri, 20 Mar 2020 10:40:17 +0000 Subject: [PATCH 3935/4996] Remove extra paragraph tags (#8063) Merge pull request 8063 --- docs/_docs/step-by-step/08-blogging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/step-by-step/08-blogging.md b/docs/_docs/step-by-step/08-blogging.md index 07c6ae32317..249d2c35f10 100644 --- a/docs/_docs/step-by-step/08-blogging.md +++ b/docs/_docs/step-by-step/08-blogging.md @@ -76,7 +76,7 @@ title: Blog {% for post in site.posts %}
  • {{ post.title }}

    -

    {{ post.excerpt }}

    + {{ post.excerpt }}
  • {% endfor %} From 83decb42f6998b047c3310245b5a3fe59bfc7b91 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 20 Mar 2020 06:40:19 -0400 Subject: [PATCH 3936/4996] Update history to reflect merge of #8063 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 3a59d1fa48b..993dea2f544 100644 --- a/History.markdown +++ b/History.markdown @@ -66,6 +66,7 @@ * docs: improvements for note boxes (#8037) * Non-deprecated `vendor/bundle` path configuration (#8048) * Update 09-collections.md (#8060) + * Remove extra paragraph tags (#8063) ### Development Fixes From a1401c6fe9d4cfc5c00de4e926cc14dd107be008 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 22 Mar 2020 21:34:33 +0530 Subject: [PATCH 3937/4996] Use `layout.path` when rendering the Liquid layout (#8069) Merge pull request 8069 --- lib/jekyll/renderer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index dff212ef961..7ecd1cb3d33 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -197,7 +197,7 @@ def render_layout(output, layout, info) layout.content, payload, info, - layout.relative_path + layout.path ) end From a011579fe42ca76fbd531670ed4bc03286b49157 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 22 Mar 2020 12:04:36 -0400 Subject: [PATCH 3938/4996] Update history to reflect merge of #8069 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 993dea2f544..f4ba8338098 100644 --- a/History.markdown +++ b/History.markdown @@ -11,6 +11,7 @@ * Optimize Jekyll::Filters#item_property (#7696) * Allow multiple binary operators in where_exp filter (#8047) * Fix documents custom-ordering logic (#8028) + * Use `layout.path` when rendering the Liquid layout (#8069) ### Minor Enhancements From b84ba5acccd0d3c33144ce5013851969d86ca196 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 26 Mar 2020 19:09:47 +0530 Subject: [PATCH 3939/4996] Add PageDrop to provide Liquid templates with data (#7992) Merge pull request 7992 --- docs/_docs/pages.md | 35 +++++++++++++++++++++++++++++++ lib/jekyll/drops/page_drop.rb | 14 +++++++++++++ lib/jekyll/page.rb | 32 ++++++++++++++++++++++++++++ test/test_page.rb | 36 ++++++++++++++++++++++++++++++++ test/test_page_without_a_file.rb | 6 ++++++ 5 files changed, 123 insertions(+) create mode 100644 lib/jekyll/drops/page_drop.rb diff --git a/docs/_docs/pages.md b/docs/_docs/pages.md index d707d0f44da..6b29267fc69 100644 --- a/docs/_docs/pages.md +++ b/docs/_docs/pages.md @@ -34,3 +34,38 @@ If you have a lot of pages, you can organize them into subfolders. The same subf ## Changing the output URL You might want to have a particular folder structure for your source files that changes for the built site. With [permalinks](/docs/permalinks) you have full control of the output URL. + +## Liquid Representation + +From Jekyll 4.1 onwards, there is a minor change in how instances of `Jekyll::Page` are exposed to layouts and other Liquid +templates. `Jekyll::Page` instances now use a `Liquid::Drop` instead of a `Hash`. This change results in greater performance +for a site with numerous *standlone pages not within a collection*. + +### For plugin developers + +While end-users do not need to take any extra action due to this change, plugin authors depending on the existing behavior *may* +need to make minor changes to their plugins. + +If a `Jekyll::Page` subclass' `to_liquid` method calls `super`, it will have to be slightly modified. +```ruby +class Foo::BarPage < Jekyll::Page + def to_liquid(*) + payload = super # This needs to be changed to `super.to_h` + # to obtain a Hash as in v4.0.0. + + do_something(payload) # Logic specific to `Foo::BarPage` objects + end +end +``` + +`Jekyll::Page` subclasses won't inherit the optimization automatically until the next major version. However, plugin authors +can opt-in to the optimization in their subclasses by wrapping the temporary `liquid_drop` method if the subclass doesn't +override the superclass method: +```ruby +class Foo::BarPage < Jekyll::Page + def to_liquid(*) + liquid_drop # Returns an instance of `Jekyll::Drops::PageDrop`. + # Will be removed in Jekyll 5.0. + end +end +``` diff --git a/lib/jekyll/drops/page_drop.rb b/lib/jekyll/drops/page_drop.rb new file mode 100644 index 00000000000..3a6e961367b --- /dev/null +++ b/lib/jekyll/drops/page_drop.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class PageDrop < Drop + extend Forwardable + + mutable false + + def_delegators :@obj, :content, :dir, :name, :path, :url + private def_delegator :@obj, :data, :fallback_data + end + end +end diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index f353252d825..2e346fc5f25 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -70,6 +70,38 @@ def dir end end + # For backwards-compatibility in subclasses that do not redefine + # the `:to_liquid` method, stash existing definition under a new name + # + # TODO: Remove in Jekyll 5.0 + alias_method :legacy_to_liquid, :to_liquid + private :legacy_to_liquid + + # Private + # Subclasses can choose to optimize their `:to_liquid` method by wrapping + # it around this definition. + # + # TODO: Remove in Jekyll 5.0 + def liquid_drop + @liquid_drop ||= begin + defaults = site.frontmatter_defaults.all(relative_path, type) + unless defaults.empty? + Utils.deep_merge_hashes!(data, Utils.deep_merge_hashes!(defaults, data)) + end + Drops::PageDrop.new(self) + end + end + private :liquid_drop + + # Public + # + # Liquid representation of current page + # + # TODO: Remove optional parameter in Jekyll 5.0 + def to_liquid(attrs = nil) + self.class == Jekyll::Page ? liquid_drop : legacy_to_liquid(attrs) + end + # The full path and filename of the post. Defined in the YAML of the post # body. # diff --git a/test/test_page.rb b/test/test_page.rb index 16aa3ff90f3..023560c90e6 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -50,6 +50,42 @@ def do_render(page) assert_equal "/+/%25%23%20+.html", @page.url end + should "be exposed to Liquid as a Liquid::Drop subclass" do + page = setup_page("properties.html") + liquid_rep = page.to_liquid + refute_equal Hash, liquid_rep.class + assert_equal true, liquid_rep.is_a?(Liquid::Drop) + assert_equal Jekyll::Drops::PageDrop, liquid_rep.class + end + + should "make attributes accessible for use in Liquid templates" do + page = setup_page("/contacts", "index.html") + template = Liquid::Template.parse(<<~TEXT) + Name: {{ page.name }} + Path: {{ page.path }} + URL: {{ page.url }} + TEXT + expected = <<~TEXT + Name: index.html + Path: contacts/index.html + URL: /contacts/ + TEXT + assert_equal(expected, template.render!("page" => page.to_liquid)) + end + + should "make front matter data accessible for use in Liquid templates" do + page = setup_page("properties.html") + template = Liquid::Template.parse(<<~TEXT) + TITLE: {{ page.title }} + FOO: {{ page.foo }} + TEXT + expected = <<~TEXT + TITLE: Properties Page + FOO: bar + TEXT + assert_equal expected, template.render!("page" => page.to_liquid) + end + context "in a directory hierarchy" do should "create URL based on filename" do @page = setup_page("/contacts", "bar.html") diff --git a/test/test_page_without_a_file.rb b/test/test_page_without_a_file.rb index f06706962c2..6deca7b537c 100644 --- a/test/test_page_without_a_file.rb +++ b/test/test_page_without_a_file.rb @@ -76,6 +76,12 @@ def render_and_write end end end + + should "be exposed to Liquid as a Hash" do + liquid_rep = @page.to_liquid + refute_equal Jekyll::Drops::PageDrop, liquid_rep.class + assert_equal Hash, liquid_rep.class + end end context "with site-wide permalink configuration" do From ef6b382a480294185df652445529ea9b5ad96a4a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 Mar 2020 09:39:49 -0400 Subject: [PATCH 3940/4996] Update history to reflect merge of #7992 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f4ba8338098..0d4708cf633 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * Include _config.yml in a new theme's gemspec (#7865) * Add an option to easily disable disk-cache (#7928) * Optimize markdown parsing with Kramdown by reusing the options and parser objects (#8013) + * Add PageDrop to provide Liquid templates with data (#7992) ### Documentation From 237d08a76cc1bf36351e2aedd97fd3246b4c1fb2 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 26 Mar 2020 19:41:33 +0530 Subject: [PATCH 3941/4996] Optimize `Kramdown::JekyllDocument#to_html` calls (#8041) Merge pull request 8041 --- lib/jekyll/converters/markdown/kramdown_parser.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index aebd6ee7fef..8a5543c5ddd 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -53,6 +53,16 @@ def initialize(source, options = {}) @options = JekyllDocument.options @root, @warnings = JekyllDocument.parser.parse(source, @options) end + + # Use Kramdown::Converter::Html class to convert this document into HTML. + # + # The implementation is basically an optimized version of core logic in + # +Kramdown::Document#method_missing+ from kramdown-2.1.0. + def to_html + output, warnings = Kramdown::Converter::Html.convert(@root, @options) + @warnings.concat(warnings) + output + end end end From 7860d1bac0dcf313371a4b25ae7edf5b5a928777 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 26 Mar 2020 10:11:35 -0400 Subject: [PATCH 3942/4996] Update history to reflect merge of #8041 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 0d4708cf633..76afe05ef17 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,7 @@ * Add an option to easily disable disk-cache (#7928) * Optimize markdown parsing with Kramdown by reusing the options and parser objects (#8013) * Add PageDrop to provide Liquid templates with data (#7992) + * Optimize `Kramdown::JekyllDocument#to_html` calls (#8041) ### Documentation From e972065325bc96bcd2bcd9a651cd0f61d4b2b8d7 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Sun, 29 Mar 2020 22:10:28 +0530 Subject: [PATCH 3943/4996] Reduce Pathname objects from front matter defaults (#8067) Merge pull request 8067 --- lib/jekyll/frontmatter_defaults.rb | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb index 21e3cc6faf1..a7d7975cf84 100644 --- a/lib/jekyll/frontmatter_defaults.rb +++ b/lib/jekyll/frontmatter_defaults.rb @@ -103,15 +103,15 @@ def applies?(scope, path, type) end def applies_path?(scope, path) - return true if !scope.key?("path") || scope["path"].empty? + rel_scope_path = scope["path"] + return true if !rel_scope_path.is_a?(String) || rel_scope_path.empty? - sanitized_path = Pathname.new(sanitize_path(path)) - rel_scope_path = Pathname.new(scope["path"]) + sanitized_path = sanitize_path(path) - if scope["path"].to_s.include?("*") + if rel_scope_path.include?("*") glob_scope(sanitized_path, rel_scope_path) else - path_is_subpath?(sanitized_path, strip_collections_dir(scope["path"])) + path_is_subpath?(sanitized_path, strip_collections_dir(rel_scope_path)) end end @@ -134,11 +134,7 @@ def glob_cache(path) end def path_is_subpath?(path, parent_path) - path.ascend do |ascended_path| - return true if ascended_path.to_s == parent_path.to_s - end - - false + path.start_with?(parent_path) end def strip_collections_dir(path) From 8d3c2f6a96d4324fb7d61218a225a3bc35ed6113 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 29 Mar 2020 12:40:30 -0400 Subject: [PATCH 3944/4996] Update history to reflect merge of #8067 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 76afe05ef17..a8f35498f2f 100644 --- a/History.markdown +++ b/History.markdown @@ -93,6 +93,7 @@ * chore: simplify require for Jekyll::VERSION (#8057) * Remove version-constraint relaxation for i18n gem (#8055) * Mirror `spec.homepage` as `metadata["homepage_uri"]` (#8056) + * Reduce Pathname objects from front matter defaults (#8067) ### Site Enhancements From 09c448449e1b2e3edf5ad4b852877a952148c63d Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 30 Mar 2020 01:41:17 +0530 Subject: [PATCH 3945/4996] Add default front matter for tutorials collection (#8081) Merge pull request 8081 --- docs/_config.yml | 6 ++++++ docs/_tutorials/{cache_api.md => cache-api.md} | 2 -- ...existing-site-to-jekyll.md => convert-site-to-jekyll.md} | 2 -- docs/_tutorials/custom-404-page.md | 2 -- docs/_tutorials/index.md | 1 - docs/_tutorials/navigation.md | 2 -- docs/_tutorials/orderofinterpretation.md | 2 -- docs/_tutorials/using-jekyll-with-bundler.md | 2 -- docs/_tutorials/video-walkthroughs.md | 2 -- 9 files changed, 6 insertions(+), 15 deletions(-) rename docs/_tutorials/{cache_api.md => cache-api.md} (98%) rename docs/_tutorials/{convert-existing-site-to-jekyll.md => convert-site-to-jekyll.md} (99%) diff --git a/docs/_config.yml b/docs/_config.yml index bec8b14f035..80e58d301b5 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -18,6 +18,7 @@ collections: permalink: "/news/:year/:month/:day/:title/" output: true tutorials: + permalink: "/:collection/:path/" output: true defaults: - scope: @@ -30,6 +31,11 @@ defaults: type: posts values: layout: news_item +- scope: + path: _tutorials + type: tutorials + values: + layout: tutorials - scope: path: '' values: diff --git a/docs/_tutorials/cache_api.md b/docs/_tutorials/cache-api.md similarity index 98% rename from docs/_tutorials/cache_api.md rename to docs/_tutorials/cache-api.md index 84a7d047d6e..491572df704 100644 --- a/docs/_tutorials/cache_api.md +++ b/docs/_tutorials/cache-api.md @@ -1,6 +1,4 @@ --- -layout: tutorials -permalink: /tutorials/cache-api/ title: Cache API --- diff --git a/docs/_tutorials/convert-existing-site-to-jekyll.md b/docs/_tutorials/convert-site-to-jekyll.md similarity index 99% rename from docs/_tutorials/convert-existing-site-to-jekyll.md rename to docs/_tutorials/convert-site-to-jekyll.md index 650006744ce..f90b3bdf534 100644 --- a/docs/_tutorials/convert-existing-site-to-jekyll.md +++ b/docs/_tutorials/convert-site-to-jekyll.md @@ -1,6 +1,4 @@ --- -layout: tutorials -permalink: /tutorials/convert-site-to-jekyll/ title: Convert an HTML site to Jekyll --- diff --git a/docs/_tutorials/custom-404-page.md b/docs/_tutorials/custom-404-page.md index d739735d190..29e93420007 100644 --- a/docs/_tutorials/custom-404-page.md +++ b/docs/_tutorials/custom-404-page.md @@ -1,6 +1,4 @@ --- -layout: tutorials -permalink: /tutorials/custom-404-page/ title: Custom 404 Page --- diff --git a/docs/_tutorials/index.md b/docs/_tutorials/index.md index 4deb89bcf98..8f5e8211817 100644 --- a/docs/_tutorials/index.md +++ b/docs/_tutorials/index.md @@ -1,5 +1,4 @@ --- -layout: tutorials title: Tutorials permalink: /tutorials/home/ redirect_from: /tutorials/index.html diff --git a/docs/_tutorials/navigation.md b/docs/_tutorials/navigation.md index c1c86a259b8..2ba30ab0ba0 100644 --- a/docs/_tutorials/navigation.md +++ b/docs/_tutorials/navigation.md @@ -1,6 +1,4 @@ --- -layout: tutorials -permalink: /tutorials/navigation/ title: Navigation --- diff --git a/docs/_tutorials/orderofinterpretation.md b/docs/_tutorials/orderofinterpretation.md index e5aa4ea6f0b..d938564e89c 100644 --- a/docs/_tutorials/orderofinterpretation.md +++ b/docs/_tutorials/orderofinterpretation.md @@ -1,6 +1,4 @@ --- -layout: tutorials -permalink: /tutorials/orderofinterpretation/ title: Order of interpretation --- diff --git a/docs/_tutorials/using-jekyll-with-bundler.md b/docs/_tutorials/using-jekyll-with-bundler.md index 73e77679469..bfc6c6a7fc6 100644 --- a/docs/_tutorials/using-jekyll-with-bundler.md +++ b/docs/_tutorials/using-jekyll-with-bundler.md @@ -1,6 +1,4 @@ --- -layout: tutorials -permalink: /tutorials/using-jekyll-with-bundler/ title: Using Jekyll with Bundler --- diff --git a/docs/_tutorials/video-walkthroughs.md b/docs/_tutorials/video-walkthroughs.md index 635b883fa6d..55cfe99fab8 100644 --- a/docs/_tutorials/video-walkthroughs.md +++ b/docs/_tutorials/video-walkthroughs.md @@ -1,6 +1,4 @@ --- -layout: tutorials -permalink: /tutorials/video-walkthroughs/ title: Video Walkthroughs --- From f7bff1c5c4c3f9300c6e434b7ad6919dcd5a0372 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 29 Mar 2020 16:11:19 -0400 Subject: [PATCH 3946/4996] Update history to reflect merge of #8081 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index a8f35498f2f..f5bb90945ec 100644 --- a/History.markdown +++ b/History.markdown @@ -70,6 +70,7 @@ * Non-deprecated `vendor/bundle` path configuration (#8048) * Update 09-collections.md (#8060) * Remove extra paragraph tags (#8063) + * Add default front matter for tutorials collection (#8081) ### Development Fixes From 6bc27f9fdf290544e7e12083a9321ae0666bfd93 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 30 Mar 2020 20:06:37 +0530 Subject: [PATCH 3947/4996] Quicker categories for documents without superdirs (#7987) Merge pull request 7987 --- lib/jekyll/document.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index 0c7b2f67b51..6622d2a3c24 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -414,9 +414,13 @@ def respond_to_missing?(method, *) # # Returns nothing. def categories_from_path(special_dir) - superdirs = relative_path.sub(Document.superdirs_regex(special_dir), "") - superdirs = superdirs.split(File::SEPARATOR) - superdirs.reject! { |c| c.empty? || c == special_dir || c == basename } + if relative_path.start_with?(special_dir) + superdirs = [] + else + superdirs = relative_path.sub(Document.superdirs_regex(special_dir), "") + superdirs = superdirs.split(File::SEPARATOR) + superdirs.reject! { |c| c.empty? || c == special_dir || c == basename } + end merge_data!({ "categories" => superdirs }, :source => "file path") end From 539e712c414f93f1c12e10fb75511d51cb22760a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 30 Mar 2020 10:36:40 -0400 Subject: [PATCH 3948/4996] Update history to reflect merge of #7987 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f5bb90945ec..73789d2dcb7 100644 --- a/History.markdown +++ b/History.markdown @@ -95,6 +95,7 @@ * Remove version-constraint relaxation for i18n gem (#8055) * Mirror `spec.homepage` as `metadata["homepage_uri"]` (#8056) * Reduce Pathname objects from front matter defaults (#8067) + * Quicker categories for documents without superdirs (#7987) ### Site Enhancements From f0ab09968ed666069c701febe9d87ce92110c2ee Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Mon, 30 Mar 2020 20:14:04 +0530 Subject: [PATCH 3949/4996] Reduce array allocations from `StaticFile#path` (#8083) Merge pull request 8083 --- lib/jekyll/static_file.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 9f988a7b0bd..d3a9b8591cd 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -40,11 +40,13 @@ def initialize(site, base, dir, name, collection = nil) # Returns source file path. def path - # Static file is from a collection inside custom collections directory - if !@collection.nil? && !@site.config["collections_dir"].empty? - File.join(*[@base, @site.config["collections_dir"], @dir, @name].compact) - else - File.join(*[@base, @dir, @name].compact) + @path ||= begin + # Static file is from a collection inside custom collections directory + if !@collection.nil? && !@site.config["collections_dir"].empty? + File.join(*[@base, @site.config["collections_dir"], @dir, @name].compact) + else + File.join(*[@base, @dir, @name].compact) + end end end From 9614cb67d427bb89443ad0ada890a98702311411 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 30 Mar 2020 10:44:07 -0400 Subject: [PATCH 3950/4996] Update history to reflect merge of #8083 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 73789d2dcb7..6bc4f22a359 100644 --- a/History.markdown +++ b/History.markdown @@ -12,6 +12,7 @@ * Allow multiple binary operators in where_exp filter (#8047) * Fix documents custom-ordering logic (#8028) * Use `layout.path` when rendering the Liquid layout (#8069) + * Reduce array allocations from `StaticFile#path` (#8083) ### Minor Enhancements From 1412928dde0f24731489acbfa03eb1f717bce9b9 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 1 Apr 2020 14:21:24 +0530 Subject: [PATCH 3951/4996] Bump RuboCop to v0.81.x --- .rubocop.yml | 4 ++++ Gemfile | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index b49da571bf6..07ce3243190 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -40,6 +40,10 @@ Layout/EmptyComment: Enabled: false Layout/EndAlignment: Severity: error +Lint/RaiseException: + Enabled: true +Lint/StructNewOverride: + Enabled: true Lint/UnreachableCode: Severity: error Lint/Void: diff --git a/Gemfile b/Gemfile index 3026f996e58..4203dcae640 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,7 @@ group :test do gem "nokogiri", "~> 1.7" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 0.80.0" + gem "rubocop", "~> 0.81.0" gem "rubocop-performance" gem "test-dependency-theme", :path => File.expand_path("test/fixtures/test-dependency-theme", __dir__) gem "test-theme", :path => File.expand_path("test/fixtures/test-theme", __dir__) From bc9774561b5d2a634619758aec9e8f0e7d3709db Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 1 Apr 2020 18:11:30 +0530 Subject: [PATCH 3952/4996] Utilize relative_url filter in documentation site (#8089) Merge pull request 8089 --- docs/_docs/assets.md | 2 +- docs/_docs/collections.md | 4 ++-- docs/_docs/community/community.md | 12 ++++++------ docs/_docs/configuration.md | 16 ++++++++-------- docs/_docs/configuration/environments.md | 2 +- .../_docs/configuration/front-matter-defaults.md | 8 +++++--- docs/_docs/configuration/options.md | 7 ++++--- docs/_docs/contributing.md | 2 +- docs/_docs/datafiles.md | 4 ++-- docs/_docs/deployment.md | 6 +++--- docs/_docs/deployment/automated.md | 6 +++--- docs/_docs/front-matter.md | 11 ++++++----- docs/_docs/github-pages.md | 8 ++++---- docs/_docs/index.md | 10 +++++----- docs/_docs/installation.md | 8 ++++---- docs/_docs/installation/macos.md | 4 ++-- docs/_docs/installation/windows.md | 3 ++- docs/_docs/liquid.md | 4 ++-- docs/_docs/liquid/tags.md | 4 ++-- docs/_docs/plugins.md | 16 ++++++++-------- docs/_includes/docs_contents.html | 2 +- docs/_includes/docs_contents_mobile.html | 2 +- docs/_includes/footer.html | 4 ++-- docs/_includes/header.html | 4 ++-- docs/_includes/mobile-nav-items.html | 2 +- docs/_includes/news_contents.html | 10 +++++----- docs/_includes/news_contents_mobile.html | 4 ++-- docs/_includes/news_item.html | 2 +- docs/_includes/news_item_archive.html | 2 +- docs/_includes/primary-nav-items.html | 2 +- docs/_includes/section_nav_tutorials.html | 4 ++-- docs/_includes/top.html | 12 ++++++------ docs/_includes/tutorials_contents.html | 2 +- docs/_includes/tutorials_contents_mobile.html | 2 +- docs/_layouts/news_item.html | 2 +- docs/_tutorials/index.md | 2 +- docs/pages/404.html | 8 ++++---- docs/pages/index.html | 6 +++--- docs/pages/resources.md | 4 ++-- docs/pages/showcase.html | 4 ++-- 40 files changed, 111 insertions(+), 106 deletions(-) diff --git a/docs/_docs/assets.md b/docs/_docs/assets.md index ee4e698b39b..2090414867d 100644 --- a/docs/_docs/assets.md +++ b/docs/_docs/assets.md @@ -28,7 +28,7 @@ will process it and put it in your site's destination folder under
    Jekyll processes all Liquid filters and tags in asset files

    If you are using Mustache or another JavaScript templating language that conflicts with - the Liquid template syntax, you + the Liquid template syntax, you will need to place {% raw %} and {% endraw %} tags around your code.

    diff --git a/docs/_docs/collections.md b/docs/_docs/collections.md index 4e591d3b587..9e4ea99569e 100644 --- a/docs/_docs/collections.md +++ b/docs/_docs/collections.md @@ -51,7 +51,7 @@ information, see the section Output. Create a corresponding folder (e.g. `/_staff_members`) and add documents. Front matter is processed if the front matter exists, and everything after the front matter is pushed into the document's `content` attribute. If no front -matter is provided, Jekyll will consider it to be a [static file](/docs/static-files/) +matter is provided, Jekyll will consider it to be a [static file]({{ '/docs/static-files/' | relative_url }}) and the contents will not undergo further processing. If front matter is provided, Jekyll will process the file contents into the expected output. @@ -126,7 +126,7 @@ You can link to the generated page using the `url` attribute: ## Permalinks -There are special [permalink variables for collections](/docs/permalinks/) to +There are special [permalink variables for collections]({{ '/docs/permalinks/' | relative_url }}) to help you control the output url for the entire collection. ## Custom Sorting of Documents diff --git a/docs/_docs/community/community.md b/docs/_docs/community/community.md index 7176dfe5b77..273bff7c48d 100644 --- a/docs/_docs/community/community.md +++ b/docs/_docs/community/community.md @@ -8,13 +8,13 @@ redirect_from: "/help/index.html" As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. -Read the full [code of conduct](/docs/conduct/) +Read the full [code of conduct]({{ '/docs/conduct/' | relative_url }}) ## Where to get support If you're looking for support for Jekyll, there are a lot of options: -* Read the [Jekyll Documentation](https://jekyllrb.com/docs/) +* Read the [Jekyll Documentation]({{ '/docs/' | relative_url }}) * If you have a question about using Jekyll, start a discussion on the [Jekyll Forum](https://talk.jekyllrb.com/) or [StackOverflow](https://stackoverflow.com/questions/tagged/jekyll) * Chat with Jekyllers — Join our [Gitter channel](https://gitter.im/jekyll/jekyll) or our [IRC channel on Freenode](irc:irc.freenode.net/jekyll) @@ -24,13 +24,13 @@ There are a bunch of helpful community members on these services that should be ## Ways to contribute -* [How to Contribute](/docs/contributing/) -* [How to file a bug](/docs/community/bug/) -* [Guide for maintaining Jekyll](/docs/maintaining/) +* [How to Contribute]({{ '/docs/contributing/' | relative_url }}) +* [How to file a bug]({{ '/docs/community/bug/' | relative_url }}) +* [Guide for maintaining Jekyll]({{ '/docs/maintaining/' | relative_url }}) ## Jekyllconf -[Watch videos](/jekyllconf/) from members of the Jekyll community speak about interesting use cases, tricks they’ve learned or meta Jekyll topics. +[Watch videos]({{ '/jekyllconf/' | relative_url }}) from members of the Jekyll community speak about interesting use cases, tricks they’ve learned or meta Jekyll topics. ## Jekyll on Twitter diff --git a/docs/_docs/configuration.md b/docs/_docs/configuration.md index 1f7660cbf17..b542bd97de9 100644 --- a/docs/_docs/configuration.md +++ b/docs/_docs/configuration.md @@ -8,11 +8,11 @@ options can either be specified in a `_config.yml` or `_config.toml` file placed in your site’s root directory, or can be specified as flags for the `jekyll` executable in the terminal. -* [Configuration Options](/docs/configuration/options/) -* [Default Configuration](/docs/configuration/default/) -* [Front Matter Defaults](/docs/configuration/front-matter-defaults/) -* [Environments](/docs/configuration/environments/) -* [Markdown Options](/docs/configuration/markdown/) -* [Liquid Options](/docs/configuration/liquid/) -* [Webrick Options](/docs/configuration/webrick/) -* [Incremental Regeneration](/docs/configuration/incremental-regeneration/) +* [Configuration Options]({{ '/docs/configuration/options/' | relative_url }}) +* [Default Configuration]({{ '/docs/configuration/default/' | relative_url }}) +* [Front Matter Defaults]({{ '/docs/configuration/front-matter-defaults/' | relative_url }}) +* [Environments]({{ '/docs/configuration/environments/' | relative_url }}) +* [Markdown Options]({{ '/docs/configuration/markdown/' | relative_url }}) +* [Liquid Options]({{ '/docs/configuration/liquid/' | relative_url }}) +* [Webrick Options]({{ '/docs/configuration/webrick/' | relative_url }}) +* [Incremental Regeneration]({{ '/docs/configuration/incremental-regeneration/' | relative_url }}) diff --git a/docs/_docs/configuration/environments.md b/docs/_docs/configuration/environments.md index 95250cc854a..6b06c84c75f 100644 --- a/docs/_docs/configuration/environments.md +++ b/docs/_docs/configuration/environments.md @@ -44,6 +44,6 @@ values in your configuration files when moving from one environment to another. {: .note} To switch part of your config settings depending on the environment, use the -build command option, +build command option, for example --config _config.yml,_config_development.yml. Settings in later files override settings in earlier files. diff --git a/docs/_docs/configuration/front-matter-defaults.md b/docs/_docs/configuration/front-matter-defaults.md index 2f19954efdb..5f7355e1327 100644 --- a/docs/_docs/configuration/front-matter-defaults.md +++ b/docs/_docs/configuration/front-matter-defaults.md @@ -30,7 +30,7 @@ defaults: during automatic regeneration are not loaded until the next execution.

    - Note Data Files are included and reloaded during automatic regeneration. + Note Data Files are included and reloaded during automatic regeneration.

    @@ -68,7 +68,9 @@ defaults: author: "Mr. Hyde" ``` -With these defaults, all pages would use the `my-site` layout. Any html files that exist in the `projects/` folder will use the `project` layout, if it exists. Those files will also have the `page.author` [liquid variable](/docs/variables/) set to `Mr. Hyde`. +With these defaults, all pages would use the `my-site` layout. Any html files that exist in the `projects/` +folder will use the `project` layout, if it exists. Those files will also have the `page.author` +[liquid variable]({{ '/docs/variables/' | relative_url }}) set to `Mr. Hyde`. ```yaml collections: @@ -85,7 +87,7 @@ defaults: ``` In this example, the `layout` is set to `default` inside the -[collection](/docs/collections/) with the name `my_collection`. +[collection]({{ '/docs/collections/' | relative_url }}) with the name `my_collection`. ### Glob patterns in Front Matter defaults diff --git a/docs/_docs/configuration/options.md b/docs/_docs/configuration/options.md index 1a5e96f01b5..90bfaff1478 100644 --- a/docs/_docs/configuration/options.md +++ b/docs/_docs/configuration/options.md @@ -150,12 +150,12 @@ class="flag">flags
    (specified on the command-line) that control them.

    Defaults

    - Set defaults for front matter + Set defaults for front matter variables.

    -

    see below

    +

    see below

    @@ -247,7 +247,8 @@ class="flag">flags
    (specified on the command-line) that control them.

    LSI

    -

    Produce an index for related posts. Requires the classifier-reborn plugin.

    +

    Produce an index for related posts. Requires the + classifier-reborn plugin.

    lsi: BOOL

    diff --git a/docs/_docs/contributing.md b/docs/_docs/contributing.md index d22dc861e3c..b1a5b7d241d 100644 --- a/docs/_docs/contributing.md +++ b/docs/_docs/contributing.md @@ -8,7 +8,7 @@ Hi there! Interested in contributing to Jekyll? We'd love your help. Jekyll is a ## Where to get help or report a problem -See the [support guidelines](https://jekyllrb.com/docs/support/) +See the [support guidelines]({{ '/docs/support/' | relative_url }}) ## Ways to contribute diff --git a/docs/_docs/datafiles.md b/docs/_docs/datafiles.md index 9a9961c75f2..7050512c6ab 100644 --- a/docs/_docs/datafiles.md +++ b/docs/_docs/datafiles.md @@ -3,7 +3,7 @@ title: Data Files permalink: /docs/datafiles/ --- -In addition to the [built-in variables](../variables/) available from Jekyll, +In addition to the [built-in variables]({{'/docs/variables/' | relative_url }}) available from Jekyll, you can specify your own custom data that can be accessed via the [Liquid templating system](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers). @@ -147,4 +147,4 @@ author: dave ``` {% endraw %} -For information on how to build robust navigation for your site (especially if you have a documentation website or another type of Jekyll site with a lot of pages to organize), see [Navigation](/tutorials/navigation). +For information on how to build robust navigation for your site (especially if you have a documentation website or another type of Jekyll site with a lot of pages to organize), see [Navigation]({{ '/tutorials/navigation/' | relative_url }}). diff --git a/docs/_docs/deployment.md b/docs/_docs/deployment.md index d6e841c0ae9..45722e4e93c 100644 --- a/docs/_docs/deployment.md +++ b/docs/_docs/deployment.md @@ -6,6 +6,6 @@ redirect_from: "/docs/deployment-methods/index.html" Sites built using Jekyll can be deployed in a large number of ways due to the static nature of the generated output. Here's some of the most common ways: -* [Manually](/docs/deployment/manual/) -* [Automated](/docs/deployment/automated/) -* [Third Party](/docs/deployment/third-party/) +* [Manually]({{ '/docs/deployment/manual/' | relative_url }}) +* [Automated]({{ '/docs/deployment/automated/' | relative_url }}) +* [Third Party]({{ '/docs/deployment/third-party/' | relative_url }}) diff --git a/docs/_docs/deployment/automated.md b/docs/_docs/deployment/automated.md index 0e68e90f17e..ac6ac49bae4 100644 --- a/docs/_docs/deployment/automated.md +++ b/docs/_docs/deployment/automated.md @@ -15,9 +15,9 @@ service of your choice. We have guides for the following providers: -* [Travis CI](/docs/continuous-integration/travis-ci/) -* [CircleCI](/docs/continuous-integration/circleci/) -* [Buddy](/docs/continuous-integration/buddyworks/) +* [Travis CI]({{ '/docs/continuous-integration/travis-ci/' | relative_url }}) +* [CircleCI]({{ '/docs/continuous-integration/circleci/' | relative_url }}) +* [Buddy]({{ '/docs/continuous-integration/buddyworks/' | relative_url }}) ## Git post-receive hook diff --git a/docs/_docs/front-matter.md b/docs/_docs/front-matter.md index a3deb697193..f7700bb8d83 100644 --- a/docs/_docs/front-matter.md +++ b/docs/_docs/front-matter.md @@ -28,14 +28,14 @@ relies on. If you use UTF-8 encoding, make sure that no BOM header characters exist in your files or very, very bad things will happen to Jekyll. This is especially relevant if you’re running - Jekyll on Windows. + Jekyll on Windows.

    Front Matter Variables Are Optional

    - If you want to use Liquid tags and variables + If you want to use Liquid tags and variables but don’t need anything in your front matter, just leave it empty! The set of triple-dashed lines with nothing in between will still get Jekyll to process your file. (This is useful for things like CSS and RSS feeds!) @@ -72,7 +72,7 @@ front matter of a page or post.

  • Using null will produce a file without using a layout file. This is overridden if the file is a post/document and has a - layout defined in the + layout defined in the front matter defaults.
  • @@ -117,7 +117,7 @@ front matter of a page or post.
    Render Posts Marked As Unpublished

    To preview unpublished pages, run `jekyll serve` or `jekyll build` - with the `--unpublished` switch. Jekyll also has a handy drafts + with the `--unpublished` switch. Jekyll also has a handy drafts feature tailored specifically for blog posts.

  • @@ -204,7 +204,8 @@ These are available out-of-the-box to be used in the front matter for a post.
    Don't repeat yourself

    If you don't want to repeat your frequently used front matter variables - over and over, define defaults + over and over, define + defaults for them and only override them where necessary (or not at all). This works both for predefined and custom variables.

    diff --git a/docs/_docs/github-pages.md b/docs/_docs/github-pages.md index 3aed957ddf4..5f51e9da02a 100644 --- a/docs/_docs/github-pages.md +++ b/docs/_docs/github-pages.md @@ -58,12 +58,12 @@ Be sure to run `bundle update` often. Sometimes it's nice to preview your Jekyll site before you push your `gh-pages` branch to GitHub. The subdirectory-like URL structure GitHub uses for Project Pages complicates the proper resolution of URLs. In order to assure your -site builds properly, use the handy [URL filters](/docs/liquid/filters/): +site builds properly, use the handy [URL filters]({{ '/docs/liquid/filters/' | relative_url }}): {% raw %} ```liquid - + [{{ page.title }}]("{{ page.url | relative_url }}") ``` @@ -122,7 +122,7 @@ to see more detailed examples.
    Source files must be in the root directory

    GitHub Pages overrides - the “Site Source” + the “Site Source” configuration value, so if you locate your files anywhere other than the root directory, your site may not build correctly.

    @@ -135,6 +135,6 @@ to see more detailed examples. While Windows is not officially supported, it is possible to install the github-pages gem on Windows. Special instructions can be found on our - Windows-specific docs page. + Windows-specific docs page.

    diff --git a/docs/_docs/index.md b/docs/_docs/index.md index e46da606454..ab373c916d8 100644 --- a/docs/_docs/index.md +++ b/docs/_docs/index.md @@ -13,12 +13,12 @@ site, and more. ## Prerequisites -See [requirements](/docs/installation/#requirements). +See [requirements]({{ '/docs/installation/#requirements' | relative_url }}). ## Instructions -1. Install a full [Ruby development environment](/docs/installation/). -2. Install Jekyll and [bundler](/docs/ruby-101/#bundler) [gems](/docs/ruby-101/#gems). +1. Install a full [Ruby development environment]({{ '/docs/installation/' | relative_url }}). +2. Install Jekyll and [bundler]({{ '/docs/ruby-101/#bundler' | relative_url }}) [gems]({{ '/docs/ruby-101/#gems' | relative_url }}). ``` gem install jekyll bundler ``` @@ -37,6 +37,6 @@ bundle exec jekyll serve 6. Browse to [http://localhost:4000](http://localhost:4000){:target="_blank"} If you encounter any errors during this process, see the -[troubleshooting](/docs/troubleshooting/#configuration-problems) page. Also, +[troubleshooting]({{ '/docs/troubleshooting/#configuration-problems' | relative_url }}) page. Also, make sure you've installed the development headers and other prerequisites as -mentioned on the [requirements](/docs/installation/#requirements) page. +mentioned on the [requirements]({{ '/docs/installation/#requirements' | relative_url }}) page. diff --git a/docs/_docs/installation.md b/docs/_docs/installation.md index 70c251746a9..76cf42888fe 100644 --- a/docs/_docs/installation.md +++ b/docs/_docs/installation.md @@ -16,7 +16,7 @@ Jekyll is a [Ruby Gem](/docs/ruby-101/#gems) that can be installed on most syste For detailed install instructions have a look at the guide for your operating system. -* [macOS](/docs/installation/macos/) -* [Ubuntu Linux](/docs/installation/ubuntu/) -* [Other Linux distros](/docs/installation/other-linux) -* [Windows](/docs/installation/windows/) \ No newline at end of file +* [macOS]({{ '/docs/installation/macos/' | relative_url }}) +* [Ubuntu Linux]({{ '/docs/installation/ubuntu/' | relative_url }}) +* [Other Linux distros]({{ '/docs/installation/other-linux/' | relative_url }}) +* [Windows]({{ '/docs/installation/windows/' | relative_url }}) \ No newline at end of file diff --git a/docs/_docs/installation/macos.md b/docs/_docs/installation/macos.md index 836c8e77772..162c6f09c56 100644 --- a/docs/_docs/installation/macos.md +++ b/docs/_docs/installation/macos.md @@ -77,7 +77,7 @@ That's it! Head over [rbenv command references](https://github.com/rbenv/rbenv#c ## Install Jekyll -Now all that is left is installing [Bundler](/docs/ruby-101/#bundler) and Jekyll. +Now all that is left is installing [Bundler]({{ '/docs/ruby-101/#bundler' | relative_url }}) and Jekyll. ### Local Install @@ -133,4 +133,4 @@ sudo gem install bundler jekyll ## Problems? -Check out the [troubleshooting](/docs/troubleshooting/) page or [ask for help on our forum](https://talk.jekyllrb.com). +Check out the [troubleshooting]({{ '/docs/troubleshooting/' | relative_url }}) page or [ask for help on our forum](https://talk.jekyllrb.com). diff --git a/docs/_docs/installation/windows.md b/docs/_docs/installation/windows.md index e564edde35f..f3a5160b0d3 100644 --- a/docs/_docs/installation/windows.md +++ b/docs/_docs/installation/windows.md @@ -87,7 +87,8 @@ with the current date in the filename.
    Non-superuser account issues

    If the `jekyll new` command prints the error "Your user account isn't allowed to install to the system RubyGems", see - the "Running Jekyll as Non-Superuser" instructions in Troubleshooting.

    + the "Running Jekyll as Non-Superuser" instructions in + Troubleshooting.

    {: .note .info} diff --git a/docs/_docs/liquid.md b/docs/_docs/liquid.md index d09ba99b535..9dead2b8b7c 100644 --- a/docs/_docs/liquid.md +++ b/docs/_docs/liquid.md @@ -15,5 +15,5 @@ out the [official Liquid Documentation](https://shopify.github.io/liquid/). Jekyll provides a number of useful Liquid additions to help you build your site: -* [Filters](/docs/liquid/filters/) -* [Tags](/docs/liquid/tags/) +* [Filters]({{ '/docs/liquid/filters/' | relative_url }}) +* [Tags]({{ '/docs/liquid/tags/' | relative_url }}) diff --git a/docs/_docs/liquid/tags.md b/docs/_docs/liquid/tags.md index a813cd9c5d4..c21f7a01090 100644 --- a/docs/_docs/liquid/tags.md +++ b/docs/_docs/liquid/tags.md @@ -5,12 +5,12 @@ permalink: "/docs/liquid/tags/" All of the standard Liquid [tags](https://shopify.github.io/liquid/tags/control-flow/) are supported. Jekyll has a few built in tags to help you build your site. You can also create -your own tags using [plugins](/docs/plugins/). +your own tags using [plugins]({{ '/docs/plugins/' | relative_url }}). ## Includes If you have page snippets that you use repeatedly across your site, an -[include](/docs/includes/) is the perfect way to make this more maintainable. +[include]({{ '/docs/includes/' | relative_url }}) is the perfect way to make this more maintainable. ## Code snippet highlighting diff --git a/docs/_docs/plugins.md b/docs/_docs/plugins.md index b53ed8d65e0..79a30d3c01d 100644 --- a/docs/_docs/plugins.md +++ b/docs/_docs/plugins.md @@ -7,11 +7,11 @@ Jekyll has a plugin system with hooks that allow you to create custom generated content specific to your site. You can run custom code for your site without having to modify the Jekyll source itself. -* [Installation](/docs/plugins/installation/) - How to install plugins -* [Your first plugin](/docs/plugins/your-first-plugin/) - How to write plugins -* [Generators](/docs/plugins/generators/) - Create additional content on your site -* [Converters](/docs/plugins/converters/) - Change a markup language into another format -* [Commands](/docs/plugins/commands/) - Extend the `jekyll` executable with subcommands -* [Tags](/docs/plugins/tags) - Create custom Liquid tags -* [Filters](/docs/plugins/filters/) - Create custom Liquid filters -* [Hooks](/docs/plugins/hooks/) - Fine-grained control to extend the build process +* [Installation]({{ '/docs/plugins/installation/' | relative_url }}) - How to install plugins +* [Your first plugin]({{ '/docs/plugins/your-first-plugin/' | relative_url }}) - How to write plugins +* [Generators]({{ '/docs/plugins/generators/' | relative_url }}) - Create additional content on your site +* [Converters]({{ '/docs/plugins/converters/' | relative_url }}) - Change a markup language into another format +* [Commands]({{ '/docs/plugins/commands/' | relative_url }}) - Extend the `jekyll` executable with subcommands +* [Tags]({{ '/docs/plugins/tags/' | relative_url }}) - Create custom Liquid tags +* [Filters]({{ '/docs/plugins/filters/' | relative_url }}) - Create custom Liquid filters +* [Hooks]({{ '/docs/plugins/hooks/' | relative_url }}) - Fine-grained control to extend the build process diff --git a/docs/_includes/docs_contents.html b/docs/_includes/docs_contents.html index 4c004fe278e..f46df08f960 100644 --- a/docs/_includes/docs_contents.html +++ b/docs/_includes/docs_contents.html @@ -5,7 +5,7 @@

    {{ section.title }}

      {%- for item in section.docs -%} {%- assign p = site.documents | where: "url", item.link | first %} -
    • +
    • {{- p.menu_name | default: p.title -}}
    • {%- endfor %} diff --git a/docs/_includes/docs_contents_mobile.html b/docs/_includes/docs_contents_mobile.html index 5df8039fec4..b259744d2c4 100644 --- a/docs/_includes/docs_contents_mobile.html +++ b/docs/_includes/docs_contents_mobile.html @@ -5,7 +5,7 @@ {%- for item in section.docs -%} {% assign p = site.documents | where: "url", item.link | first %} - {%- endfor %} diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html index 7e28b8edde6..6c2a8b49f90 100644 --- a/docs/_includes/footer.html +++ b/docs/_includes/footer.html @@ -1,14 +1,14 @@

      Proudly hosted by - GitHub • Social coding + GitHub • Social coding

      diff --git a/docs/_includes/header.html b/docs/_includes/header.html index b38a89ec25f..b03a850dc6a 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -2,9 +2,9 @@
      diff --git a/docs/_includes/mobile-nav-items.html b/docs/_includes/mobile-nav-items.html index 6b9b0062a55..5dd9b86d206 100644 --- a/docs/_includes/mobile-nav-items.html +++ b/docs/_includes/mobile-nav-items.html @@ -7,7 +7,7 @@ {% else -%} {%- if page.url contains p.link %} class="current" {% endif -%} {% endif -%} - >{{ p.title }} + >{{ p.title }} {% endif -%} {% endfor -%}
    • GitHub
    • diff --git a/docs/_includes/news_contents.html b/docs/_includes/news_contents.html index d717b20dd12..ea0a558e401 100644 --- a/docs/_includes/news_contents.html +++ b/docs/_includes/news_contents.html @@ -2,21 +2,21 @@
    diff --git a/docs/_includes/section_nav_tutorials.html b/docs/_includes/section_nav_tutorials.html index 8d665f5139b..7a684b644b7 100644 --- a/docs/_includes/section_nav_tutorials.html +++ b/docs/_includes/section_nav_tutorials.html @@ -20,7 +20,7 @@ {% else -%} {% assign previous = forloop.index0 | minus: 1 -%} {% assign previous_page = tutorials[previous] | prepend:"/tutorials/" | append:"/" -%} - + {% endif -%}
    @@ -29,7 +29,7 @@ {% else -%} {% assign next = forloop.index0 | plus: 1 -%} {% assign next_page = tutorials[next] | prepend:"/tutorials/" | append:"/" -%} - + {% endif -%}
    diff --git a/docs/_includes/top.html b/docs/_includes/top.html index 0cce753ff94..c0e203c33f4 100644 --- a/docs/_includes/top.html +++ b/docs/_includes/top.html @@ -4,13 +4,13 @@ {% feed_meta %} - + - - - - - + + + + + {% seo %} + +
    If you see a bunch of garbage + +If it relates to a ... +
    well-formed pattern + +See if there's a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it. + +If not, try writing one and adding it to the `patterns.txt` file. + +Patterns are Perl 5 Regular Expressions - you can [test]( +https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines. + +Note that patterns can't match multiline strings. +
    +
    binary-ish string + +Please add a file path to the `excludes.txt` file instead of just accepting the garbage. + +File paths are Perl 5 Regular Expressions - you can [test]( +https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files. + +`^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md]( +../tree/HEAD/README.md) (on whichever branch you're using). +
    + +
    diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt new file mode 100644 index 00000000000..0d035882ec3 --- /dev/null +++ b/.github/actions/spelling/excludes.txt @@ -0,0 +1,31 @@ +# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-excludes +(?:^|/)(?i)COPYRIGHT +(?:^|/)(?i)LICEN[CS]E +(?:^|/)package(?:-lock|)\.json$ +(?:^|/)vendor/ +/fonts/ +ignore$ +\.avi$ +\.eot$ +\.ico$ +\.jpe?g$ +\.lock$ +\.map$ +\.min\. +\.mod$ +\.mp[34]$ +\.png$ +\.svg$ +\.ttf$ +\.wav$ +\.woff$ +\.woff2$ +^docs/pages/redirects/github\.html$ +^lib/jekyll/mime\.types$ +^lib/theme_template/example/index\.html$ +^lib/theme_template/example/_post\.md$ +^test/fixtures/empty_permalink\.erb$ +^test/fixtures/webrick/bar/baz\.html$ +^test/fixtures/webrick/bar/foo\.xhtml$ +^test/source/_posts/2009-06-22-no-yaml\.markdown$ +^\.github/ diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt new file mode 100644 index 00000000000..7fd61c7195a --- /dev/null +++ b/.github/actions/spelling/expect.txt @@ -0,0 +1,684 @@ +acl +activesupport +adaoraul +addons +aeiou +AFile +afterall +alfredxing +algolia +allowfullscreen +apps +appveyor +arengu +args +ariejan +arounds +asciinema +asdf +ashmaroli +attr +Autobuild +autocompletion +autogenerated +Autolink +autoload +autoreconf +autosave +aws +awscli +backend +backlink +backport +backtick +barcamp +baseurl +bashrc +baz +bbatsov +bdimcheff +binstubs +bip +bitbucket +blog +Blogger +blogging +bonafide +breadcrumbs +briandoll +bridgetown +bridgetownrb +brightbox +brighterplanet +buddyworks +Bugfix +Burela +byparker +cachegrind +calavera +callgraphs +cartera +cavalle +CDNs +cgi +changefreq +changelog +chango +charset +chcp +chdir +Cheatsheet +chmod +chown +Chrononaut +chruby +cibuild +circleci +CJK +classname +cloudcannon +Cloudinary +cloudsh +CLT +codebase +codeclimate +CODEOWNERS +coderay +codeslinger +coffeescript +colorator +commandline +commonmark +compat +compatibilize +concat +config +configyml +contentblocks +CORS +Cov +CRLFs +cron +crontab +cruft +css +csv +Currin +CWD +cygwin +daringfireball +datafiles +datetime +DCEU +Debian +debuggability +defunkt +delegators +deployer +deps +dest +Devkit +devops +digitalocean +dirs +disqus +ditaa +dnf +doclist +doctype +doeorg +dommmel +dotfile +downcase +downcased +duckduckgo +duritong +dysinger +ecf +editorconfig +eduardoboucas +Elasticsearch +elsif +Emacs +emails +emoji +endcapture +endfor +endhighlight +endif +endraw +endrender +endtablerow +Enumerables +EOL'd +erb +errordocument +eugenebolshakov +evaled +exe +execjs +extensionpack +extname +exts +favicon +Fengyun +ffi +figcaption +filesystem +firstimage +FIXME +flakey +flickr +fnmatch +fontello +forloop +formcake +formester +formingo +formkeep +formspark +formspree +formx +Forwardable +frameborder +freenode +frontmatter +fsnotify +ftp +fullstory +gcc +gcnovus +gemfile +gemset +gemspec +getform +getset +getsimpleform +gettalong +gfm +ghp +ghpages +giraffeacademy +github +githubusercontent +gitignore +gitlab +gjtorikian +globbed +globbing +google +gotcha +gridism +GSo +gsub +gsubbing +Hakiri +hardcode +hashbang +hashmap +helaili +henrik +heredoc +heroku +highlighter +hilighting +homepage +hostman +hostname +href +htaccess +htm +html +htmlproofer +http +httpd +httpdocs +hyperlinks +Iaa +ial +ico +icomoon +iconset +ified +iframe +img +Impl +Inlining +invokables +irc +ivey +ize +jalali +jameshamann +jamstackthemes +javascript +Jax +jayferd +jcon +jdoe +jeffreytse +jeffrydegrande +Jekpack +jekyllbot +jekyllconf +Jekyllers +Jekyllin +jekyllized +jekylllayoutconcept +jekyllrb +jekyllthemes +jemoji +jmcglone +jneen +johnreilly +jpg +jqr +jruby +json +jsonify +juretta +jwarby +kbd +Kentico +keycdn +kickster +kiwifruit +konklone +kontent +kramdown +Lamprecht +laquo +lastmod +launchctl +launchy +laurilehmijoki +ldquo +learnxinyminutes +lexer +LGTM +libcurl +libffi +lifecycle +lightgray +limjh +linenos +linkify +linux +liufengyun +livereload +localhost +localtime +loglevel +Losslessly +lovin +lsi +lsquo +lstrip +lyche +macos +macromates +mademistakes +mailto +markdownify +maruku +mathjax +mathml +mattr +mchung +mdash +memberspace +Memoize +memoized +memoizing +mergable +metadata +microdata +microsoft +mimetype +mingw +minibundle +minifier +minitest +mixin +mkasberg +mkd +mkdir +mkdn +mkdown +modernizr +mojombo +moz +mreid +msdn +mswin +MSYS +mtime +multiline +munging +Mvvm +myblog +mycontent +mydata +mydoc +myimage +mypage +myposts +myrepo +mysite +myvalue +myvar +myvariable +namespace +namespaced +navbar +nbsp +nearlyfreespeech +nethack +netlify +netlifycms +Neue +nginx +ngx +nielsenramon +nodejs +noifniof +nokogiri +notextile +onclick +onebox +oneclick +onschedule +opensource +openssl +Optim +orderofinterpretation +orgs +OSVDB +osx +packagecontrol +pacman +paginator +pandoc +pantulis +params +parkr +parseable +paspagon +passthrough +pathawks +Pathutil +paywall +pdf +permalink +PHP +pinboard +Piwigo +pjhyett +pkill +pkpass +placeholders +planetjekyll +plantuml +plugin +png +podcasts +popen +Posterous +postfiles +postlayout +postmodern +prepends +Prioritise +Probot +projectlist +pubstorm +pufuwozu +pwa +pwd +pygments +qrush +Quaid +quickstart +rackup +Rakefile +raquo +razorops +rbenv +rdiscount +rdoc +rdquo +readme +realz +rebund +redcarpet +redcloth +redgreen +redhat +refactor +refactoring +Refheap +regen +regex +regexp +remi +reqs +Responsify +revertable +rfc +rfelix +RHEL +ridk +roadmap +rowspan +rspec +rsquo +rss +rstrip +rsync +rtomayko +Rubo +rubocop +rubygem +rubyinstaller +rubyprof +rvm +ryanflorence +saas +samplelist +samrayner +sandboxed +Sassc +sassify +schemastore +Schwartzian +scp +screenshot +scrollbar +scroller +scss +scssify +sectore +semver +seo +serverless +setenv +SFTP +shopify +shortlog +shoulda +sieversii +sigpipe +simplecov +siteleaf +sitemap +SITENAME +Slicehost +slugified +slugify +smartforms +smartify +snipcart +socio +somedir +sonnym +Sonomy +sourced +sourcemaps +spam +spotify +src +ssg +ssh +SSL +stackoverflow +standalone +staticfiles +staticman +statictastic +STDERR +stdout +Stickyposts +strftime +stringified +Stringify +styleguide +stylesheet +subdir +subdomain +subfolder +subfolderitems +subnav +subpages +subpath +subpiece +subsubfolderitems +subthing +subvalues +subwidget +sudo +superdirectories +superdirs +SUSE +sverrirs +svg +svn +swfobject +swupd +symlink +symlinking +tablerow +tada +talkyard +tbody +technicalpickles +templating +templatize +Termux +textilize +textpattern +thead +therubyracer +Thornquest +thoughtbot +throughs +Tidelift +timeago +timezone +titleize +TLS +tmm +tmp +toc +tok +tomjoht +toml +tomo +toolset +toshimaru +triaged +triaging +truncatewords +tsv +ttf +Tudou +Tumblr +Tweetsert +txtpen +tzinfo +ubuntu +uby +ujh +ultron +undumpable +unencode +Unescape +unescaping +unicode +uniq +upcase +uppercasing +uri +url +urlset +username +usr +utf +utils +utime +utm +vanpelt +vendored +vercel +versioned +versioning +vertycal +Veyor +vilcans +visualstudio +vnd +vps +vscode +vwochnik +Walkthroughs +wdm +We'd +webfont +webhook +webhosting +webmentions +webrick +website +weekdate +whitelist +whitelisting +wiki +wikipedia +willcodeforfoo +woff +wordpress +Workaround +workflow +wsl +www +xcode +xdg +xhtml +XMinutes +xml +xmlns +xmlschema +yajl +yaml +Yarp +yml +Youku +youtube +yunbox +zeropadding +zlib +zoneinfo +zpinter +Zsh +zshrc +zypper +zzot diff --git a/.github/actions/spelling/only.txt b/.github/actions/spelling/only.txt new file mode 100644 index 00000000000..af5f5b1cceb --- /dev/null +++ b/.github/actions/spelling/only.txt @@ -0,0 +1 @@ +^docs/.*\.md$ diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt new file mode 100644 index 00000000000..b4c2bffcfe6 --- /dev/null +++ b/.github/actions/spelling/patterns.txt @@ -0,0 +1,61 @@ +# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns + +# data urls +(['"])data:.*?\g{-1} +data:[-a-zA-Z=;:/0-9+]*,\S* + +# YouTube +https?://(?:(?:www\.|)youtube\.com|youtu.be)/(?:channel/|embed/|playlist\?list=|watch\?v=|v/|)[-a-zA-Z0-9?&=_]* +<\s*youtube\s+id=['"][-a-zA-Z0-9?_]*['"] +\bimg\.youtube\.com/vi/[-a-zA-Z0-9?&=_]* +youtube_id:\s*[-a-zA-Z0-9?&=_]* +# Google Analytics +\bgoogle-analytics\.com/collect.[-0-9a-zA-Z?%=&_.~]* +# Google APIs +\bgoogleapis\.com/[a-z]+/v\d+/[a-z]+/[@./?=\w]+ +\b[-a-zA-Z0-9.]*\bstorage\d*\.googleapis\.com(?:/\S*|) +# Google Calendar +\bcalendar\.google\.com/calendar(?:/u/\d+|)/embed\?src=[@./?=\w&%]+ +\w+\@group\.calendar\.google\.com\b +# Google DataStudio +\bdatastudio\.google\.com/(?:(?:c/|)u/\d+/|)(?:embed/|)(?:open|reporting|datasources|s)/[-0-9a-zA-Z]+(?:/page/[-0-9a-zA-Z]+|) +# The leading `/` here is as opposed to the `\b` above +# ... a short way to match `https://` or `http://` since most urls have one of those prefixes +# Google Docs +/docs\.google\.com/[a-z]+/d/(?:e/|)[0-9a-zA-Z_-]+/? +# Google Groups +https://groups\.google\.com/d/topic/[^/]+/[a-zA-Z0-9]+/discussion +https://groups\.google\.com/d/msg/[^/]+/[a-zA-Z0-9]+/[a-zA-Z0-9]+ +# Google themes +themes\.googleusercontent\.com/static/fonts/[^/]+/v\d+/[^.]+. +# Google CDN +\bclients2\.google(?:usercontent|)\.com[-0-9a-zA-Z/.]* +# Goo.gl +/goo\.gl/[a-zA-Z0-9]+ +# Google Chrome Store +\bchrome\.google\.com/webstore/detail/\w*(?:/\w*|) +# google_site_verification: +google_site_verification: [-a-zA-Z=;:/0-9+]* + +# Contributors +alphabetical order.*:.* +twitter_handle: .* + +# apiKey +apiKey: '[a-f0-9]+' + +# FontAwesome +/(?:(?i)FontAwesome\.\w+\?\w+) + +# Lorem +(?:\w|\s|[,.])*\b(?i)(?:amet|consectetur|cursus|dolor|eros|ipsum|lacus|libero|ligula|lorem|magna|neque|nulla|suscipit|tempus|ultrices)\b(?:\w|\s|[,.])* + +# URL escaped characters +\%[0-9A-F]{2} +# c99 hex digits (not the full format, just one I've seen) + +# hex digits including css/html color classes: +(?:[\\0][xX]|\\u|[uU]\+|#x?|\%23)[0-9a-fA-FgGrR_]{2,}(?:[uU]?[lL]{0,2}|u\d+)\b + +# ignore long runs of a single character: +\b([A-Za-z])\g{-1}{3,}\b diff --git a/.github/actions/spelling/reject.txt b/.github/actions/spelling/reject.txt new file mode 100644 index 00000000000..a5ba6f6390e --- /dev/null +++ b/.github/actions/spelling/reject.txt @@ -0,0 +1,7 @@ +^attache$ +benefitting +occurence +Sorce +^[Ss]pae +^untill +^wether diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml new file mode 100644 index 00000000000..cbc72ae28ea --- /dev/null +++ b/.github/workflows/spelling.yml @@ -0,0 +1,19 @@ +name: Spell checking +on: + pull_request_target: + push: + +jobs: + build: + name: Spell checking + runs-on: ubuntu-latest + steps: + - name: checkout-merge + if: "contains(github.event_name, 'pull_request')" + uses: actions/checkout@v2.0.0 + with: + ref: refs/pull/${{github.event.pull_request.number}}/merge + - name: checkout + if: "!contains(github.event_name, 'pull_request')" + uses: actions/checkout@v2.0.0 + - uses: check-spelling/check-spelling@v0.0.18 diff --git a/docs/_docs/continuous-integration/razorops.md b/docs/_docs/continuous-integration/razorops.md index f34ad082d9c..fc92d339596 100644 --- a/docs/_docs/continuous-integration/razorops.md +++ b/docs/_docs/continuous-integration/razorops.md @@ -25,7 +25,7 @@ With [Razorops][razorops-homepage] you can set up your Jekyll websites project's 1. Log in at [https://razorops.com/][razorops-homepage] with your GitHub/Bitbucket or Gitlab account 2. Create a pipeline, choose your Git provider and select your Jekyll Project 3. Add .razorops.yaml file in your root directory of your project -4. Add envirommant var and your deployment is ready +4. Add environment var and your deployment is ready 5. Add build and deployment steps as shown in this post [How to Deploy a Static Website to AWS S3 with Razorops CI/CD][deploy-s3] ## 2. How it works From 02b12e5dfc63f41aeaebfdbacee6593f87394299 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 16 May 2021 08:14:48 -0400 Subject: [PATCH 4440/4996] Update history to reflect merge of #8675 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 44d5f8fe80a..9344c8e5c28 100644 --- a/History.markdown +++ b/History.markdown @@ -36,6 +36,7 @@ * Cross Version Testing Locally and Faster CI (#8610) * style: run rubocop -a (#8654) * Use official Ruby setup GH action (#8614) + * Spell check action for markdown documentation (#8675) ### Minor Enhancements From 92633c699617123eeef22f5a63bd9253500b58a2 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Sun, 16 May 2021 15:58:44 -0400 Subject: [PATCH 4441/4996] Update expect to cover docs/_posts (#8677) Merge pull request 8677 --- .github/actions/spelling/expect.txt | 68 ++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index 7fd61c7195a..ceceb3fdf80 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -5,9 +5,14 @@ addons aeiou AFile afterall +Alexey alfredxing algolia allowfullscreen +Anatoliy +andreyvit +Ankit +Anning apps appveyor arengu @@ -25,6 +30,7 @@ Autolink autoload autoreconf autosave +awood aws awscli backend @@ -37,6 +43,9 @@ bashrc baz bbatsov bdimcheff +bellvat +benbalter +Beney binstubs bip bitbucket @@ -44,6 +53,7 @@ blog Blogger blogging bonafide +Bou breadcrumbs briandoll bridgetown @@ -65,9 +75,11 @@ changefreq changelog chango charset +Chayoung chcp chdir Cheatsheet +Checkoway chmod chown Chrononaut @@ -107,6 +119,7 @@ Currin CWD cygwin daringfireball +Dassonville datafiles datetime DCEU @@ -129,10 +142,12 @@ doctype doeorg dommmel dotfile +Dousse downcase downcased duckduckgo duritong +Dusseau dysinger ecf editorconfig @@ -150,9 +165,11 @@ endraw endrender endtablerow Enumerables -EOL'd +EOL +eol erb errordocument +Espinaco eugenebolshakov evaled exe @@ -165,6 +182,7 @@ Fengyun ffi figcaption filesystem +Finazzo firstimage FIXME flakey @@ -186,6 +204,7 @@ frontmatter fsnotify ftp fullstory +Gaudino gcc gcnovus gemfile @@ -200,6 +219,7 @@ ghp ghpages giraffeacademy github +githubcom githubusercontent gitignore gitlab @@ -208,6 +228,7 @@ globbed globbing google gotcha +Goulven gridism GSo gsub @@ -222,6 +243,7 @@ heredoc heroku highlighter hilighting +Hoizey homepage hostman hostname @@ -251,6 +273,7 @@ ize jalali jameshamann jamstackthemes +jan javascript Jax jayferd @@ -263,6 +286,7 @@ jekyllbot jekyllconf Jekyllers Jekyllin +Jekylling jekyllized jekylllayoutconcept jekyllrb @@ -278,14 +302,22 @@ json jsonify juretta jwarby +Kacper +Kasberg kbd Kentico +Kewin keycdn kickster +Kinnula kiwifruit +Kolesky konklone kontent +Kotvinsky kramdown +Kulig +Kwokfu Lamprecht laquo lastmod @@ -306,8 +338,10 @@ linkify linux liufengyun livereload +localheinz localhost localtime +Locher loglevel Losslessly lovin @@ -319,18 +353,25 @@ macos macromates mademistakes mailto +Manmeet markdownify +Maroli +Marsceill maruku mathjax mathml mattr +Maximiliano mchung mdash memberspace Memoize memoized memoizing +mentoring mergable +Mertcan +mertkahyaoglu metadata microdata microsoft @@ -339,12 +380,14 @@ mingw minibundle minifier minitest +Mittal mixin mkasberg mkd mkdir mkdn mkdown +mmistakes modernizr mojombo moz @@ -363,11 +406,14 @@ mydoc myimage mypage myposts +myproject myrepo mysite myvalue myvar myvariable +Nadjib +nakanishi namespace namespaced navbar @@ -380,6 +426,7 @@ Neue nginx ngx nielsenramon +nior nodejs noifniof nokogiri @@ -409,6 +456,7 @@ pathawks Pathutil paywall pdf +Pelykh permalink PHP pinboard @@ -423,6 +471,7 @@ plugin png podcasts popen +Porcel Posterous postfiles postlayout @@ -481,6 +530,8 @@ rubocop rubygem rubyinstaller rubyprof +Ruparelia +Rusiczki rvm ryanflorence saas @@ -490,6 +541,7 @@ sandboxed Sassc sassify schemastore +Schroers Schwartzian scp screenshot @@ -503,12 +555,14 @@ seo serverless setenv SFTP +shingo shopify shortlog shoulda sieversii sigpipe simplecov +Singhaniya siteleaf sitemap SITENAME @@ -568,6 +622,7 @@ symlink symlinking tablerow tada +Taillandier talkyard tbody technicalpickles @@ -578,6 +633,7 @@ textilize textpattern thead therubyracer +Theunissen Thornquest thoughtbot throughs @@ -604,6 +660,7 @@ Tudou Tumblr Tweetsert txtpen +Tyborska tzinfo ubuntu uby @@ -627,6 +684,7 @@ utils utime utm vanpelt +Vasovi vendored vercel versioned @@ -634,8 +692,10 @@ versioning vertycal Veyor vilcans +Vishesh visualstudio vnd +vohedge vps vscode vwochnik @@ -653,6 +713,7 @@ whitelist whitelisting wiki wikipedia +wildcards willcodeforfoo woff wordpress @@ -662,7 +723,9 @@ wsl www xcode xdg +Xhmikos xhtml +Xiaoiver XMinutes xml xmlns @@ -670,11 +733,14 @@ xmlschema yajl yaml Yarp +Yashu +Yastreb yml Youku youtube yunbox zeropadding +Zlatan zlib zoneinfo zpinter From 0274943bcd561639c69b2e24cc8463e48380dedc Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 16 May 2021 15:58:45 -0400 Subject: [PATCH 4442/4996] Update history to reflect merge of #8677 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 9344c8e5c28..8a28be948a7 100644 --- a/History.markdown +++ b/History.markdown @@ -37,6 +37,7 @@ * style: run rubocop -a (#8654) * Use official Ruby setup GH action (#8614) * Spell check action for markdown documentation (#8675) + * Update expect to cover docs/_posts (#8677) ### Minor Enhancements From 7e350ac031303a650b6dba70a868a33c187eaffb Mon Sep 17 00:00:00 2001 From: "Kelvin M. Klann" Date: Sun, 16 May 2021 20:00:53 +0000 Subject: [PATCH 4443/4996] Revert "style: run rubocop -a" (#8676) Merge pull request 8676 --- lib/jekyll/cache.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/jekyll/cache.rb b/lib/jekyll/cache.rb index e688c2ed0b7..be9a1893ef0 100644 --- a/lib/jekyll/cache.rb +++ b/lib/jekyll/cache.rb @@ -163,6 +163,7 @@ def delete_cache_files # Load `path` from disk and return the result. # This MUST NEVER be called in Safe Mode + # rubocop:disable Security/MarshalLoad def load(path) raise unless disk_cache_enabled? @@ -171,6 +172,7 @@ def load(path) cached_file.close value end + # rubocop:enable Security/MarshalLoad # Given a path and a value, save value to disk at path. # This should NEVER be called in Safe Mode From 6a6d735db27cf9cb3975ad58edad62b1e82e7b2e Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 16 May 2021 16:00:55 -0400 Subject: [PATCH 4444/4996] Update history to reflect merge of #8676 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 8a28be948a7..57dd053949e 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Add webrick as a dependency (#8524) * fix: pin rubocop to 1.12 due to error with ruby 2.4 (#8651) + * Revert "style: run rubocop -a" (#8676) ### Development Fixes From 93ef9389bae191daf3bb396257810224b0dfa21c Mon Sep 17 00:00:00 2001 From: Liam Bigelow <40188355+bglw@users.noreply.github.com> Date: Mon, 17 May 2021 08:06:05 +1200 Subject: [PATCH 4445/4996] Load Jekyll plugins from BUNDLE_GEMFILE location (#8585) Merge pull request 8585 --- lib/jekyll/plugin_manager.rb | 9 ++++++++- test/test_plugin_manager.rb | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index d7785338c40..fe2e43f9904 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -46,7 +46,7 @@ def require_theme_deps end def self.require_from_bundler - if !ENV["JEKYLL_NO_BUNDLER_REQUIRE"] && File.file?("Gemfile") + if !ENV["JEKYLL_NO_BUNDLER_REQUIRE"] && gemfile_exists? require "bundler" Bundler.setup @@ -61,6 +61,13 @@ def self.require_from_bundler end end + # Check for the existence of a Gemfile. + # + # Returns true if a Gemfile exists in the places bundler will look + def self.gemfile_exists? + File.file?("Gemfile") || (ENV["BUNDLE_GEMFILE"] && File.file?(ENV["BUNDLE_GEMFILE"])) + end + # Check whether a gem plugin is allowed to be used during this build. # # plugin_name - the name of the plugin diff --git a/test/test_plugin_manager.rb b/test/test_plugin_manager.rb index dfcb4dfec32..a7b9359e225 100644 --- a/test/test_plugin_manager.rb +++ b/test/test_plugin_manager.rb @@ -10,6 +10,13 @@ def with_no_gemfile FileUtils.mv "Gemfile.old", "Gemfile" end + def with_bundle_gemfile + FileUtils.mv "Gemfile", "AlternateGemfile" + yield + ensure + FileUtils.mv "AlternateGemfile", "Gemfile" + end + context "JEKYLL_NO_BUNDLER_REQUIRE set to `nil`" do should "require from bundler" do with_env("JEKYLL_NO_BUNDLER_REQUIRE", nil) do @@ -20,6 +27,18 @@ def with_no_gemfile end end + context "BUNDLE_GEMFILE set to `AlternateGemfile`" do + should "require from bundler" do + with_env("BUNDLE_GEMFILE", "AlternateGemfile") do + with_bundle_gemfile do + assert Jekyll::PluginManager.require_from_bundler, + "require_from_bundler should return true" + assert ENV["JEKYLL_NO_BUNDLER_REQUIRE"], "Gemfile plugins were not required." + end + end + end + end + context "JEKYLL_NO_BUNDLER_REQUIRE set to `true`" do should "not require from bundler" do with_env("JEKYLL_NO_BUNDLER_REQUIRE", "true") do From 30b397c0467ec6b73bca9c1ddf1a5220b1e8ca4a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 16 May 2021 16:06:06 -0400 Subject: [PATCH 4446/4996] Update history to reflect merge of #8585 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 57dd053949e..53c214aeeb6 100644 --- a/History.markdown +++ b/History.markdown @@ -26,6 +26,7 @@ * Add webrick as a dependency (#8524) * fix: pin rubocop to 1.12 due to error with ruby 2.4 (#8651) * Revert "style: run rubocop -a" (#8676) + * Load Jekyll plugins from BUNDLE_GEMFILE location (#8585) ### Development Fixes From 49a00ebbec06e383aafa648f7c8bdb027a2fc3af Mon Sep 17 00:00:00 2001 From: nusu Date: Sun, 16 May 2021 23:09:23 +0300 Subject: [PATCH 4447/4996] Add formcarry to forms section (#8471) Merge pull request 8471 --- docs/pages/resources.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/resources.md b/docs/pages/resources.md index 2df8c872b14..86dc798d690 100644 --- a/docs/pages/resources.md +++ b/docs/pages/resources.md @@ -56,6 +56,7 @@ Use a SaaS service as a backend for functionality on your Jekyll site - [Getform](https://getform.io) - [99Inbound](https://www.99inbound.com) - [Formcake](https://formcake.com) + - [Formcarry](https://formcarry.com) - [Formingo](https://www.formingo.co/guides/jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=Jekyll%20Documentation) - [FormKeep](https://formkeep.com/guides/contact-form-jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=contact-form-jekyll) - [Formspark](https://formspark.io/) From f267dafc0c32c38b0eec4c5e5bd99a67b09a0321 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 16 May 2021 16:09:24 -0400 Subject: [PATCH 4448/4996] Update history to reflect merge of #8471 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 53c214aeeb6..72bcd440617 100644 --- a/History.markdown +++ b/History.markdown @@ -20,6 +20,7 @@ * Specify default port and host for serve commands in docs (#8624) * Update third-party.md (#8652) * Add documentation for Sass configuration options (#8587) + * Add formcarry to forms section (#8471) ### Bug Fixes From 1ffda285d6f797b64bd291ab7c2c6acba7360015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edson=20Jim=C3=A9nez?= <51224220+Edsonytic@users.noreply.github.com> Date: Sun, 16 May 2021 15:10:45 -0500 Subject: [PATCH 4449/4996] Add step to set SDKROOT (#8478) Merge pull request 8478 --- docs/_docs/installation/macos.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/_docs/installation/macos.md b/docs/_docs/installation/macos.md index 5d885705051..431421c9c20 100644 --- a/docs/_docs/installation/macos.md +++ b/docs/_docs/installation/macos.md @@ -10,6 +10,13 @@ To install the command line tools to compile native extensions, open a terminal xcode-select --install ``` +### set SDKROOT (only macOS Catalina or later) +Starting on macOS Catalina (10.15) the headers used for Ruby have been moved from their previous location which results in some gems, including Jekyll to fail installation. This can be solved by setting SDKROOT in your shell configuration to the value provided by xcrun. + +```ssh +export SDKROOT=$(xcrun --show-sdk-path) +``` + ## Install Ruby Jekyll requires **Ruby v{{ site.data.ruby.min_version }}** or higher. From e724b587e30598cb72f5618b481f22a9b8fd924b Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Sun, 16 May 2021 16:10:46 -0400 Subject: [PATCH 4450/4996] Update history to reflect merge of #8478 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 72bcd440617..7e5fd5ba143 100644 --- a/History.markdown +++ b/History.markdown @@ -21,6 +21,7 @@ * Update third-party.md (#8652) * Add documentation for Sass configuration options (#8587) * Add formcarry to forms section (#8471) + * Add step to set SDKROOT (#8478) ### Bug Fixes From 7605b0a474f2906e36f394a174171e9ba2cefed1 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 16 May 2021 22:12:49 +0200 Subject: [PATCH 4451/4996] Update History.markdown --- History.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/History.markdown b/History.markdown index 7e5fd5ba143..2d8ad444ac6 100644 --- a/History.markdown +++ b/History.markdown @@ -1573,7 +1573,7 @@ ### Minor Enhancements - * Stop testing with Ruby 2.0.x, which is EOL'd. (#4381) + * Stop testing with Ruby 2.0.x EOL (#4381) * Allow collections to have documents that have no file extension (#4545) * Add size property to `group_by` result (#4557) * Site Template: Removed unnecessary nesting from `_base.scss` (#4637) From 889fe4130bdda65b288c34ea8ebbba4dd0105f54 Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Sun, 16 May 2021 22:13:21 +0200 Subject: [PATCH 4452/4996] Update expect.txt --- .github/actions/spelling/expect.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index ceceb3fdf80..d6a6a589e86 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -191,6 +191,7 @@ fnmatch fontello forloop formcake +formcarry formester formingo formkeep From e5dd8897500ac0426545ba8f9304660cbeaff44d Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Mon, 17 May 2021 23:55:11 +0200 Subject: [PATCH 4453/4996] Update expect.txt --- .github/actions/spelling/expect.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index d6a6a589e86..de551310ddf 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -550,6 +550,8 @@ scrollbar scroller scss scssify +sdk +SDKROOT sectore semver seo @@ -723,6 +725,7 @@ workflow wsl www xcode +xcrun xdg Xhmikos xhtml From 42dacc1091536deababcb54591568249f7b0a7fc Mon Sep 17 00:00:00 2001 From: Frank Taillandier Date: Tue, 18 May 2021 08:31:34 +0200 Subject: [PATCH 4454/4996] fix(security): CVE-2021-28834 (#8680) Merge pull request 8680 --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 169d41cf5a4..9bb5376657f 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -38,7 +38,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency("i18n", "~> 1.0") s.add_runtime_dependency("jekyll-sass-converter", "~> 2.0") s.add_runtime_dependency("jekyll-watch", "~> 2.0") - s.add_runtime_dependency("kramdown", "~> 2.3") + s.add_runtime_dependency("kramdown", "~> 2.3", ">= 2.3.1") s.add_runtime_dependency("kramdown-parser-gfm", "~> 1.0") s.add_runtime_dependency("liquid", "~> 4.0") s.add_runtime_dependency("mercenary", ">= 0.3.6", "< 0.5") From 6ff7d680e046e12a35300297a63206e115dc1d16 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 May 2021 02:31:36 -0400 Subject: [PATCH 4455/4996] Update history to reflect merge of #8680 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 2d8ad444ac6..e1c55180671 100644 --- a/History.markdown +++ b/History.markdown @@ -29,6 +29,7 @@ * fix: pin rubocop to 1.12 due to error with ruby 2.4 (#8651) * Revert "style: run rubocop -a" (#8676) * Load Jekyll plugins from BUNDLE_GEMFILE location (#8585) + * fix(security): CVE-2021-28834 (#8680) ### Development Fixes From b5e910acfbf0ea542ddb91e035847cdae168aebf Mon Sep 17 00:00:00 2001 From: Mike Kasberg Date: Tue, 18 May 2021 01:34:13 -0600 Subject: [PATCH 4456/4996] Improve the "Markdown Options" Docs (#8681) Merge pull request 8681 --- .github/actions/spelling/expect.txt | 3 +- docs/_docs/configuration/markdown.md | 96 ++++++++++++++-------------- 2 files changed, 50 insertions(+), 49 deletions(-) diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index de551310ddf..b2cfe92c50f 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -34,7 +34,6 @@ awood aws awscli backend -backlink backport backtick barcamp @@ -165,7 +164,6 @@ endraw endrender endtablerow Enumerables -EOL eol erb errordocument @@ -528,6 +526,7 @@ rsync rtomayko Rubo rubocop +rubychan rubygem rubyinstaller rubyprof diff --git a/docs/_docs/configuration/markdown.md b/docs/_docs/configuration/markdown.md index d06743d876b..38904d7a2dd 100644 --- a/docs/_docs/configuration/markdown.md +++ b/docs/_docs/configuration/markdown.md @@ -5,61 +5,63 @@ permalink: "/docs/configuration/markdown/" The various Markdown renderers supported by Jekyll sometimes have extra options available. -### Kramdown - -Kramdown is the default Markdown renderer for Jekyll. Below is a list of the -currently supported options: - -* **auto_id_prefix** - Prefix used for automatically generated header IDs -* **auto_id_stripping** - Strip all formatting from header text for automatic ID generation -* **auto_ids** - Use automatic header ID generation -* **coderay_bold_every** - Defines how often a line number should be made bold -* **coderay_css** - Defines how the highlighted code gets styled -* **coderay_default_lang** - Sets the default language for highlighting code blocks -* **coderay_line_number_start** - The start value for the line numbers -* **coderay_line_numbers** - Defines how and if line numbers should be shown -* **coderay_tab_width** - The tab width used in highlighted code -* **coderay_wrap** - Defines how the highlighted code should be wrapped -* **enable_coderay** - Use coderay for syntax highlighting -* **entity_output** - Defines how entities are output -* **footnote_backlink** - Defines the text that should be used for the footnote backlinks -* **footnote_backlink_inline** - Specifies whether the footnote backlink should always be inline -* **footnote_nr** - The number of the first footnote -* **gfm_quirks** - Enables a set of GFM specific quirks -* **hard_wrap** - Interprets line breaks literally -* **header_offset** - Sets the output offset for headers -* **html_to_native** - Convert HTML elements to native elements -* **line_width** - Defines the line width to be used when outputting a document -* **link_defs** - Pre-defines link definitions -* **math_engine** - Set the math engine -* **math_engine_opts** - Set the math engine options -* **parse_block_html** - Process kramdown syntax in block HTML tags -* **parse_span_html** - Process kramdown syntax in span HTML tags -* **smart_quotes** - Defines the HTML entity names or code points for smart quote output -* **syntax_highlighter** - Set the syntax highlighter -* **syntax_highlighter_opts** - Set the syntax highlighter options -* **toc_levels** - Defines the levels that are used for the table of contents -* **transliterated_header_ids** - Transliterate the header text before generating the ID -* **typographic_symbols** - Defines a mapping from typographical symbol to output characters - -### Example Usage +## Kramdown + +Kramdown is the default Markdown renderer for Jekyll, and often works well with no additional configuration. However, it does support many configuration options. + +### GitHub Flavored Markdown + +Kramdown supports GitHub Flavored Markdown (GFM). To use GFM with Kramdown in Jekyll, add the following to your configuration. + +```yaml +kramdown: + input: GFM +``` + +GFM supports additional Kramdown options, documented at [kramdown-parser-gfm](https://github.com/kramdown/parser-gfm). These options can be used directly in your Kramdown Jekyll config, like this: + +```yaml +kramdown: + input: GFM + gfm_quirks: [paragraph_end] +``` + +### Syntax Highlighting (CodeRay) + +To use the [CodeRay](http://coderay.rubychan.de/) syntax highlighter with Kramdown, you need to add a dependency on the `kramdown-syntax-coderay` gem. For example, `bundle add kramdown-syntax-coderay`. Then, you'll be able to specify CodeRay in your `syntax_highlighter` config: + +```yaml +kramdown: + syntax_highlighter: coderay +``` + +CodeRay supports several of its own configuration options, documented in the [kramdown-syntax-coderay docs](https://github.com/kramdown/syntax-coderay) which can be passed as `syntax_highlighter_opts` like this: + +```yaml +kramdown: + syntax_highlighter: coderay + syntax_highlighter_opts: + line_numbers: table + bold_every: 5 +``` + +### Advanced Kramdown Options + +Kramdown supports a variety of other relatively advanced options such as `header_offset` and `smart_quotes`. These are documented in the [Kramdown configuration documentation](https://kramdown.gettalong.org/options.html) and can be added to your Kramdown config like this: + ```yaml kramdown: - html_to_native: true + header_offset: 2 ``` - +
    -
    There are two unsupported kramdown options
    +
    There are several unsupported kramdown options

    - Please note that both remove_block_html_tags and - remove_span_html_tags are currently unsupported in Jekyll due - to the fact that they are not included within the kramdown HTML converter. + Please note that Jekyll uses Kramdown's HTML converter. Kramdown options used only by other converters, such as remove_block_html_tags (used by the RemoveHtmlTags converter), will not work.

    -For more details about these options have a look at the [Kramdown configuration documentation](https://kramdown.gettalong.org/options.html). - -### CommonMark +## CommonMark [CommonMark](https://commonmark.org/) is a rationalized version of Markdown syntax, implemented in C and thus faster than default Kramdown implemented in Ruby. It [slightly differs](https://github.com/commonmark/CommonMark#differences-from-original-markdown) from original Markdown and does not support all the syntax elements implemented in Kramdown, like [Block Inline Attribute Lists](https://kramdown.gettalong.org/syntax.html#block-ials). From 76517175e700d80706c9139989053f1c53d9b956 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 18 May 2021 03:34:15 -0400 Subject: [PATCH 4457/4996] Update history to reflect merge of #8681 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index e1c55180671..1a19375d712 100644 --- a/History.markdown +++ b/History.markdown @@ -22,6 +22,7 @@ * Add documentation for Sass configuration options (#8587) * Add formcarry to forms section (#8471) * Add step to set SDKROOT (#8478) + * Improve the "Markdown Options" Docs (#8681) ### Bug Fixes From 0dee66260f2bde77d9edbf279e083de862b21b5c Mon Sep 17 00:00:00 2001 From: fauno Date: Thu, 22 Jul 2021 14:43:47 -0300 Subject: [PATCH 4458/4996] Optimize `Jekyll::Utils.parse_date` (#8425) Merge pull request 8425 --- benchmark/parse-date | 25 +++++++++++++++++++++++++ lib/jekyll/utils.rb | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100755 benchmark/parse-date diff --git a/benchmark/parse-date b/benchmark/parse-date new file mode 100755 index 00000000000..9d1d1ed632d --- /dev/null +++ b/benchmark/parse-date @@ -0,0 +1,25 @@ +#!/usr/bin/env ruby + +require_relative '../lib/jekyll' +require 'benchmark/ips' + +date = "2014-08-02 14:43:06 PDT".freeze +time = Time.parse(date) + +Benchmark.ips do |x| + x.report('Time.parse') do + Time.parse(date) + end + + x.report('localtime') do + Time.parse(date).localtime + end + + x.report('localtime parsed') do + time.localtime + end + + x.report('Utils.parse_date') do + Jekyll::Utils.parse_date(date) + end +end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 5039c07adf9..49d67f4b24f 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -128,7 +128,8 @@ def stringify_hash_keys(hash) # Returns the parsed date if successful, throws a FatalException # if not def parse_date(input, msg = "Input could not be parsed.") - Time.parse(input).localtime + @parse_date_cache ||= {} + @parse_date_cache[input] ||= Time.parse(input).localtime rescue ArgumentError raise Errors::InvalidDateError, "Invalid date '#{input}': #{msg}" end From ea535a9ab73b34b5655c3afa25c140ecbba3305f Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 22 Jul 2021 13:43:49 -0400 Subject: [PATCH 4459/4996] Update history to reflect merge of #8425 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 1a19375d712..b3eb9d827a9 100644 --- a/History.markdown +++ b/History.markdown @@ -49,6 +49,7 @@ * Regenerate supported mime types (#8542) * Update include tag to be more permissive (#8618) + * Optimize `Jekyll::Utils.parse_date` (#8425) ### Site Enhancements From bcaf878b65d6349da9e53ad9243796e72797c0db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Brand=C3=A3o?= Date: Thu, 22 Jul 2021 18:46:12 +0100 Subject: [PATCH 4460/4996] Add 'webrick' warning note to "Quickstart" Docs (#8727) Merge pull request 8727 --- docs/_docs/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/_docs/index.md b/docs/_docs/index.md index 07dfeb1126a..af97b79c0d7 100644 --- a/docs/_docs/index.md +++ b/docs/_docs/index.md @@ -41,6 +41,9 @@ bundle exec jekyll serve ``` 6. Browse to [http://localhost:4000](http://localhost:4000){:target="_blank"} +{: .note .warning} +If you are using Ruby version 3.0.0 or higher, step 5 [may fail](https://github.com/github/pages-gem/issues/752). You may fix it by adding `webrick` to your dependencies: `bundle add webrick` + {: .note .info} Pass the `--livereload` option to `serve` to automatically refresh the page with each change you make to the source files: `bundle exec jekyll serve --livereload` From 915248ff1831ec811fe6c7c7e8637accceeed33a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 22 Jul 2021 13:46:13 -0400 Subject: [PATCH 4461/4996] Update history to reflect merge of #8727 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index b3eb9d827a9..36fefa52251 100644 --- a/History.markdown +++ b/History.markdown @@ -23,6 +23,7 @@ * Add formcarry to forms section (#8471) * Add step to set SDKROOT (#8478) * Improve the "Markdown Options" Docs (#8681) + * Add 'webrick' warning note to "Quickstart" Docs (#8727) ### Bug Fixes From 8a6dd9e494f94a4100ee915903750f18abd2ffb9 Mon Sep 17 00:00:00 2001 From: Parikshit87 <75501801+Parikshit87@users.noreply.github.com> Date: Thu, 22 Jul 2021 23:19:55 +0530 Subject: [PATCH 4462/4996] Update windows.md (#8701) Merge pull request 8701 --- docs/_docs/installation/windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/installation/windows.md b/docs/_docs/installation/windows.md index a2e948b3ada..eacd92c6942 100644 --- a/docs/_docs/installation/windows.md +++ b/docs/_docs/installation/windows.md @@ -29,7 +29,7 @@ We only cover RubyInstaller-2.4 and newer here. Older versions need to 4. Check if Jekyll has been installed properly: `jekyll -v` {: .note .info} -You may receive an error when checking if Jekyll has been installed properly. Reboot your system and run `jekyll -v` again. +You may receive an error when checking if Jekyll has not been installed properly. Reboot your system and run `jekyll -v` again. If the error persists, please open a [RubyInstaller issue](https://github.com/oneclick/rubyinstaller2/issues/new). That's it, you're ready to use Jekyll! From 8926ae1aace71babba70b95053f76b6b7dc682be Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 22 Jul 2021 13:49:56 -0400 Subject: [PATCH 4463/4996] Update history to reflect merge of #8701 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 36fefa52251..316efc58dd6 100644 --- a/History.markdown +++ b/History.markdown @@ -24,6 +24,7 @@ * Add step to set SDKROOT (#8478) * Improve the "Markdown Options" Docs (#8681) * Add 'webrick' warning note to "Quickstart" Docs (#8727) + * Update windows.md (#8701) ### Bug Fixes From 37612632c54a36cabce4b071c3e79e98bbf3df73 Mon Sep 17 00:00:00 2001 From: "jaybe@jekyll" Date: Thu, 22 Jul 2021 12:52:24 -0500 Subject: [PATCH 4464/4996] IRC networks - Libera, Freenode (#8706) Merge pull request 8706 --- docs/_docs/community/community.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_docs/community/community.md b/docs/_docs/community/community.md index bb8e45c1397..d8e98a057e9 100644 --- a/docs/_docs/community/community.md +++ b/docs/_docs/community/community.md @@ -16,7 +16,7 @@ If you're looking for support for Jekyll, there are a lot of options: * Read the [Jekyll Documentation]({{ '/docs/' | relative_url }}) * If you have a question about using Jekyll, start a discussion on the [Jekyll Forum](https://talk.jekyllrb.com/) or [StackOverflow](https://stackoverflow.com/questions/tagged/jekyll) -* Chat with Jekyllers — Join our [Gitter channel](https://gitter.im/jekyll/jekyll) or our [IRC channel #jekyll on Freenode](irc://irc.freenode.net/#jekyll) +* Chat with Jekyllers — Join our [Gitter channel](https://gitter.im/jekyll/jekyll) or our IRC channels #jekyll on [Libera](irc://irc.libera.chat/#jekyll) or [Freenode](irc://irc.freenode.net/#jekyll). There are a bunch of helpful community members on these services who are willing to point you in the right direction. From a0ed9550cd58411295a1e6718cd61ba46f65c941 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 22 Jul 2021 13:52:25 -0400 Subject: [PATCH 4465/4996] Update history to reflect merge of #8706 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 316efc58dd6..71b85aad5d2 100644 --- a/History.markdown +++ b/History.markdown @@ -25,6 +25,7 @@ * Improve the "Markdown Options" Docs (#8681) * Add 'webrick' warning note to "Quickstart" Docs (#8727) * Update windows.md (#8701) + * IRC networks - Libera, Freenode (#8706) ### Bug Fixes From b31f933cd1ee769640364d8305204824b86eb632 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jul 2021 13:53:15 -0400 Subject: [PATCH 4466/4996] Bump check-spelling/check-spelling from 0.0.18 to 0.0.19 (#8740) Merge pull request 8740 --- .github/workflows/spelling.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml index cbc72ae28ea..e3825f33a18 100644 --- a/.github/workflows/spelling.yml +++ b/.github/workflows/spelling.yml @@ -16,4 +16,4 @@ jobs: - name: checkout if: "!contains(github.event_name, 'pull_request')" uses: actions/checkout@v2.0.0 - - uses: check-spelling/check-spelling@v0.0.18 + - uses: check-spelling/check-spelling@v0.0.19 From 5a441c24e2c5827373b39f039cbc7a8b3d95caa3 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 22 Jul 2021 13:53:16 -0400 Subject: [PATCH 4467/4996] Update history to reflect merge of #8740 [ci skip] --- History.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/History.markdown b/History.markdown index 71b85aad5d2..483166e89b3 100644 --- a/History.markdown +++ b/History.markdown @@ -1,5 +1,7 @@ ## HEAD + * Bump check-spelling/check-spelling from 0.0.18 to 0.0.19 (#8740) + ### Documentation * typo - do instead of don't (#8518) From 0eb9239151323b11ddcd91bf2e61edefe990443f Mon Sep 17 00:00:00 2001 From: Mike Kasberg Date: Thu, 22 Jul 2021 11:57:51 -0600 Subject: [PATCH 4468/4996] Improve GitHub Flavored Markdown Docs (#8684) Merge pull request 8684 --- docs/_docs/configuration/markdown.md | 13 +++++++------ docs/_tutorials/convert-site-to-jekyll.md | 14 ++++---------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/docs/_docs/configuration/markdown.md b/docs/_docs/configuration/markdown.md index 38904d7a2dd..9cd65a3381d 100644 --- a/docs/_docs/configuration/markdown.md +++ b/docs/_docs/configuration/markdown.md @@ -9,23 +9,24 @@ available. Kramdown is the default Markdown renderer for Jekyll, and often works well with no additional configuration. However, it does support many configuration options. -### GitHub Flavored Markdown +### Kramdown Processor -Kramdown supports GitHub Flavored Markdown (GFM). To use GFM with Kramdown in Jekyll, add the following to your configuration. +By default, Jekyll uses the [GitHub Flavored Markdown (GFM) processor](https://github.com/kramdown/parser-gfm) for Kramdown. (Specifying `input: GFM` is fine, but redundant.) GFM supports a couple additional Kramdown options, documented by [kramdown-parser-gfm](https://github.com/kramdown/parser-gfm). These options can be used directly in your Kramdown Jekyll config, like this: ```yaml kramdown: - input: GFM + gfm_quirks: [paragraph_end] ``` -GFM supports additional Kramdown options, documented at [kramdown-parser-gfm](https://github.com/kramdown/parser-gfm). These options can be used directly in your Kramdown Jekyll config, like this: +You can also change the processor used by Kramdown (as specified for the `input` key in the [Kramdown RDoc](https://kramdown.gettalong.org/rdoc/Kramdown/Document.html#method-c-new)). For example, to use the non-GFM Kramdown processor in Jekyll, add the following to your configuration. ```yaml kramdown: - input: GFM - gfm_quirks: [paragraph_end] + input: Kramdown ``` +Documentation for Kramdown parsers is available in the [Kramdown docs](https://kramdown.gettalong.org/parser/kramdown.html). If you use a Kramdown parser other than Kramdown or GFM, you'll need to add the gem for it. + ### Syntax Highlighting (CodeRay) To use the [CodeRay](http://coderay.rubychan.de/) syntax highlighter with Kramdown, you need to add a dependency on the `kramdown-syntax-coderay` gem. For example, `bundle add kramdown-syntax-coderay`. Then, you'll be able to specify CodeRay in your `syntax_highlighter` config: diff --git a/docs/_tutorials/convert-site-to-jekyll.md b/docs/_tutorials/convert-site-to-jekyll.md index 22b31c659b2..e31c0a1f94f 100644 --- a/docs/_tutorials/convert-site-to-jekyll.md +++ b/docs/_tutorials/convert-site-to-jekyll.md @@ -181,22 +181,16 @@ If you don't specify a layout in your pages, Jekyll will simply render that page ## 4. Add a configuration file -Add a `_config.yml` file in your root directory. In `_config.yml`, you can optionally specify the markdown filter you want. By default, [kramdown](https://kramdown.gettalong.org/) is used (without the need to specify it). If no other filter is specified, your config file will automatically apply the following as a default setting: +Add a `_config.yml` file in your root directory. In `_config.yml`, you can optionally specify the markdown filter you want. By default, the [GitHub Flavored Markdown (GFM) processor](https://github.com/kramdown/parser-gfm) for [kramdown](https://kramdown.gettalong.org/) is used. If no other filter is specified, your config file will automatically apply the following as a [default](/docs/configuration/default/) setting: ```yaml markdown: kramdown -``` - -You can also specify [some options](https://kramdown.gettalong.org/converter/html.html) for kramdown to make it behave more like [GitHub Flavored Markdown (GFM)](https://github.github.com/gfm/): - -```yaml kramdown: - input: GFM - auto_ids: true - hard_wrap: false - syntax_highlighter: rouge + input: GFM ``` +You can find additional [Markdown Options](/docs/configuration/markdown/) in the Jekyll docs, though it's unlikely that you'll need them. + ## 5. Test your pages Now run `jekyll serve` and toggle between your `index.html` and `about.html` pages. The default layout should load for both pages. From beca094841e4e1468bc6d90f0911f0da2ccf642d Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 22 Jul 2021 13:57:52 -0400 Subject: [PATCH 4469/4996] Update history to reflect merge of #8684 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 483166e89b3..acec20bd92a 100644 --- a/History.markdown +++ b/History.markdown @@ -28,6 +28,7 @@ * Add 'webrick' warning note to "Quickstart" Docs (#8727) * Update windows.md (#8701) * IRC networks - Libera, Freenode (#8706) + * Improve GitHub Flavored Markdown Docs (#8684) ### Bug Fixes From 3f46f02108048f2151724220d0037cbce09f483e Mon Sep 17 00:00:00 2001 From: Andrew Davis Date: Fri, 23 Jul 2021 01:58:40 +0800 Subject: [PATCH 4470/4996] Update rubocop from 1.12 to 1.18 and min ruby from 2.4 to 2.5 (#8741) Merge pull request 8741 --- .github/workflows/ci.yml | 2 +- .rubocop.yml | 2 +- Gemfile | 2 +- docs/_data/ruby.yml | 2 +- jekyll.gemspec | 2 +- .../converters/markdown/kramdown_parser.rb | 2 +- lib/jekyll/external.rb | 38 +++++++++---------- lib/jekyll/page.rb | 2 +- lib/jekyll/renderer.rb | 16 ++++---- lib/jekyll/tags/include.rb | 2 +- test/test_utils.rb | 8 ++-- 11 files changed, 35 insertions(+), 43 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6769f529ec3..f43133339fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: fail-fast: false matrix: ruby_version: - - 2.4 # Minimum required Ruby version in gemspec + - 2.5 # Minimum required Ruby version in gemspec steps: - uses: actions/checkout@v2 - name: Download released earth diff --git a/.rubocop.yml b/.rubocop.yml index 49c69dcc8e6..6d5256a8f16 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -13,7 +13,7 @@ Jekyll/NoPutsAllowed: - rake/*.rake AllCops: - TargetRubyVersion: 2.4 + TargetRubyVersion: 2.5 Include: - lib/**/*.rb - test/**/*.rb diff --git a/Gemfile b/Gemfile index 615fc9de015..e521f771d37 100644 --- a/Gemfile +++ b/Gemfile @@ -23,7 +23,7 @@ group :test do gem "nokogiri", "~> 1.7" gem "rspec" gem "rspec-mocks" - gem "rubocop", "~> 1.12.0" + gem "rubocop", "~> 1.18.3" gem "rubocop-minitest" gem "rubocop-performance" gem "rubocop-rake" diff --git a/docs/_data/ruby.yml b/docs/_data/ruby.yml index 640c5e0bf8b..10b6bfeadfb 100644 --- a/docs/_data/ruby.yml +++ b/docs/_data/ruby.yml @@ -1,3 +1,3 @@ -min_version: 2.4.0 +min_version: 2.5.0 current_version: 3.0.0 current_version_output: ruby 3.0.0p0 (2020-12-25 revision 95aff21468) diff --git a/jekyll.gemspec b/jekyll.gemspec index 9bb5376657f..f835fea1981 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -29,7 +29,7 @@ Gem::Specification.new do |s| s.rdoc_options = ["--charset=UTF-8"] s.extra_rdoc_files = %w(README.markdown LICENSE) - s.required_ruby_version = ">= 2.4.0" + s.required_ruby_version = ">= 2.5.0" s.required_rubygems_version = ">= 2.7.0" s.add_runtime_dependency("addressable", "~> 2.4") diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb index a93184b8849..6751480739e 100644 --- a/lib/jekyll/converters/markdown/kramdown_parser.rb +++ b/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -160,7 +160,7 @@ def highlighter def strip_coderay_prefix(hash) hash.each_with_object({}) do |(key, val), hsh| - cleaned_key = key.to_s.gsub(%r!\Acoderay_!, "") + cleaned_key = key.to_s.delete_prefix("coderay_") if key != cleaned_key Jekyll::Deprecator.deprecation_message( diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb index d42762ee018..b484160c8eb 100644 --- a/lib/jekyll/external.rb +++ b/lib/jekyll/external.rb @@ -22,13 +22,11 @@ def blessed_gems # def require_if_present(names) Array(names).each do |name| - begin - require name - rescue LoadError - Jekyll.logger.debug "Couldn't load #{name}. Skipping." - yield(name, version_constraint(name)) if block_given? - false - end + require name + rescue LoadError + Jekyll.logger.debug "Couldn't load #{name}. Skipping." + yield(name, version_constraint(name)) if block_given? + false end end @@ -55,23 +53,21 @@ def version_constraint(gem_name) # def require_with_graceful_fail(names) Array(names).each do |name| - begin - Jekyll.logger.debug "Requiring:", name.to_s - require name - rescue LoadError => e - Jekyll.logger.error "Dependency Error:", <<~MSG - Yikes! It looks like you don't have #{name} or one of its dependencies installed. - In order to use Jekyll as currently configured, you'll need to install this gem. + Jekyll.logger.debug "Requiring:", name.to_s + require name + rescue LoadError => e + Jekyll.logger.error "Dependency Error:", <<~MSG + Yikes! It looks like you don't have #{name} or one of its dependencies installed. + In order to use Jekyll as currently configured, you'll need to install this gem. - If you've run Jekyll with `bundle exec`, ensure that you have included the #{name} - gem in your Gemfile as well. + If you've run Jekyll with `bundle exec`, ensure that you have included the #{name} + gem in your Gemfile as well. - The full error message from Ruby is: '#{e.message}' + The full error message from Ruby is: '#{e.message}' - If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/! - MSG - raise Jekyll::Errors::MissingDependencyException, name - end + If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/! + MSG + raise Jekyll::Errors::MissingDependencyException, name end end end diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 8b3245fb5e0..3797f880969 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -144,7 +144,7 @@ def path # The path to the page source file, relative to the site source def relative_path - @relative_path ||= PathManager.join(@dir, @name).sub(%r!\A/!, "") + @relative_path ||= PathManager.join(@dir, @name).delete_prefix("/") end # Obtain destination path. diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index 6a08a12b0e6..ddf078fdfc0 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -102,15 +102,13 @@ def render_document # Returns String the converted content. def convert(content) converters.reduce(content) do |output, converter| - begin - converter.convert output - rescue StandardError => e - Jekyll.logger.error "Conversion error:", - "#{converter.class} encountered an error while "\ - "converting '#{document.relative_path}':" - Jekyll.logger.error("", e.to_s) - raise e - end + converter.convert output + rescue StandardError => e + Jekyll.logger.error "Conversion error:", + "#{converter.class} encountered an error while "\ + "converting '#{document.relative_path}':" + Jekyll.logger.error("", e.to_s) + raise e end end diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index e6fe059afb7..a3ea8ff63be 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -260,7 +260,7 @@ def page_path(context) def resource_path(page, site) path = page["path"] path = File.join(site.config["collections_dir"], path) if page["collection"] - path.sub(%r!/#excerpt\z!, "") + path.delete_suffix("/#excerpt") end end end diff --git a/test/test_utils.rb b/test/test_utils.rb index 1b3534e4f27..40549aa80ff 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -130,11 +130,9 @@ class TestUtils < JekyllUnitTest context "The \`Utils.slugify\` method" do should "return nil if passed nil" do - begin - assert Utils.slugify(nil).nil? - rescue NoMethodError - assert false, "Threw NoMethodError" - end + assert Utils.slugify(nil).nil? + rescue NoMethodError + assert false, "Threw NoMethodError" end should "replace whitespace with hyphens" do From 0ce9a7c179602a61b87a47516f3da4ed46bea81c Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Thu, 22 Jul 2021 13:58:42 -0400 Subject: [PATCH 4471/4996] Update history to reflect merge of #8741 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index acec20bd92a..52c773bf4a3 100644 --- a/History.markdown +++ b/History.markdown @@ -56,6 +56,7 @@ * Regenerate supported mime types (#8542) * Update include tag to be more permissive (#8618) * Optimize `Jekyll::Utils.parse_date` (#8425) + * Update rubocop from 1.12 to 1.18 and min ruby from 2.4 to 2.5 (#8741) ### Site Enhancements From 9bb98edb2955b41d6221838070d940b6377af95e Mon Sep 17 00:00:00 2001 From: Aram Akhavan Date: Fri, 23 Jul 2021 07:42:15 -0700 Subject: [PATCH 4472/4996] use location.protocol to inject the livereload script instead of forcing http (#8718) Merge pull request 8718 --- lib/jekyll/commands/serve/servlet.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/commands/serve/servlet.rb b/lib/jekyll/commands/serve/servlet.rb index 2544616adf3..cee9c663a8a 100644 --- a/lib/jekyll/commands/serve/servlet.rb +++ b/lib/jekyll/commands/serve/servlet.rb @@ -101,7 +101,7 @@ def template @template ||= ERB.new(<<~TEMPLATE) diff --git a/docs/_includes/docs_contents.html b/docs/_includes/docs_contents.html index 931500a90b2..8b7b19dacab 100644 --- a/docs/_includes/docs_contents.html +++ b/docs/_includes/docs_contents.html @@ -1,14 +1,17 @@
    diff --git a/docs/_includes/docs_contents_mobile.html b/docs/_includes/docs_contents_mobile.html index 6574b6a940b..a8c2b3b6d6a 100644 --- a/docs/_includes/docs_contents_mobile.html +++ b/docs/_includes/docs_contents_mobile.html @@ -1,15 +1,15 @@
    - - {% for section in site.data.docs_nav -%} - - {%- for item in section.docs -%} - {% assign p = site.docs | where: "url", item.link | first %} - - {%- endfor %} - - {% endfor -%} + {% for section in site.data.docs_nav %} + + {%- for item in section.docs -%} + {% assign page = site.docs | where: "url", item.link | first %} + + {%- endfor %} + + {% endfor %} -
    +
    \ No newline at end of file diff --git a/docs/_includes/mobile-nav-items.html b/docs/_includes/mobile-nav-items.html index 5dd9b86d206..ca337ba378d 100644 --- a/docs/_includes/mobile-nav-items.html +++ b/docs/_includes/mobile-nav-items.html @@ -3,12 +3,12 @@ {% if p.show_on_mobile -%}
  • {{ p.title }}
  • {% endif -%} {% endfor -%} -
  • GitHub
  • - +
  • GitHub
  • + \ No newline at end of file diff --git a/docs/_includes/news_contents_mobile.html b/docs/_includes/news_contents_mobile.html index 84972788ac5..6f6a98e4734 100644 --- a/docs/_includes/news_contents_mobile.html +++ b/docs/_includes/news_contents_mobile.html @@ -1,5 +1,5 @@
    - @@ -8,4 +8,4 @@ {% endfor -%} -
    +
    \ No newline at end of file diff --git a/docs/_includes/news_item.html b/docs/_includes/news_item.html index 51bc9cdff1f..6529a5f7a6a 100644 --- a/docs/_includes/news_item.html +++ b/docs/_includes/news_item.html @@ -1,5 +1,5 @@ -
    -

    + diff --git a/docs/_includes/news_item_archive.html b/docs/_includes/news_item_archive.html index bccf6523d84..c5e865455ff 100644 --- a/docs/_includes/news_item_archive.html +++ b/docs/_includes/news_item_archive.html @@ -1,4 +1,4 @@ -
    +
    diff --git a/docs/_includes/search/input.html b/docs/_includes/search/input.html index 729f5cabdfd..65015ee406c 100644 --- a/docs/_includes/search/input.html +++ b/docs/_includes/search/input.html @@ -1 +1 @@ - + \ No newline at end of file diff --git a/docs/_includes/search/script.html b/docs/_includes/search/script.html index dca756d7709..7ddd1280fed 100644 --- a/docs/_includes/search/script.html +++ b/docs/_includes/search/script.html @@ -1,9 +1,9 @@ - + diff --git a/docs/_includes/top.html b/docs/_includes/top.html index c0e203c33f4..0868d0cf43d 100644 --- a/docs/_includes/top.html +++ b/docs/_includes/top.html @@ -1,5 +1,5 @@ - - + + diff --git a/docs/_includes/tutorials_contents_mobile.html b/docs/_includes/tutorials_contents_mobile.html index 080788d5fe4..4a8a9478382 100644 --- a/docs/_includes/tutorials_contents_mobile.html +++ b/docs/_includes/tutorials_contents_mobile.html @@ -1,14 +1,14 @@
    - {% for section in site.data.tutorials -%} - - {% for item in section.tutorials -%} - {% assign item_url = item | prepend:"/tutorials/" | append:"/" -%} - {% assign tutorial = site.tutorials | where: "url", item_url | first -%} - - {% endfor -%} - + + {% for item in section.tutorials -%} + {% assign item_url = item | prepend:"/tutorials/" | append:"/" -%} + {% assign tutorial = site.tutorials | where: "url", item_url | first -%} + + {% endfor -%} + {% endfor -%} -
    +

    \ No newline at end of file diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 9234c13c754..fb30f981d0a 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -9,5 +9,16 @@ {%- include anchor_links.html -%} {%- include analytics.html -%} {%- include search/script.html -%} + + diff --git a/docs/_layouts/news_item.html b/docs/_layouts/news_item.html index 5b0960e97b6..7be7bf76bc9 100644 --- a/docs/_layouts/news_item.html +++ b/docs/_layouts/news_item.html @@ -2,8 +2,8 @@ layout: news --- -
    -

    + From 839007fa158ccd8d78fc956f9f265c249865a91a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 12 Jan 2024 08:57:17 -0800 Subject: [PATCH 4835/4996] Update history to reflect merge of #9338 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index d103140156e..ec304e9bc3d 100644 --- a/History.markdown +++ b/History.markdown @@ -37,6 +37,7 @@ * Fix broken links for several Jekyll integrations (#9496) * Add release post for v4.3.3 (#9511) * Add docs version badge to page_excerpts feature (#9520) + * Improve accessibility of the docs (#9338) ### Development Fixes From 01da87c5f9c466205a4ebbc4747e390616585c3c Mon Sep 17 00:00:00 2001 From: Akira Taguchi Date: Fri, 12 Jan 2024 19:05:00 +0200 Subject: [PATCH 4836/4996] Fix gem quote consistency on docs (#9517) Merge pull request 9517 --- docs/_docs/continuous-integration/circleci.md | 4 ++-- docs/_docs/continuous-integration/github-actions.md | 4 ++-- docs/_docs/installation/windows.md | 2 +- docs/_docs/step-by-step/10-deployment.md | 8 ++++---- docs/_docs/upgrading/2-to-3.md | 2 +- docs/_posts/2019-08-19-jekyll-4-0-0-released.markdown | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/_docs/continuous-integration/circleci.md b/docs/_docs/continuous-integration/circleci.md index fb1275a5c8f..d2e317df181 100644 --- a/docs/_docs/continuous-integration/circleci.md +++ b/docs/_docs/continuous-integration/circleci.md @@ -30,8 +30,8 @@ source 'https://rubygems.org' ruby '2.7.4' -gem 'jekyll' -gem 'html-proofer' +gem "jekyll" +gem "html-proofer" ``` ```yaml diff --git a/docs/_docs/continuous-integration/github-actions.md b/docs/_docs/continuous-integration/github-actions.md index 932f7ebbb72..caba322f9ff 100644 --- a/docs/_docs/continuous-integration/github-actions.md +++ b/docs/_docs/continuous-integration/github-actions.md @@ -61,10 +61,10 @@ Welcome to My Home Page source 'https://rubygems.org' -gem 'jekyll', '~> 4.2' +gem "jekyll", "~> 4.2" group :jekyll_plugins do - gem 'jekyll-timeago', '~> 0.13.1' + gem "jekyll-timeago", "~> 0.13.1" end ``` diff --git a/docs/_docs/installation/windows.md b/docs/_docs/installation/windows.md index 6e3e5b1a0c0..1a4920f382e 100644 --- a/docs/_docs/installation/windows.md +++ b/docs/_docs/installation/windows.md @@ -138,7 +138,7 @@ While `listen` has built-in support for UNIX systems, it may require an extra ge Add the following to the `Gemfile` for your site if you have issues with auto-regeneration on Windows alone: ```ruby -gem 'wdm', '~> 0.1.1', :install_if => Gem.win_platform? +gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform? ``` You have to use a [Ruby+Devkit](https://rubyinstaller.org/downloads/) version of the RubyInstaller and install diff --git a/docs/_docs/step-by-step/10-deployment.md b/docs/_docs/step-by-step/10-deployment.md index 7fd0d08fe37..6c41f4e0831 100644 --- a/docs/_docs/step-by-step/10-deployment.md +++ b/docs/_docs/step-by-step/10-deployment.md @@ -68,12 +68,12 @@ in a `jekyll_plugins` group they'll automatically be required into Jekyll: ```ruby source 'https://rubygems.org' -gem 'jekyll' +gem "jekyll" group :jekyll_plugins do - gem 'jekyll-sitemap' - gem 'jekyll-feed' - gem 'jekyll-seo-tag' + gem "jekyll-sitemap" + gem "jekyll-feed" + gem "jekyll-seo-tag" end ``` diff --git a/docs/_docs/upgrading/2-to-3.md b/docs/_docs/upgrading/2-to-3.md index 5c5d5ded8ce..2426a5762f2 100644 --- a/docs/_docs/upgrading/2-to-3.md +++ b/docs/_docs/upgrading/2-to-3.md @@ -93,7 +93,7 @@ it's now [Rouge](https://github.com/rouge-ruby/rouge). If you were using the `hi options, such as `hl_lines`, they may not be available when using Rouge. To go back to using Pygments, set `highlighter: pygments` in your `_config.yml` file and run `gem install pygments.rb` or add -`gem 'pygments.rb'` to your project's `Gemfile`. +`gem "pygments.rb"` to your project's `Gemfile`. ### Relative Permalink support removed diff --git a/docs/_posts/2019-08-19-jekyll-4-0-0-released.markdown b/docs/_posts/2019-08-19-jekyll-4-0-0-released.markdown index dec7401e18d..fe3a84ee012 100644 --- a/docs/_posts/2019-08-19-jekyll-4-0-0-released.markdown +++ b/docs/_posts/2019-08-19-jekyll-4-0-0-released.markdown @@ -82,7 +82,7 @@ First, read the [upgrade guide](/docs/upgrading/3-to-4/)! Next, Edit your project's `Gemfile` to test Jekyll v4.x: ```ruby -gem "jekyll", "~> 4.0" +gem 'jekyll', '~> 4.0' ``` Then run `bundle update` to update all dependencies. Unless you're using From 42dd477f8a449b16cacb94e4d966000106718430 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 12 Jan 2024 09:05:01 -0800 Subject: [PATCH 4837/4996] Update history to reflect merge of #9517 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index ec304e9bc3d..df7e316ba8e 100644 --- a/History.markdown +++ b/History.markdown @@ -38,6 +38,7 @@ * Add release post for v4.3.3 (#9511) * Add docs version badge to page_excerpts feature (#9520) * Improve accessibility of the docs (#9338) + * Fix gem quote consistency on docs (#9517) ### Development Fixes From db3437a34fb9a050a758ed7b6eda90ab302c264d Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Fri, 12 Jan 2024 20:48:56 -0600 Subject: [PATCH 4838/4996] chore: Bump the required ruby version to 2.7 (#9525) Merge pull request 9525 --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 9c5e9dfd206..bd60d43068a 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -29,7 +29,7 @@ Gem::Specification.new do |s| s.rdoc_options = ["--charset=UTF-8"] s.extra_rdoc_files = %w(README.markdown LICENSE) - s.required_ruby_version = ">= 2.5.0" + s.required_ruby_version = ">= 2.7.0" s.required_rubygems_version = ">= 2.7.0" s.add_dependency("csv", "~> 3.0") From b38b7a14798d7231db8ef77d29db1eedeed51f47 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Fri, 12 Jan 2024 18:48:58 -0800 Subject: [PATCH 4839/4996] Update history to reflect merge of #9525 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index df7e316ba8e..699a60c5097 100644 --- a/History.markdown +++ b/History.markdown @@ -76,6 +76,7 @@ * Handle TypeError from `where` filter gracefully (#9292) * Add support for upcoming logger 1.4.3 (#9392) * Fix typo in devcontainer.json (#9364) + * Bump the minimum ruby version to 2.7 (#9525) ## 4.3.3 / 2023-12-27 From 8f2b53172f233507cc624313a0d2a34d77c96a15 Mon Sep 17 00:00:00 2001 From: Matt Rogers Date: Wed, 17 Jan 2024 00:58:28 -0600 Subject: [PATCH 4840/4996] fix: make search work again (#9530) Merge pull request 9530 --- docs/_includes/search/script.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_includes/search/script.html b/docs/_includes/search/script.html index 7ddd1280fed..dca756d7709 100644 --- a/docs/_includes/search/script.html +++ b/docs/_includes/search/script.html @@ -1,9 +1,9 @@ - + From 860d730ff33d31a4e922da0e08b46f25434ba59a Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 16 Jan 2024 22:58:30 -0800 Subject: [PATCH 4841/4996] Update history to reflect merge of #9530 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 699a60c5097..f709c1e843b 100644 --- a/History.markdown +++ b/History.markdown @@ -39,6 +39,7 @@ * Add docs version badge to page_excerpts feature (#9520) * Improve accessibility of the docs (#9338) * Fix gem quote consistency on docs (#9517) + * Make site search work again (#9530) ### Development Fixes From 84a29bd1429819416bc6454b1374be67b7043bdb Mon Sep 17 00:00:00 2001 From: Parker Moore <237985+parkr@users.noreply.github.com> Date: Tue, 23 Jan 2024 10:53:21 -0800 Subject: [PATCH 4842/4996] Add a few more emeritus team members (#9535) Merge pull request 9535 --- docs/pages/team.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/pages/team.md b/docs/pages/team.md index 901eb729f46..279df20a485 100644 --- a/docs/pages/team.md +++ b/docs/pages/team.md @@ -26,7 +26,10 @@ patch security vulnerabilities reported to them._ _Emeritus Core Team Members were once members of Jekyll's Core Team._ * Alfred (@alfredxing) +* Ben (@benbalter) * Frank (@DirtyF) * Nick (@qrush) +* Olivia * Parker (@parkr) +* Pat (@pathawks) * Tom (@mojombo) From 12ab35011f6e86d49c7781514f9dd1d92e43ea11 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Tue, 23 Jan 2024 10:53:22 -0800 Subject: [PATCH 4843/4996] Update history to reflect merge of #9535 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index f709c1e843b..77e56558303 100644 --- a/History.markdown +++ b/History.markdown @@ -66,6 +66,7 @@ * Update rubocop gem (#9476) * Fix Performance/StringIdentifierArgument violation in site.rb and allow activesupport 6 for windows tests (#9512) * Add csv to runtime dependency list (#9522) + * Add a few more emeritus team members (#9535) ### Bug Fixes From 22c756a2e06d63d71ccda2e389fbfda915df6c25 Mon Sep 17 00:00:00 2001 From: velle Date: Tue, 13 Feb 2024 04:01:16 +0100 Subject: [PATCH 4844/4996] Jekyll docs template typo - All pages show "Deployment" (#9548) Merge pull request 9548 --- docs/_includes/docs_contents.html | 8 ++++---- docs/_includes/docs_contents_mobile.html | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/_includes/docs_contents.html b/docs/_includes/docs_contents.html index 8b7b19dacab..0bbdb1dc059 100644 --- a/docs/_includes/docs_contents.html +++ b/docs/_includes/docs_contents.html @@ -4,13 +4,13 @@

    {{ section.title }}

    {% endfor -%} diff --git a/docs/_includes/docs_contents_mobile.html b/docs/_includes/docs_contents_mobile.html index a8c2b3b6d6a..a639c53b2d0 100644 --- a/docs/_includes/docs_contents_mobile.html +++ b/docs/_includes/docs_contents_mobile.html @@ -4,12 +4,12 @@ {% for section in site.data.docs_nav %} {%- for item in section.docs -%} - {% assign page = site.docs | where: "url", item.link | first %} - {%- endfor %} {% endfor %} -

    \ No newline at end of file +
    From c7e9061da3f0c60ead24ee887ae10db56c47c3df Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 12 Feb 2024 19:01:18 -0800 Subject: [PATCH 4845/4996] Update history to reflect merge of #9548 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index 77e56558303..edf9d4eef35 100644 --- a/History.markdown +++ b/History.markdown @@ -40,6 +40,7 @@ * Improve accessibility of the docs (#9338) * Fix gem quote consistency on docs (#9517) * Make site search work again (#9530) + * Jekyll docs template typo - All pages show "Deployment" (#9548) ### Development Fixes From dbbfc5d48c81cf424f29c7b0eebf10886bc99904 Mon Sep 17 00:00:00 2001 From: jekyllbot Date: Mon, 12 Feb 2024 20:19:22 -0800 Subject: [PATCH 4846/4996] Update history to reflect merge of #9550 [ci skip] --- History.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/History.markdown b/History.markdown index edf9d4eef35..0ca20bb2d05 100644 --- a/History.markdown +++ b/History.markdown @@ -3,6 +3,7 @@ ### Minor Enhancements * Allow marking specific highlighted lines via Liquid (#9138) + * 3.9-stable: allow Pages to be Excerpted (#9550) ### Documentation From c85bd153407a238df4ac79fedfa19f340dc5a4e4 Mon Sep 17 00:00:00 2001 From: a story Date: Wed, 24 Apr 2024 02:58:59 +0800 Subject: [PATCH 4847/4996] Fixed: Wrong navigation style on the right side of news and docs pages (#9586) Merge pull request 9586 --- docs/_includes/docs_contents.html | 2 +- docs/_includes/news_contents.html | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/_includes/docs_contents.html b/docs/_includes/docs_contents.html index 0bbdb1dc059..04cb94f0a0a 100644 --- a/docs/_includes/docs_contents.html +++ b/docs/_includes/docs_contents.html @@ -10,7 +10,7 @@

    {{ section.title }}

    {{ item_page.menu_name | default: item_page.title }} {% endcapture %} - {{ item_html }} + {{ item_html }} {% endfor %} {% endfor -%} diff --git a/docs/_includes/news_contents.html b/docs/_includes/news_contents.html index ea0a558e401..e8f7ed17f2a 100644 --- a/docs/_includes/news_contents.html +++ b/docs/_includes/news_contents.html @@ -1,10 +1,10 @@